/tags/0.3.0/kernel/arch/ppc32/include/context_offset.h |
---|
0,0 → 1,132 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#ifndef KERN_ppc32_CONTEXT_OFFSET_H_ |
#define KERN_ppc32_CONTEXT_OFFSET_H_ |
#define OFFSET_SP 0x0 |
#define OFFSET_PC 0x4 |
#define OFFSET_R2 0x8 |
#define OFFSET_R13 0xc |
#define OFFSET_R14 0x10 |
#define OFFSET_R15 0x14 |
#define OFFSET_R16 0x18 |
#define OFFSET_R17 0x1c |
#define OFFSET_R18 0x20 |
#define OFFSET_R19 0x24 |
#define OFFSET_R20 0x28 |
#define OFFSET_R21 0x2c |
#define OFFSET_R22 0x30 |
#define OFFSET_R23 0x34 |
#define OFFSET_R24 0x38 |
#define OFFSET_R25 0x3c |
#define OFFSET_R26 0x40 |
#define OFFSET_R27 0x44 |
#define OFFSET_R28 0x48 |
#define OFFSET_R29 0x4c |
#define OFFSET_R30 0x50 |
#define OFFSET_R31 0x54 |
#define OFFSET_CR 0x58 |
#define OFFSET_FR14 0x0 |
#define OFFSET_FR15 0x8 |
#define OFFSET_FR16 0x10 |
#define OFFSET_FR17 0x18 |
#define OFFSET_FR18 0x20 |
#define OFFSET_FR19 0x28 |
#define OFFSET_FR20 0x30 |
#define OFFSET_FR21 0x38 |
#define OFFSET_FR22 0x40 |
#define OFFSET_FR23 0x48 |
#define OFFSET_FR24 0x50 |
#define OFFSET_FR25 0x58 |
#define OFFSET_FR26 0x60 |
#define OFFSET_FR27 0x68 |
#define OFFSET_FR28 0x70 |
#define OFFSET_FR29 0x78 |
#define OFFSET_FR30 0x80 |
#define OFFSET_FR31 0x88 |
#define OFFSET_FPSCR 0x90 |
#ifdef __ASM__ |
# include <arch/asm/regname.h> |
# ctx: address of the structure with saved context |
.macro CONTEXT_SAVE_ARCH_CORE ctx:req |
stw sp, OFFSET_SP(\ctx) |
stw r2, OFFSET_R2(\ctx) |
stw r13, OFFSET_R13(\ctx) |
stw r14, OFFSET_R14(\ctx) |
stw r15, OFFSET_R15(\ctx) |
stw r16, OFFSET_R16(\ctx) |
stw r17, OFFSET_R17(\ctx) |
stw r18, OFFSET_R18(\ctx) |
stw r19, OFFSET_R19(\ctx) |
stw r20, OFFSET_R20(\ctx) |
stw r21, OFFSET_R21(\ctx) |
stw r22, OFFSET_R22(\ctx) |
stw r23, OFFSET_R23(\ctx) |
stw r24, OFFSET_R24(\ctx) |
stw r25, OFFSET_R25(\ctx) |
stw r26, OFFSET_R26(\ctx) |
stw r27, OFFSET_R27(\ctx) |
stw r28, OFFSET_R28(\ctx) |
stw r29, OFFSET_R29(\ctx) |
stw r30, OFFSET_R30(\ctx) |
stw r31, OFFSET_R31(\ctx) |
.endm |
# ctx: address of the structure with saved context |
.macro CONTEXT_RESTORE_ARCH_CORE ctx:req |
lwz sp, OFFSET_SP(\ctx) |
lwz r2, OFFSET_R2(\ctx) |
lwz r13, OFFSET_R13(\ctx) |
lwz r14, OFFSET_R14(\ctx) |
lwz r15, OFFSET_R15(\ctx) |
lwz r16, OFFSET_R16(\ctx) |
lwz r17, OFFSET_R17(\ctx) |
lwz r18, OFFSET_R18(\ctx) |
lwz r19, OFFSET_R19(\ctx) |
lwz r20, OFFSET_R20(\ctx) |
lwz r21, OFFSET_R21(\ctx) |
lwz r22, OFFSET_R22(\ctx) |
lwz r23, OFFSET_R23(\ctx) |
lwz r24, OFFSET_R24(\ctx) |
lwz r25, OFFSET_R25(\ctx) |
lwz r26, OFFSET_R26(\ctx) |
lwz r27, OFFSET_R27(\ctx) |
lwz r28, OFFSET_R28(\ctx) |
lwz r29, OFFSET_R29(\ctx) |
lwz r30, OFFSET_R30(\ctx) |
lwz r31, OFFSET_R31(\ctx) |
.endm |
#endif /* __ASM__ */ |
#endif |
/tags/0.3.0/kernel/arch/ppc32/include/mm/frame.h |
---|
0,0 → 1,57 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc32mm |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc32_FRAME_H_ |
#define KERN_ppc32_FRAME_H_ |
#define FRAME_WIDTH 12 /* 4K */ |
#define FRAME_SIZE (1 << FRAME_WIDTH) |
#ifdef KERNEL |
#ifndef __ASM__ |
#include <arch/types.h> |
extern uintptr_t last_frame; |
extern void frame_arch_init(void); |
extern void physmem_print(void); |
#endif /* __ASM__ */ |
#endif /* KERNEL */ |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc32/include/mm/page.h |
---|
0,0 → 1,166 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc32mm |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc32_PAGE_H_ |
#define KERN_ppc32_PAGE_H_ |
#include <arch/mm/frame.h> |
#define PAGE_WIDTH FRAME_WIDTH |
#define PAGE_SIZE FRAME_SIZE |
#define PAGE_COLOR_BITS 0 /* dummy */ |
#ifdef KERNEL |
#ifndef __ASM__ |
# define KA2PA(x) (((uintptr_t) (x)) - 0x80000000) |
# define PA2KA(x) (((uintptr_t) (x)) + 0x80000000) |
#else |
# define KA2PA(x) ((x) - 0x80000000) |
# define PA2KA(x) ((x) + 0x80000000) |
#endif |
/* |
* Implementation of generic 4-level page table interface, |
* the hardware Page Hash Table is used as cache. |
* |
* Page table layout: |
* - 32-bit virtual addressess |
* - Offset is 12 bits => pages are 4K long |
* - PTL0 has 1024 entries (10 bits) |
* - PTL1 is not used |
* - PTL2 is not used |
* - PLT3 has 1024 entries (10 bits) |
*/ |
/* Number of entries in each level. */ |
#define PTL0_ENTRIES_ARCH 1024 |
#define PTL1_ENTRIES_ARCH 0 |
#define PTL2_ENTRIES_ARCH 0 |
#define PTL3_ENTRIES_ARCH 1024 |
/* Page table sizes for each level. */ |
#define PTL0_SIZE_ARCH ONE_FRAME |
#define PTL1_SIZE_ARCH 0 |
#define PTL2_SIZE_ARCH 0 |
#define PTL3_SIZE_ARCH ONE_FRAME |
/* Macros calculating indices into page tables on each level. */ |
#define PTL0_INDEX_ARCH(vaddr) (((vaddr) >> 22) & 0x3ff) |
#define PTL1_INDEX_ARCH(vaddr) 0 |
#define PTL2_INDEX_ARCH(vaddr) 0 |
#define PTL3_INDEX_ARCH(vaddr) (((vaddr) >> 12) & 0x3ff) |
/* Get PTE address accessors for each level. */ |
#define GET_PTL1_ADDRESS_ARCH(ptl0, i) \ |
(((pte_t *) (ptl0))[(i)].pfn << 12) |
#define GET_PTL2_ADDRESS_ARCH(ptl1, i) \ |
(ptl1) |
#define GET_PTL3_ADDRESS_ARCH(ptl2, i) \ |
(ptl2) |
#define GET_FRAME_ADDRESS_ARCH(ptl3, i) \ |
(((pte_t *) (ptl3))[(i)].pfn << 12) |
/* Set PTE address accessors for each level. */ |
#define SET_PTL0_ADDRESS_ARCH(ptl0) |
#define SET_PTL1_ADDRESS_ARCH(ptl0, i, a) \ |
(((pte_t *) (ptl0))[(i)].pfn = (a) >> 12) |
#define SET_PTL2_ADDRESS_ARCH(ptl1, i, a) |
#define SET_PTL3_ADDRESS_ARCH(ptl2, i, a) |
#define SET_FRAME_ADDRESS_ARCH(ptl3, i, a) \ |
(((pte_t *) (ptl3))[(i)].pfn = (a) >> 12) |
/* Get PTE flags accessors for each level. */ |
#define GET_PTL1_FLAGS_ARCH(ptl0, i) \ |
get_pt_flags((pte_t *) (ptl0), (index_t) (i)) |
#define GET_PTL2_FLAGS_ARCH(ptl1, i) \ |
PAGE_PRESENT |
#define GET_PTL3_FLAGS_ARCH(ptl2, i) \ |
PAGE_PRESENT |
#define GET_FRAME_FLAGS_ARCH(ptl3, i) \ |
get_pt_flags((pte_t *) (ptl3), (index_t) (i)) |
/* Set PTE flags accessors for each level. */ |
#define SET_PTL1_FLAGS_ARCH(ptl0, i, x) \ |
set_pt_flags((pte_t *) (ptl0), (index_t) (i), (x)) |
#define SET_PTL2_FLAGS_ARCH(ptl1, i, x) |
#define SET_PTL3_FLAGS_ARCH(ptl2, i, x) |
#define SET_FRAME_FLAGS_ARCH(ptl3, i, x) \ |
set_pt_flags((pte_t *) (ptl3), (index_t) (i), (x)) |
/* Macros for querying the last-level PTEs. */ |
#define PTE_VALID_ARCH(pte) (*((uint32_t *) (pte)) != 0) |
#define PTE_PRESENT_ARCH(pte) ((pte)->p != 0) |
#define PTE_GET_FRAME_ARCH(pte) ((pte)->pfn << 12) |
#define PTE_WRITABLE_ARCH(pte) 1 |
#define PTE_EXECUTABLE_ARCH(pte) 1 |
#ifndef __ASM__ |
#include <mm/mm.h> |
#include <arch/interrupt.h> |
static inline int get_pt_flags(pte_t *pt, index_t i) |
{ |
pte_t *p = &pt[i]; |
return ((1 << PAGE_CACHEABLE_SHIFT) | |
((!p->p) << PAGE_PRESENT_SHIFT) | |
(1 << PAGE_USER_SHIFT) | |
(1 << PAGE_READ_SHIFT) | |
(1 << PAGE_WRITE_SHIFT) | |
(1 << PAGE_EXEC_SHIFT) | |
(p->g << PAGE_GLOBAL_SHIFT)); |
} |
static inline void set_pt_flags(pte_t *pt, index_t i, int flags) |
{ |
pte_t *p = &pt[i]; |
p->p = !(flags & PAGE_NOT_PRESENT); |
p->g = (flags & PAGE_GLOBAL) != 0; |
p->valid = 1; |
} |
extern void page_arch_init(void); |
#endif /* __ASM__ */ |
#endif /* KERNEL */ |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc32/include/mm/tlb.h |
---|
0,0 → 1,61 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc32mm |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc32_TLB_H_ |
#define KERN_ppc32_TLB_H_ |
#include <arch/interrupt.h> |
typedef struct { |
unsigned v : 1; /**< Valid */ |
unsigned vsid : 24; /**< Virtual Segment ID */ |
unsigned h : 1; /**< Primary/secondary hash */ |
unsigned api : 6; /**< Abbreviated Page Index */ |
unsigned rpn : 20; /**< Real Page Number */ |
unsigned reserved0 : 3; |
unsigned r : 1; /**< Reference */ |
unsigned c : 1; /**< Change */ |
unsigned wimg : 4; /**< Access control */ |
unsigned reserved1 : 1; |
unsigned pp : 2; /**< Page protection */ |
} phte_t; |
extern void pht_refill(int n, istate_t *istate); |
extern bool pht_real_refill(int n, istate_t *istate) __attribute__ ((section("K_UNMAPPED_TEXT_START"))); |
extern void pht_init(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc32/include/mm/as.h |
---|
0,0 → 1,63 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc32mm |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc32_AS_H_ |
#define KERN_ppc32_AS_H_ |
#define KERNEL_ADDRESS_SPACE_SHADOWED_ARCH 0 |
#define KERNEL_ADDRESS_SPACE_START_ARCH ((unsigned long) 0x80000000) |
#define KERNEL_ADDRESS_SPACE_END_ARCH ((unsigned long) 0xffffffff) |
#define USER_ADDRESS_SPACE_START_ARCH ((unsigned long) 0x00000000) |
#define USER_ADDRESS_SPACE_END_ARCH ((unsigned long) 0x7fffffff) |
#define USTACK_ADDRESS_ARCH (0x7fffffff - (PAGE_SIZE - 1)) |
typedef struct { |
} as_arch_t; |
#include <genarch/mm/as_pt.h> |
#define as_constructor_arch(as, flags) (as != as) |
#define as_destructor_arch(as) (as != as) |
#define as_create_arch(as, flags) (as != as) |
#define as_deinstall_arch(as) |
#define as_invalidate_translation_cache(as, page, cnt) |
extern void as_arch_init(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc32/include/mm/asid.h |
---|
0,0 → 1,47 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc32mm |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc32_ASID_H_ |
#define KERN_ppc32_ASID_H_ |
#include <arch/types.h> |
#define ASID_MAX_ARCH 4096 |
typedef uint32_t asid_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc32/include/types.h |
---|
0,0 → 1,84 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc32_TYPES_H_ |
#define KERN_ppc32_TYPES_H_ |
#define NULL 0 |
#define false 0 |
#define true 1 |
typedef signed char int8_t; |
typedef signed short int16_t; |
typedef signed int int32_t; |
typedef signed long long int64_t; |
typedef unsigned char uint8_t; |
typedef unsigned short uint16_t; |
typedef unsigned int uint32_t; |
typedef unsigned long long uint64_t; |
typedef uint32_t size_t; |
typedef uint32_t count_t; |
typedef uint32_t index_t; |
typedef uint32_t uintptr_t; |
typedef uint32_t pfn_t; |
typedef uint32_t ipl_t; |
typedef uint32_t unative_t; |
typedef int32_t native_t; |
typedef uint8_t bool; |
typedef uint64_t thread_id_t; |
typedef uint64_t task_id_t; |
typedef uint32_t context_id_t; |
typedef int32_t inr_t; |
typedef int32_t devno_t; |
/** Page Table Entry. */ |
typedef struct { |
unsigned p : 1; /**< Present bit. */ |
unsigned a : 1; /**< Accessed bit. */ |
unsigned g : 1; /**< Global bit. */ |
unsigned valid : 1; /**< Valid content even if not present. */ |
unsigned pfn : 20; /**< Physical frame number. */ |
} pte_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc32/include/exception.h |
---|
0,0 → 1,100 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc32_EXCEPTION_H_ |
#define KERN_ppc32_EXCEPTION_H_ |
#include <arch/types.h> |
typedef struct { |
uint32_t r0; |
uint32_t r2; |
uint32_t r3; |
uint32_t r4; |
uint32_t r5; |
uint32_t r6; |
uint32_t r7; |
uint32_t r8; |
uint32_t r9; |
uint32_t r10; |
uint32_t r11; |
uint32_t r13; |
uint32_t r14; |
uint32_t r15; |
uint32_t r16; |
uint32_t r17; |
uint32_t r18; |
uint32_t r19; |
uint32_t r20; |
uint32_t r21; |
uint32_t r22; |
uint32_t r23; |
uint32_t r24; |
uint32_t r25; |
uint32_t r26; |
uint32_t r27; |
uint32_t r28; |
uint32_t r29; |
uint32_t r30; |
uint32_t r31; |
uint32_t cr; |
uint32_t pc; |
uint32_t srr1; |
uint32_t lr; |
uint32_t ctr; |
uint32_t xer; |
uint32_t r12; |
uint32_t sp; |
} istate_t; |
static inline void istate_set_retaddr(istate_t *istate, uintptr_t retaddr) |
{ |
istate->pc = retaddr; |
} |
/** Return true if exception happened while in userspace */ |
#include <panic.h> |
static inline int istate_from_uspace(istate_t *istate) |
{ |
panic("istate_from_uspace not yet implemented"); |
return 0; |
} |
static inline unative_t istate_get_pc(istate_t *istate) |
{ |
return istate->pc; |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc32/include/cpu.h |
---|
0,0 → 1,48 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc32_CPU_H_ |
#define KERN_ppc32_CPU_H_ |
#include <arch/asm.h> |
typedef struct { |
int version; |
int revision; |
} cpu_arch_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc32/include/drivers/pic.h |
---|
0,0 → 1,56 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc32_PIC_H_ |
#define KERN_ppc32_PIC_H_ |
#include <arch/types.h> |
#define PIC_PENDING_LOW 8 |
#define PIC_PENDING_HIGH 4 |
#define PIC_MASK_LOW 9 |
#define PIC_MASK_HIGH 5 |
#define PIC_ACK_LOW 10 |
#define PIC_ACK_HIGH 6 |
void pic_init(uintptr_t base, size_t size); |
void pic_enable_interrupt(int intnum); |
void pic_disable_interrupt(int intnum); |
void pic_ack_interrupt(int intnum); |
int pic_get_pending(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc32/include/drivers/cuda.h |
---|
0,0 → 1,48 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc32_CUDA_H_ |
#define KERN_ppc32_CUDA_H_ |
#include <arch/types.h> |
extern void cuda_init(devno_t devno, uintptr_t base, size_t size); |
extern int cuda_get_scancode(void); |
extern void cuda_grab(void); |
extern void cuda_release(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc32/include/fpu_context.h |
---|
0,0 → 1,67 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc32_FPU_CONTEXT_H_ |
#define KERN_ppc32_FPU_CONTEXT_H_ |
#ifndef KERN_ppc32_TYPES_H_ |
# include <arch/types.h> |
#endif |
typedef struct { |
uint64_t fr14; |
uint64_t fr15; |
uint64_t fr16; |
uint64_t fr17; |
uint64_t fr18; |
uint64_t fr19; |
uint64_t fr20; |
uint64_t fr21; |
uint64_t fr22; |
uint64_t fr23; |
uint64_t fr24; |
uint64_t fr25; |
uint64_t fr26; |
uint64_t fr27; |
uint64_t fr28; |
uint64_t fr29; |
uint64_t fr30; |
uint64_t fr31; |
uint32_t fpscr; |
} __attribute__ ((packed)) fpu_context_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc32/include/context.h |
---|
0,0 → 1,75 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc32_CONTEXT_H_ |
#define KERN_ppc32_CONTEXT_H_ |
#include <arch/types.h> |
#define SP_DELTA 16 |
typedef struct { |
uintptr_t sp; |
uintptr_t pc; |
uint32_t r2; |
uint32_t r13; |
uint32_t r14; |
uint32_t r15; |
uint32_t r16; |
uint32_t r17; |
uint32_t r18; |
uint32_t r19; |
uint32_t r20; |
uint32_t r21; |
uint32_t r22; |
uint32_t r23; |
uint32_t r24; |
uint32_t r25; |
uint32_t r26; |
uint32_t r27; |
uint32_t r28; |
uint32_t r29; |
uint32_t r30; |
uint32_t r31; |
uint32_t cr; |
ipl_t ipl; |
} __attribute__ ((packed)) context_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc32/include/cpuid.h |
---|
0,0 → 1,56 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc32_CPUID_H_ |
#define KERN_ppc32_CPUID_H_ |
#include <arch/types.h> |
typedef struct { |
uint16_t version; |
uint16_t revision; |
} __attribute__ ((packed)) cpu_info_t; |
static inline void cpu_version(cpu_info_t *info) |
{ |
asm volatile ( |
"mfpvr %0\n" |
: "=r" (*info) |
); |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc32/include/asm/regname.h |
---|
0,0 → 1,231 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc32_REGNAME_H_ |
#define KERN_ppc32_REGNAME_H_ |
/* Condition Register Bit Fields */ |
#define cr0 0 |
#define cr1 1 |
#define cr2 2 |
#define cr3 3 |
#define cr4 4 |
#define cr5 5 |
#define cr6 6 |
#define cr7 7 |
/* General Purpose Registers (GPRs) */ |
#define r0 0 |
#define r1 1 |
#define r2 2 |
#define r3 3 |
#define r4 4 |
#define r5 5 |
#define r6 6 |
#define r7 7 |
#define r8 8 |
#define r9 9 |
#define r10 10 |
#define r11 11 |
#define r12 12 |
#define r13 13 |
#define r14 14 |
#define r15 15 |
#define r16 16 |
#define r17 17 |
#define r18 18 |
#define r19 19 |
#define r20 20 |
#define r21 21 |
#define r22 22 |
#define r23 23 |
#define r24 24 |
#define r25 25 |
#define r26 26 |
#define r27 27 |
#define r28 28 |
#define r29 29 |
#define r30 30 |
#define r31 31 |
/* GPR Aliases */ |
#define sp 1 |
/* Floating Point Registers (FPRs) */ |
#define fr0 0 |
#define fr1 1 |
#define fr2 2 |
#define fr3 3 |
#define fr4 4 |
#define fr5 5 |
#define fr6 6 |
#define fr7 7 |
#define fr8 8 |
#define fr9 9 |
#define fr10 10 |
#define fr11 11 |
#define fr12 12 |
#define fr13 13 |
#define fr14 14 |
#define fr15 15 |
#define fr16 16 |
#define fr17 17 |
#define fr18 18 |
#define fr19 19 |
#define fr20 20 |
#define fr21 21 |
#define fr22 22 |
#define fr23 23 |
#define fr24 24 |
#define fr25 25 |
#define fr26 26 |
#define fr27 27 |
#define fr28 28 |
#define fr29 29 |
#define fr30 30 |
#define fr31 31 |
#define vr0 0 |
#define vr1 1 |
#define vr2 2 |
#define vr3 3 |
#define vr4 4 |
#define vr5 5 |
#define vr6 6 |
#define vr7 7 |
#define vr8 8 |
#define vr9 9 |
#define vr10 10 |
#define vr11 11 |
#define vr12 12 |
#define vr13 13 |
#define vr14 14 |
#define vr15 15 |
#define vr16 16 |
#define vr17 17 |
#define vr18 18 |
#define vr19 19 |
#define vr20 20 |
#define vr21 21 |
#define vr22 22 |
#define vr23 23 |
#define vr24 24 |
#define vr25 25 |
#define vr26 26 |
#define vr27 27 |
#define vr28 28 |
#define vr29 29 |
#define vr30 30 |
#define vr31 31 |
#define evr0 0 |
#define evr1 1 |
#define evr2 2 |
#define evr3 3 |
#define evr4 4 |
#define evr5 5 |
#define evr6 6 |
#define evr7 7 |
#define evr8 8 |
#define evr9 9 |
#define evr10 10 |
#define evr11 11 |
#define evr12 12 |
#define evr13 13 |
#define evr14 14 |
#define evr15 15 |
#define evr16 16 |
#define evr17 17 |
#define evr18 18 |
#define evr19 19 |
#define evr20 20 |
#define evr21 21 |
#define evr22 22 |
#define evr23 23 |
#define evr24 24 |
#define evr25 25 |
#define evr26 26 |
#define evr27 27 |
#define evr28 28 |
#define evr29 29 |
#define evr30 30 |
#define evr31 31 |
/* Special Purpose Registers (SPRs) */ |
#define xer 1 |
#define lr 8 |
#define ctr 9 |
#define dec 22 |
#define sdr1 25 |
#define srr0 26 |
#define srr1 27 |
#define sprg0 272 |
#define sprg1 273 |
#define sprg2 274 |
#define sprg3 275 |
#define prv 287 |
#define ibat0u 528 |
#define ibat0l 529 |
#define ibat1u 530 |
#define ibat1l 531 |
#define ibat2u 532 |
#define ibat2l 533 |
#define ibat3u 534 |
#define ibat3l 535 |
#define dbat0u 536 |
#define dbat0l 537 |
#define dbat1u 538 |
#define dbat1l 539 |
#define dbat2u 540 |
#define dbat2l 541 |
#define dbat3u 542 |
#define dbat3l 543 |
#define hid0 1008 |
/* MSR bits */ |
#define msr_ir (1 << 4) |
#define msr_dr (1 << 5) |
#define msr_pr (1 << 14) |
#define msr_ee (1 << 15) |
/* HID0 bits */ |
#define hid0_ice (1 << 15) |
#define hid0_dce (1 << 14) |
#define hid0_icfi (1 << 11) |
#define hid0_dci (1 << 10) |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc32/include/interrupt.h |
---|
0,0 → 1,55 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc32interrupt |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc32_INTERRUPT_H_ |
#define KERN_ppc32_INTERRUPT_H_ |
#include <arch/exception.h> |
#define IVT_ITEMS 16 |
#define IVT_FIRST 0 |
#define VECTOR_DATA_STORAGE 2 |
#define VECTOR_INSTRUCTION_STORAGE 3 |
#define VECTOR_EXTERNAL 4 |
#define VECTOR_DECREMENTER 8 |
extern void start_decrementer(void); |
extern void interrupt_init(void); |
extern void extint_handler(int n, istate_t *istate); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc32/include/cycle.h |
---|
0,0 → 1,62 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc32_CYCLE_H_ |
#define KERN_ppc32_CYCLE_H_ |
static inline uint64_t get_cycle(void) |
{ |
uint32_t lower; |
uint32_t upper; |
uint32_t upper2; |
asm volatile ( |
"1: mftbu %0\n" |
"mftb %1\n" |
"mftbu %2\n" |
"cmpw %0, %2\n" |
"bne- 1b\n" |
: "=r" (upper), |
"=r" (lower), |
"=r" (upper2) |
:: "cr0" |
); |
return ((uint64_t) upper << 32) + (uint64_t) lower; |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc32/include/byteorder.h |
---|
0,0 → 1,49 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc32_BYTEORDER_H_ |
#define KERN_ppc32_BYTEORDER_H_ |
#include <byteorder.h> |
#define uint32_t_le2host(n) uint32_t_byteorder_swap(n) |
#define uint64_t_le2host(n) uint64_t_byteorder_swap(n) |
#define uint32_t_be2host(n) (n) |
#define uint64_t_be2host(n) (n) |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc32/include/elf.h |
---|
0,0 → 1,45 |
/* |
* Copyright (c) 2006 Sergey Bondari |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc32_ELF_H_ |
#define KERN_ppc32_ELF_H_ |
#define ELF_MACHINE EM_PPC |
#define ELF_DATA_ENCODING ELFDATA2MSB |
#define ELF_CLASS ELFCLASS32 |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc32/include/memstr.h |
---|
0,0 → 1,48 |
/* |
* Copyright (c) 2005 Sergey Bondari |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc32_MEMSTR_H_ |
#define KERN_ppc32_MEMSTR_H_ |
#define memcpy(dst, src, cnt) __builtin_memcpy((dst), (src), (cnt)) |
extern void memsetw(uintptr_t dst, size_t cnt, uint16_t x); |
extern void memsetb(uintptr_t dst, size_t cnt, uint8_t x); |
extern int memcmp(uintptr_t src, uintptr_t dst, int cnt); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc32/include/arg.h |
---|
0,0 → 1,43 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc32_ARG_H_ |
#define KERN_ppc32_ARG_H_ |
#include <stdarg.h> |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc32/include/atomic.h |
---|
0,0 → 1,97 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc32_ATOMIC_H_ |
#define KERN_ppc32_ATOMIC_H_ |
static inline void atomic_inc(atomic_t *val) |
{ |
long tmp; |
asm volatile ( |
"1:\n" |
"lwarx %0, 0, %2\n" |
"addic %0, %0, 1\n" |
"stwcx. %0, 0, %2\n" |
"bne- 1b" |
: "=&r" (tmp), "=m" (val->count) |
: "r" (&val->count), "m" (val->count) |
: "cc" |
); |
} |
static inline void atomic_dec(atomic_t *val) |
{ |
long tmp; |
asm volatile ( |
"1:\n" |
"lwarx %0, 0, %2\n" |
"addic %0, %0, -1\n" |
"stwcx. %0, 0, %2\n" |
"bne- 1b" |
: "=&r" (tmp), "=m" (val->count) |
: "r" (&val->count), "m" (val->count) |
: "cc" |
); |
} |
static inline long atomic_postinc(atomic_t *val) |
{ |
atomic_inc(val); |
return val->count - 1; |
} |
static inline long atomic_postdec(atomic_t *val) |
{ |
atomic_dec(val); |
return val->count + 1; |
} |
static inline long atomic_preinc(atomic_t *val) |
{ |
atomic_inc(val); |
return val->count; |
} |
static inline long atomic_predec(atomic_t *val) |
{ |
atomic_dec(val); |
return val->count; |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc32/include/boot/boot.h |
---|
0,0 → 1,98 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc32_BOOT_H_ |
#define KERN_ppc32_BOOT_H_ |
#define BOOT_OFFSET 0x8000 |
/* Temporary stack size for boot process */ |
#define TEMP_STACK_SIZE 0x100 |
#define TASKMAP_MAX_RECORDS 32 |
#define MEMMAP_MAX_RECORDS 32 |
#ifndef __ASM__ |
#include <arch/types.h> |
typedef struct { |
uintptr_t addr; |
uint32_t size; |
} utask_t; |
typedef struct { |
uint32_t count; |
utask_t tasks[TASKMAP_MAX_RECORDS]; |
} taskmap_t; |
typedef struct { |
uintptr_t start; |
uint32_t size; |
} memzone_t; |
typedef struct { |
uint32_t total; |
uint32_t count; |
memzone_t zones[MEMMAP_MAX_RECORDS]; |
} memmap_t; |
typedef struct { |
uintptr_t addr; |
unsigned int width; |
unsigned int height; |
unsigned int bpp; |
unsigned int scanline; |
} screen_t; |
typedef struct { |
uintptr_t addr; |
unsigned int size; |
} keyboard_t; |
typedef struct { |
memmap_t memmap; |
taskmap_t taskmap; |
screen_t screen; |
keyboard_t keyboard; |
} bootinfo_t; |
extern bootinfo_t bootinfo; |
#endif |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc32/include/arch.h |
---|
0,0 → 1,43 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc32_ARCH_H_ |
#define KERN_ppc32_ARCH_H_ |
#include <arch/drivers/cuda.h> |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc32/include/proc/task.h |
---|
0,0 → 1,47 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc32proc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc32_TASK_H_ |
#define KERN_ppc32_TASK_H_ |
typedef struct { |
} task_arch_t; |
#define task_create_arch(t) |
#define task_destroy_arch(t) |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc32/include/proc/thread.h |
---|
0,0 → 1,48 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc32proc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc32_THREAD_H_ |
#define KERN_ppc32_THREAD_H_ |
typedef struct { |
} thread_arch_t; |
#define thr_constructor_arch(t) |
#define thr_destructor_arch(t) |
#define thread_create_arch(t) |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc32/include/asm.h |
---|
0,0 → 1,155 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc32_ASM_H_ |
#define KERN_ppc32_ASM_H_ |
#include <arch/types.h> |
#include <config.h> |
/** Enable interrupts. |
* |
* Enable interrupts and return previous |
* value of EE. |
* |
* @return Old interrupt priority level. |
*/ |
static inline ipl_t interrupts_enable(void) |
{ |
ipl_t v; |
ipl_t tmp; |
asm volatile ( |
"mfmsr %0\n" |
"mfmsr %1\n" |
"ori %1, %1, 1 << 15\n" |
"mtmsr %1\n" |
: "=r" (v), "=r" (tmp) |
); |
return v; |
} |
/** Disable interrupts. |
* |
* Disable interrupts and return previous |
* value of EE. |
* |
* @return Old interrupt priority level. |
*/ |
static inline ipl_t interrupts_disable(void) |
{ |
ipl_t v; |
ipl_t tmp; |
asm volatile ( |
"mfmsr %0\n" |
"mfmsr %1\n" |
"rlwinm %1, %1, 0, 17, 15\n" |
"mtmsr %1\n" |
: "=r" (v), "=r" (tmp) |
); |
return v; |
} |
/** Restore interrupt priority level. |
* |
* Restore EE. |
* |
* @param ipl Saved interrupt priority level. |
*/ |
static inline void interrupts_restore(ipl_t ipl) |
{ |
ipl_t tmp; |
asm volatile ( |
"mfmsr %1\n" |
"rlwimi %0, %1, 0, 17, 15\n" |
"cmpw 0, %0, %1\n" |
"beq 0f\n" |
"mtmsr %0\n" |
"0:\n" |
: "=r" (ipl), "=r" (tmp) |
: "0" (ipl) |
: "cr0" |
); |
} |
/** Return interrupt priority level. |
* |
* Return EE. |
* |
* @return Current interrupt priority level. |
*/ |
static inline ipl_t interrupts_read(void) |
{ |
ipl_t v; |
asm volatile ( |
"mfmsr %0\n" |
: "=r" (v) |
); |
return v; |
} |
/** Return base address of current stack. |
* |
* Return the base address of the current stack. |
* The stack is assumed to be STACK_SIZE bytes long. |
* The stack must start on page boundary. |
*/ |
static inline uintptr_t get_stack_base(void) |
{ |
uintptr_t v; |
asm volatile ( |
"and %0, %%sp, %1\n" |
: "=r" (v) |
: "r" (~(STACK_SIZE - 1)) |
); |
return v; |
} |
static inline void cpu_sleep(void) |
{ |
} |
void cpu_halt(void); |
void asm_delay_loop(uint32_t t); |
extern void userspace_asm(uintptr_t uspace_uarg, uintptr_t stack, uintptr_t entry); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc32/include/faddr.h |
---|
0,0 → 1,45 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc32_FADDR_H_ |
#define KERN_ppc32_FADDR_H_ |
#include <arch/types.h> |
#define FADDR(fptr) ((uintptr_t) (fptr)) |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc32/include/debug.h |
---|
0,0 → 1,41 |
/* |
* Copyright (c) 2005 |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc32debug |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc32_DEBUG_H_ |
#define KERN_ppc32_DEBUG_H_ |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc32/include/barrier.h |
---|
0,0 → 1,48 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc32_BARRIER_H_ |
#define KERN_ppc32_BARRIER_H_ |
#define CS_ENTER_BARRIER() asm volatile ("" ::: "memory") |
#define CS_LEAVE_BARRIER() asm volatile ("" ::: "memory") |
#define memory_barrier() asm volatile ("sync" ::: "memory") |
#define read_barrier() asm volatile ("sync" ::: "memory") |
#define write_barrier() asm volatile ("eieio" ::: "memory") |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc32/src/context.S |
---|
0,0 → 1,60 |
# |
# Copyright (c) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
#include <arch/context_offset.h> |
.text |
.global context_save_arch |
.global context_restore_arch |
context_save_arch: |
CONTEXT_SAVE_ARCH_CORE r3 |
mflr r4 |
stw r4, OFFSET_PC(r3) |
mfcr r4 |
stw r4, OFFSET_CR(r3) |
# context_save returns 1 |
li r3, 1 |
blr |
context_restore_arch: |
CONTEXT_RESTORE_ARCH_CORE r3 |
lwz r4, OFFSET_CR(r3) |
mtcr r4 |
lwz r4, OFFSET_PC(r3) |
mtlr r4 |
# context_restore returns 0 |
li r3, 0 |
blr |
/tags/0.3.0/kernel/arch/ppc32/src/ppc32.c |
---|
0,0 → 1,155 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc32 |
* @{ |
*/ |
/** @file |
*/ |
#include <config.h> |
#include <arch.h> |
#include <arch/boot/boot.h> |
#include <arch/drivers/cuda.h> |
#include <arch/interrupt.h> |
#include <genarch/fb/fb.h> |
#include <genarch/fb/visuals.h> |
#include <userspace.h> |
#include <proc/uarg.h> |
#include <console/console.h> |
#include <ddi/device.h> |
#include <ddi/irq.h> |
#include <arch/drivers/pic.h> |
#define IRQ_COUNT 64 |
bootinfo_t bootinfo; |
void arch_pre_main(void) |
{ |
/* Setup usermode */ |
init.cnt = bootinfo.taskmap.count; |
uint32_t i; |
for (i = 0; i < bootinfo.taskmap.count; i++) { |
init.tasks[i].addr = PA2KA(bootinfo.taskmap.tasks[i].addr); |
init.tasks[i].size = bootinfo.taskmap.tasks[i].size; |
} |
} |
void arch_pre_mm_init(void) |
{ |
/* Initialize dispatch table */ |
interrupt_init(); |
/* Start decrementer */ |
start_decrementer(); |
} |
void arch_post_mm_init(void) |
{ |
if (config.cpu_active == 1) { |
/* Initialize framebuffer */ |
unsigned int visual; |
switch (bootinfo.screen.bpp) { |
case 8: |
visual = VISUAL_INDIRECT_8; |
break; |
case 16: |
visual = VISUAL_RGB_5_5_5; |
break; |
case 24: |
visual = VISUAL_RGB_8_8_8; |
break; |
case 32: |
visual = VISUAL_RGB_0_8_8_8; |
break; |
default: |
panic("Unsupported bits per pixel"); |
} |
fb_init(bootinfo.screen.addr, bootinfo.screen.width, bootinfo.screen.height, bootinfo.screen.scanline, visual); |
/* Initialize IRQ routing */ |
irq_init(IRQ_COUNT, IRQ_COUNT); |
/* Initialize PIC */ |
pic_init(bootinfo.keyboard.addr, PAGE_SIZE); |
/* Initialize I/O controller */ |
cuda_init(device_assign_devno(), bootinfo.keyboard.addr + 0x16000, 2 * PAGE_SIZE); |
/* Merge all zones to 1 big zone */ |
zone_merge_all(); |
} |
} |
void arch_post_cpu_init(void) |
{ |
} |
void arch_pre_smp_init(void) |
{ |
} |
void arch_post_smp_init(void) |
{ |
} |
void calibrate_delay_loop(void) |
{ |
} |
void userspace(uspace_arg_t *kernel_uarg) |
{ |
userspace_asm((uintptr_t) kernel_uarg->uspace_uarg, (uintptr_t) kernel_uarg->uspace_stack + THREAD_STACK_SIZE - SP_DELTA, (uintptr_t) kernel_uarg->uspace_entry); |
/* Unreachable */ |
for (;;) |
; |
} |
/** Acquire console back for kernel |
* |
*/ |
void arch_grab_console(void) |
{ |
cuda_grab(); |
} |
/** Return console to userspace |
* |
*/ |
void arch_release_console(void) |
{ |
cuda_release(); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc32/src/mm/frame.c |
---|
0,0 → 1,92 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc32mm |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/boot/boot.h> |
#include <arch/mm/frame.h> |
#include <mm/frame.h> |
#include <align.h> |
#include <macros.h> |
#include <print.h> |
uintptr_t last_frame = 0; |
void physmem_print(void) |
{ |
unsigned int i; |
printf("Base Size\n"); |
printf("---------- ----------\n"); |
for (i = 0; i < bootinfo.memmap.count; i++) { |
printf("%#10x %#10x\n", bootinfo.memmap.zones[i].start, |
bootinfo.memmap.zones[i].size); |
} |
} |
void frame_arch_init(void) |
{ |
pfn_t minconf = 2; |
count_t i; |
pfn_t start, conf; |
size_t size; |
for (i = 0; i < bootinfo.memmap.count; i++) { |
start = ADDR2PFN(ALIGN_UP(bootinfo.memmap.zones[i].start, FRAME_SIZE)); |
size = SIZE2FRAMES(ALIGN_DOWN(bootinfo.memmap.zones[i].size, FRAME_SIZE)); |
if ((minconf < start) || (minconf >= start + size)) |
conf = start; |
else |
conf = minconf; |
zone_create(start, size, conf, 0); |
if (last_frame < ALIGN_UP(bootinfo.memmap.zones[i].start + bootinfo.memmap.zones[i].size, FRAME_SIZE)) |
last_frame = ALIGN_UP(bootinfo.memmap.zones[i].start + bootinfo.memmap.zones[i].size, FRAME_SIZE); |
} |
/* First is exception vector, second is 'implementation specific', |
third and fourth is reserved, other contain real mode code */ |
frame_mark_unavailable(0, 8); |
/* Mark the Page Hash Table frames as unavailable */ |
uint32_t sdr1; |
asm volatile ( |
"mfsdr1 %0\n" |
: "=r" (sdr1) |
); |
frame_mark_unavailable(ADDR2PFN(sdr1 & 0xffff000), 16); // FIXME |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc32/src/mm/page.c |
---|
0,0 → 1,64 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc32mm |
* @{ |
*/ |
/** @file |
*/ |
#include <genarch/mm/page_pt.h> |
#include <mm/frame.h> |
#include <mm/as.h> |
#include <align.h> |
#include <config.h> |
void page_arch_init(void) |
{ |
if (config.cpu_active == 1) |
page_mapping_operations = &pt_mapping_operations; |
} |
uintptr_t hw_map(uintptr_t physaddr, size_t size) |
{ |
if (last_frame + ALIGN_UP(size, PAGE_SIZE) > KA2PA(KERNEL_ADDRESS_SPACE_END_ARCH)) |
panic("Unable to map physical memory %p (%d bytes)", physaddr, size) |
uintptr_t virtaddr = PA2KA(last_frame); |
pfn_t i; |
for (i = 0; i < ADDR2PFN(ALIGN_UP(size, PAGE_SIZE)); i++) |
page_mapping_insert(AS_KERNEL, virtaddr + PFN2ADDR(i), physaddr + PFN2ADDR(i), PAGE_NOT_CACHEABLE | PAGE_WRITE); |
last_frame = ALIGN_UP(last_frame + size, FRAME_SIZE); |
return virtaddr; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc32/src/mm/as.c |
---|
0,0 → 1,81 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc32mm |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/mm/as.h> |
#include <genarch/mm/as_pt.h> |
#include <genarch/mm/asid_fifo.h> |
#include <arch.h> |
/** Architecture dependent address space init. */ |
void as_arch_init(void) |
{ |
as_operations = &as_pt_operations; |
asid_fifo_init(); |
} |
/** Install address space. |
* |
* Install ASID. |
* |
* @param as Address space structure. |
* |
*/ |
void as_install_arch(as_t *as) |
{ |
asid_t asid; |
uint32_t sr; |
asid = as->asid; |
/* Lower 2 GB, user and supervisor access */ |
for (sr = 0; sr < 8; sr++) { |
asm volatile ( |
"mtsrin %0, %1\n" |
: |
: "r" ((0x6000 << 16) + (asid << 4) + sr), "r" (sr << 28) |
); |
} |
/* Upper 2 GB, only supervisor access */ |
for (sr = 8; sr < 16; sr++) { |
asm volatile ( |
"mtsrin %0, %1\n" |
: |
: "r" ((0x4000 << 16) + (asid << 4) + sr), "r" (sr << 28) |
); |
} |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc32/src/mm/tlb.c |
---|
0,0 → 1,444 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc32mm |
* @{ |
*/ |
/** @file |
*/ |
#include <mm/tlb.h> |
#include <arch/mm/tlb.h> |
#include <arch/interrupt.h> |
#include <mm/as.h> |
#include <arch.h> |
#include <print.h> |
#include <symtab.h> |
/** Try to find PTE for faulting address |
* |
* Try to find PTE for faulting address. |
* The as->lock must be held on entry to this function |
* if lock is true. |
* |
* @param as Address space. |
* @param lock Lock/unlock the address space. |
* @param badvaddr Faulting virtual address. |
* @param access Access mode that caused the fault. |
* @param istate Pointer to interrupted state. |
* @param pfrc Pointer to variable where as_page_fault() return code will be stored. |
* @return PTE on success, NULL otherwise. |
* |
*/ |
static pte_t *find_mapping_and_check(as_t *as, bool lock, uintptr_t badvaddr, int access, istate_t *istate, int *pfrc) |
{ |
/* |
* Check if the mapping exists in page tables. |
*/ |
pte_t *pte = page_mapping_find(as, badvaddr); |
if ((pte) && (pte->p)) { |
/* |
* Mapping found in page tables. |
* Immediately succeed. |
*/ |
return pte; |
} else { |
int rc; |
/* |
* Mapping not found in page tables. |
* Resort to higher-level page fault handler. |
*/ |
page_table_unlock(as, lock); |
switch (rc = as_page_fault(badvaddr, access, istate)) { |
case AS_PF_OK: |
/* |
* The higher-level page fault handler succeeded, |
* The mapping ought to be in place. |
*/ |
page_table_lock(as, lock); |
pte = page_mapping_find(as, badvaddr); |
ASSERT((pte) && (pte->p)); |
*pfrc = 0; |
return pte; |
case AS_PF_DEFER: |
page_table_lock(as, lock); |
*pfrc = rc; |
return NULL; |
case AS_PF_FAULT: |
page_table_lock(as, lock); |
printf("Page fault.\n"); |
*pfrc = rc; |
return NULL; |
default: |
panic("unexpected rc (%d)\n", rc); |
} |
} |
} |
static void pht_refill_fail(uintptr_t badvaddr, istate_t *istate) |
{ |
char *symbol = ""; |
char *sym2 = ""; |
char *s = get_symtab_entry(istate->pc); |
if (s) |
symbol = s; |
s = get_symtab_entry(istate->lr); |
if (s) |
sym2 = s; |
panic("%p: PHT Refill Exception at %p (%s<-%s)\n", badvaddr, istate->pc, symbol, sym2); |
} |
static void pht_insert(const uintptr_t vaddr, const pfn_t pfn) |
{ |
uint32_t page = (vaddr >> 12) & 0xffff; |
uint32_t api = (vaddr >> 22) & 0x3f; |
uint32_t vsid; |
asm volatile ( |
"mfsrin %0, %1\n" |
: "=r" (vsid) |
: "r" (vaddr) |
); |
uint32_t sdr1; |
asm volatile ( |
"mfsdr1 %0\n" |
: "=r" (sdr1) |
); |
phte_t *phte = (phte_t *) PA2KA(sdr1 & 0xffff0000); |
/* Primary hash (xor) */ |
uint32_t h = 0; |
uint32_t hash = vsid ^ page; |
uint32_t base = (hash & 0x3ff) << 3; |
uint32_t i; |
bool found = false; |
/* Find unused or colliding |
PTE in PTEG */ |
for (i = 0; i < 8; i++) { |
if ((!phte[base + i].v) || ((phte[base + i].vsid == vsid) && (phte[base + i].api == api))) { |
found = true; |
break; |
} |
} |
if (!found) { |
/* Secondary hash (not) */ |
uint32_t base2 = (~hash & 0x3ff) << 3; |
/* Find unused or colliding |
PTE in PTEG */ |
for (i = 0; i < 8; i++) { |
if ((!phte[base2 + i].v) || ((phte[base2 + i].vsid == vsid) && (phte[base2 + i].api == api))) { |
found = true; |
base = base2; |
h = 1; |
break; |
} |
} |
if (!found) { |
// TODO: A/C precedence groups |
i = page % 8; |
} |
} |
phte[base + i].v = 1; |
phte[base + i].vsid = vsid; |
phte[base + i].h = h; |
phte[base + i].api = api; |
phte[base + i].rpn = pfn; |
phte[base + i].r = 0; |
phte[base + i].c = 0; |
phte[base + i].pp = 2; // FIXME |
} |
static void pht_real_insert(const uintptr_t vaddr, const pfn_t pfn) |
{ |
uint32_t page = (vaddr >> 12) & 0xffff; |
uint32_t api = (vaddr >> 22) & 0x3f; |
uint32_t vsid; |
asm volatile ( |
"mfsrin %0, %1\n" |
: "=r" (vsid) |
: "r" (vaddr) |
); |
uint32_t sdr1; |
asm volatile ( |
"mfsdr1 %0\n" |
: "=r" (sdr1) |
); |
phte_t *phte_physical = (phte_t *) (sdr1 & 0xffff0000); |
/* Primary hash (xor) */ |
uint32_t h = 0; |
uint32_t hash = vsid ^ page; |
uint32_t base = (hash & 0x3ff) << 3; |
uint32_t i; |
bool found = false; |
/* Find unused or colliding |
PTE in PTEG */ |
for (i = 0; i < 8; i++) { |
if ((!phte_physical[base + i].v) || ((phte_physical[base + i].vsid == vsid) && (phte_physical[base + i].api == api))) { |
found = true; |
break; |
} |
} |
if (!found) { |
/* Secondary hash (not) */ |
uint32_t base2 = (~hash & 0x3ff) << 3; |
/* Find unused or colliding |
PTE in PTEG */ |
for (i = 0; i < 8; i++) { |
if ((!phte_physical[base2 + i].v) || ((phte_physical[base2 + i].vsid == vsid) && (phte_physical[base2 + i].api == api))) { |
found = true; |
base = base2; |
h = 1; |
break; |
} |
} |
if (!found) { |
// TODO: A/C precedence groups |
i = page % 8; |
} |
} |
phte_physical[base + i].v = 1; |
phte_physical[base + i].vsid = vsid; |
phte_physical[base + i].h = h; |
phte_physical[base + i].api = api; |
phte_physical[base + i].rpn = pfn; |
phte_physical[base + i].r = 0; |
phte_physical[base + i].c = 0; |
phte_physical[base + i].pp = 2; // FIXME |
} |
/** Process Instruction/Data Storage Interrupt |
* |
* @param n Interrupt vector number. |
* @param istate Interrupted register context. |
* |
*/ |
void pht_refill(int n, istate_t *istate) |
{ |
uintptr_t badvaddr; |
pte_t *pte; |
int pfrc; |
as_t *as; |
bool lock; |
if (AS == NULL) { |
as = AS_KERNEL; |
lock = false; |
} else { |
as = AS; |
lock = true; |
} |
if (n == VECTOR_DATA_STORAGE) { |
asm volatile ( |
"mfdar %0\n" |
: "=r" (badvaddr) |
); |
} else |
badvaddr = istate->pc; |
page_table_lock(as, lock); |
pte = find_mapping_and_check(as, lock, badvaddr, PF_ACCESS_READ /* FIXME */, istate, &pfrc); |
if (!pte) { |
switch (pfrc) { |
case AS_PF_FAULT: |
goto fail; |
break; |
case AS_PF_DEFER: |
/* |
* The page fault came during copy_from_uspace() |
* or copy_to_uspace(). |
*/ |
page_table_unlock(as, lock); |
return; |
default: |
panic("Unexpected pfrc (%d)\n", pfrc); |
} |
} |
pte->a = 1; /* Record access to PTE */ |
pht_insert(badvaddr, pte->pfn); |
page_table_unlock(as, lock); |
return; |
fail: |
page_table_unlock(as, lock); |
pht_refill_fail(badvaddr, istate); |
} |
/** Process Instruction/Data Storage Interrupt in Real Mode |
* |
* @param n Interrupt vector number. |
* @param istate Interrupted register context. |
* |
*/ |
bool pht_real_refill(int n, istate_t *istate) |
{ |
uintptr_t badvaddr; |
if (n == VECTOR_DATA_STORAGE) { |
asm volatile ( |
"mfdar %0\n" |
: "=r" (badvaddr) |
); |
} else |
badvaddr = istate->pc; |
uint32_t physmem; |
asm volatile ( |
"mfsprg3 %0\n" |
: "=r" (physmem) |
); |
if ((badvaddr >= PA2KA(0)) && (badvaddr < PA2KA(physmem))) { |
pht_real_insert(badvaddr, KA2PA(badvaddr) >> 12); |
return true; |
} |
return false; |
} |
void tlb_arch_init(void) |
{ |
tlb_invalidate_all(); |
} |
void tlb_invalidate_all(void) |
{ |
asm volatile ( |
"tlbia\n" |
"tlbsync\n" |
); |
} |
void tlb_invalidate_asid(asid_t asid) |
{ |
uint32_t sdr1; |
asm volatile ( |
"mfsdr1 %0\n" |
: "=r" (sdr1) |
); |
phte_t *phte = (phte_t *) PA2KA(sdr1 & 0xffff0000); |
uint32_t i; |
for (i = 0; i < 8192; i++) { |
if ((phte[i].v) && (phte[i].vsid >= (asid << 4)) && (phte[i].vsid < ((asid << 4) + 16))) |
phte[i].v = 0; |
} |
tlb_invalidate_all(); |
} |
void tlb_invalidate_pages(asid_t asid, uintptr_t page, count_t cnt) |
{ |
// TODO |
tlb_invalidate_all(); |
} |
#define PRINT_BAT(name, ureg, lreg) \ |
asm volatile ( \ |
"mfspr %0," #ureg "\n" \ |
"mfspr %1," #lreg "\n" \ |
: "=r" (upper), "=r" (lower) \ |
); \ |
mask = (upper & 0x1ffc) >> 2; \ |
if (upper & 3) { \ |
uint32_t tmp = mask; \ |
length = 128; \ |
while (tmp) { \ |
if ((tmp & 1) == 0) { \ |
printf("ibat[0]: error in mask\n"); \ |
break; \ |
} \ |
length <<= 1; \ |
tmp >>= 1; \ |
} \ |
} else \ |
length = 0; \ |
printf(name ": page=%.*p frame=%.*p length=%d KB (mask=%#x)%s%s\n", sizeof(upper) * 2, upper & 0xffff0000, sizeof(lower) * 2, lower & 0xffff0000, length, mask, ((upper >> 1) & 1) ? " supervisor" : "", (upper & 1) ? " user" : ""); |
void tlb_print(void) |
{ |
uint32_t sr; |
for (sr = 0; sr < 16; sr++) { |
uint32_t vsid; |
asm volatile ( |
"mfsrin %0, %1\n" |
: "=r" (vsid) |
: "r" (sr << 28) |
); |
printf("vsid[%d]: VSID=%.*p (ASID=%d)%s%s\n", sr, sizeof(vsid) * 2, vsid & 0xffffff, (vsid & 0xffffff) >> 4, ((vsid >> 30) & 1) ? " supervisor" : "", ((vsid >> 29) & 1) ? " user" : ""); |
} |
uint32_t upper; |
uint32_t lower; |
uint32_t mask; |
uint32_t length; |
PRINT_BAT("ibat[0]", 528, 529); |
PRINT_BAT("ibat[1]", 530, 531); |
PRINT_BAT("ibat[2]", 532, 533); |
PRINT_BAT("ibat[3]", 534, 535); |
PRINT_BAT("dbat[0]", 536, 537); |
PRINT_BAT("dbat[1]", 538, 539); |
PRINT_BAT("dbat[2]", 540, 541); |
PRINT_BAT("dbat[3]", 542, 543); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc32/src/drivers/cuda.c |
---|
0,0 → 1,355 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc32 |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/drivers/cuda.h> |
#include <ipc/irq.h> |
#include <arch/asm.h> |
#include <console/console.h> |
#include <console/chardev.h> |
#include <arch/drivers/pic.h> |
#include <sysinfo/sysinfo.h> |
#include <interrupt.h> |
#include <stdarg.h> |
#define CUDA_IRQ 10 |
#define SPECIAL '?' |
#define PACKET_ADB 0x00 |
#define PACKET_CUDA 0x01 |
#define CUDA_POWERDOWN 0x0a |
#define CUDA_RESET 0x11 |
#define RS 0x200 |
#define B (0 * RS) |
#define A (1 * RS) |
#define SR (10 * RS) |
#define ACR (11 * RS) |
#define SR_OUT 0x10 |
#define TACK 0x10 |
#define TIP 0x20 |
static volatile uint8_t *cuda = NULL; |
static irq_t cuda_irq; /**< Cuda's IRQ. */ |
static char lchars[0x80] = { |
'a', |
's', |
'd', |
'f', |
'h', |
'g', |
'z', |
'x', |
'c', |
'v', |
SPECIAL, |
'b', |
'q', |
'w', |
'e', |
'r', |
'y', |
't', |
'1', |
'2', |
'3', |
'4', |
'6', |
'5', |
'=', |
'9', |
'7', |
'-', |
'8', |
'0', |
']', |
'o', |
'u', |
'[', |
'i', |
'p', |
'\n', /* Enter */ |
'l', |
'j', |
'\'', |
'k', |
';', |
'\\', |
',', |
'/', |
'n', |
'm', |
'.', |
'\t', /* Tab */ |
' ', |
'`', |
'\b', /* Backspace */ |
SPECIAL, |
SPECIAL, /* Escape */ |
SPECIAL, /* Ctrl */ |
SPECIAL, /* Alt */ |
SPECIAL, /* Shift */ |
SPECIAL, /* Caps-Lock */ |
SPECIAL, /* RAlt */ |
SPECIAL, /* Left */ |
SPECIAL, /* Right */ |
SPECIAL, /* Down */ |
SPECIAL, /* Up */ |
SPECIAL, |
SPECIAL, |
'.', /* Keypad . */ |
SPECIAL, |
'*', /* Keypad * */ |
SPECIAL, |
'+', /* Keypad + */ |
SPECIAL, |
SPECIAL, /* NumLock */ |
SPECIAL, |
SPECIAL, |
SPECIAL, |
'/', /* Keypad / */ |
'\n', /* Keypad Enter */ |
SPECIAL, |
'-', /* Keypad - */ |
SPECIAL, |
SPECIAL, |
SPECIAL, |
'0', /* Keypad 0 */ |
'1', /* Keypad 1 */ |
'2', /* Keypad 2 */ |
'3', /* Keypad 3 */ |
'4', /* Keypad 4 */ |
'5', /* Keypad 5 */ |
'6', /* Keypad 6 */ |
'7', /* Keypad 7 */ |
SPECIAL, |
'8', /* Keypad 8 */ |
'9', /* Keypad 9 */ |
SPECIAL, |
SPECIAL, |
SPECIAL, |
SPECIAL, /* F5 */ |
SPECIAL, /* F6 */ |
SPECIAL, /* F7 */ |
SPECIAL, /* F3 */ |
SPECIAL, /* F8 */ |
SPECIAL, /* F9 */ |
SPECIAL, |
SPECIAL, /* F11 */ |
SPECIAL, |
SPECIAL, /* F13 */ |
SPECIAL, |
SPECIAL, /* ScrollLock */ |
SPECIAL, |
SPECIAL, /* F10 */ |
SPECIAL, |
SPECIAL, /* F12 */ |
SPECIAL, |
SPECIAL, /* Pause */ |
SPECIAL, /* Insert */ |
SPECIAL, /* Home */ |
SPECIAL, /* PageUp */ |
SPECIAL, /* Delete */ |
SPECIAL, /* F4 */ |
SPECIAL, /* End */ |
SPECIAL, /* F2 */ |
SPECIAL, /* PageDown */ |
SPECIAL /* F1 */ |
}; |
static void receive_packet(uint8_t *kind, index_t count, uint8_t data[]) |
{ |
cuda[B] = cuda[B] & ~TIP; |
*kind = cuda[SR]; |
index_t i; |
for (i = 0; i < count; i++) |
data[i] = cuda[SR]; |
cuda[B] = cuda[B] | TIP; |
} |
/* Called from getc(). */ |
static void cuda_resume(chardev_t *d) |
{ |
} |
/* Called from getc(). */ |
static void cuda_suspend(chardev_t *d) |
{ |
} |
static char key_read(chardev_t *d) |
{ |
char ch; |
ch = 0; |
return ch; |
} |
static chardev_t kbrd; |
static chardev_operations_t ops = { |
.suspend = cuda_suspend, |
.resume = cuda_resume, |
.read = key_read |
}; |
int cuda_get_scancode(void) |
{ |
uint8_t kind; |
uint8_t data[4]; |
receive_packet(&kind, 4, data); |
if ((kind == PACKET_ADB) && (data[0] == 0x40) && (data[1] == 0x2c)) |
return data[2]; |
return -1; |
} |
static void cuda_irq_handler(irq_t *irq, void *arg, ...) |
{ |
if ((irq->notif_cfg.notify) && (irq->notif_cfg.answerbox)) |
ipc_irq_send_notif(irq); |
else { |
int scan_code = cuda_get_scancode(); |
if (scan_code != -1) { |
uint8_t scancode = (uint8_t) scan_code; |
if ((scancode & 0x80) != 0x80) |
chardev_push_character(&kbrd, lchars[scancode & 0x7f]); |
} |
} |
} |
static irq_ownership_t cuda_claim(void) |
{ |
return IRQ_ACCEPT; |
} |
/** Initialize keyboard and service interrupts using kernel routine */ |
void cuda_grab(void) |
{ |
ipl_t ipl = interrupts_disable(); |
spinlock_lock(&cuda_irq.lock); |
cuda_irq.notif_cfg.notify = false; |
spinlock_unlock(&cuda_irq.lock); |
interrupts_restore(ipl); |
} |
/** Resume the former interrupt vector */ |
void cuda_release(void) |
{ |
ipl_t ipl = interrupts_disable(); |
spinlock_lock(&cuda_irq.lock); |
if (cuda_irq.notif_cfg.answerbox) |
cuda_irq.notif_cfg.notify = true; |
spinlock_unlock(&cuda_irq.unlock); |
interrupts_restore(ipl); |
} |
void cuda_init(devno_t devno, uintptr_t base, size_t size) |
{ |
cuda = (uint8_t *) hw_map(base, size); |
chardev_initialize("cuda_kbd", &kbrd, &ops); |
stdin = &kbrd; |
irq_initialize(&cuda_irq); |
cuda_irq.devno = devno; |
cuda_irq.inr = CUDA_IRQ; |
cuda_irq.claim = cuda_claim; |
cuda_irq.handler = cuda_irq_handler; |
irq_register(&cuda_irq); |
pic_enable_interrupt(CUDA_IRQ); |
sysinfo_set_item_val("kbd", NULL, true); |
sysinfo_set_item_val("kbd.devno", NULL, devno); |
sysinfo_set_item_val("kbd.inr", NULL, CUDA_IRQ); |
sysinfo_set_item_val("kbd.address.virtual", NULL, base); |
} |
static void send_packet(const uint8_t kind, count_t count, ...) |
{ |
index_t i; |
va_list va; |
cuda[B] = cuda[B] | TIP; |
cuda[ACR] = cuda[ACR] | SR_OUT; |
cuda[SR] = kind; |
cuda[B] = cuda[B] & ~TIP; |
va_start(va, count); |
for (i = 0; i < count; i++) { |
cuda[ACR] = cuda[ACR] | SR_OUT; |
cuda[SR] = va_arg(va, int); |
cuda[B] = cuda[B] | TACK; |
} |
va_end(va); |
cuda[B] = cuda[B] | TIP; |
} |
void cpu_halt(void) { |
asm volatile ( |
"b 0\n" |
); |
} |
void arch_reboot(void) { |
send_packet(PACKET_CUDA, 1, CUDA_RESET); |
asm volatile ( |
"b 0\n" |
); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc32/src/drivers/pic.c |
---|
0,0 → 1,92 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc32 |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/drivers/pic.h> |
#include <mm/page.h> |
#include <byteorder.h> |
#include <bitops.h> |
static volatile uint32_t *pic; |
void pic_init(uintptr_t base, size_t size) |
{ |
pic = (uint32_t *) hw_map(base, size); |
} |
void pic_enable_interrupt(int intnum) |
{ |
if (intnum < 32) { |
pic[PIC_MASK_LOW] = pic[PIC_MASK_LOW] | (1 << intnum); |
} else { |
pic[PIC_MASK_HIGH] = pic[PIC_MASK_HIGH] | (1 << (intnum - 32)); |
} |
} |
void pic_disable_interrupt(int intnum) |
{ |
if (intnum < 32) { |
pic[PIC_MASK_LOW] = pic[PIC_MASK_LOW] & (~(1 << intnum)); |
} else { |
pic[PIC_MASK_HIGH] = pic[PIC_MASK_HIGH] & (~(1 << (intnum - 32))); |
} |
} |
void pic_ack_interrupt(int intnum) |
{ |
if (intnum < 32) |
pic[PIC_ACK_LOW] = 1 << intnum; |
else |
pic[PIC_ACK_HIGH] = 1 << (intnum - 32); |
} |
/** Return number of pending interrupt */ |
int pic_get_pending(void) |
{ |
int pending; |
pending = pic[PIC_PENDING_LOW]; |
if (pending) |
return fnzb32(pending); |
pending = pic[PIC_PENDING_HIGH]; |
if (pending) |
return fnzb32(pending) + 32; |
return -1; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc32/src/interrupt.c |
---|
0,0 → 1,110 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc32interrupt |
* @{ |
*/ |
/** @file |
*/ |
#include <ddi/irq.h> |
#include <interrupt.h> |
#include <arch/interrupt.h> |
#include <arch/types.h> |
#include <arch.h> |
#include <time/clock.h> |
#include <ipc/sysipc.h> |
#include <arch/drivers/pic.h> |
#include <arch/mm/tlb.h> |
#include <print.h> |
void start_decrementer(void) |
{ |
asm volatile ( |
"mtdec %0\n" |
: |
: "r" (1000) |
); |
} |
/** Handler of external interrupts */ |
static void exception_external(int n, istate_t *istate) |
{ |
int inum; |
while ((inum = pic_get_pending()) != -1) { |
bool ack = false; |
irq_t *irq = irq_dispatch_and_lock(inum); |
if (irq) { |
/* |
* The IRQ handler was found. |
*/ |
if (irq->preack) { |
/* Acknowledge the interrupt before processing */ |
pic_ack_interrupt(inum); |
ack = true; |
} |
irq->handler(irq, irq->arg); |
spinlock_unlock(&irq->lock); |
} else { |
/* |
* Spurious interrupt. |
*/ |
#ifdef CONFIG_DEBUG |
printf("cpu%d: spurious interrupt (inum=%d)\n", CPU->id, inum); |
#endif |
} |
if (!ack) |
pic_ack_interrupt(inum); |
} |
} |
static void exception_decrementer(int n, istate_t *istate) |
{ |
clock(); |
start_decrementer(); |
} |
/* Initialize basic tables for exception dispatching */ |
void interrupt_init(void) |
{ |
exc_register(VECTOR_DATA_STORAGE, "data_storage", pht_refill); |
exc_register(VECTOR_INSTRUCTION_STORAGE, "instruction_storage", pht_refill); |
exc_register(VECTOR_EXTERNAL, "external", exception_external); |
exc_register(VECTOR_DECREMENTER, "timer", exception_decrementer); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc32/src/ddi/ddi.c |
---|
0,0 → 1,55 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc32ddi |
* @{ |
*/ |
/** @file |
*/ |
#include <ddi/ddi.h> |
#include <proc/task.h> |
#include <arch/types.h> |
/** Enable I/O space range for task. |
* |
* Interrupts are disabled and task is locked. |
* |
* @param task Task. |
* @param ioaddr Startign I/O space address. |
* @param size Size of the enabled I/O range. |
* |
* @return 0 on success or an error code from errno.h. |
*/ |
int ddi_iospace_enable_arch(task_t *task, uintptr_t ioaddr, size_t size) |
{ |
return 0; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc32/src/cpu/cpu.c |
---|
0,0 → 1,79 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc32 |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/cpu.h> |
#include <arch/cpuid.h> |
#include <cpu.h> |
#include <arch.h> |
#include <print.h> |
void cpu_arch_init(void) |
{ |
} |
void cpu_identify(void) |
{ |
cpu_info_t info; |
cpu_version(&info); |
CPU->arch.version = info.version; |
CPU->arch.revision = info.revision; |
} |
void cpu_print_report(cpu_t *m) |
{ |
char *name; |
switch (m->arch.version) { |
case 8: |
name = " (PowerPC 750)"; |
break; |
case 9: |
name = " (PowerPC 604e)"; |
break; |
case 0x81: |
name = " (PowerPC 8260)"; |
break; |
case 0x8081: |
name = " (PowerPC 826xA)"; |
break; |
default: |
name = ""; |
} |
printf("cpu%d: version=%d%s, revision=%d\n", m->id, m->arch.version, name, m->arch.revision); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc32/src/exception.S |
---|
0,0 → 1,328 |
# |
# Copyright (c) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
#include <arch/asm/regname.h> |
#include <arch/mm/page.h> |
.section K_UNMAPPED_TEXT_START, "ax" |
.macro CONTEXT_STORE |
# save R12 in SPRG1, backup CR in R12 |
# save SP in SPRG2 |
mtsprg1 r12 |
mfcr r12 |
mtsprg2 sp |
# check whether SP is in kernel |
andis. sp, sp, 0x8000 |
bne 1f |
# stack is in user-space |
mfsprg0 sp |
b 2f |
1: |
# stack is in kernel |
mfsprg2 sp |
subis sp, sp, 0x8000 |
2: |
subi sp, sp, 160 |
stw r0, 8(sp) |
stw r2, 12(sp) |
stw r3, 16(sp) |
stw r4, 20(sp) |
stw r5, 24(sp) |
stw r6, 28(sp) |
stw r7, 32(sp) |
stw r8, 36(sp) |
stw r9, 40(sp) |
stw r10, 44(sp) |
stw r11, 48(sp) |
stw r13, 52(sp) |
stw r14, 56(sp) |
stw r15, 60(sp) |
stw r16, 64(sp) |
stw r17, 68(sp) |
stw r18, 72(sp) |
stw r19, 76(sp) |
stw r20, 80(sp) |
stw r21, 84(sp) |
stw r22, 88(sp) |
stw r23, 92(sp) |
stw r24, 96(sp) |
stw r25, 100(sp) |
stw r26, 104(sp) |
stw r27, 108(sp) |
stw r28, 112(sp) |
stw r29, 116(sp) |
stw r30, 120(sp) |
stw r31, 124(sp) |
stw r12, 128(sp) |
mfsrr0 r12 |
stw r12, 132(sp) |
mfsrr1 r12 |
stw r12, 136(sp) |
mflr r12 |
stw r12, 140(sp) |
mfctr r12 |
stw r12, 144(sp) |
mfxer r12 |
stw r12, 148(sp) |
mfsprg1 r12 |
stw r12, 152(sp) |
mfsprg2 r12 |
stw r12, 156(sp) |
.endm |
.org 0x100 |
.global exc_system_reset |
exc_system_reset: |
CONTEXT_STORE |
li r3, 0 |
b jump_to_kernel |
.org 0x200 |
.global exc_machine_check |
exc_machine_check: |
CONTEXT_STORE |
li r3, 1 |
b jump_to_kernel |
.org 0x300 |
.global exc_data_storage |
exc_data_storage: |
CONTEXT_STORE |
li r3, 2 |
mr r4, sp |
addi r4, r4, 8 |
bl pht_real_refill |
cmpwi r3, 0 |
bne iret_real |
li r3, 2 |
b jump_to_kernel |
.org 0x400 |
.global exc_instruction_storage |
exc_instruction_storage: |
CONTEXT_STORE |
li r3, 3 |
mr r4, sp |
addi r4, r4, 8 |
bl pht_real_refill |
cmpwi r3, 0 |
bne iret_real |
li r3, 3 |
b jump_to_kernel |
.org 0x500 |
.global exc_external |
exc_external: |
CONTEXT_STORE |
li r3, 4 |
b jump_to_kernel |
.org 0x600 |
.global exc_alignment |
exc_alignment: |
CONTEXT_STORE |
li r3, 5 |
b jump_to_kernel |
.org 0x700 |
.global exc_program |
exc_program: |
CONTEXT_STORE |
li r3, 6 |
b jump_to_kernel |
.org 0x800 |
.global exc_fp_unavailable |
exc_fp_unavailable: |
CONTEXT_STORE |
li r3, 7 |
b jump_to_kernel |
.org 0x900 |
.global exc_decrementer |
exc_decrementer: |
CONTEXT_STORE |
li r3, 8 |
b jump_to_kernel |
.org 0xa00 |
.global exc_reserved0 |
exc_reserved0: |
CONTEXT_STORE |
li r3, 9 |
b jump_to_kernel |
.org 0xb00 |
.global exc_reserved1 |
exc_reserved1: |
CONTEXT_STORE |
li r3, 10 |
b jump_to_kernel |
.org 0xc00 |
.global exc_syscall |
exc_syscall: |
CONTEXT_STORE |
b jump_to_kernel_syscall |
.org 0xd00 |
.global exc_trace |
exc_trace: |
CONTEXT_STORE |
li r3, 12 |
b jump_to_kernel |
.org 0x4000 |
jump_to_kernel: |
lis r12, iret@ha |
addi r12, r12, iret@l |
mtlr r12 |
lis r12, exc_dispatch@ha |
addi r12, r12, exc_dispatch@l |
mtsrr0 r12 |
mfmsr r12 |
ori r12, r12, (msr_ir | msr_dr)@l |
mtsrr1 r12 |
addis sp, sp, 0x8000 |
mr r4, sp |
addi r4, r4, 8 |
rfi |
jump_to_kernel_syscall: |
lis r12, syscall_handler@ha |
addi r12, r12, syscall_handler@l |
mtsrr0 r12 |
lis r12, iret_syscall@ha |
addi r12, r12, iret_syscall@l |
mtlr r12 |
mfmsr r12 |
ori r12, r12, (msr_ir | msr_dr)@l |
mtsrr1 r12 |
addis sp, sp, 0x8000 |
rfi |
iret_real: |
lwz r0, 8(sp) |
lwz r2, 12(sp) |
lwz r3, 16(sp) |
lwz r4, 20(sp) |
lwz r5, 24(sp) |
lwz r6, 28(sp) |
lwz r7, 32(sp) |
lwz r8, 36(sp) |
lwz r9, 40(sp) |
lwz r10, 44(sp) |
lwz r11, 48(sp) |
lwz r13, 52(sp) |
lwz r14, 56(sp) |
lwz r15, 60(sp) |
lwz r16, 64(sp) |
lwz r17, 68(sp) |
lwz r18, 72(sp) |
lwz r19, 76(sp) |
lwz r20, 80(sp) |
lwz r21, 84(sp) |
lwz r22, 88(sp) |
lwz r23, 92(sp) |
lwz r24, 96(sp) |
lwz r25, 100(sp) |
lwz r26, 104(sp) |
lwz r27, 108(sp) |
lwz r28, 112(sp) |
lwz r29, 116(sp) |
lwz r30, 120(sp) |
lwz r31, 124(sp) |
lwz r12, 128(sp) |
mtcr r12 |
lwz r12, 132(sp) |
mtsrr0 r12 |
lwz r12, 136(sp) |
mtsrr1 r12 |
lwz r12, 140(sp) |
mtlr r12 |
lwz r12, 144(sp) |
mtctr r12 |
lwz r12, 148(sp) |
mtxer r12 |
lwz r12, 152(sp) |
lwz sp, 156(sp) |
rfi |
/tags/0.3.0/kernel/arch/ppc32/src/fpu_context.S |
---|
0,0 → 1,105 |
# |
# Copyright (c) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
#include <arch/asm/regname.h> |
#include <arch/context_offset.h> |
.text |
.global fpu_context_save |
.global fpu_context_restore |
.global fpu_init |
.global fpu_enable |
.global fpu_disable |
.macro FPU_CONTEXT_STORE r |
stfd fr14, OFFSET_FR14(\r) |
stfd fr15, OFFSET_FR15(\r) |
stfd fr16, OFFSET_FR16(\r) |
stfd fr17, OFFSET_FR17(\r) |
stfd fr18, OFFSET_FR18(\r) |
stfd fr19, OFFSET_FR19(\r) |
stfd fr20, OFFSET_FR20(\r) |
stfd fr21, OFFSET_FR21(\r) |
stfd fr22, OFFSET_FR22(\r) |
stfd fr23, OFFSET_FR23(\r) |
stfd fr24, OFFSET_FR24(\r) |
stfd fr25, OFFSET_FR25(\r) |
stfd fr26, OFFSET_FR26(\r) |
stfd fr27, OFFSET_FR27(\r) |
stfd fr28, OFFSET_FR28(\r) |
stfd fr29, OFFSET_FR29(\r) |
stfd fr30, OFFSET_FR30(\r) |
stfd fr31, OFFSET_FR31(\r) |
.endm |
.macro FPU_CONTEXT_LOAD r |
lfd fr14, OFFSET_FR14(\r) |
lfd fr15, OFFSET_FR15(\r) |
lfd fr16, OFFSET_FR16(\r) |
lfd fr17, OFFSET_FR17(\r) |
lfd fr18, OFFSET_FR18(\r) |
lfd fr19, OFFSET_FR19(\r) |
lfd fr20, OFFSET_FR20(\r) |
lfd fr21, OFFSET_FR21(\r) |
lfd fr22, OFFSET_FR22(\r) |
lfd fr23, OFFSET_FR23(\r) |
lfd fr24, OFFSET_FR24(\r) |
lfd fr25, OFFSET_FR25(\r) |
lfd fr26, OFFSET_FR26(\r) |
lfd fr27, OFFSET_FR27(\r) |
lfd fr28, OFFSET_FR28(\r) |
lfd fr29, OFFSET_FR29(\r) |
lfd fr30, OFFSET_FR30(\r) |
lfd fr31, OFFSET_FR31(\r) |
.endm |
fpu_context_save: |
// FPU_CONTEXT_STORE r3 |
// |
// mffs fr0 |
// stfd fr0, OFFSET_FPSCR(r3) |
blr |
fpu_context_restore: |
// FPU_CONTEXT_LOAD r3 |
// |
// lfd fr0, OFFSET_FPSCR(r3) |
// mtfsf 7, fr0 |
blr |
fpu_init: |
blr |
fpu_enable: |
blr |
fpu_disable: |
blr |
/tags/0.3.0/kernel/arch/ppc32/src/asm.S |
---|
0,0 → 1,311 |
# |
# Copyright (c) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
#include <arch/asm/regname.h> |
.text |
.global userspace_asm |
.global iret |
.global iret_syscall |
.global memsetb |
.global memcpy |
.global memcpy_from_uspace |
.global memcpy_to_uspace |
.global memcpy_from_uspace_failover_address |
.global memcpy_to_uspace_failover_address |
userspace_asm: |
# r3 = uspace_uarg |
# r4 = stack |
# r5 = entry |
# disable interrupts |
mfmsr r31 |
rlwinm r31, r31, 0, 17, 15 |
mtmsr r31 |
# set entry point |
mtsrr0 r5 |
# set problem state, enable interrupts |
ori r31, r31, msr_pr |
ori r31, r31, msr_ee |
mtsrr1 r31 |
# set stack |
mr sp, r4 |
# jump to userspace |
rfi |
iret: |
# disable interrupts |
mfmsr r31 |
rlwinm r31, r31, 0, 17, 15 |
mtmsr r31 |
lwz r0, 8(sp) |
lwz r2, 12(sp) |
lwz r3, 16(sp) |
lwz r4, 20(sp) |
lwz r5, 24(sp) |
lwz r6, 28(sp) |
lwz r7, 32(sp) |
lwz r8, 36(sp) |
lwz r9, 40(sp) |
lwz r10, 44(sp) |
lwz r11, 48(sp) |
lwz r13, 52(sp) |
lwz r14, 56(sp) |
lwz r15, 60(sp) |
lwz r16, 64(sp) |
lwz r17, 68(sp) |
lwz r18, 72(sp) |
lwz r19, 76(sp) |
lwz r20, 80(sp) |
lwz r21, 84(sp) |
lwz r22, 88(sp) |
lwz r23, 92(sp) |
lwz r24, 96(sp) |
lwz r25, 100(sp) |
lwz r26, 104(sp) |
lwz r27, 108(sp) |
lwz r28, 112(sp) |
lwz r29, 116(sp) |
lwz r30, 120(sp) |
lwz r31, 124(sp) |
lwz r12, 128(sp) |
mtcr r12 |
lwz r12, 132(sp) |
mtsrr0 r12 |
lwz r12, 136(sp) |
mtsrr1 r12 |
lwz r12, 140(sp) |
mtlr r12 |
lwz r12, 144(sp) |
mtctr r12 |
lwz r12, 148(sp) |
mtxer r12 |
lwz r12, 152(sp) |
lwz sp, 156(sp) |
rfi |
iret_syscall: |
# reset decrementer |
li r31, 1000 |
mtdec r31 |
# disable interrupts |
mfmsr r31 |
rlwinm r31, r31, 0, 17, 15 |
mtmsr r31 |
lwz r0, 8(sp) |
lwz r2, 12(sp) |
lwz r4, 20(sp) |
lwz r5, 24(sp) |
lwz r6, 28(sp) |
lwz r7, 32(sp) |
lwz r8, 36(sp) |
lwz r9, 40(sp) |
lwz r10, 44(sp) |
lwz r11, 48(sp) |
lwz r13, 52(sp) |
lwz r14, 56(sp) |
lwz r15, 60(sp) |
lwz r16, 64(sp) |
lwz r17, 68(sp) |
lwz r18, 72(sp) |
lwz r19, 76(sp) |
lwz r20, 80(sp) |
lwz r21, 84(sp) |
lwz r22, 88(sp) |
lwz r23, 92(sp) |
lwz r24, 96(sp) |
lwz r25, 100(sp) |
lwz r26, 104(sp) |
lwz r27, 108(sp) |
lwz r28, 112(sp) |
lwz r29, 116(sp) |
lwz r30, 120(sp) |
lwz r31, 124(sp) |
lwz r12, 128(sp) |
mtcr r12 |
lwz r12, 132(sp) |
mtsrr0 r12 |
lwz r12, 136(sp) |
mtsrr1 r12 |
lwz r12, 140(sp) |
mtlr r12 |
lwz r12, 144(sp) |
mtctr r12 |
lwz r12, 148(sp) |
mtxer r12 |
lwz r12, 152(sp) |
lwz sp, 156(sp) |
rfi |
memsetb: |
rlwimi r5, r5, 8, 16, 23 |
rlwimi r5, r5, 16, 0, 15 |
addi r14, r3, -4 |
cmplwi 0, r4, 4 |
blt 7f |
stwu r5, 4(r14) |
beqlr |
andi. r15, r14, 3 |
add r4, r15, r4 |
subf r14, r15, r14 |
srwi r15, r4, 2 |
mtctr r15 |
bdz 6f |
1: |
stwu r5, 4(r14) |
bdnz 1b |
6: |
andi. r4, r4, 3 |
7: |
cmpwi 0, r4, 0 |
beqlr |
mtctr r4 |
addi r6, r6, 3 |
8: |
stbu r5, 1(r14) |
bdnz 8b |
blr |
memcpy: |
memcpy_from_uspace: |
memcpy_to_uspace: |
srwi. r7, r5, 3 |
addi r6, r3, -4 |
addi r4, r4, -4 |
beq 2f |
andi. r0, r6, 3 |
mtctr r7 |
bne 5f |
1: |
lwz r7, 4(r4) |
lwzu r8, 8(r4) |
stw r7, 4(r6) |
stwu r8, 8(r6) |
bdnz 1b |
andi. r5, r5, 7 |
2: |
cmplwi 0, r5, 4 |
blt 3f |
lwzu r0, 4(r4) |
addi r5, r5, -4 |
stwu r0, 4(r6) |
3: |
cmpwi 0, r5, 0 |
beqlr |
mtctr r5 |
addi r4, r4, 3 |
addi r6, r6, 3 |
4: |
lbzu r0, 1(r4) |
stbu r0, 1(r6) |
bdnz 4b |
blr |
5: |
subfic r0, r0, 4 |
mtctr r0 |
6: |
lbz r7, 4(r4) |
addi r4, r4, 1 |
stb r7, 4(r6) |
addi r6, r6, 1 |
bdnz 6b |
subf r5, r0, r5 |
rlwinm. r7, r5, 32-3, 3, 31 |
beq 2b |
mtctr r7 |
b 1b |
memcpy_from_uspace_failover_address: |
memcpy_to_uspace_failover_address: |
b memcpy_from_uspace_failover_address |
/tags/0.3.0/kernel/arch/ppc32/src/boot/boot.S |
---|
0,0 → 1,81 |
# |
# Copyright (c) 2005 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
#include <arch/asm/regname.h> |
#include <arch/boot/boot.h> |
.section K_TEXT_START, "ax" |
.global kernel_image_start |
kernel_image_start: |
# load temporal kernel stack |
lis sp, kernel_stack@ha |
addi sp, sp, kernel_stack@l |
# set kernel stack for interrupt handling |
mr r31, sp |
subis r31, r31, 0x8000 |
mtsprg0 r31 |
# r3 contains physical address of bootinfo_t |
# r4 contains size of bootinfo_t |
cmpwi r4, 0 |
beq bootinfo_end |
addis r3, r3, 0x8000 |
lis r31, bootinfo@ha |
addi r31, r31, bootinfo@l # r31 = bootinfo |
bootinfo_loop: |
lwz r30, 0(r3) |
stw r30, 0(r31) |
addi r3, r3, 4 |
addi r31, r31, 4 |
subi r4, r4, 4 |
cmpwi r4, 0 |
bgt bootinfo_loop |
bootinfo_end: |
bl arch_pre_main |
b main_bsp |
.section K_DATA_START, "aw", @progbits |
.align 12 |
kernel_stack_bottom: |
.space TEMP_STACK_SIZE |
kernel_stack: |
/tags/0.3.0/kernel/arch/ppc32/src/proc/scheduler.c |
---|
0,0 → 1,62 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc32proc |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/mm/page.h> |
#include <arch/boot/boot.h> |
#include <proc/scheduler.h> |
#include <proc/thread.h> |
#include <arch.h> |
/** Perform ppc32 specific tasks needed before the new task is run. */ |
void before_task_runs_arch(void) |
{ |
} |
/** Perform ppc32 specific tasks needed before the new thread is scheduled. */ |
void before_thread_runs_arch(void) |
{ |
tlb_invalidate_all(); |
asm volatile ( |
"mtsprg0 %0\n" |
: |
: "r" (KA2PA(&THREAD->kstack[THREAD_STACK_SIZE - SP_DELTA])) |
); |
} |
void after_thread_ran_arch(void) |
{ |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc32/src/debug/panic.s |
---|
0,0 → 1,38 |
# |
# Copyright (c) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
#include <arch/asm/macro.h> |
.text |
.global panic_printf |
panic_printf: |
lis %r14, halt@ha |
addi %r14, %r14, halt@l |
mtlr %r14 # fake stack to make printf return to halt |
b printf |
/tags/0.3.0/kernel/arch/ppc32/src/dummy.s |
---|
0,0 → 1,38 |
# |
# Copyright (c) 2005 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
.text |
.global asm_delay_loop |
.global sys_tls_set |
sys_tls_set: |
b sys_tls_set |
asm_delay_loop: |
blr |
/tags/0.3.0/kernel/arch/ppc32/Makefile.inc |
---|
0,0 → 1,84 |
# |
# Copyright (c) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
## Toolchain configuration |
# |
BFD_NAME = elf32-powerpc |
BFD_ARCH = powerpc:common |
BFD = binary |
TARGET = ppc-linux-gnu |
TOOLCHAIN_DIR = /usr/local/ppc |
GCC_CFLAGS += -mcpu=powerpc -msoft-float -m32 |
AFLAGS += -a32 |
LFLAGS += -no-check-sections -N |
DEFS += -D__32_BITS__ |
## Own configuration directives |
# |
CONFIG_FB = y |
## Compile with hierarchical page tables support. |
# |
CONFIG_PAGE_PT = y |
DEFS += -DCONFIG_PAGE_PT |
## Compile with support for address space identifiers. |
# |
CONFIG_ASID = y |
CONFIG_ASID_FIFO = y |
## Compile with support for software integer division. |
# |
CONFIG_SOFTINT = y |
ARCH_SOURCES = \ |
arch/$(ARCH)/src/context.S \ |
arch/$(ARCH)/src/debug/panic.s \ |
arch/$(ARCH)/src/fpu_context.S \ |
arch/$(ARCH)/src/boot/boot.S \ |
arch/$(ARCH)/src/ppc32.c \ |
arch/$(ARCH)/src/dummy.s \ |
arch/$(ARCH)/src/exception.S \ |
arch/$(ARCH)/src/interrupt.c \ |
arch/$(ARCH)/src/asm.S \ |
arch/$(ARCH)/src/cpu/cpu.c \ |
arch/$(ARCH)/src/proc/scheduler.c \ |
arch/$(ARCH)/src/ddi/ddi.c \ |
arch/$(ARCH)/src/drivers/cuda.c \ |
arch/$(ARCH)/src/mm/as.c \ |
arch/$(ARCH)/src/mm/frame.c \ |
arch/$(ARCH)/src/mm/page.c \ |
arch/$(ARCH)/src/mm/tlb.c \ |
arch/$(ARCH)/src/drivers/pic.c |
/tags/0.3.0/kernel/arch/ppc32/_link.ld.in |
---|
0,0 → 1,58 |
/** PPC32 linker script |
* |
* umapped section: |
* kernel text |
* kernel data |
* mapped section: |
* kernel text |
* kernel data |
* |
*/ |
#include <arch/boot/boot.h> |
#include <arch/mm/page.h> |
ENTRY(kernel_image_start) |
OUTPUT_FORMAT("elf32-powerpc") |
OUTPUT_ARCH("powerpc:common") |
SECTIONS { |
.unmapped 0: AT (0) { |
unmapped_ktext_start = .; |
*(K_UNMAPPED_TEXT_START); |
unmapped_ktext_end = .; |
unmapped_kdata_start = .; |
*(K_UNMAPPED_DATA_START); |
unmapped_kdata_start = .; |
} |
.mapped PA2KA(BOOT_OFFSET): AT (BOOT_OFFSET) { |
ktext_start = .; |
*(K_TEXT_START); |
*(.text); |
ktext_end = .; |
kdata_start = .; |
*(K_DATA_START); |
*(.rodata); |
*(.rodata.*); |
*(.data); /* initialized data */ |
*(.sdata); |
*(.sdata2); |
*(.sbss); |
hardcoded_ktext_size = .; |
LONG(ktext_end - ktext_start); |
hardcoded_kdata_size = .; |
LONG(kdata_end - kdata_start); |
hardcoded_load_address = .; |
LONG(PA2KA(BOOT_OFFSET)); |
*(.bss); /* uninitialized static variables */ |
*(COMMON); /* global variables */ |
symbol_table = .; |
*(symtab.*); /* Symbol table, must be LAST symbol!*/ |
kdata_end = .; |
} |
} |
/tags/0.3.0/kernel/arch/ia32xen/include/context_offset.h |
---|
0,0 → 1,0 |
link ../../ia32/include/context_offset.h |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/arch/ia32xen/include/mm/frame.h |
---|
0,0 → 1,57 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32xen_mm |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia32xen_FRAME_H_ |
#define KERN_ia32xen_FRAME_H_ |
#define FRAME_WIDTH 12 /* 4K */ |
#define FRAME_SIZE (1 << FRAME_WIDTH) |
#ifdef KERNEL |
#ifndef __ASM__ |
#define PA2MA(x) ((start_info.pm_map[((uintptr_t) (x)) >> 12] << 12) + (((uintptr_t) (x)) & 0xfff)) |
#define MA2PA(x) ((mp_map[((uintptr_t) (x)) >> 12] << 12) + (((uintptr_t) (x)) & 0xfff)) |
extern void frame_arch_init(void); |
extern void physmem_print(void); |
#endif /* __ASM__ */ |
#endif /* KERNEL */ |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32xen/include/mm/page.h |
---|
0,0 → 1,259 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32xen_mm |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia32xen_PAGE_H_ |
#define KERN_ia32xen_PAGE_H_ |
#include <arch/mm/frame.h> |
#define PAGE_WIDTH FRAME_WIDTH |
#define PAGE_SIZE FRAME_SIZE |
#define PAGE_COLOR_BITS 0 /* dummy */ |
#ifdef KERNEL |
#ifndef __ASM__ |
# define KA2PA(x) (((uintptr_t) (x)) - 0x80000000) |
# define PA2KA(x) (((uintptr_t) (x)) + 0x80000000) |
#else |
# define KA2PA(x) ((x) - 0x80000000) |
# define PA2KA(x) ((x) + 0x80000000) |
#endif |
/* |
* Implementation of generic 4-level page table interface. |
* IA-32 has 2-level page tables, so PTL1 and PTL2 are left out. |
*/ |
/* Number of entries in each level. */ |
#define PTL0_ENTRIES_ARCH 1024 |
#define PTL1_ENTRIES_ARCH 0 |
#define PTL2_ENTRIES_ARCH 0 |
#define PTL3_ENTRIES_ARCH 1024 |
/* Page table size for each level. */ |
#define PTL0_SIZE_ARCH ONE_FRAME |
#define PTL1_SIZE_ARCH 0 |
#define PTL2_SIZE_ARCH 0 |
#define PTL3_SIZE_ARCH ONE_FRAME |
/* Macros calculating indices into page tables in each level. */ |
#define PTL0_INDEX_ARCH(vaddr) (((vaddr) >> 22) & 0x3ff) |
#define PTL1_INDEX_ARCH(vaddr) 0 |
#define PTL2_INDEX_ARCH(vaddr) 0 |
#define PTL3_INDEX_ARCH(vaddr) (((vaddr) >> 12) & 0x3ff) |
/* Get PTE address accessors for each level. */ |
#define GET_PTL1_ADDRESS_ARCH(ptl0, i) \ |
((pte_t *) MA2PA((((pte_t *) (ptl0))[(i)].frame_address) << 12)) |
#define GET_PTL2_ADDRESS_ARCH(ptl1, i) \ |
(ptl1) |
#define GET_PTL3_ADDRESS_ARCH(ptl2, i) \ |
(ptl2) |
#define GET_FRAME_ADDRESS_ARCH(ptl3, i) \ |
((uintptr_t) MA2PA((((pte_t *) (ptl3))[(i)].frame_address) << 12)) |
/* Set PTE address accessors for each level. */ |
#define SET_PTL0_ADDRESS_ARCH(ptl0) \ |
{ \ |
mmuext_op_t mmu_ext; \ |
\ |
mmu_ext.cmd = MMUEXT_NEW_BASEPTR; \ |
mmu_ext.mfn = ADDR2PFN(PA2MA(ptl0)); \ |
ASSERT(xen_mmuext_op(&mmu_ext, 1, NULL, DOMID_SELF) == 0); \ |
} |
#define SET_PTL1_ADDRESS_ARCH(ptl0, i, a) \ |
{ \ |
mmuext_op_t mmu_ext; \ |
\ |
mmu_ext.cmd = MMUEXT_PIN_L1_TABLE; \ |
mmu_ext.mfn = ADDR2PFN(PA2MA(a)); \ |
ASSERT(xen_mmuext_op(&mmu_ext, 1, NULL, DOMID_SELF) == 0); \ |
\ |
mmu_update_t update; \ |
\ |
update.ptr = PA2MA(KA2PA(&((pte_t *) (ptl0))[(i)])); \ |
update.val = PA2MA(a); \ |
ASSERT(xen_mmu_update(&update, 1, NULL, DOMID_SELF) == 0); \ |
} |
#define SET_PTL2_ADDRESS_ARCH(ptl1, i, a) |
#define SET_PTL3_ADDRESS_ARCH(ptl2, i, a) |
#define SET_FRAME_ADDRESS_ARCH(ptl3, i, a) \ |
{ \ |
mmu_update_t update; \ |
\ |
update.ptr = PA2MA(KA2PA(&((pte_t *) (ptl3))[(i)])); \ |
update.val = PA2MA(a); \ |
ASSERT(xen_mmu_update(&update, 1, NULL, DOMID_SELF) == 0); \ |
} |
/* Get PTE flags accessors for each level. */ |
#define GET_PTL1_FLAGS_ARCH(ptl0, i) \ |
get_pt_flags((pte_t *) (ptl0), (index_t) (i)) |
#define GET_PTL2_FLAGS_ARCH(ptl1, i) \ |
PAGE_PRESENT |
#define GET_PTL3_FLAGS_ARCH(ptl2, i) \ |
PAGE_PRESENT |
#define GET_FRAME_FLAGS_ARCH(ptl3, i) \ |
get_pt_flags((pte_t *) (ptl3), (index_t) (i)) |
/* Set PTE flags accessors for each level. */ |
#define SET_PTL1_FLAGS_ARCH(ptl0, i, x) \ |
set_pt_flags((pte_t *) (ptl0), (index_t) (i), (x)) |
#define SET_PTL2_FLAGS_ARCH(ptl1, i, x) |
#define SET_PTL3_FLAGS_ARCH(ptl2, i, x) |
#define SET_FRAME_FLAGS_ARCH(ptl3, i, x) \ |
set_pt_flags((pte_t *) (ptl3), (index_t) (i), (x)) |
/* Query macros for the last level. */ |
#define PTE_VALID_ARCH(p) \ |
(*((uint32_t *) (p)) != 0) |
#define PTE_PRESENT_ARCH(p) \ |
((p)->present != 0) |
#define PTE_GET_FRAME_ARCH(p) \ |
((p)->frame_address << FRAME_WIDTH) |
#define PTE_WRITABLE_ARCH(p) \ |
((p)->writeable != 0) |
#define PTE_EXECUTABLE_ARCH(p) \ |
1 |
#ifndef __ASM__ |
#include <mm/mm.h> |
#include <arch/hypercall.h> |
#include <arch/interrupt.h> |
/* Page fault error codes. */ |
/** When bit on this position is 0, the page fault was caused by a not-present |
* page. |
*/ |
#define PFERR_CODE_P (1 << 0) |
/** When bit on this position is 1, the page fault was caused by a write. */ |
#define PFERR_CODE_RW (1 << 1) |
/** When bit on this position is 1, the page fault was caused in user mode. */ |
#define PFERR_CODE_US (1 << 2) |
/** When bit on this position is 1, a reserved bit was set in page directory. */ |
#define PFERR_CODE_RSVD (1 << 3) |
typedef struct { |
uint64_t ptr; /**< Machine address of PTE */ |
union { /**< New contents of PTE */ |
uint64_t val; |
pte_t pte; |
}; |
} mmu_update_t; |
typedef struct { |
unsigned int cmd; |
union { |
unsigned long mfn; |
unsigned long linear_addr; |
}; |
union { |
unsigned int nr_ents; |
void *vcpumask; |
}; |
} mmuext_op_t; |
static inline int xen_update_va_mapping(const void *va, const pte_t pte, |
const unsigned int flags) |
{ |
return hypercall4(XEN_UPDATE_VA_MAPPING, va, pte, 0, flags); |
} |
static inline int xen_mmu_update(const mmu_update_t *req, |
const unsigned int count, unsigned int *success_count, domid_t domid) |
{ |
return hypercall4(XEN_MMU_UPDATE, req, count, success_count, domid); |
} |
static inline int xen_mmuext_op(const mmuext_op_t *op, const unsigned int count, |
unsigned int *success_count, domid_t domid) |
{ |
return hypercall4(XEN_MMUEXT_OP, op, count, success_count, domid); |
} |
static inline int get_pt_flags(pte_t *pt, index_t i) |
{ |
pte_t *p = &pt[i]; |
return ((!p->page_cache_disable) << PAGE_CACHEABLE_SHIFT | |
(!p->present) << PAGE_PRESENT_SHIFT | |
p->uaccessible << PAGE_USER_SHIFT | |
1 << PAGE_READ_SHIFT | |
p->writeable << PAGE_WRITE_SHIFT | |
1 << PAGE_EXEC_SHIFT | |
p->global << PAGE_GLOBAL_SHIFT); |
} |
static inline void set_pt_flags(pte_t *pt, index_t i, int flags) |
{ |
pte_t p = pt[i]; |
p.page_cache_disable = !(flags & PAGE_CACHEABLE); |
p.present = !(flags & PAGE_NOT_PRESENT); |
p.uaccessible = (flags & PAGE_USER) != 0; |
p.writeable = (flags & PAGE_WRITE) != 0; |
p.global = (flags & PAGE_GLOBAL) != 0; |
/* |
* Ensure that there is at least one bit set even if the present bit is cleared. |
*/ |
p.soft_valid = true; |
mmu_update_t update; |
update.ptr = PA2MA(KA2PA(&(pt[i]))); |
update.pte = p; |
xen_mmu_update(&update, 1, NULL, DOMID_SELF); |
} |
extern void page_arch_init(void); |
extern void page_fault(int n, istate_t *istate); |
#endif /* __ASM__ */ |
#endif /* KERNEL */ |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32xen/include/mm/as.h |
---|
0,0 → 1,64 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32xen_mm |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia32xen_AS_H_ |
#define KERN_ia32xen_AS_H_ |
#define KERNEL_ADDRESS_SPACE_SHADOWED_ARCH 0 |
#define KERNEL_ADDRESS_SPACE_START_ARCH ((unsigned long) 0x80000000) |
#define KERNEL_ADDRESS_SPACE_END_ARCH ((unsigned long) 0xffffffff) |
#define USER_ADDRESS_SPACE_START_ARCH ((unsigned long) 0x00000000) |
#define USER_ADDRESS_SPACE_END_ARCH ((unsigned long) 0x7fffffff) |
#define USTACK_ADDRESS_ARCH (USER_ADDRESS_SPACE_END_ARCH-(PAGE_SIZE-1)) |
typedef struct { |
} as_arch_t; |
#include <genarch/mm/as_pt.h> |
#define as_constructor_arch(as, flags) (as != as) |
#define as_destructor_arch(as) (as != as) |
#define as_create_arch(as, flags) (as != as) |
#define as_install_arch(as) |
#define as_deinstall_arch(as) |
#define as_invalidate_translation_cache(as, page, cnt) |
extern void as_arch_init(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32xen/include/mm/asid.h |
---|
0,0 → 1,55 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32xen_mm |
* @{ |
*/ |
/** @file |
* @ingroup ia32xen_mm |
*/ |
/* |
* ia32xen has no hardware support for address space identifiers. |
* This file is provided to do nop-implementation of mm/asid.h |
* interface. |
*/ |
#ifndef KERN_ia32xen_ASID_H_ |
#define KERN_ia32xen_ASID_H_ |
typedef int asid_t; |
#define ASID_MAX_ARCH 3 |
#define asid_get() (ASID_START+1) |
#define asid_put(asid) |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32xen/include/mm/tlb.h |
---|
0,0 → 1,44 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32xen_mm |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia32xen_TLB_H_ |
#define KERN_ia32xen_TLB_H_ |
#define tlb_arch_init() |
#define tlb_print() |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32xen/include/types.h |
---|
0,0 → 1,91 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32xen |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia32xen_TYPES_H_ |
#define KERN_ia32xen_TYPES_H_ |
#define NULL 0 |
#define false 0 |
#define true 1 |
typedef signed char int8_t; |
typedef signed short int16_t; |
typedef signed long int32_t; |
typedef signed long long int64_t; |
typedef unsigned char uint8_t; |
typedef unsigned short uint16_t; |
typedef unsigned long uint32_t; |
typedef unsigned long long uint64_t; |
typedef uint32_t size_t; |
typedef uint32_t count_t; |
typedef uint32_t index_t; |
typedef uint32_t uintptr_t; |
typedef uint32_t pfn_t; |
typedef uint8_t ipl_t; |
typedef uint32_t unative_t; |
typedef int32_t native_t; |
typedef uint8_t bool; |
typedef uint64_t thread_id_t; |
typedef uint64_t task_id_t; |
typedef uint32_t context_id_t; |
typedef int32_t inr_t; |
typedef int32_t devno_t; |
/** Page Table Entry. */ |
typedef struct { |
unsigned present : 1; |
unsigned writeable : 1; |
unsigned uaccessible : 1; |
unsigned page_write_through : 1; |
unsigned page_cache_disable : 1; |
unsigned accessed : 1; |
unsigned dirty : 1; |
unsigned pat : 1; |
unsigned global : 1; |
unsigned soft_valid : 1; /**< Valid content even if the present bit is not set. */ |
unsigned avl : 2; |
unsigned frame_address : 20; |
} __attribute__ ((packed)) pte_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32xen/include/pm.h |
---|
0,0 → 1,159 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32xen |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia32xen_PM_H_ |
#define KERN_ia32xen_PM_H_ |
#define IDT_ITEMS 64 |
#define GDT_ITEMS 7 |
#define NULL_DES 0 |
#define KTEXT_DES 1 |
#define KDATA_DES 2 |
#define UTEXT_DES 3 |
#define UDATA_DES 4 |
#define TSS_DES 5 |
#define TLS_DES 6 /* Pointer to Thread-Local-Storage data */ |
#define selector(des) ((des) << 3) |
#define PL_KERNEL 1 |
#define PL_USER 3 |
#define AR_PRESENT (1<<7) |
#define AR_DATA (2<<3) |
#define AR_CODE (3<<3) |
#define AR_WRITABLE (1<<1) |
#define AR_INTERRUPT (0xe) |
#define AR_TSS (0x9) |
#define DPL_KERNEL (PL_KERNEL<<5) |
#define DPL_USER (PL_USER<<5) |
#define TSS_BASIC_SIZE 104 |
#define TSS_IOMAP_SIZE (16*1024+1) /* 16K for bitmap + 1 terminating byte for convenience */ |
#define IO_PORTS (64*1024) |
#ifndef __ASM__ |
#include <arch/types.h> |
#include <arch/context.h> |
struct ptr_16_32 { |
uint16_t limit; |
uint32_t base; |
} __attribute__ ((packed)); |
typedef struct ptr_16_32 ptr_16_32_t; |
struct descriptor { |
unsigned limit_0_15: 16; |
unsigned base_0_15: 16; |
unsigned base_16_23: 8; |
unsigned access: 8; |
unsigned limit_16_19: 4; |
unsigned available: 1; |
unsigned unused: 1; |
unsigned special: 1; |
unsigned granularity : 1; |
unsigned base_24_31: 8; |
} __attribute__ ((packed)); |
typedef struct descriptor descriptor_t; |
struct tss { |
uint16_t link; |
unsigned : 16; |
uint32_t esp0; |
uint16_t ss0; |
unsigned : 16; |
uint32_t esp1; |
uint16_t ss1; |
unsigned : 16; |
uint32_t esp2; |
uint16_t ss2; |
unsigned : 16; |
uint32_t cr3; |
uint32_t eip; |
uint32_t eflags; |
uint32_t eax; |
uint32_t ecx; |
uint32_t edx; |
uint32_t ebx; |
uint32_t esp; |
uint32_t ebp; |
uint32_t esi; |
uint32_t edi; |
uint16_t es; |
unsigned : 16; |
uint16_t cs; |
unsigned : 16; |
uint16_t ss; |
unsigned : 16; |
uint16_t ds; |
unsigned : 16; |
uint16_t fs; |
unsigned : 16; |
uint16_t gs; |
unsigned : 16; |
uint16_t ldtr; |
unsigned : 16; |
unsigned : 16; |
uint16_t iomap_base; |
uint8_t iomap[TSS_IOMAP_SIZE]; |
} __attribute__ ((packed)); |
typedef struct tss tss_t; |
extern ptr_16_32_t gdtr; |
extern ptr_16_32_t bootstrap_gdtr; |
extern ptr_16_32_t protected_ap_gdtr; |
extern struct tss *tss_p; |
extern descriptor_t gdt[]; |
extern void pm_init(void); |
extern void gdt_setbase(descriptor_t *d, uintptr_t base); |
extern void gdt_setlimit(descriptor_t *d, uint32_t limit); |
extern void traps_init(void); |
extern void tss_initialize(tss_t *t); |
extern void set_tls_desc(uintptr_t tls); |
#endif /* __ASM__ */ |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32xen/include/hypercall.h |
---|
0,0 → 1,381 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#ifndef KERN_ia32xen_HYPERCALL_H_ |
#define KERN_ia32xen_HYPERCALL_H_ |
#ifndef __ASM__ |
# include <arch/types.h> |
# include <macros.h> |
#endif |
#define GUEST_CMDLINE 1024 |
#define VIRT_CPUS 32 |
#define START_INFO_SIZE 1104 |
#define BOOT_OFFSET 0x0000 |
#define TEMP_STACK_SIZE 0x1000 |
#define XEN_VIRT_START 0xFC000000 |
#define XEN_CS 0xe019 |
#define XEN_ELFNOTE_INFO 0 |
#define XEN_ELFNOTE_ENTRY 1 |
#define XEN_ELFNOTE_HYPERCALL_PAGE 2 |
#define XEN_ELFNOTE_VIRT_BASE 3 |
#define XEN_ELFNOTE_PADDR_OFFSET 4 |
#define XEN_ELFNOTE_XEN_VERSION 5 |
#define XEN_ELFNOTE_GUEST_OS 6 |
#define XEN_ELFNOTE_GUEST_VERSION 7 |
#define XEN_ELFNOTE_LOADER 8 |
#define XEN_ELFNOTE_PAE_MODE 9 |
#define XEN_ELFNOTE_FEATURES 10 |
#define XEN_ELFNOTE_BSD_SYMTAB 11 |
#define mp_map ((pfn_t *) XEN_VIRT_START) |
#define SIF_PRIVILEGED (1 << 0) /**< Privileged domain */ |
#define SIF_INITDOMAIN (1 << 1) /**< Iinitial control domain */ |
#define XEN_CONSOLE_VGA 0x03 |
#define XEN_CONSOLE_VESA 0x23 |
#define XEN_SET_TRAP_TABLE 0 |
#define XEN_MMU_UPDATE 1 |
#define XEN_SET_CALLBACKS 4 |
#define XEN_UPDATE_VA_MAPPING 14 |
#define XEN_EVENT_CHANNEL_OP 16 |
#define XEN_VERSION 17 |
#define XEN_CONSOLE_IO 18 |
#define XEN_MMUEXT_OP 26 |
/* |
* Commands for XEN_CONSOLE_IO |
*/ |
#define CONSOLE_IO_WRITE 0 |
#define CONSOLE_IO_READ 1 |
#define MMUEXT_PIN_L1_TABLE 0 |
#define MMUEXT_PIN_L2_TABLE 1 |
#define MMUEXT_PIN_L3_TABLE 2 |
#define MMUEXT_PIN_L4_TABLE 3 |
#define MMUEXT_UNPIN_TABLE 4 |
#define MMUEXT_NEW_BASEPTR 5 |
#define MMUEXT_TLB_FLUSH_LOCAL 6 |
#define MMUEXT_INVLPG_LOCAL 7 |
#define MMUEXT_TLB_FLUSH_MULTI 8 |
#define MMUEXT_INVLPG_MULTI 9 |
#define MMUEXT_TLB_FLUSH_ALL 10 |
#define MMUEXT_INVLPG_ALL 11 |
#define MMUEXT_FLUSH_CACHE 12 |
#define MMUEXT_SET_LDT 13 |
#define MMUEXT_NEW_USER_BASEPTR 15 |
#define EVTCHNOP_SEND 4 |
#define UVMF_NONE 0 /**< No flushing at all */ |
#define UVMF_TLB_FLUSH 1 /**< Flush entire TLB(s) */ |
#define UVMF_INVLPG 2 /**< Flush only one entry */ |
#define UVMF_FLUSHTYPE_MASK 3 |
#define UVMF_MULTI 0 /**< Flush subset of TLBs */ |
#define UVMF_LOCAL 0 /**< Flush local TLB */ |
#define UVMF_ALL (1 << 2) /**< Flush all TLBs */ |
#define DOMID_SELF (0x7FF0U) |
#define DOMID_IO (0x7FF1U) |
#ifndef __ASM__ |
typedef uint16_t domid_t; |
typedef uint32_t evtchn_t; |
typedef struct { |
uint32_t version; |
uint32_t pad0; |
uint64_t tsc_timestamp; /**< TSC at last update of time vals */ |
uint64_t system_time; /**< Time, in nanosecs, since boot */ |
uint32_t tsc_to_system_mul; |
int8_t tsc_shift; |
int8_t pad1[3]; |
} vcpu_time_info_t; |
typedef struct { |
uint32_t cr2; |
uint32_t pad[5]; |
} arch_vcpu_info_t; |
typedef struct arch_shared_info { |
pfn_t max_pfn; /**< max pfn that appears in table */ |
uint32_t pfn_to_mfn_frame_list_list; |
uint32_t nmi_reason; |
} arch_shared_info_t; |
typedef struct { |
uint8_t evtchn_upcall_pending; |
ipl_t evtchn_upcall_mask; |
evtchn_t evtchn_pending_sel; |
arch_vcpu_info_t arch; |
vcpu_time_info_t time; |
} vcpu_info_t; |
typedef struct { |
vcpu_info_t vcpu_info[VIRT_CPUS]; |
evtchn_t evtchn_pending[32]; |
evtchn_t evtchn_mask[32]; |
uint32_t wc_version; /**< Version counter */ |
uint32_t wc_sec; /**< Secs 00:00:00 UTC, Jan 1, 1970 */ |
uint32_t wc_nsec; /**< Nsecs 00:00:00 UTC, Jan 1, 1970 */ |
arch_shared_info_t arch; |
} shared_info_t; |
typedef struct { |
int8_t magic[32]; /**< "xen-<version>-<platform>" */ |
uint32_t frames; /**< Available frames */ |
shared_info_t *shared_info; /**< Shared info structure (machine address) */ |
uint32_t flags; /**< SIF_xxx flags */ |
pfn_t store_mfn; /**< Shared page (machine page) */ |
evtchn_t store_evtchn; /**< Event channel for store communication */ |
union { |
struct { |
pfn_t mfn; /**< Console page (machine page) */ |
evtchn_t evtchn; /**< Event channel for console messages */ |
} domU; |
struct { |
uint32_t info_off; /**< Offset of console_info struct */ |
uint32_t info_size; /**< Size of console_info struct from start */ |
} dom0; |
} console; |
pte_t *ptl0; /**< Boot PTL0 (kernel address) */ |
uint32_t pt_frames; /**< Number of bootstrap page table frames */ |
pfn_t *pm_map; /**< Physical->machine frame map (kernel address) */ |
void *mod_start; /**< Modules start (kernel address) */ |
uint32_t mod_len; /**< Modules size (bytes) */ |
int8_t cmd_line[GUEST_CMDLINE]; |
} start_info_t; |
typedef struct { |
uint8_t video_type; |
union { |
struct { |
uint16_t font_height; |
uint16_t cursor_x; |
uint16_t cursor_y; |
uint16_t rows; |
uint16_t columns; |
} vga; |
struct { |
uint16_t width; |
uint16_t height; |
uint16_t bytes_per_line; |
uint16_t bits_per_pixel; |
uint32_t lfb_base; |
uint32_t lfb_size; |
uint8_t red_pos; |
uint8_t red_size; |
uint8_t green_pos; |
uint8_t green_size; |
uint8_t blue_pos; |
uint8_t blue_size; |
uint8_t rsvd_pos; |
uint8_t rsvd_size; |
} vesa_lfb; |
} info; |
} console_info_t; |
typedef struct { |
pfn_t start; |
pfn_t size; |
pfn_t reserved; |
} memzone_t; |
extern start_info_t start_info; |
extern shared_info_t shared_info; |
extern memzone_t meminfo; |
typedef struct { |
uint8_t vector; /**< Exception vector */ |
uint8_t flags; /**< 0-3: privilege level; 4: clear event enable */ |
uint16_t cs; /**< Code selector */ |
void *address; /**< Code offset */ |
} trap_info_t; |
typedef struct { |
evtchn_t port; |
} evtchn_send_t; |
typedef struct { |
uint32_t cmd; |
union { |
evtchn_send_t send; |
}; |
} evtchn_op_t; |
#define force_evtchn_callback() ((void) xen_version(0, 0)) |
#define hypercall0(id) \ |
({ \ |
unative_t ret; \ |
asm volatile ( \ |
"call hypercall_page + (" STRING(id) " * 32)\n" \ |
: "=a" (ret) \ |
: \ |
: "memory" \ |
); \ |
ret; \ |
}) |
#define hypercall1(id, p1) \ |
({ \ |
unative_t ret, __ign1; \ |
asm volatile ( \ |
"call hypercall_page + (" STRING(id) " * 32)\n" \ |
: "=a" (ret), \ |
"=b" (__ign1) \ |
: "1" (p1) \ |
: "memory" \ |
); \ |
ret; \ |
}) |
#define hypercall2(id, p1, p2) \ |
({ \ |
unative_t ret, __ign1, __ign2; \ |
asm volatile ( \ |
"call hypercall_page + (" STRING(id) " * 32)\n" \ |
: "=a" (ret), \ |
"=b" (__ign1), \ |
"=c" (__ign2) \ |
: "1" (p1), \ |
"2" (p2) \ |
: "memory" \ |
); \ |
ret; \ |
}) |
#define hypercall3(id, p1, p2, p3) \ |
({ \ |
unative_t ret, __ign1, __ign2, __ign3; \ |
asm volatile ( \ |
"call hypercall_page + (" STRING(id) " * 32)\n" \ |
: "=a" (ret), \ |
"=b" (__ign1), \ |
"=c" (__ign2), \ |
"=d" (__ign3) \ |
: "1" (p1), \ |
"2" (p2), \ |
"3" (p3) \ |
: "memory" \ |
); \ |
ret; \ |
}) |
#define hypercall4(id, p1, p2, p3, p4) \ |
({ \ |
unative_t ret, __ign1, __ign2, __ign3, __ign4; \ |
asm volatile ( \ |
"call hypercall_page + (" STRING(id) " * 32)\n" \ |
: "=a" (ret), \ |
"=b" (__ign1), \ |
"=c" (__ign2), \ |
"=d" (__ign3), \ |
"=S" (__ign4) \ |
: "1" (p1), \ |
"2" (p2), \ |
"3" (p3), \ |
"4" (p4) \ |
: "memory" \ |
); \ |
ret; \ |
}) |
#define hypercall5(id, p1, p2, p3, p4, p5) \ |
({ \ |
unative_t ret, __ign1, __ign2, __ign3, __ign4, __ign5; \ |
asm volatile ( \ |
"call hypercall_page + (" STRING(id) " * 32)\n" \ |
: "=a" (ret), \ |
"=b" (__ign1), \ |
"=c" (__ign2), \ |
"=d" (__ign3), \ |
"=S" (__ign4), \ |
"=D" (__ign5) \ |
: "1" (p1), \ |
"2" (p2), \ |
"3" (p3), \ |
"4" (p4), \ |
"5" (p5) \ |
: "memory" \ |
); \ |
ret; \ |
}) |
static inline int xen_console_io(const unsigned int cmd, const unsigned int count, const char *str) |
{ |
return hypercall3(XEN_CONSOLE_IO, cmd, count, str); |
} |
static inline int xen_set_callbacks(const unsigned int event_selector, const void *event_address, const unsigned int failsafe_selector, void *failsafe_address) |
{ |
return hypercall4(XEN_SET_CALLBACKS, event_selector, event_address, failsafe_selector, failsafe_address); |
} |
static inline int xen_set_trap_table(const trap_info_t *table) |
{ |
return hypercall1(XEN_SET_TRAP_TABLE, table); |
} |
static inline int xen_version(const unsigned int cmd, const void *arg) |
{ |
return hypercall2(XEN_VERSION, cmd, arg); |
} |
static inline int xen_notify_remote(evtchn_t channel) |
{ |
evtchn_op_t op; |
op.cmd = EVTCHNOP_SEND; |
op.send.port = channel; |
return hypercall1(XEN_EVENT_CHANNEL_OP, &op); |
} |
#endif |
#endif |
/tags/0.3.0/kernel/arch/ia32xen/include/asm.h |
---|
0,0 → 1,272 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* Copyright (c) 2005 Sergey Bondari |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32xen |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia32xen_ASM_H_ |
#define KERN_ia32xen_ASM_H_ |
#include <arch/pm.h> |
#include <arch/types.h> |
#include <arch/barrier.h> |
#include <config.h> |
extern void enable_l_apic_in_msr(void); |
extern void asm_delay_loop(uint32_t t); |
extern void asm_fake_loop(uint32_t t); |
/** Halt CPU |
* |
* Halt the current CPU until interrupt event. |
*/ |
#define cpu_halt() ((void) 0) |
#define cpu_sleep() ((void) 0) |
#define GEN_READ_REG(reg) static inline unative_t read_ ##reg (void) \ |
{ \ |
unative_t res; \ |
asm volatile ("movl %%" #reg ", %0" : "=r" (res) ); \ |
return res; \ |
} |
#define GEN_WRITE_REG(reg) static inline void write_ ##reg (unative_t regn) \ |
{ \ |
asm volatile ("movl %0, %%" #reg : : "r" (regn)); \ |
} |
GEN_READ_REG(cr0); |
GEN_READ_REG(cr2); |
GEN_READ_REG(dr0); |
GEN_READ_REG(dr1); |
GEN_READ_REG(dr2); |
GEN_READ_REG(dr3); |
GEN_READ_REG(dr6); |
GEN_READ_REG(dr7); |
GEN_WRITE_REG(dr0); |
GEN_WRITE_REG(dr1); |
GEN_WRITE_REG(dr2); |
GEN_WRITE_REG(dr3); |
GEN_WRITE_REG(dr6); |
GEN_WRITE_REG(dr7); |
/** Byte to port |
* |
* Output byte to port |
* |
* @param port Port to write to |
* @param val Value to write |
*/ |
static inline void outb(uint16_t port, uint8_t val) { asm volatile ("outb %b0, %w1\n" : : "a" (val), "d" (port) ); } |
/** Word to port |
* |
* Output word to port |
* |
* @param port Port to write to |
* @param val Value to write |
*/ |
static inline void outw(uint16_t port, uint16_t val) { asm volatile ("outw %w0, %w1\n" : : "a" (val), "d" (port) ); } |
/** Double word to port |
* |
* Output double word to port |
* |
* @param port Port to write to |
* @param val Value to write |
*/ |
static inline void outl(uint16_t port, uint32_t val) { asm volatile ("outl %l0, %w1\n" : : "a" (val), "d" (port) ); } |
/** Byte from port |
* |
* Get byte from port |
* |
* @param port Port to read from |
* @return Value read |
*/ |
static inline uint8_t inb(uint16_t port) { uint8_t val; asm volatile ("inb %w1, %b0 \n" : "=a" (val) : "d" (port) ); return val; } |
/** Word from port |
* |
* Get word from port |
* |
* @param port Port to read from |
* @return Value read |
*/ |
static inline uint16_t inw(uint16_t port) { uint16_t val; asm volatile ("inw %w1, %w0 \n" : "=a" (val) : "d" (port) ); return val; } |
/** Double word from port |
* |
* Get double word from port |
* |
* @param port Port to read from |
* @return Value read |
*/ |
static inline uint32_t inl(uint16_t port) { uint32_t val; asm volatile ("inl %w1, %l0 \n" : "=a" (val) : "d" (port) ); return val; } |
/** Enable interrupts. |
* |
* Enable interrupts and return previous |
* value of EFLAGS. |
* |
* @return Old interrupt priority level. |
*/ |
static inline ipl_t interrupts_enable(void) |
{ |
// FIXME SMP |
ipl_t v = shared_info.vcpu_info[0].evtchn_upcall_mask; |
write_barrier(); |
shared_info.vcpu_info[0].evtchn_upcall_mask = 0; |
write_barrier(); |
if (shared_info.vcpu_info[0].evtchn_upcall_pending) |
force_evtchn_callback(); |
return v; |
} |
/** Disable interrupts. |
* |
* Disable interrupts and return previous |
* value of EFLAGS. |
* |
* @return Old interrupt priority level. |
*/ |
static inline ipl_t interrupts_disable(void) |
{ |
// FIXME SMP |
ipl_t v = shared_info.vcpu_info[0].evtchn_upcall_mask; |
shared_info.vcpu_info[0].evtchn_upcall_mask = 1; |
write_barrier(); |
return v; |
} |
/** Restore interrupt priority level. |
* |
* Restore EFLAGS. |
* |
* @param ipl Saved interrupt priority level. |
*/ |
static inline void interrupts_restore(ipl_t ipl) |
{ |
if (ipl == 0) |
interrupts_enable(); |
else |
interrupts_disable(); |
} |
/** Return interrupt priority level. |
* |
* @return EFLAFS. |
*/ |
static inline ipl_t interrupts_read(void) |
{ |
// FIXME SMP |
return shared_info.vcpu_info[0].evtchn_upcall_mask; |
} |
/** Return base address of current stack |
* |
* Return the base address of the current stack. |
* The stack is assumed to be STACK_SIZE bytes long. |
* The stack must start on page boundary. |
*/ |
static inline uintptr_t get_stack_base(void) |
{ |
uintptr_t v; |
asm volatile ("andl %%esp, %0\n" : "=r" (v) : "0" (~(STACK_SIZE-1))); |
return v; |
} |
/** Return current IP address */ |
static inline uintptr_t * get_ip() |
{ |
uintptr_t *ip; |
asm volatile ( |
"mov %%eip, %0" |
: "=r" (ip) |
); |
return ip; |
} |
/** Invalidate TLB Entry. |
* |
* @param addr Address on a page whose TLB entry is to be invalidated. |
*/ |
static inline void invlpg(uintptr_t addr) |
{ |
asm volatile ("invlpg %0\n" :: "m" (*(unative_t *)addr)); |
} |
/** Load GDTR register from memory. |
* |
* @param gdtr_reg Address of memory from where to load GDTR. |
*/ |
static inline void gdtr_load(ptr_16_32_t *gdtr_reg) |
{ |
asm volatile ("lgdtl %0\n" : : "m" (*gdtr_reg)); |
} |
/** Store GDTR register to memory. |
* |
* @param gdtr_reg Address of memory to where to load GDTR. |
*/ |
static inline void gdtr_store(ptr_16_32_t *gdtr_reg) |
{ |
asm volatile ("sgdtl %0\n" : : "m" (*gdtr_reg)); |
} |
/** Load TR from descriptor table. |
* |
* @param sel Selector specifying descriptor of TSS segment. |
*/ |
static inline void tr_load(uint16_t sel) |
{ |
asm volatile ("ltr %0" : : "r" (sel)); |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32xen/include/drivers/xconsole.h |
---|
0,0 → 1,56 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32xen |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia32xen_XCONSOLE_H_ |
#define KERN_ia32xen_XCONSOLE_H_ |
#include <arch/types.h> |
typedef struct { |
char in[1024]; |
char out[2048]; |
uint32_t in_cons; |
uint32_t in_prod; |
uint32_t out_cons; |
uint32_t out_prod; |
} xencons_t; |
extern xencons_t console_page; |
extern void xen_console_init(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32xen/include/cycle.h |
---|
0,0 → 1,0 |
link ../../ia32/include/cycle.h |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/arch/ia32xen/include/interrupt.h |
---|
0,0 → 1,0 |
link ../../ia32/include/interrupt.h |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/arch/ia32xen/include/fpu_context.h |
---|
0,0 → 1,0 |
link ../../ia32/include/fpu_context.h |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/arch/ia32xen/include/byteorder.h |
---|
0,0 → 1,0 |
link ../../ia32/include/byteorder.h |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/arch/ia32xen/include/cpuid.h |
---|
0,0 → 1,0 |
link ../../ia32/include/cpuid.h |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/arch/ia32xen/include/elf.h |
---|
0,0 → 1,0 |
link ../../ia32/include/elf.h |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/arch/ia32xen/include/bios |
---|
0,0 → 1,0 |
link ../../ia32/include/bios |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/arch/ia32xen/include/memstr.h |
---|
0,0 → 1,0 |
link ../../ia32/include/memstr.h |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/arch/ia32xen/include/arg.h |
---|
0,0 → 1,0 |
link ../../ia32/include/arg.h |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/arch/ia32xen/include/smp |
---|
0,0 → 1,0 |
link ../../ia32/include/smp |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/arch/ia32xen/include/ddi |
---|
0,0 → 1,0 |
link ../../ia32/include/ddi |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/arch/ia32xen/include/atomic.h |
---|
0,0 → 1,0 |
link ../../ia32/include/atomic.h |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/arch/ia32xen/include/arch.h |
---|
0,0 → 1,0 |
link ../../ia32/include/arch.h |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/arch/ia32xen/include/proc |
---|
0,0 → 1,0 |
link ../../ia32/include/proc |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/arch/ia32xen/include/faddr.h |
---|
0,0 → 1,0 |
link ../../ia32/include/faddr.h |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/arch/ia32xen/include/debugger.h |
---|
0,0 → 1,0 |
link ../../ia32/include/debugger.h |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/arch/ia32xen/include/context.h |
---|
0,0 → 1,0 |
link ../../ia32/include/context.h |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/arch/ia32xen/include/debug.h |
---|
0,0 → 1,0 |
link ../../ia32/include/debug.h |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/arch/ia32xen/include/barrier.h |
---|
0,0 → 1,0 |
link ../../ia32/include/barrier.h |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/arch/ia32xen/include/cpu.h |
---|
0,0 → 1,0 |
link ../../ia32/include/cpu.h |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/arch/ia32xen/Makefile.inc |
---|
0,0 → 1,140 |
# |
# Copyright (c) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
## Toolchain configuration |
# |
BFD_NAME = elf32-i386 |
BFD_ARCH = i386 |
BFD = elf32-i386 |
TARGET = i686-pc-linux-gnu |
TOOLCHAIN_DIR = /usr/local/i686 |
DEFS += -DMACHINE=$(MACHINE) -D__32_BITS__ |
CMN1 = -m32 |
GCC_CFLAGS += $(CMN1) |
ICC_CFLAGS += $(CMN1) |
SUNCC_CFLAGS += $(CMN1) |
## Accepted CPUs |
# |
ifeq ($(MACHINE),athlon-xp) |
CMN2 = -march=athlon-xp -mmmx -msse -m3dnow |
GCC_CFLAGS += $(CMN2) |
ICC_CFLAGS += $(CMN2) |
SUNCC_CFLAGS += -xarch=ssea |
DEFS += -DCONFIG_FENCES_P3 |
CONFIG_SMP = n |
CONFIG_HT = n |
endif |
ifeq ($(MACHINE),athlon-mp) |
CMN2 = -march=athlon-mp -mmmx -msse -m3dnow |
GCC_CFLAGS += $(CMN2) |
ICC_CFLAGS += $(CMN2) |
SUNCC_CFLAGS += -xarch=ssea |
DEFS += -DCONFIG_FENCES_P3 |
CONFIG_HT = n |
endif |
ifeq ($(MACHINE),pentium3) |
CMN2 = -march=pentium3 -mmmx -msse |
GCC_CFLAGS += $(CMN2) |
ICC_CFLAGS += $(CMN2) |
SUNCC_CFLAGS += -xarch=sse |
DEFS += -DCONFIG_FENCES_P3 |
CONFIG_HT = n |
endif |
ifeq ($(MACHINE),core) |
CMN2 = -march=prescott -mfpmath=sse -mmmx -msse -msse2 -msse3 |
GCC_CFLAGS += $(CMN2) |
ICC_CFLAGS += $(CMN2) |
SUNCC_CFLAGS += -xarch=sse3 |
DEFS += -DCONFIG_FENCES_P4 |
endif |
ifeq ($(MACHINE),pentium4) |
GCC_CFLAGS += -march=pentium4 -mfpmath=sse -mmmx -msse -msse2 |
ICC_CFLAGS += -march=pentium4 |
SUNCC_CFLAGS += -xarch=sse2 |
DEFS += -DCONFIG_FENCES_P4 |
endif |
## Own configuration directives |
# |
CONFIG_ACPI = y |
## Compile with hierarchical page tables support. |
# |
CONFIG_PAGE_PT = y |
DEFS += -DCONFIG_PAGE_PT |
## Accepted configuration directives |
# |
ifeq ($(CONFIG_SMP),y) |
DEFS += -DCONFIG_SMP |
endif |
ifeq ($(CONFIG_HT),y) |
DEFS += -DCONFIG_HT |
endif |
## Compile with support for software integer division. |
# |
CONFIG_SOFTINT = y |
ARCH_SOURCES = \ |
arch/$(ARCH)/src/context.S \ |
arch/$(ARCH)/src/debug/panic.s \ |
arch/$(ARCH)/src/delay.s \ |
arch/$(ARCH)/src/asm.S \ |
arch/$(ARCH)/src/proc/scheduler.c \ |
arch/$(ARCH)/src/proc/task.c \ |
arch/$(ARCH)/src/proc/thread.c \ |
arch/$(ARCH)/src/bios/bios.c \ |
arch/$(ARCH)/src/smp/apic.c \ |
arch/$(ARCH)/src/smp/mps.c \ |
arch/$(ARCH)/src/smp/smp.c \ |
arch/$(ARCH)/src/atomic.S \ |
arch/$(ARCH)/src/smp/ipi.c \ |
arch/$(ARCH)/src/ia32xen.c \ |
arch/$(ARCH)/src/interrupt.c \ |
arch/$(ARCH)/src/pm.c \ |
arch/$(ARCH)/src/userspace.c \ |
arch/$(ARCH)/src/cpu/cpu.c \ |
arch/$(ARCH)/src/mm/as.c \ |
arch/$(ARCH)/src/mm/frame.c \ |
arch/$(ARCH)/src/mm/page.c \ |
arch/$(ARCH)/src/mm/tlb.c \ |
arch/$(ARCH)/src/ddi/ddi.c \ |
arch/$(ARCH)/src/drivers/xconsole.c \ |
arch/$(ARCH)/src/boot/boot.S \ |
arch/$(ARCH)/src/fpu_context.c \ |
arch/$(ARCH)/src/debugger.c |
/tags/0.3.0/kernel/arch/ia32xen/src/context.S |
---|
0,0 → 1,0 |
link ../../ia32/src/context.S |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/arch/ia32xen/src/smp/mps.c |
---|
0,0 → 1,433 |
/* |
* Copyright (c) 2001-2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32xen |
* @{ |
*/ |
/** @file |
*/ |
#ifdef CONFIG_SMP |
#include <config.h> |
#include <print.h> |
#include <debug.h> |
#include <arch/smp/mps.h> |
#include <arch/smp/apic.h> |
#include <arch/smp/smp.h> |
#include <func.h> |
#include <arch/types.h> |
#include <cpu.h> |
#include <arch/asm.h> |
#include <arch/bios/bios.h> |
#include <mm/frame.h> |
/* |
* MultiProcessor Specification detection code. |
*/ |
#define FS_SIGNATURE 0x5f504d5f |
#define CT_SIGNATURE 0x504d4350 |
int mps_fs_check(uint8_t *base); |
int mps_ct_check(void); |
int configure_via_ct(void); |
int configure_via_default(uint8_t n); |
int ct_processor_entry(struct __processor_entry *pr); |
void ct_bus_entry(struct __bus_entry *bus); |
void ct_io_apic_entry(struct __io_apic_entry *ioa); |
void ct_io_intr_entry(struct __io_intr_entry *iointr); |
void ct_l_intr_entry(struct __l_intr_entry *lintr); |
void ct_extended_entries(void); |
static struct mps_fs *fs; |
static struct mps_ct *ct; |
struct __processor_entry *processor_entries = NULL; |
struct __bus_entry *bus_entries = NULL; |
struct __io_apic_entry *io_apic_entries = NULL; |
struct __io_intr_entry *io_intr_entries = NULL; |
struct __l_intr_entry *l_intr_entries = NULL; |
unsigned int processor_entry_cnt = 0; |
unsigned int bus_entry_cnt = 0; |
unsigned int io_apic_entry_cnt = 0; |
unsigned int io_intr_entry_cnt = 0; |
unsigned int l_intr_entry_cnt = 0; |
waitq_t ap_completion_wq; |
/* |
* Implementation of IA-32 SMP configuration interface. |
*/ |
static count_t get_cpu_count(void); |
static bool is_cpu_enabled(index_t i); |
static bool is_bsp(index_t i); |
static uint8_t get_cpu_apic_id(index_t i); |
static int mps_irq_to_pin(unsigned int irq); |
struct smp_config_operations mps_config_operations = { |
.cpu_count = get_cpu_count, |
.cpu_enabled = is_cpu_enabled, |
.cpu_bootstrap = is_bsp, |
.cpu_apic_id = get_cpu_apic_id, |
.irq_to_pin = mps_irq_to_pin |
}; |
count_t get_cpu_count(void) |
{ |
return processor_entry_cnt; |
} |
bool is_cpu_enabled(index_t i) |
{ |
ASSERT(i < processor_entry_cnt); |
return processor_entries[i].cpu_flags & 0x1; |
} |
bool is_bsp(index_t i) |
{ |
ASSERT(i < processor_entry_cnt); |
return processor_entries[i].cpu_flags & 0x2; |
} |
uint8_t get_cpu_apic_id(index_t i) |
{ |
ASSERT(i < processor_entry_cnt); |
return processor_entries[i].l_apic_id; |
} |
/* |
* Used to check the integrity of the MP Floating Structure. |
*/ |
int mps_fs_check(uint8_t *base) |
{ |
int i; |
uint8_t sum; |
for (i = 0, sum = 0; i < 16; i++) |
sum += base[i]; |
return !sum; |
} |
/* |
* Used to check the integrity of the MP Configuration Table. |
*/ |
int mps_ct_check(void) |
{ |
uint8_t *base = (uint8_t *) ct; |
uint8_t *ext = base + ct->base_table_length; |
uint8_t sum; |
int i; |
/* count the checksum for the base table */ |
for (i=0,sum=0; i < ct->base_table_length; i++) |
sum += base[i]; |
if (sum) |
return 0; |
/* count the checksum for the extended table */ |
for (i=0,sum=0; i < ct->ext_table_length; i++) |
sum += ext[i]; |
return sum == ct->ext_table_checksum; |
} |
void mps_init(void) |
{ |
uint8_t *addr[2] = { NULL, (uint8_t *) PA2KA(0xf0000) }; |
int i, j, length[2] = { 1024, 64*1024 }; |
/* |
* Find MP Floating Pointer Structure |
* 1a. search first 1K of EBDA |
* 1b. if EBDA is undefined, search last 1K of base memory |
* 2. search 64K starting at 0xf0000 |
*/ |
addr[0] = (uint8_t *) PA2KA(ebda ? ebda : 639 * 1024); |
for (i = 0; i < 2; i++) { |
for (j = 0; j < length[i]; j += 16) { |
if (*((uint32_t *) &addr[i][j]) == FS_SIGNATURE && mps_fs_check(&addr[i][j])) { |
fs = (struct mps_fs *) &addr[i][j]; |
goto fs_found; |
} |
} |
} |
return; |
fs_found: |
printf("%p: MPS Floating Pointer Structure\n", fs); |
if (fs->config_type == 0 && fs->configuration_table) { |
if (fs->mpfib2 >> 7) { |
printf("%s: PIC mode not supported\n", __func__); |
return; |
} |
ct = (struct mps_ct *)PA2KA((uintptr_t)fs->configuration_table); |
config.cpu_count = configure_via_ct(); |
} |
else |
config.cpu_count = configure_via_default(fs->config_type); |
return; |
} |
int configure_via_ct(void) |
{ |
uint8_t *cur; |
int i, cnt; |
if (ct->signature != CT_SIGNATURE) { |
printf("%s: bad ct->signature\n", __func__); |
return 1; |
} |
if (!mps_ct_check()) { |
printf("%s: bad ct checksum\n", __func__); |
return 1; |
} |
if (ct->oem_table) { |
printf("%s: ct->oem_table not supported\n", __func__); |
return 1; |
} |
l_apic = (uint32_t *)(uintptr_t)ct->l_apic; |
cnt = 0; |
cur = &ct->base_table[0]; |
for (i=0; i < ct->entry_count; i++) { |
switch (*cur) { |
/* Processor entry */ |
case 0: |
processor_entries = processor_entries ? processor_entries : (struct __processor_entry *) cur; |
processor_entry_cnt++; |
cnt += ct_processor_entry((struct __processor_entry *) cur); |
cur += 20; |
break; |
/* Bus entry */ |
case 1: |
bus_entries = bus_entries ? bus_entries : (struct __bus_entry *) cur; |
bus_entry_cnt++; |
ct_bus_entry((struct __bus_entry *) cur); |
cur += 8; |
break; |
/* I/O Apic */ |
case 2: |
io_apic_entries = io_apic_entries ? io_apic_entries : (struct __io_apic_entry *) cur; |
io_apic_entry_cnt++; |
ct_io_apic_entry((struct __io_apic_entry *) cur); |
cur += 8; |
break; |
/* I/O Interrupt Assignment */ |
case 3: |
io_intr_entries = io_intr_entries ? io_intr_entries : (struct __io_intr_entry *) cur; |
io_intr_entry_cnt++; |
ct_io_intr_entry((struct __io_intr_entry *) cur); |
cur += 8; |
break; |
/* Local Interrupt Assignment */ |
case 4: |
l_intr_entries = l_intr_entries ? l_intr_entries : (struct __l_intr_entry *) cur; |
l_intr_entry_cnt++; |
ct_l_intr_entry((struct __l_intr_entry *) cur); |
cur += 8; |
break; |
default: |
/* |
* Something is wrong. Fallback to UP mode. |
*/ |
printf("%s: ct badness\n", __func__); |
return 1; |
} |
} |
/* |
* Process extended entries. |
*/ |
ct_extended_entries(); |
return cnt; |
} |
int configure_via_default(uint8_t n) |
{ |
/* |
* Not yet implemented. |
*/ |
printf("%s: not supported\n", __func__); |
return 1; |
} |
int ct_processor_entry(struct __processor_entry *pr) |
{ |
/* |
* Ignore processors which are not marked enabled. |
*/ |
if ((pr->cpu_flags & (1<<0)) == 0) |
return 0; |
apic_id_mask |= (1<<pr->l_apic_id); |
return 1; |
} |
void ct_bus_entry(struct __bus_entry *bus) |
{ |
#ifdef MPSCT_VERBOSE |
char buf[7]; |
memcpy((void *) buf, (void *) bus->bus_type, 6); |
buf[6] = 0; |
printf("bus%d: %s\n", bus->bus_id, buf); |
#endif |
} |
void ct_io_apic_entry(struct __io_apic_entry *ioa) |
{ |
static int io_apic_count = 0; |
/* this ioapic is marked unusable */ |
if ((ioa->io_apic_flags & 1) == 0) |
return; |
if (io_apic_count++ > 0) { |
/* |
* Multiple IO APIC's are currently not supported. |
*/ |
return; |
} |
io_apic = (uint32_t *)(uintptr_t)ioa->io_apic; |
} |
//#define MPSCT_VERBOSE |
void ct_io_intr_entry(struct __io_intr_entry *iointr) |
{ |
#ifdef MPSCT_VERBOSE |
switch (iointr->intr_type) { |
case 0: printf("INT"); break; |
case 1: printf("NMI"); break; |
case 2: printf("SMI"); break; |
case 3: printf("ExtINT"); break; |
} |
putchar(','); |
switch (iointr->poel&3) { |
case 0: printf("bus-like"); break; |
case 1: printf("active high"); break; |
case 2: printf("reserved"); break; |
case 3: printf("active low"); break; |
} |
putchar(','); |
switch ((iointr->poel>>2)&3) { |
case 0: printf("bus-like"); break; |
case 1: printf("edge-triggered"); break; |
case 2: printf("reserved"); break; |
case 3: printf("level-triggered"); break; |
} |
putchar(','); |
printf("bus%d,irq%d", iointr->src_bus_id, iointr->src_bus_irq); |
putchar(','); |
printf("io_apic%d,pin%d", iointr->dst_io_apic_id, iointr->dst_io_apic_pin); |
putchar('\n'); |
#endif |
} |
void ct_l_intr_entry(struct __l_intr_entry *lintr) |
{ |
#ifdef MPSCT_VERBOSE |
switch (lintr->intr_type) { |
case 0: printf("INT"); break; |
case 1: printf("NMI"); break; |
case 2: printf("SMI"); break; |
case 3: printf("ExtINT"); break; |
} |
putchar(','); |
switch (lintr->poel&3) { |
case 0: printf("bus-like"); break; |
case 1: printf("active high"); break; |
case 2: printf("reserved"); break; |
case 3: printf("active low"); break; |
} |
putchar(','); |
switch ((lintr->poel>>2)&3) { |
case 0: printf("bus-like"); break; |
case 1: printf("edge-triggered"); break; |
case 2: printf("reserved"); break; |
case 3: printf("level-triggered"); break; |
} |
putchar(','); |
printf("bus%d,irq%d", lintr->src_bus_id, lintr->src_bus_irq); |
putchar(','); |
printf("l_apic%d,pin%d", lintr->dst_l_apic_id, lintr->dst_l_apic_pin); |
putchar('\n'); |
#endif |
} |
void ct_extended_entries(void) |
{ |
uint8_t *ext = (uint8_t *) ct + ct->base_table_length; |
uint8_t *cur; |
for (cur = ext; cur < ext + ct->ext_table_length; cur += cur[CT_EXT_ENTRY_LEN]) { |
switch (cur[CT_EXT_ENTRY_TYPE]) { |
default: |
printf("%p: skipping MP Configuration Table extended entry type %d\n", cur, cur[CT_EXT_ENTRY_TYPE]); |
break; |
} |
} |
} |
int mps_irq_to_pin(unsigned int irq) |
{ |
unsigned int i; |
for (i = 0; i < io_intr_entry_cnt; i++) { |
if (io_intr_entries[i].src_bus_irq == irq && io_intr_entries[i].intr_type == 0) |
return io_intr_entries[i].dst_io_apic_pin; |
} |
return -1; |
} |
#endif /* CONFIG_SMP */ |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32xen/src/smp/smp.c |
---|
0,0 → 1,174 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32xen |
* @{ |
*/ |
/** @file |
*/ |
#include <smp/smp.h> |
#include <arch/smp/smp.h> |
#include <arch/smp/mps.h> |
#include <arch/smp/ap.h> |
#include <genarch/acpi/acpi.h> |
#include <genarch/acpi/madt.h> |
#include <config.h> |
#include <synch/waitq.h> |
#include <synch/synch.h> |
#include <arch/pm.h> |
#include <func.h> |
#include <panic.h> |
#include <debug.h> |
#include <arch/asm.h> |
#include <mm/frame.h> |
#include <mm/page.h> |
#include <mm/slab.h> |
#include <mm/as.h> |
#include <print.h> |
#include <memstr.h> |
#ifdef CONFIG_SMP |
static struct smp_config_operations *ops = NULL; |
void smp_init(void) |
{ |
uintptr_t l_apic_address, io_apic_address; |
if (acpi_madt) { |
acpi_madt_parse(); |
ops = &madt_config_operations; |
} |
if (config.cpu_count == 1) { |
mps_init(); |
ops = &mps_config_operations; |
} |
l_apic_address = (uintptr_t) frame_alloc(ONE_FRAME, FRAME_ATOMIC | FRAME_KA); |
if (!l_apic_address) |
panic("cannot allocate address for l_apic\n"); |
io_apic_address = (uintptr_t) frame_alloc(ONE_FRAME, FRAME_ATOMIC | FRAME_KA); |
if (!io_apic_address) |
panic("cannot allocate address for io_apic\n"); |
if (config.cpu_count > 1) { |
page_mapping_insert(AS_KERNEL, l_apic_address, (uintptr_t) l_apic, |
PAGE_NOT_CACHEABLE | PAGE_WRITE); |
page_mapping_insert(AS_KERNEL, io_apic_address, (uintptr_t) io_apic, |
PAGE_NOT_CACHEABLE | PAGE_WRITE); |
l_apic = (uint32_t *) l_apic_address; |
io_apic = (uint32_t *) io_apic_address; |
} |
} |
/* |
* Kernel thread for bringing up application processors. It becomes clear |
* that we need an arrangement like this (AP's being initialized by a kernel |
* thread), for a thread has its dedicated stack. (The stack used during the |
* BSP initialization (prior the very first call to scheduler()) will be used |
* as an initialization stack for each AP.) |
*/ |
void kmp(void *arg) |
{ |
unsigned int i; |
ASSERT(ops != NULL); |
waitq_initialize(&ap_completion_wq); |
/* |
* We need to access data in frame 0. |
* We boldly make use of kernel address space mapping. |
*/ |
/* |
* Save 0xa to address 0xf of the CMOS RAM. |
* BIOS will not do the POST after the INIT signal. |
*/ |
outb(0x70,0xf); |
outb(0x71,0xa); |
// pic_disable_irqs(0xffff); |
apic_init(); |
for (i = 0; i < ops->cpu_count(); i++) { |
struct descriptor *gdt_new; |
/* |
* Skip processors marked unusable. |
*/ |
if (!ops->cpu_enabled(i)) |
continue; |
/* |
* The bootstrap processor is already up. |
*/ |
if (ops->cpu_bootstrap(i)) |
continue; |
if (ops->cpu_apic_id(i) == l_apic_id()) { |
printf("%s: bad processor entry #%d, will not send IPI to myself\n", __FUNCTION__, i); |
continue; |
} |
/* |
* Prepare new GDT for CPU in question. |
*/ |
if (!(gdt_new = (struct descriptor *) malloc(GDT_ITEMS*sizeof(struct descriptor), FRAME_ATOMIC))) |
panic("couldn't allocate memory for GDT\n"); |
memcpy(gdt_new, gdt, GDT_ITEMS * sizeof(struct descriptor)); |
memsetb((uintptr_t)(&gdt_new[TSS_DES]), sizeof(struct descriptor), 0); |
gdtr.base = (uintptr_t) gdt_new; |
if (l_apic_send_init_ipi(ops->cpu_apic_id(i))) { |
/* |
* There may be just one AP being initialized at |
* the time. After it comes completely up, it is |
* supposed to wake us up. |
*/ |
if (waitq_sleep_timeout(&ap_completion_wq, 1000000, SYNCH_FLAGS_NONE) == ESYNCH_TIMEOUT) |
printf("%s: waiting for cpu%d (APIC ID = %d) timed out\n", __FUNCTION__, config.cpu_active > i ? config.cpu_active : i, ops->cpu_apic_id(i)); |
} else |
printf("INIT IPI for l_apic%d failed\n", ops->cpu_apic_id(i)); |
} |
} |
int smp_irq_to_pin(unsigned int irq) |
{ |
ASSERT(ops != NULL); |
return ops->irq_to_pin(irq); |
} |
#endif /* CONFIG_SMP */ |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32xen/src/smp/apic.c |
---|
0,0 → 1,581 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32xen |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/types.h> |
#include <arch/smp/apic.h> |
#include <arch/smp/ap.h> |
#include <arch/smp/mps.h> |
#include <mm/page.h> |
#include <time/delay.h> |
#include <interrupt.h> |
#include <arch/interrupt.h> |
#include <print.h> |
#include <arch/asm.h> |
#include <arch.h> |
#ifdef CONFIG_SMP |
/* |
* Advanced Programmable Interrupt Controller for SMP systems. |
* Tested on: |
* Bochs 2.0.2 - Bochs 2.2.6 with 2-8 CPUs |
* Simics 2.0.28 - Simics 2.2.19 2-15 CPUs |
* VMware Workstation 5.5 with 2 CPUs |
* QEMU 0.8.0 with 2-15 CPUs |
* ASUS P/I-P65UP5 + ASUS C-P55T2D REV. 1.41 with 2x 200Mhz Pentium CPUs |
* ASUS PCH-DL with 2x 3000Mhz Pentium 4 Xeon (HT) CPUs |
* MSI K7D Master-L with 2x 2100MHz Athlon MP CPUs |
*/ |
/* |
* These variables either stay configured as initilalized, or are changed by |
* the MP configuration code. |
* |
* Pay special attention to the volatile keyword. Without it, gcc -O2 would |
* optimize the code too much and accesses to l_apic and io_apic, that must |
* always be 32-bit, would use byte oriented instructions. |
*/ |
volatile uint32_t *l_apic = (uint32_t *) 0xfee00000; |
volatile uint32_t *io_apic = (uint32_t *) 0xfec00000; |
uint32_t apic_id_mask = 0; |
static int apic_poll_errors(void); |
#ifdef LAPIC_VERBOSE |
static char *delmod_str[] = { |
"Fixed", |
"Lowest Priority", |
"SMI", |
"Reserved", |
"NMI", |
"INIT", |
"STARTUP", |
"ExtInt" |
}; |
static char *destmod_str[] = { |
"Physical", |
"Logical" |
}; |
static char *trigmod_str[] = { |
"Edge", |
"Level" |
}; |
static char *mask_str[] = { |
"Unmasked", |
"Masked" |
}; |
static char *delivs_str[] = { |
"Idle", |
"Send Pending" |
}; |
static char *tm_mode_str[] = { |
"One-shot", |
"Periodic" |
}; |
static char *intpol_str[] = { |
"Polarity High", |
"Polarity Low" |
}; |
#endif /* LAPIC_VERBOSE */ |
static void apic_spurious(int n, istate_t *istate); |
static void l_apic_timer_interrupt(int n, istate_t *istate); |
/** Initialize APIC on BSP. */ |
void apic_init(void) |
{ |
io_apic_id_t idreg; |
unsigned int i; |
exc_register(VECTOR_APIC_SPUR, "apic_spurious", (iroutine) apic_spurious); |
enable_irqs_function = io_apic_enable_irqs; |
disable_irqs_function = io_apic_disable_irqs; |
eoi_function = l_apic_eoi; |
/* |
* Configure interrupt routing. |
* IRQ 0 remains masked as the time signal is generated by l_apic's themselves. |
* Other interrupts will be forwarded to the lowest priority CPU. |
*/ |
io_apic_disable_irqs(0xffff); |
exc_register(VECTOR_CLK, "l_apic_timer", (iroutine) l_apic_timer_interrupt); |
for (i = 0; i < IRQ_COUNT; i++) { |
int pin; |
if ((pin = smp_irq_to_pin(i)) != -1) { |
io_apic_change_ioredtbl(pin, DEST_ALL, IVT_IRQBASE+i, LOPRI); |
} |
} |
/* |
* Ensure that io_apic has unique ID. |
*/ |
idreg.value = io_apic_read(IOAPICID); |
if ((1 << idreg.apic_id) & apic_id_mask) { /* see if IO APIC ID is used already */ |
for (i = 0; i < APIC_ID_COUNT; i++) { |
if (!((1<<i) & apic_id_mask)) { |
idreg.apic_id = i; |
io_apic_write(IOAPICID, idreg.value); |
break; |
} |
} |
} |
/* |
* Configure the BSP's lapic. |
*/ |
l_apic_init(); |
l_apic_debug(); |
} |
/** APIC spurious interrupt handler. |
* |
* @param n Interrupt vector. |
* @param istate Interrupted state. |
*/ |
void apic_spurious(int n, istate_t *istate) |
{ |
#ifdef CONFIG_DEBUG |
printf("cpu%d: APIC spurious interrupt\n", CPU->id); |
#endif |
} |
/** Poll for APIC errors. |
* |
* Examine Error Status Register and report all errors found. |
* |
* @return 0 on error, 1 on success. |
*/ |
int apic_poll_errors(void) |
{ |
esr_t esr; |
esr.value = l_apic[ESR]; |
if (esr.send_checksum_error) |
printf("Send Checksum Error\n"); |
if (esr.receive_checksum_error) |
printf("Receive Checksum Error\n"); |
if (esr.send_accept_error) |
printf("Send Accept Error\n"); |
if (esr.receive_accept_error) |
printf("Receive Accept Error\n"); |
if (esr.send_illegal_vector) |
printf("Send Illegal Vector\n"); |
if (esr.received_illegal_vector) |
printf("Received Illegal Vector\n"); |
if (esr.illegal_register_address) |
printf("Illegal Register Address\n"); |
return !esr.err_bitmap; |
} |
/** Send all CPUs excluding CPU IPI vector. |
* |
* @param vector Interrupt vector to be sent. |
* |
* @return 0 on failure, 1 on success. |
*/ |
int l_apic_broadcast_custom_ipi(uint8_t vector) |
{ |
icr_t icr; |
icr.lo = l_apic[ICRlo]; |
icr.delmod = DELMOD_FIXED; |
icr.destmod = DESTMOD_LOGIC; |
icr.level = LEVEL_ASSERT; |
icr.shorthand = SHORTHAND_ALL_EXCL; |
icr.trigger_mode = TRIGMOD_LEVEL; |
icr.vector = vector; |
l_apic[ICRlo] = icr.lo; |
icr.lo = l_apic[ICRlo]; |
if (icr.delivs == DELIVS_PENDING) { |
#ifdef CONFIG_DEBUG |
printf("IPI is pending.\n"); |
#endif |
} |
return apic_poll_errors(); |
} |
/** Universal Start-up Algorithm for bringing up the AP processors. |
* |
* @param apicid APIC ID of the processor to be brought up. |
* |
* @return 0 on failure, 1 on success. |
*/ |
int l_apic_send_init_ipi(uint8_t apicid) |
{ |
icr_t icr; |
int i; |
/* |
* Read the ICR register in and zero all non-reserved fields. |
*/ |
icr.lo = l_apic[ICRlo]; |
icr.hi = l_apic[ICRhi]; |
icr.delmod = DELMOD_INIT; |
icr.destmod = DESTMOD_PHYS; |
icr.level = LEVEL_ASSERT; |
icr.trigger_mode = TRIGMOD_LEVEL; |
icr.shorthand = SHORTHAND_NONE; |
icr.vector = 0; |
icr.dest = apicid; |
l_apic[ICRhi] = icr.hi; |
l_apic[ICRlo] = icr.lo; |
/* |
* According to MP Specification, 20us should be enough to |
* deliver the IPI. |
*/ |
delay(20); |
if (!apic_poll_errors()) |
return 0; |
icr.lo = l_apic[ICRlo]; |
if (icr.delivs == DELIVS_PENDING) { |
#ifdef CONFIG_DEBUG |
printf("IPI is pending.\n"); |
#endif |
} |
icr.delmod = DELMOD_INIT; |
icr.destmod = DESTMOD_PHYS; |
icr.level = LEVEL_DEASSERT; |
icr.shorthand = SHORTHAND_NONE; |
icr.trigger_mode = TRIGMOD_LEVEL; |
icr.vector = 0; |
l_apic[ICRlo] = icr.lo; |
/* |
* Wait 10ms as MP Specification specifies. |
*/ |
delay(10000); |
if (!is_82489DX_apic(l_apic[LAVR])) { |
/* |
* If this is not 82489DX-based l_apic we must send two STARTUP IPI's. |
*/ |
for (i = 0; i < 2; i++) { |
icr.lo = l_apic[ICRlo]; |
icr.delmod = DELMOD_STARTUP; |
icr.destmod = DESTMOD_PHYS; |
icr.level = LEVEL_ASSERT; |
icr.shorthand = SHORTHAND_NONE; |
icr.trigger_mode = TRIGMOD_LEVEL; |
l_apic[ICRlo] = icr.lo; |
delay(200); |
} |
} |
return apic_poll_errors(); |
} |
/** Initialize Local APIC. */ |
void l_apic_init(void) |
{ |
lvt_error_t error; |
lvt_lint_t lint; |
tpr_t tpr; |
svr_t svr; |
icr_t icr; |
tdcr_t tdcr; |
lvt_tm_t tm; |
ldr_t ldr; |
dfr_t dfr; |
uint32_t t1, t2; |
/* Initialize LVT Error register. */ |
error.value = l_apic[LVT_Err]; |
error.masked = true; |
l_apic[LVT_Err] = error.value; |
/* Initialize LVT LINT0 register. */ |
lint.value = l_apic[LVT_LINT0]; |
lint.masked = true; |
l_apic[LVT_LINT0] = lint.value; |
/* Initialize LVT LINT1 register. */ |
lint.value = l_apic[LVT_LINT1]; |
lint.masked = true; |
l_apic[LVT_LINT1] = lint.value; |
/* Task Priority Register initialization. */ |
tpr.value = l_apic[TPR]; |
tpr.pri_sc = 0; |
tpr.pri = 0; |
l_apic[TPR] = tpr.value; |
/* Spurious-Interrupt Vector Register initialization. */ |
svr.value = l_apic[SVR]; |
svr.vector = VECTOR_APIC_SPUR; |
svr.lapic_enabled = true; |
svr.focus_checking = true; |
l_apic[SVR] = svr.value; |
if (CPU->arch.family >= 6) |
enable_l_apic_in_msr(); |
/* Interrupt Command Register initialization. */ |
icr.lo = l_apic[ICRlo]; |
icr.delmod = DELMOD_INIT; |
icr.destmod = DESTMOD_PHYS; |
icr.level = LEVEL_DEASSERT; |
icr.shorthand = SHORTHAND_ALL_INCL; |
icr.trigger_mode = TRIGMOD_LEVEL; |
l_apic[ICRlo] = icr.lo; |
/* Timer Divide Configuration Register initialization. */ |
tdcr.value = l_apic[TDCR]; |
tdcr.div_value = DIVIDE_1; |
l_apic[TDCR] = tdcr.value; |
/* Program local timer. */ |
tm.value = l_apic[LVT_Tm]; |
tm.vector = VECTOR_CLK; |
tm.mode = TIMER_PERIODIC; |
tm.masked = false; |
l_apic[LVT_Tm] = tm.value; |
/* |
* Measure and configure the timer to generate timer |
* interrupt with period 1s/HZ seconds. |
*/ |
t1 = l_apic[CCRT]; |
l_apic[ICRT] = 0xffffffff; |
while (l_apic[CCRT] == t1) |
; |
t1 = l_apic[CCRT]; |
delay(1000000/HZ); |
t2 = l_apic[CCRT]; |
l_apic[ICRT] = t1-t2; |
/* Program Logical Destination Register. */ |
ldr.value = l_apic[LDR]; |
if (CPU->id < sizeof(CPU->id) * 8) /* size in bits */ |
ldr.id = (1 << CPU->id); |
l_apic[LDR] = ldr.value; |
/* Program Destination Format Register for Flat mode. */ |
dfr.value = l_apic[DFR]; |
dfr.model = MODEL_FLAT; |
l_apic[DFR] = dfr.value; |
} |
/** Local APIC End of Interrupt. */ |
void l_apic_eoi(void) |
{ |
l_apic[EOI] = 0; |
} |
/** Dump content of Local APIC registers. */ |
void l_apic_debug(void) |
{ |
#ifdef LAPIC_VERBOSE |
lvt_tm_t tm; |
lvt_lint_t lint; |
lvt_error_t error; |
printf("LVT on cpu%d, LAPIC ID: %d\n", CPU->id, l_apic_id()); |
tm.value = l_apic[LVT_Tm]; |
printf("LVT Tm: vector=%hhd, %s, %s, %s\n", tm.vector, delivs_str[tm.delivs], mask_str[tm.masked], tm_mode_str[tm.mode]); |
lint.value = l_apic[LVT_LINT0]; |
printf("LVT LINT0: vector=%hhd, %s, %s, %s, irr=%d, %s, %s\n", tm.vector, delmod_str[lint.delmod], delivs_str[lint.delivs], intpol_str[lint.intpol], lint.irr, trigmod_str[lint.trigger_mode], mask_str[lint.masked]); |
lint.value = l_apic[LVT_LINT1]; |
printf("LVT LINT1: vector=%hhd, %s, %s, %s, irr=%d, %s, %s\n", tm.vector, delmod_str[lint.delmod], delivs_str[lint.delivs], intpol_str[lint.intpol], lint.irr, trigmod_str[lint.trigger_mode], mask_str[lint.masked]); |
error.value = l_apic[LVT_Err]; |
printf("LVT Err: vector=%hhd, %s, %s\n", error.vector, delivs_str[error.delivs], mask_str[error.masked]); |
#endif |
} |
/** Local APIC Timer Interrupt. |
* |
* @param n Interrupt vector number. |
* @param istate Interrupted state. |
*/ |
void l_apic_timer_interrupt(int n, istate_t *istate) |
{ |
l_apic_eoi(); |
clock(); |
} |
/** Get Local APIC ID. |
* |
* @return Local APIC ID. |
*/ |
uint8_t l_apic_id(void) |
{ |
l_apic_id_t idreg; |
idreg.value = l_apic[L_APIC_ID]; |
return idreg.apic_id; |
} |
/** Read from IO APIC register. |
* |
* @param address IO APIC register address. |
* |
* @return Content of the addressed IO APIC register. |
*/ |
uint32_t io_apic_read(uint8_t address) |
{ |
io_regsel_t regsel; |
regsel.value = io_apic[IOREGSEL]; |
regsel.reg_addr = address; |
io_apic[IOREGSEL] = regsel.value; |
return io_apic[IOWIN]; |
} |
/** Write to IO APIC register. |
* |
* @param address IO APIC register address. |
* @param x Content to be written to the addressed IO APIC register. |
*/ |
void io_apic_write(uint8_t address, uint32_t x) |
{ |
io_regsel_t regsel; |
regsel.value = io_apic[IOREGSEL]; |
regsel.reg_addr = address; |
io_apic[IOREGSEL] = regsel.value; |
io_apic[IOWIN] = x; |
} |
/** Change some attributes of one item in I/O Redirection Table. |
* |
* @param pin IO APIC pin number. |
* @param dest Interrupt destination address. |
* @param v Interrupt vector to trigger. |
* @param flags Flags. |
*/ |
void io_apic_change_ioredtbl(uint8_t pin, uint8_t dest, uint8_t v, int flags) |
{ |
io_redirection_reg_t reg; |
int dlvr = DELMOD_FIXED; |
if (flags & LOPRI) |
dlvr = DELMOD_LOWPRI; |
reg.lo = io_apic_read(IOREDTBL + pin * 2); |
reg.hi = io_apic_read(IOREDTBL + pin * 2 + 1); |
reg.dest = dest; |
reg.destmod = DESTMOD_LOGIC; |
reg.trigger_mode = TRIGMOD_EDGE; |
reg.intpol = POLARITY_HIGH; |
reg.delmod = dlvr; |
reg.intvec = v; |
io_apic_write(IOREDTBL + pin * 2, reg.lo); |
io_apic_write(IOREDTBL + pin * 2 + 1, reg.hi); |
} |
/** Mask IRQs in IO APIC. |
* |
* @param irqmask Bitmask of IRQs to be masked (0 = do not mask, 1 = mask). |
*/ |
void io_apic_disable_irqs(uint16_t irqmask) |
{ |
io_redirection_reg_t reg; |
unsigned int i; |
int pin; |
for (i = 0; i < 16; i++) { |
if (irqmask & (1 << i)) { |
/* |
* Mask the signal input in IO APIC if there is a |
* mapping for the respective IRQ number. |
*/ |
pin = smp_irq_to_pin(i); |
if (pin != -1) { |
reg.lo = io_apic_read(IOREDTBL + pin * 2); |
reg.masked = true; |
io_apic_write(IOREDTBL + pin*2, reg.lo); |
} |
} |
} |
} |
/** Unmask IRQs in IO APIC. |
* |
* @param irqmask Bitmask of IRQs to be unmasked (0 = do not unmask, 1 = unmask). |
*/ |
void io_apic_enable_irqs(uint16_t irqmask) |
{ |
unsigned int i; |
int pin; |
io_redirection_reg_t reg; |
for (i = 0; i < 16; i++) { |
if (irqmask & (1 << i)) { |
/* |
* Unmask the signal input in IO APIC if there is a |
* mapping for the respective IRQ number. |
*/ |
pin = smp_irq_to_pin(i); |
if (pin != -1) { |
reg.lo = io_apic_read(IOREDTBL + pin * 2); |
reg.masked = false; |
io_apic_write(IOREDTBL + pin*2, reg.lo); |
} |
} |
} |
} |
#endif /* CONFIG_SMP */ |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32xen/src/smp/ipi.c |
---|
0,0 → 1,48 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32xen |
* @{ |
*/ |
/** @file |
*/ |
#ifdef CONFIG_SMP |
#include <smp/ipi.h> |
#include <arch/smp/apic.h> |
void ipi_broadcast_arch(int ipi) |
{ |
(void) l_apic_broadcast_custom_ipi((uint8_t) ipi); |
} |
#endif /* CONFIG_SMP */ |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32xen/src/mm/tlb.c |
---|
0,0 → 1,75 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32xen_mm |
* @{ |
*/ |
/** @file |
* @ingroup ia32xen_mm |
*/ |
#include <mm/tlb.h> |
#include <arch/mm/asid.h> |
#include <arch/asm.h> |
#include <arch/types.h> |
#include <arch/hypercall.h> |
/** Invalidate all entries in TLB. */ |
void tlb_invalidate_all(void) |
{ |
mmuext_op_t mmu_ext; |
mmu_ext.cmd = MMUEXT_TLB_FLUSH_LOCAL; |
xen_mmuext_op(&mmu_ext, 1, NULL, DOMID_SELF); |
} |
/** Invalidate all entries in TLB that belong to specified address space. |
* |
* @param asid This parameter is ignored as the architecture doesn't support it. |
*/ |
void tlb_invalidate_asid(asid_t asid) |
{ |
tlb_invalidate_all(); |
} |
/** Invalidate TLB entries for specified page range belonging to specified address space. |
* |
* @param asid This parameter is ignored as the architecture doesn't support it. |
* @param page Address of the first page whose entry is to be invalidated. |
* @param cnt Number of entries to invalidate. |
*/ |
void tlb_invalidate_pages(asid_t asid, uintptr_t page, count_t cnt) |
{ |
unsigned int i; |
for (i = 0; i < cnt; i++) |
invlpg(page + i * PAGE_SIZE); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32xen/src/mm/frame.c |
---|
0,0 → 1,57 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32xen_mm |
* @{ |
*/ |
/** @file |
* @ingroup ia32xen_mm |
*/ |
#include <mm/frame.h> |
#include <config.h> |
void physmem_print(void) |
{ |
printf("Base Size Reserved\n"); |
printf("---------- ---------- ---------\n"); |
printf("%#10x %#10x %#10x\n", PFN2ADDR(meminfo.start), |
PFN2ADDR(meminfo.size), PFN2ADDR(meminfo.reserved)); |
} |
void frame_arch_init(void) |
{ |
if (config.cpu_active == 1) { |
/* The only memory zone */ |
zone_create(meminfo.start, meminfo.size, meminfo.start + meminfo.reserved, 0); |
frame_mark_unavailable(meminfo.start, meminfo.reserved); |
} |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32xen/src/mm/page.c |
---|
0,0 → 1,86 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32xen_mm |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/mm/page.h> |
#include <genarch/mm/page_pt.h> |
#include <arch/mm/frame.h> |
#include <mm/frame.h> |
#include <mm/page.h> |
#include <mm/as.h> |
#include <arch/types.h> |
#include <align.h> |
#include <config.h> |
#include <func.h> |
#include <arch/interrupt.h> |
#include <arch/asm.h> |
#include <debug.h> |
#include <memstr.h> |
#include <print.h> |
#include <interrupt.h> |
void page_arch_init(void) |
{ |
if (config.cpu_active == 1) { |
page_mapping_operations = &pt_mapping_operations; |
AS_KERNEL->genarch.page_table = (pte_t *) KA2PA(start_info.ptl0); |
} else |
SET_PTL0_ADDRESS_ARCH(AS_KERNEL->genarch.page_table); |
} |
void page_fault(int n, istate_t *istate) |
{ |
uintptr_t page; |
pf_access_t access; |
page = read_cr2(); |
if (istate->error_word & PFERR_CODE_RSVD) |
panic("Reserved bit set in page directory.\n"); |
if (istate->error_word & PFERR_CODE_RW) |
access = PF_ACCESS_WRITE; |
else |
access = PF_ACCESS_READ; |
if (as_page_fault(page, access, istate) == AS_PF_FAULT) { |
fault_if_from_uspace(istate, "Page fault: %#x", page); |
decode_istate(istate); |
printf("page fault address: %#x\n", page); |
panic("page fault\n"); |
} |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32xen/src/mm/as.c |
---|
0,0 → 1,46 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32xen_mm |
* @{ |
*/ |
/** @file |
* @ingroup ia32xen_mm |
*/ |
#include <arch/mm/as.h> |
#include <genarch/mm/page_pt.h> |
/** Architecture dependent address space init. */ |
void as_arch_init(void) |
{ |
as_operations = &as_pt_operations; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32xen/src/ia32xen.c |
---|
0,0 → 1,218 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32xen |
* @{ |
*/ |
/** @file |
*/ |
#include <arch.h> |
#include <main/main.h> |
#include <arch/types.h> |
#include <align.h> |
#include <arch/pm.h> |
#include <arch/drivers/xconsole.h> |
#include <arch/mm/page.h> |
#include <arch/context.h> |
#include <config.h> |
#include <arch/interrupt.h> |
#include <arch/asm.h> |
#include <genarch/acpi/acpi.h> |
#include <arch/bios/bios.h> |
#include <interrupt.h> |
#include <arch/debugger.h> |
#include <proc/thread.h> |
#include <syscall/syscall.h> |
#include <console/console.h> |
#include <ddi/irq.h> |
start_info_t start_info; |
memzone_t meminfo; |
extern void xen_callback(void); |
extern void xen_failsafe_callback(void); |
void arch_pre_main(void) |
{ |
pte_t pte; |
memsetb((uintptr_t) &pte, sizeof(pte), 0); |
pte.present = 1; |
pte.writeable = 1; |
pte.frame_address = ADDR2PFN((uintptr_t) start_info.shared_info); |
ASSERT(xen_update_va_mapping(&shared_info, pte, UVMF_INVLPG) == 0); |
if (!(start_info.flags & SIF_INITDOMAIN)) { |
/* Map console frame */ |
pte.present = 1; |
pte.writeable = 1; |
pte.frame_address = start_info.console.domU.mfn; |
ASSERT(xen_update_va_mapping(&console_page, pte, UVMF_INVLPG) == 0); |
} else |
start_info.console.domU.evtchn = 0; |
ASSERT(xen_set_callbacks(XEN_CS, xen_callback, XEN_CS, xen_failsafe_callback) == 0); |
/* Create identity mapping */ |
meminfo.start = ADDR2PFN(ALIGN_UP(KA2PA(start_info.ptl0), PAGE_SIZE)) + start_info.pt_frames; |
meminfo.size = start_info.frames - meminfo.start; |
meminfo.reserved = 0; |
uintptr_t pa; |
index_t last_ptl0 = 0; |
for (pa = PFN2ADDR(meminfo.start); pa < PFN2ADDR(meminfo.start + meminfo.size); pa += FRAME_SIZE) { |
uintptr_t va = PA2KA(pa); |
if ((PTL0_INDEX(va) != last_ptl0) && (GET_PTL1_FLAGS(start_info.ptl0, PTL0_INDEX(va)) & PAGE_NOT_PRESENT)) { |
/* New page directory entry needed */ |
uintptr_t tpa = PFN2ADDR(meminfo.start + meminfo.reserved); |
uintptr_t tva = PA2KA(tpa); |
memsetb(tva, PAGE_SIZE, 0); |
pte_t *tptl3 = (pte_t *) PA2KA(GET_PTL1_ADDRESS(start_info.ptl0, PTL0_INDEX(tva))); |
SET_FRAME_ADDRESS(tptl3, PTL3_INDEX(tva), 0); |
SET_PTL1_ADDRESS(start_info.ptl0, PTL0_INDEX(va), tpa); |
SET_FRAME_ADDRESS(tptl3, PTL3_INDEX(tva), tpa); |
last_ptl0 = PTL0_INDEX(va); |
meminfo.reserved++; |
} |
pte_t *ptl3 = (pte_t *) PA2KA(GET_PTL1_ADDRESS(start_info.ptl0, PTL0_INDEX(va))); |
SET_FRAME_ADDRESS(ptl3, PTL3_INDEX(va), pa); |
SET_FRAME_FLAGS(ptl3, PTL3_INDEX(va), PAGE_PRESENT | PAGE_WRITE); |
} |
/* Put initial stack safely in the mapped area */ |
stack_safe = PA2KA(PFN2ADDR(meminfo.start + meminfo.reserved)); |
} |
void arch_pre_mm_init(void) |
{ |
pm_init(); |
if (config.cpu_active == 1) { |
interrupt_init(); |
// bios_init(); |
} |
} |
void arch_post_mm_init(void) |
{ |
if (config.cpu_active == 1) { |
/* Initialize IRQ routing */ |
irq_init(IRQ_COUNT, IRQ_COUNT); |
/* Video */ |
xen_console_init(); |
/* Enable debugger */ |
debugger_init(); |
/* Merge all memory zones to 1 big zone */ |
zone_merge_all(); |
} |
} |
void arch_post_cpu_init(void) |
{ |
} |
void arch_pre_smp_init(void) |
{ |
if (config.cpu_active == 1) { |
#ifdef CONFIG_SMP |
acpi_init(); |
#endif /* CONFIG_SMP */ |
} |
} |
void arch_post_smp_init(void) |
{ |
} |
void calibrate_delay_loop(void) |
{ |
// i8254_calibrate_delay_loop(); |
if (config.cpu_active == 1) { |
/* |
* This has to be done only on UP. |
* On SMP, i8254 is not used for time keeping and its interrupt pin remains masked. |
*/ |
// i8254_normal_operation(); |
} |
} |
/** Set thread-local-storage pointer |
* |
* TLS pointer is set in GS register. That means, the GS contains |
* selector, and the descriptor->base is the correct address. |
*/ |
unative_t sys_tls_set(unative_t addr) |
{ |
THREAD->arch.tls = addr; |
set_tls_desc(addr); |
return 0; |
} |
/** Acquire console back for kernel |
* |
*/ |
void arch_grab_console(void) |
{ |
} |
/** Return console to userspace |
* |
*/ |
void arch_release_console(void) |
{ |
} |
void arch_reboot(void) |
{ |
// TODO |
while (1); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32xen/src/interrupt.c |
---|
0,0 → 1,248 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32xen_interrupt |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/interrupt.h> |
#include <syscall/syscall.h> |
#include <print.h> |
#include <debug.h> |
#include <panic.h> |
#include <func.h> |
#include <cpu.h> |
#include <arch/asm.h> |
#include <mm/tlb.h> |
#include <mm/as.h> |
#include <arch.h> |
#include <symtab.h> |
#include <proc/thread.h> |
#include <proc/task.h> |
#include <synch/spinlock.h> |
#include <arch/ddi/ddi.h> |
#include <ipc/sysipc.h> |
#include <interrupt.h> |
#include <ddi/irq.h> |
/* |
* Interrupt and exception dispatching. |
*/ |
void (* disable_irqs_function)(uint16_t irqmask) = NULL; |
void (* enable_irqs_function)(uint16_t irqmask) = NULL; |
void (* eoi_function)(void) = NULL; |
void decode_istate(istate_t *istate) |
{ |
char *symbol = get_symtab_entry(istate->eip); |
if (!symbol) |
symbol = ""; |
if (CPU) |
printf("----------------EXCEPTION OCCURED (cpu%d)----------------\n", CPU->id); |
else |
printf("----------------EXCEPTION OCCURED----------------\n"); |
printf("%%eip: %#x (%s)\n",istate->eip,symbol); |
printf("ERROR_WORD=%#x\n", istate->error_word); |
printf("%%cs=%#x,flags=%#x\n", istate->cs, istate->eflags); |
printf("%%eax=%#x, %%ecx=%#x, %%edx=%#x, %%esp=%#x\n", istate->eax,istate->ecx,istate->edx,&istate->stack[0]); |
#ifdef CONFIG_DEBUG_ALLREGS |
printf("%%esi=%#x, %%edi=%#x, %%ebp=%#x, %%ebx=%#x\n", istate->esi,istate->edi,istate->ebp,istate->ebx); |
#endif |
printf("stack: %#x, %#x, %#x, %#x\n", istate->stack[0], istate->stack[1], istate->stack[2], istate->stack[3]); |
printf(" %#x, %#x, %#x, %#x\n", istate->stack[4], istate->stack[5], istate->stack[6], istate->stack[7]); |
} |
static void trap_virtual_eoi(void) |
{ |
if (eoi_function) |
eoi_function(); |
else |
panic("no eoi_function\n"); |
} |
static void null_interrupt(int n, istate_t *istate) |
{ |
fault_if_from_uspace(istate, "unserviced interrupt: %d", n); |
decode_istate(istate); |
panic("unserviced interrupt: %d\n", n); |
} |
/** General Protection Fault. */ |
static void gp_fault(int n, istate_t *istate) |
{ |
if (TASK) { |
count_t ver; |
spinlock_lock(&TASK->lock); |
ver = TASK->arch.iomapver; |
spinlock_unlock(&TASK->lock); |
if (CPU->arch.iomapver_copy != ver) { |
/* |
* This fault can be caused by an early access |
* to I/O port because of an out-dated |
* I/O Permission bitmap installed on CPU. |
* Install the fresh copy and restart |
* the instruction. |
*/ |
io_perm_bitmap_install(); |
return; |
} |
fault_if_from_uspace(istate, "general protection fault"); |
} |
decode_istate(istate); |
panic("general protection fault\n"); |
} |
static void ss_fault(int n, istate_t *istate) |
{ |
fault_if_from_uspace(istate, "stack fault"); |
decode_istate(istate); |
panic("stack fault\n"); |
} |
static void simd_fp_exception(int n, istate_t *istate) |
{ |
uint32_t mxcsr; |
asm |
( |
"stmxcsr %0;\n" |
:"=m"(mxcsr) |
); |
fault_if_from_uspace(istate, "SIMD FP exception(19), MXCSR: %#zx", |
(unative_t)mxcsr); |
decode_istate(istate); |
printf("MXCSR: %#zx\n",(unative_t)(mxcsr)); |
panic("SIMD FP exception(19)\n"); |
} |
static void nm_fault(int n, istate_t *istate) |
{ |
#ifdef CONFIG_FPU_LAZY |
scheduler_fpu_lazy_request(); |
#else |
fault_if_from_uspace(istate, "fpu fault"); |
panic("fpu fault"); |
#endif |
} |
#ifdef CONFIG_SMP |
static void tlb_shootdown_ipi(int n, istate_t *istate) |
{ |
trap_virtual_eoi(); |
tlb_shootdown_ipi_recv(); |
} |
#endif |
/** Handler of IRQ exceptions */ |
static void irq_interrupt(int n, istate_t *istate) |
{ |
ASSERT(n >= IVT_IRQBASE); |
int inum = n - IVT_IRQBASE; |
bool ack = false; |
ASSERT(inum < IRQ_COUNT); |
ASSERT((inum != IRQ_PIC_SPUR) && (inum != IRQ_PIC1)); |
irq_t *irq = irq_dispatch_and_lock(inum); |
if (irq) { |
/* |
* The IRQ handler was found. |
*/ |
if (irq->preack) { |
/* Send EOI before processing the interrupt */ |
trap_virtual_eoi(); |
ack = true; |
} |
irq->handler(irq, irq->arg); |
spinlock_unlock(&irq->lock); |
} else { |
/* |
* Spurious interrupt. |
*/ |
#ifdef CONFIG_DEBUG |
printf("cpu%d: spurious interrupt (inum=%d)\n", CPU->id, inum); |
#endif |
} |
if (!ack) |
trap_virtual_eoi(); |
} |
void interrupt_init(void) |
{ |
int i; |
for (i = 0; i < IVT_ITEMS; i++) |
exc_register(i, "null", (iroutine) null_interrupt); |
for (i = 0; i < IRQ_COUNT; i++) { |
if ((i != IRQ_PIC_SPUR) && (i != IRQ_PIC1)) |
exc_register(IVT_IRQBASE + i, "irq", (iroutine) irq_interrupt); |
} |
exc_register(7, "nm_fault", (iroutine) nm_fault); |
exc_register(12, "ss_fault", (iroutine) ss_fault); |
exc_register(13, "gp_fault", (iroutine) gp_fault); |
exc_register(19, "simd_fp", (iroutine) simd_fp_exception); |
#ifdef CONFIG_SMP |
exc_register(VECTOR_TLB_SHOOTDOWN_IPI, "tlb_shootdown", (iroutine) tlb_shootdown_ipi); |
#endif |
} |
void trap_virtual_enable_irqs(uint16_t irqmask) |
{ |
if (enable_irqs_function) |
enable_irqs_function(irqmask); |
else |
panic("no enable_irqs_function\n"); |
} |
void trap_virtual_disable_irqs(uint16_t irqmask) |
{ |
if (disable_irqs_function) |
disable_irqs_function(irqmask); |
else |
panic("no disable_irqs_function\n"); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32xen/src/pm.c |
---|
0,0 → 1,206 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32xen |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/pm.h> |
#include <config.h> |
#include <arch/types.h> |
#include <arch/interrupt.h> |
#include <arch/asm.h> |
#include <arch/context.h> |
#include <panic.h> |
#include <arch/mm/page.h> |
#include <mm/slab.h> |
#include <memstr.h> |
#include <interrupt.h> |
/* |
* Early ia32xen configuration functions and data structures. |
*/ |
/* |
* We have no use for segmentation so we set up flat mode. In this |
* mode, we use, for each privilege level, two segments spanning the |
* whole memory. One is for code and one is for data. |
* |
* One is for GS register which holds pointer to the TLS thread |
* structure in it's base. |
*/ |
descriptor_t gdt[GDT_ITEMS] = { |
/* NULL descriptor */ |
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, |
/* KTEXT descriptor */ |
{ 0xffff, 0, 0, AR_PRESENT | AR_CODE | DPL_KERNEL, 0xf, 0, 0, 1, 1, 0 }, |
/* KDATA descriptor */ |
{ 0xffff, 0, 0, AR_PRESENT | AR_DATA | AR_WRITABLE | DPL_KERNEL, 0xf, 0, 0, 1, 1, 0 }, |
/* UTEXT descriptor */ |
{ 0xffff, 0, 0, AR_PRESENT | AR_CODE | DPL_USER, 0xf, 0, 0, 1, 1, 0 }, |
/* UDATA descriptor */ |
{ 0xffff, 0, 0, AR_PRESENT | AR_DATA | AR_WRITABLE | DPL_USER, 0xf, 0, 0, 1, 1, 0 }, |
/* TSS descriptor - set up will be completed later */ |
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, |
/* TLS descriptor */ |
{ 0xffff, 0, 0, AR_PRESENT | AR_DATA | AR_WRITABLE | DPL_USER, 0xf, 0, 0, 1, 1, 0 }, |
}; |
static trap_info_t traps[IDT_ITEMS + 1]; |
static tss_t tss; |
tss_t *tss_p = NULL; |
/* gdtr is changed by kmp before next CPU is initialized */ |
ptr_16_32_t bootstrap_gdtr = { .limit = sizeof(gdt), .base = KA2PA((uintptr_t) gdt) }; |
ptr_16_32_t gdtr = { .limit = sizeof(gdt), .base = (uintptr_t) gdt }; |
void gdt_setbase(descriptor_t *d, uintptr_t base) |
{ |
d->base_0_15 = base & 0xffff; |
d->base_16_23 = ((base) >> 16) & 0xff; |
d->base_24_31 = ((base) >> 24) & 0xff; |
} |
void gdt_setlimit(descriptor_t *d, uint32_t limit) |
{ |
d->limit_0_15 = limit & 0xffff; |
d->limit_16_19 = (limit >> 16) & 0xf; |
} |
void tss_initialize(tss_t *t) |
{ |
memsetb((uintptr_t) t, sizeof(struct tss), 0); |
} |
static void trap(void) |
{ |
} |
void traps_init(void) |
{ |
index_t i; |
for (i = 0; i < IDT_ITEMS; i++) { |
traps[i].vector = i; |
if (i == VECTOR_SYSCALL) |
traps[i].flags = 3; |
else |
traps[i].flags = 0; |
traps[i].cs = XEN_CS; |
traps[i].address = trap; |
} |
traps[IDT_ITEMS].vector = 0; |
traps[IDT_ITEMS].flags = 0; |
traps[IDT_ITEMS].cs = 0; |
traps[IDT_ITEMS].address = NULL; |
} |
/* Clean IOPL(12,13) and NT(14) flags in EFLAGS register */ |
static void clean_IOPL_NT_flags(void) |
{ |
// asm volatile ( |
// "pushfl\n" |
// "pop %%eax\n" |
// "and $0xffff8fff, %%eax\n" |
// "push %%eax\n" |
// "popfl\n" |
// : : : "eax" |
// ); |
} |
/* Clean AM(18) flag in CR0 register */ |
static void clean_AM_flag(void) |
{ |
// asm volatile ( |
// "mov %%cr0, %%eax\n" |
// "and $0xfffbffff, %%eax\n" |
// "mov %%eax, %%cr0\n" |
// : : : "eax" |
// ); |
} |
void pm_init(void) |
{ |
descriptor_t *gdt_p = (descriptor_t *) gdtr.base; |
// gdtr_load(&gdtr); |
if (config.cpu_active == 1) { |
traps_init(); |
xen_set_trap_table(traps); |
/* |
* NOTE: bootstrap CPU has statically allocated TSS, because |
* the heap hasn't been initialized so far. |
*/ |
tss_p = &tss; |
} else { |
tss_p = (tss_t *) malloc(sizeof(tss_t), FRAME_ATOMIC); |
if (!tss_p) |
panic("could not allocate TSS\n"); |
} |
// tss_initialize(tss_p); |
gdt_p[TSS_DES].access = AR_PRESENT | AR_TSS | DPL_KERNEL; |
gdt_p[TSS_DES].special = 1; |
gdt_p[TSS_DES].granularity = 0; |
gdt_setbase(&gdt_p[TSS_DES], (uintptr_t) tss_p); |
gdt_setlimit(&gdt_p[TSS_DES], TSS_BASIC_SIZE - 1); |
/* |
* As of this moment, the current CPU has its own GDT pointing |
* to its own TSS. We just need to load the TR register. |
*/ |
// tr_load(selector(TSS_DES)); |
clean_IOPL_NT_flags(); /* Disable I/O on nonprivileged levels and clear NT flag. */ |
clean_AM_flag(); /* Disable alignment check */ |
} |
void set_tls_desc(uintptr_t tls) |
{ |
ptr_16_32_t cpugdtr; |
descriptor_t *gdt_p; |
gdtr_store(&cpugdtr); |
gdt_p = (descriptor_t *) cpugdtr.base; |
gdt_setbase(&gdt_p[TLS_DES], tls); |
/* Reload gdt register to update GS in CPU */ |
gdtr_load(&cpugdtr); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32xen/src/boot/boot.S |
---|
0,0 → 1,102 |
# |
# Copyright (c) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
#include <arch/mm/page.h> |
#include <arch/hypercall.h> |
#define ELFNOTE(name, type, desctype, descval) \ |
.section .note.name; \ |
.align 4; \ |
.long 2f - 1f; \ |
.long 4f - 3f; \ |
.long type; \ |
1:.asciz #name; \ |
2:.align 4; \ |
3:desctype descval; \ |
4:.align 4 |
ELFNOTE(Xen, XEN_ELFNOTE_GUEST_OS, .asciz, "HelenOS") |
ELFNOTE(Xen, XEN_ELFNOTE_GUEST_VERSION, .asciz, RELEASE) |
ELFNOTE(Xen, XEN_ELFNOTE_XEN_VERSION, .asciz, "xen-3.0") |
ELFNOTE(Xen, XEN_ELFNOTE_VIRT_BASE, .long, PA2KA(BOOT_OFFSET)) |
ELFNOTE(Xen, XEN_ELFNOTE_PADDR_OFFSET, .long, 0) |
ELFNOTE(Xen, XEN_ELFNOTE_ENTRY, .long, kernel_image_start) |
ELFNOTE(Xen, XEN_ELFNOTE_HYPERCALL_PAGE, .long, hypercall_page) |
ELFNOTE(Xen, XEN_ELFNOTE_FEATURES, .asciz, "auto_translated_physmap|supervisor_mode_kernel") |
ELFNOTE(Xen, XEN_ELFNOTE_PAE_MODE, .asciz, "no") |
ELFNOTE(Xen, XEN_ELFNOTE_LOADER, .asciz, "generic") |
.text |
.code32 |
.align 4 |
.global kernel_image_start |
kernel_image_start: |
# copy start_info (esi initialized by Xen) |
movl $start_info, %edi |
movl $START_INFO_SIZE >> 2, %ecx |
cld |
rep movsb |
# switch to temporal kernel stack |
movl $kernel_stack, %esp |
call arch_pre_main |
call main_bsp # never returns |
cli |
hlt |
kernel_stack_bottom: |
.space TEMP_STACK_SIZE |
kernel_stack: |
.section K_TEXT_START, "aw", @progbits |
.global hypercall_page |
.org 0 |
hypercall_page: |
.space PAGE_SIZE |
.global shared_info |
.org 0x1000 |
shared_info: |
.space PAGE_SIZE |
.global console_page |
.org 0x2000 |
console_page: |
.space PAGE_SIZE |
# Xen 3.0.3 ELF loader is somehow buggy |
# thus this workaround |
.global dummy_fill |
dummy_fill: |
.space (1024 * 1024) |
/tags/0.3.0/kernel/arch/ia32xen/src/asm.S |
---|
0,0 → 1,124 |
# |
# Copyright (c) 2001-2004 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
## very low and hardware-level functions |
# Mask for interrupts 0 - 31 (bits 0 - 31) where 0 means that int has no error word |
# and 1 means interrupt with error word |
#define ERROR_WORD_INTERRUPT_LIST 0x00027D00 |
.text |
.global xen_callback |
.global xen_failsafe_callback |
.global enable_l_apic_in_msr |
.global memcpy |
.global memcpy_from_uspace |
.global memcpy_from_uspace_failover_address |
.global memcpy_to_uspace |
.global memcpy_to_uspace_failover_address |
xen_callback: |
iret |
xen_failsafe_callback: |
iret |
#define MEMCPY_DST 4 |
#define MEMCPY_SRC 8 |
#define MEMCPY_SIZE 12 |
/** Copy memory to/from userspace. |
* |
* This is almost conventional memcpy(). |
* The difference is that there is a failover part |
* to where control is returned from a page fault |
* if the page fault occurs during copy_from_uspace() |
* or copy_to_uspace(). |
* |
* @param MEMCPY_DST(%esp) Destination address. |
* @param MEMCPY_SRC(%esp) Source address. |
* @param MEMCPY_SIZE(%esp) Size. |
* |
* @return MEMCPY_SRC(%esp) on success and 0 on failure. |
*/ |
memcpy: |
memcpy_from_uspace: |
memcpy_to_uspace: |
movl %edi, %edx /* save %edi */ |
movl %esi, %eax /* save %esi */ |
movl MEMCPY_SIZE(%esp), %ecx |
shrl $2, %ecx /* size / 4 */ |
movl MEMCPY_DST(%esp), %edi |
movl MEMCPY_SRC(%esp), %esi |
rep movsl /* copy as much as possible word by word */ |
movl MEMCPY_SIZE(%esp), %ecx |
andl $3, %ecx /* size % 4 */ |
jz 0f |
rep movsb /* copy the rest byte by byte */ |
0: |
movl %edx, %edi |
movl %eax, %esi |
movl MEMCPY_SRC(%esp), %eax /* MEMCPY_SRC(%esp), success */ |
ret |
/* |
* We got here from as_page_fault() after the memory operations |
* above had caused a page fault. |
*/ |
memcpy_from_uspace_failover_address: |
memcpy_to_uspace_failover_address: |
movl %edx, %edi |
movl %eax, %esi |
xorl %eax, %eax /* return 0, failure */ |
ret |
## Enable local APIC |
# |
# Enable local APIC in MSR. |
# |
enable_l_apic_in_msr: |
push %eax |
movl $0x1b, %ecx |
rdmsr |
orl $(1<<11),%eax |
orl $(0xfee00000),%eax |
wrmsr |
pop %eax |
ret |
/tags/0.3.0/kernel/arch/ia32xen/src/proc/scheduler.c |
---|
0,0 → 1,81 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32xen_proc |
* @{ |
*/ |
/** @file |
*/ |
#include <proc/scheduler.h> |
#include <cpu.h> |
#include <proc/task.h> |
#include <proc/thread.h> |
#include <arch.h> |
#include <arch/context.h> /* SP_DELTA */ |
#include <arch/debugger.h> |
#include <arch/pm.h> |
#include <arch/asm.h> |
#include <arch/ddi/ddi.h> |
/** Perform ia32 specific tasks needed before the new task is run. |
* |
* Interrupts are disabled. |
*/ |
void before_task_runs_arch(void) |
{ |
// io_perm_bitmap_install(); |
} |
/** Perform ia32 specific tasks needed before the new thread is scheduled. |
* |
* THREAD is locked and interrupts are disabled. |
*/ |
void before_thread_runs_arch(void) |
{ |
CPU->arch.tss->esp0 = (uintptr_t) &THREAD->kstack[THREAD_STACK_SIZE-SP_DELTA]; |
CPU->arch.tss->ss0 = selector(KDATA_DES); |
/* Set up TLS in GS register */ |
// set_tls_desc(THREAD->arch.tls); |
#ifdef CONFIG_DEBUG_AS_WATCHPOINT |
/* Set watchpoint on AS to ensure that nobody sets it to zero */ |
if (CPU->id < BKPOINTS_MAX) |
breakpoint_add(&((the_t *) THREAD->kstack)->as, |
BKPOINT_WRITE | BKPOINT_CHECK_ZERO, |
CPU->id); |
#endif |
} |
void after_thread_ran_arch(void) |
{ |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32xen/src/proc/task.c |
---|
0,0 → 1,61 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32xen_proc |
* @{ |
*/ |
/** @file |
*/ |
#include <proc/task.h> |
#include <arch/types.h> |
#include <adt/bitmap.h> |
#include <mm/slab.h> |
/** Perform ia32 specific task initialization. |
* |
* @param t Task to be initialized. |
*/ |
void task_create_arch(task_t *t) |
{ |
t->arch.iomapver = 0; |
bitmap_initialize(&t->arch.iomap, NULL, 0); |
} |
/** Perform ia32 specific task destruction. |
* |
* @param t Task to be initialized. |
*/ |
void task_destroy_arch(task_t *t) |
{ |
if (t->arch.iomap.map) |
free(t->arch.iomap.map); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32xen/src/proc/thread.c |
---|
0,0 → 1,47 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32xen_proc |
* @{ |
*/ |
/** @file |
*/ |
#include <proc/thread.h> |
/** Perform ia32xen specific thread initialization. |
* |
* @param t Thread to be initialized. |
*/ |
void thread_create_arch(thread_t *t) |
{ |
t->arch.tls = 0; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32xen/src/userspace.c |
---|
0,0 → 1,89 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32xen |
* @{ |
*/ |
/** @file |
*/ |
#include <userspace.h> |
#include <arch/pm.h> |
#include <arch/types.h> |
#include <arch.h> |
#include <proc/uarg.h> |
#include <mm/as.h> |
/** Enter userspace |
* |
* Change CPU protection level to 3, enter userspace. |
* |
*/ |
void userspace(uspace_arg_t *kernel_uarg) |
{ |
uint32_t ipl = interrupts_disable(); |
asm volatile ( |
/* |
* Clear nested task flag. |
*/ |
"pushfl\n" |
"pop %%eax\n" |
"and $0xffffbfff, %%eax\n" |
"push %%eax\n" |
"popfl\n" |
/* Set up GS register (TLS) */ |
"movl %6, %%gs\n" |
"pushl %0\n" |
"pushl %1\n" |
"pushl %2\n" |
"pushl %3\n" |
"pushl %4\n" |
"movl %5, %%eax\n" |
"iret\n" |
: |
: "i" (selector(UDATA_DES) | PL_USER), |
"r" (kernel_uarg->uspace_stack + THREAD_STACK_SIZE), |
"r" (ipl), |
"i" (selector(UTEXT_DES) | PL_USER), |
"r" (kernel_uarg->uspace_entry), |
"r" (kernel_uarg->uspace_uarg), |
"r" (selector(TLS_DES)) |
: "eax" |
); |
/* Unreachable */ |
for(;;) |
; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32xen/src/drivers/xconsole.c |
---|
0,0 → 1,83 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32xen |
* @{ |
*/ |
/** |
* @file |
* @brief ia32xen console driver. |
*/ |
#include <arch/drivers/xconsole.h> |
#include <putchar.h> |
#include <console/chardev.h> |
#include <console/console.h> |
#include <arch/hypercall.h> |
#define MASK_INDEX(index, ring) ((index) & (sizeof(ring) - 1)) |
static void xen_putchar(chardev_t *d, const char ch); |
chardev_t xen_console; |
static chardev_operations_t xen_ops = { |
.write = xen_putchar |
}; |
void xen_console_init(void) |
{ |
chardev_initialize("xen_out", &xen_console, &xen_ops); |
stdout = &xen_console; |
} |
void xen_putchar(chardev_t *d, const char ch) |
{ |
if (start_info.console.domU.evtchn != 0) { |
uint32_t cons = console_page.out_cons; |
uint32_t prod = console_page.out_prod; |
memory_barrier(); |
if ((prod - cons) > sizeof(console_page.out)) |
return; |
if (ch == '\n') |
console_page.out[MASK_INDEX(prod++, console_page.out)] = '\r'; |
console_page.out[MASK_INDEX(prod++, console_page.out)] = ch; |
write_barrier(); |
console_page.out_prod = prod; |
xen_notify_remote(start_info.console.domU.evtchn); |
} else |
xen_console_io(CONSOLE_IO_WRITE, 1, &ch); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32xen/src/fpu_context.c |
---|
0,0 → 1,0 |
link ../../ia32/src/fpu_context.c |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/arch/ia32xen/src/debug |
---|
0,0 → 1,0 |
link ../../ia32/src/debug |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/arch/ia32xen/src/cpu |
---|
0,0 → 1,0 |
link ../../ia32/src/cpu |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/arch/ia32xen/src/bios |
---|
0,0 → 1,0 |
link ../../ia32/src/bios |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/arch/ia32xen/src/delay.s |
---|
0,0 → 1,0 |
link ../../ia32/src/delay.s |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/arch/ia32xen/src/ddi |
---|
0,0 → 1,0 |
link ../../ia32/src/ddi |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/arch/ia32xen/src/debugger.c |
---|
0,0 → 1,0 |
link ../../ia32/src/debugger.c |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/arch/ia32xen/src/atomic.S |
---|
0,0 → 1,0 |
link ../../ia32/src/atomic.S |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/arch/ia32xen/_link.ld.in |
---|
0,0 → 1,45 |
/** ia32xen linker script |
*/ |
#include <arch/hypercall.h> |
#include <arch/mm/page.h> |
ENTRY(kernel_image_start) |
PHDRS { |
image PT_LOAD FLAGS(7); /* RWE */ |
note PT_NOTE FLAGS(4); /* R__ */ |
} |
SECTIONS { |
.image PA2KA(BOOT_OFFSET): AT (BOOT_OFFSET) { |
ktext_start = .; |
*(K_TEXT_START); |
*(.text); |
ktext_end = .; |
kdata_start = .; |
*(.data); /* initialized data */ |
*(.rodata*); /* string literals */ |
*(COMMON); /* global variables */ |
hardcoded_load_address = .; |
LONG(PA2KA(0)); |
hardcoded_ktext_size = .; |
LONG(ktext_end - ktext_start); |
hardcoded_kdata_size = .; |
LONG(kdata_end - kdata_start); |
symbol_table = .; |
*(symtab.*); /* Symbol table, must be LAST symbol! */ |
*(.bss); /* uninitialized static variables */ |
kdata_end = .; |
} :image |
.notes : { |
*(.note.Xen); |
} :note |
/DISCARD/ : { |
*(.note.GNU-stack); |
*(.comment); |
} |
} |
/tags/0.3.0/kernel/arch/mips32/include/context_offset.h |
---|
0,0 → 1,218 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#ifndef KERN_mips32_CONTEXT_OFFSET_H_ |
#define KERN_mips32_CONTEXT_OFFSET_H_ |
#define OFFSET_SP 0x0 |
#define OFFSET_PC 0x4 |
#define OFFSET_S0 0x8 |
#define OFFSET_S1 0xc |
#define OFFSET_S2 0x10 |
#define OFFSET_S3 0x14 |
#define OFFSET_S4 0x18 |
#define OFFSET_S5 0x1c |
#define OFFSET_S6 0x20 |
#define OFFSET_S7 0x24 |
#define OFFSET_S8 0x28 |
#define OFFSET_GP 0x2c |
#ifdef KERNEL |
# define OFFSET_IPL 0x30 |
#else |
# define OFFSET_TLS 0x30 |
# define OFFSET_F20 0x34 |
# define OFFSET_F21 0x38 |
# define OFFSET_F22 0x3c |
# define OFFSET_F23 0x40 |
# define OFFSET_F24 0x44 |
# define OFFSET_F25 0x48 |
# define OFFSET_F26 0x4c |
# define OFFSET_F27 0x50 |
# define OFFSET_F28 0x54 |
# define OFFSET_F29 0x58 |
# define OFFSET_F30 0x5c |
#endif /* KERNEL */ |
/* istate_t */ |
#define EOFFSET_AT 0x0 |
#define EOFFSET_V0 0x4 |
#define EOFFSET_V1 0x8 |
#define EOFFSET_A0 0xc |
#define EOFFSET_A1 0x10 |
#define EOFFSET_A2 0x14 |
#define EOFFSET_A3 0x18 |
#define EOFFSET_T0 0x1c |
#define EOFFSET_T1 0x20 |
#define EOFFSET_T2 0x24 |
#define EOFFSET_T3 0x28 |
#define EOFFSET_T4 0x2c |
#define EOFFSET_T5 0x30 |
#define EOFFSET_T6 0x34 |
#define EOFFSET_T7 0x38 |
#define EOFFSET_S0 0x3c |
#define EOFFSET_S1 0x40 |
#define EOFFSET_S2 0x44 |
#define EOFFSET_S3 0x48 |
#define EOFFSET_S4 0x4c |
#define EOFFSET_S5 0x50 |
#define EOFFSET_S6 0x54 |
#define EOFFSET_S7 0x58 |
#define EOFFSET_T8 0x5c |
#define EOFFSET_T9 0x60 |
#define EOFFSET_GP 0x64 |
#define EOFFSET_SP 0x68 |
#define EOFFSET_S8 0x6c |
#define EOFFSET_RA 0x70 |
#define EOFFSET_LO 0x74 |
#define EOFFSET_HI 0x78 |
#define EOFFSET_STATUS 0x7c |
#define EOFFSET_EPC 0x80 |
#define EOFFSET_K1 0x84 |
#define REGISTER_SPACE 136 |
#ifdef __ASM__ |
#include <arch/asm/regname.h> |
# ctx: address of the structure with saved context |
.macro CONTEXT_SAVE_ARCH_CORE ctx:req |
sw $s0,OFFSET_S0(\ctx) |
sw $s1,OFFSET_S1(\ctx) |
sw $s2,OFFSET_S2(\ctx) |
sw $s3,OFFSET_S3(\ctx) |
sw $s4,OFFSET_S4(\ctx) |
sw $s5,OFFSET_S5(\ctx) |
sw $s6,OFFSET_S6(\ctx) |
sw $s7,OFFSET_S7(\ctx) |
sw $s8,OFFSET_S8(\ctx) |
sw $gp,OFFSET_GP(\ctx) |
#ifndef KERNEL |
sw $k1,OFFSET_TLS(\ctx) |
# ifdef CONFIG_MIPS_FPU |
mfc1 $t0,$20 |
sw $t0, OFFSET_F20(\ctx) |
mfc1 $t0,$21 |
sw $t0, OFFSET_F21(\ctx) |
mfc1 $t0,$22 |
sw $t0, OFFSET_F22(\ctx) |
mfc1 $t0,$23 |
sw $t0, OFFSET_F23(\ctx) |
mfc1 $t0,$24 |
sw $t0, OFFSET_F24(\ctx) |
mfc1 $t0,$25 |
sw $t0, OFFSET_F25(\ctx) |
mfc1 $t0,$26 |
sw $t0, OFFSET_F26(\ctx) |
mfc1 $t0,$27 |
sw $t0, OFFSET_F27(\ctx) |
mfc1 $t0,$28 |
sw $t0, OFFSET_F28(\ctx) |
mfc1 $t0,$29 |
sw $t0, OFFSET_F29(\ctx) |
mfc1 $t0,$30 |
sw $t0, OFFSET_F30(\ctx) |
# endif /* CONFIG_MIPS_FPU */ |
#endif /* KERNEL */ |
sw $ra,OFFSET_PC(\ctx) |
sw $sp,OFFSET_SP(\ctx) |
.endm |
# ctx: address of the structure with saved context |
.macro CONTEXT_RESTORE_ARCH_CORE ctx:req |
lw $s0,OFFSET_S0(\ctx) |
lw $s1,OFFSET_S1(\ctx) |
lw $s2,OFFSET_S2(\ctx) |
lw $s3,OFFSET_S3(\ctx) |
lw $s4,OFFSET_S4(\ctx) |
lw $s5,OFFSET_S5(\ctx) |
lw $s6,OFFSET_S6(\ctx) |
lw $s7,OFFSET_S7(\ctx) |
lw $s8,OFFSET_S8(\ctx) |
lw $gp,OFFSET_GP(\ctx) |
#ifndef KERNEL |
lw $k1,OFFSET_TLS(\ctx) |
# ifdef CONFIG_MIPS_FPU |
lw $t0, OFFSET_F20(\ctx) |
mtc1 $t0,$20 |
lw $t0, OFFSET_F21(\ctx) |
mtc1 $t0,$21 |
lw $t0, OFFSET_F22(\ctx) |
mtc1 $t0,$22 |
lw $t0, OFFSET_F23(\ctx) |
mtc1 $t0,$23 |
lw $t0, OFFSET_F24(\ctx) |
mtc1 $t0,$24 |
lw $t0, OFFSET_F25(\ctx) |
mtc1 $t0,$25 |
lw $t0, OFFSET_F26(\ctx) |
mtc1 $t0,$26 |
lw $t0, OFFSET_F27(\ctx) |
mtc1 $t0,$27 |
lw $t0, OFFSET_F28(\ctx) |
mtc1 $t0,$28 |
lw $t0, OFFSET_F29(\ctx) |
mtc1 $t0,$29 |
lw $t0, OFFSET_F30(\ctx) |
mtc1 $t0,$30 |
# endif /* CONFIG_MIPS_FPU */ |
#endif /* KERNEL */ |
lw $ra,OFFSET_PC(\ctx) |
lw $sp,OFFSET_SP(\ctx) |
.endm |
#endif |
#endif |
/tags/0.3.0/kernel/arch/mips32/include/mm/frame.h |
---|
0,0 → 1,53 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup mips32mm |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_mips32_FRAME_H_ |
#define KERN_mips32_FRAME_H_ |
#define FRAME_WIDTH 14 /* 16K */ |
#define FRAME_SIZE (1 << FRAME_WIDTH) |
#ifdef KERNEL |
#ifndef __ASM__ |
extern void frame_arch_init(void); |
extern void physmem_print(void); |
#endif /* __ASM__ */ |
#endif /* KERNEL */ |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/mips32/include/mm/page.h |
---|
0,0 → 1,182 |
/* |
* Copyright (c) 2003-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup mips32mm |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_mips32_PAGE_H_ |
#define KERN_mips32_PAGE_H_ |
#include <arch/mm/frame.h> |
#define PAGE_WIDTH FRAME_WIDTH |
#define PAGE_SIZE FRAME_SIZE |
#define PAGE_COLOR_BITS 0 /* dummy */ |
#ifndef __ASM__ |
# define KA2PA(x) (((uintptr_t) (x)) - 0x80000000) |
# define PA2KA(x) (((uintptr_t) (x)) + 0x80000000) |
#else |
# define KA2PA(x) ((x) - 0x80000000) |
# define PA2KA(x) ((x) + 0x80000000) |
#endif |
#ifdef KERNEL |
/* |
* Implementation of generic 4-level page table interface. |
* |
* Page table layout: |
* - 32-bit virtual addresses |
* - Offset is 14 bits => pages are 16K long |
* - PTE's use similar format as CP0 EntryLo[01] registers => PTE is therefore |
* 4 bytes long |
* - PTE's replace EntryLo v (valid) bit with p (present) bit |
* - PTE's use only one bit to distinguish between cacheable and uncacheable |
* mappings |
* - PTE's define soft_valid field to ensure there is at least one 1 bit even if |
* the p bit is cleared |
* - PTE's make use of CP0 EntryLo's two-bit reserved field for bit W (writable) |
* and bit A (accessed) |
* - PTL0 has 64 entries (6 bits) |
* - PTL1 is not used |
* - PTL2 is not used |
* - PTL3 has 4096 entries (12 bits) |
*/ |
/* Macros describing number of entries in each level. */ |
#define PTL0_ENTRIES_ARCH 64 |
#define PTL1_ENTRIES_ARCH 0 |
#define PTL2_ENTRIES_ARCH 0 |
#define PTL3_ENTRIES_ARCH 4096 |
/* Macros describing size of page tables in each level. */ |
#define PTL0_SIZE_ARCH ONE_FRAME |
#define PTL1_SIZE_ARCH 0 |
#define PTL2_SIZE_ARCH 0 |
#define PTL3_SIZE_ARCH ONE_FRAME |
/* Macros calculating entry indices for each level. */ |
#define PTL0_INDEX_ARCH(vaddr) ((vaddr) >> 26) |
#define PTL1_INDEX_ARCH(vaddr) 0 |
#define PTL2_INDEX_ARCH(vaddr) 0 |
#define PTL3_INDEX_ARCH(vaddr) (((vaddr) >> 14) & 0xfff) |
/* Set accessor for PTL0 address. */ |
#define SET_PTL0_ADDRESS_ARCH(ptl0) |
/* Get PTE address accessors for each level. */ |
#define GET_PTL1_ADDRESS_ARCH(ptl0, i) \ |
(((pte_t *) (ptl0))[(i)].pfn << 12) |
#define GET_PTL2_ADDRESS_ARCH(ptl1, i) \ |
(ptl1) |
#define GET_PTL3_ADDRESS_ARCH(ptl2, i) \ |
(ptl2) |
#define GET_FRAME_ADDRESS_ARCH(ptl3, i) \ |
(((pte_t *) (ptl3))[(i)].pfn << 12) |
/* Set PTE address accessors for each level. */ |
#define SET_PTL1_ADDRESS_ARCH(ptl0, i, a) \ |
(((pte_t *) (ptl0))[(i)].pfn = (a) >> 12) |
#define SET_PTL2_ADDRESS_ARCH(ptl1, i, a) |
#define SET_PTL3_ADDRESS_ARCH(ptl2, i, a) |
#define SET_FRAME_ADDRESS_ARCH(ptl3, i, a) \ |
(((pte_t *) (ptl3))[(i)].pfn = (a) >> 12) |
/* Get PTE flags accessors for each level. */ |
#define GET_PTL1_FLAGS_ARCH(ptl0, i) \ |
get_pt_flags((pte_t *) (ptl0), (index_t) (i)) |
#define GET_PTL2_FLAGS_ARCH(ptl1, i) \ |
PAGE_PRESENT |
#define GET_PTL3_FLAGS_ARCH(ptl2, i) \ |
PAGE_PRESENT |
#define GET_FRAME_FLAGS_ARCH(ptl3, i) \ |
get_pt_flags((pte_t *) (ptl3), (index_t) (i)) |
/* Set PTE flags accessors for each level. */ |
#define SET_PTL1_FLAGS_ARCH(ptl0, i, x) \ |
set_pt_flags((pte_t *) (ptl0), (index_t) (i), (x)) |
#define SET_PTL2_FLAGS_ARCH(ptl1, i, x) |
#define SET_PTL3_FLAGS_ARCH(ptl2, i, x) |
#define SET_FRAME_FLAGS_ARCH(ptl3, i, x) \ |
set_pt_flags((pte_t *) (ptl3), (index_t) (i), (x)) |
/* Last-level info macros. */ |
#define PTE_VALID_ARCH(pte) (*((uint32_t *) (pte)) != 0) |
#define PTE_PRESENT_ARCH(pte) ((pte)->p != 0) |
#define PTE_GET_FRAME_ARCH(pte) ((pte)->pfn << 12) |
#define PTE_WRITABLE_ARCH(pte) ((pte)->w != 0) |
#define PTE_EXECUTABLE_ARCH(pte) 1 |
#ifndef __ASM__ |
#include <mm/mm.h> |
#include <arch/exception.h> |
static inline int get_pt_flags(pte_t *pt, index_t i) |
{ |
pte_t *p = &pt[i]; |
return ((p->cacheable << PAGE_CACHEABLE_SHIFT) | |
((!p->p) << PAGE_PRESENT_SHIFT) | |
(1 << PAGE_USER_SHIFT) | |
(1 << PAGE_READ_SHIFT) | |
((p->w) << PAGE_WRITE_SHIFT) | |
(1 << PAGE_EXEC_SHIFT) | |
(p->g << PAGE_GLOBAL_SHIFT)); |
} |
static inline void set_pt_flags(pte_t *pt, index_t i, int flags) |
{ |
pte_t *p = &pt[i]; |
p->cacheable = (flags & PAGE_CACHEABLE) != 0; |
p->p = !(flags & PAGE_NOT_PRESENT); |
p->g = (flags & PAGE_GLOBAL) != 0; |
p->w = (flags & PAGE_WRITE) != 0; |
/* |
* Ensure that valid entries have at least one bit set. |
*/ |
p->soft_valid = 1; |
} |
extern void page_arch_init(void); |
#endif /* __ASM__ */ |
#endif /* KERNEL */ |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/mips32/include/mm/tlb.h |
---|
0,0 → 1,166 |
/* |
* Copyright (c) 2003-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup mips32mm |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_mips32_TLB_H_ |
#define KERN_mips32_TLB_H_ |
#include <arch/exception.h> |
#ifdef TLBCNT |
# define TLB_ENTRY_COUNT TLBCNT |
#else |
# define TLB_ENTRY_COUNT 48 |
#endif |
#define TLB_WIRED 1 |
#define TLB_KSTACK_WIRED_INDEX 0 |
#define TLB_PAGE_MASK_16K (0x3<<13) |
#define PAGE_UNCACHED 2 |
#define PAGE_CACHEABLE_EXC_WRITE 5 |
typedef union { |
struct { |
#ifdef BIG_ENDIAN |
unsigned : 2; /* zero */ |
unsigned pfn : 24; /* frame number */ |
unsigned c : 3; /* cache coherency attribute */ |
unsigned d : 1; /* dirty/write-protect bit */ |
unsigned v : 1; /* valid bit */ |
unsigned g : 1; /* global bit */ |
#else |
unsigned g : 1; /* global bit */ |
unsigned v : 1; /* valid bit */ |
unsigned d : 1; /* dirty/write-protect bit */ |
unsigned c : 3; /* cache coherency attribute */ |
unsigned pfn : 24; /* frame number */ |
unsigned : 2; /* zero */ |
#endif |
} __attribute__ ((packed)); |
uint32_t value; |
} entry_lo_t; |
typedef union { |
struct { |
#ifdef BIG_ENDIAN |
unsigned vpn2 : 19; |
unsigned : 5; |
unsigned asid : 8; |
#else |
unsigned asid : 8; |
unsigned : 5; |
unsigned vpn2 : 19; |
#endif |
} __attribute__ ((packed)); |
uint32_t value; |
} entry_hi_t; |
typedef union { |
struct { |
#ifdef BIG_ENDIAN |
unsigned : 7; |
unsigned mask : 12; |
unsigned : 13; |
#else |
unsigned : 13; |
unsigned mask : 12; |
unsigned : 7; |
#endif |
} __attribute__ ((packed)); |
uint32_t value; |
} page_mask_t; |
typedef union { |
struct { |
#ifdef BIG_ENDIAN |
unsigned p : 1; |
unsigned : 27; |
unsigned index : 4; |
#else |
unsigned index : 4; |
unsigned : 27; |
unsigned p : 1; |
#endif |
} __attribute__ ((packed)); |
uint32_t value; |
} tlb_index_t; |
/** Probe TLB for Matching Entry |
* |
* Probe TLB for Matching Entry. |
*/ |
static inline void tlbp(void) |
{ |
asm volatile ("tlbp\n\t"); |
} |
/** Read Indexed TLB Entry |
* |
* Read Indexed TLB Entry. |
*/ |
static inline void tlbr(void) |
{ |
asm volatile ("tlbr\n\t"); |
} |
/** Write Indexed TLB Entry |
* |
* Write Indexed TLB Entry. |
*/ |
static inline void tlbwi(void) |
{ |
asm volatile ("tlbwi\n\t"); |
} |
/** Write Random TLB Entry |
* |
* Write Random TLB Entry. |
*/ |
static inline void tlbwr(void) |
{ |
asm volatile ("tlbwr\n\t"); |
} |
#define tlb_invalidate(asid) tlb_invalidate_asid(asid) |
extern void tlb_invalid(istate_t *istate); |
extern void tlb_refill(istate_t *istate); |
extern void tlb_modified(istate_t *istate); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/mips32/include/mm/as.h |
---|
0,0 → 1,63 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup mips32mm |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_mips32_AS_H_ |
#define KERN_mips32_AS_H_ |
#define KERNEL_ADDRESS_SPACE_SHADOWED_ARCH 0 |
#define KERNEL_ADDRESS_SPACE_START_ARCH (unsigned long) 0x80000000 |
#define KERNEL_ADDRESS_SPACE_END_ARCH (unsigned long) 0xffffffff |
#define USER_ADDRESS_SPACE_START_ARCH (unsigned long) 0x00000000 |
#define USER_ADDRESS_SPACE_END_ARCH (unsigned long) 0x7fffffff |
#define USTACK_ADDRESS_ARCH (0x80000000 - PAGE_SIZE) |
typedef struct { |
} as_arch_t; |
#include <genarch/mm/as_pt.h> |
#define as_constructor_arch(as, flags) (as != as) |
#define as_destructor_arch(as) (as != as) |
#define as_create_arch(as, flags) (as != as) |
#define as_deinstall_arch(as) |
#define as_invalidate_translation_cache(as, page, cnt) |
extern void as_arch_init(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/mips32/include/mm/asid.h |
---|
0,0 → 1,47 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup mips32mm |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_mips32_ASID_H_ |
#define KERN_mips32_ASID_H_ |
#include <arch/types.h> |
#define ASID_MAX_ARCH 255 /* 2^8 - 1 */ |
typedef uint8_t asid_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/mips32/include/drivers/arc.h |
---|
0,0 → 1,267 |
/* |
* Copyright (c) 2005 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup mips32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_mips32_ARC_H_ |
#define KERN_mips32_ARC_H_ |
#include <arch/types.h> |
#include <console/chardev.h> |
#define ARC_BASE_ADDR 0x1000; |
#define ARC_MAGIC 0x53435241 |
/* Frame size used by ARC */ |
#define ARC_FRAME 4096 |
typedef enum { |
CmResourceTypeNull = 0, |
CmResourceTypePort, |
CmResourceTypeInterrupt, |
CmResourceTypeMemory, |
CmResourceTypeDma, |
CmResourceTypeDeviceSpecific, |
CmResourceTypeVendor, |
CmResourceTypeProductName, |
CmResourceTypeSerialNumber |
} cm_resource_type; |
typedef struct { |
uint8_t type; |
uint8_t sharedisposition; |
uint16_t flags; |
union { |
struct { |
long long start; /* 64-bit phys address */ |
unsigned long length; |
}port; |
struct { |
unsigned long level; |
unsigned long vector; |
unsigned long reserved1; |
}interrupt; |
struct { |
long long start; /* 64-bit phys address */ |
unsigned long length; |
}memory; |
}u; |
} __attribute__ ((packed)) cm_resource_descriptor; |
typedef struct { |
uint16_t version; |
uint16_t revision; |
unsigned long count; |
cm_resource_descriptor descr[1]; |
} __attribute__ ((packed)) cm_resource_list; |
typedef enum { |
SystemClass = 0, |
ProcessorClass, |
CacheClass, |
AdapterClass, |
ControllerClass, |
PeripheralClass, |
MemoryClass |
} arc_component_class; |
typedef enum { |
ARC_type = 0, |
CPU_type, |
FPU_type, |
PrimaryICache, |
PrimaryDCache, |
SecondaryICache, |
SecondaryDCache, |
SecondaryCache, |
Memory, /* Not in NT PROM */ |
EISAAdapter, |
TCAdapter, |
SCSIAdapter, |
DTIAdapter, |
MultiFunctionAdapter, |
DiskController, |
TapeController, |
CDROMController, |
WORMController, |
SerialController, |
NetworkController, |
DisplayController, |
ParallelController, |
PointerController, |
KeyboardController, |
AudioController, |
OtherController, |
DiskPeripheral, |
FloppyDiskPeripheral, |
TapePeripheral, |
ModemPeripheral, |
MonitorPeripheral, |
PrinterPeripheral, |
PointerPeripheral, |
KeyboardPeripheral, |
TerminalPeripheral, |
LinePeripheral, |
NetworkPeripheral, |
OtherPeripheral, |
XTalkAdapter, |
PCIAdapter, |
GIOAdapter, |
TPUAdapter, |
Anonymous |
} arc_component_type; |
typedef enum { |
Failed = 1, |
ReadOnly = 2, |
Removable = 4, |
ConsoleIn = 8, |
ConsoleOut = 16, |
Input = 32, |
Output = 64 |
} arc_component_flags; |
typedef struct { |
arc_component_class class; |
arc_component_type type; |
arc_component_flags flags; |
uint16_t revision; |
uint16_t version; |
uint32_t key; |
uint32_t affinitymask; |
uint32_t configdatasize; |
uint32_t identifier_len; |
char *identifier; |
} __attribute__ ((packed)) arc_component; |
typedef struct { |
uint16_t year; |
uint16_t month; |
uint16_t day; |
uint16_t hour; |
uint16_t minutes; |
uint16_t seconds; |
uint16_t mseconds; |
} __attribute__ ((packed)) arc_timeinfo; |
/* This is the SGI block structure, WinNT has it different */ |
typedef enum { |
ExceptionBlock, |
SystemParameterBlock, |
FreeContiguous, |
FreeMemory, |
BadMemory, |
LoadedProgram, |
FirmwareTemporary, |
FirmwarePermanent |
} arc_memorytype_t; |
typedef struct { |
arc_memorytype_t type; |
uint32_t basepage; /* *4096 = baseaddr */ |
uint32_t basecount; |
} arc_memdescriptor_t; |
typedef struct { |
char vendorid[8]; |
char prodid[8]; |
} arc_sysid_t; |
typedef struct { |
long (*load)(void); /* ... */ |
long (*invoke)(uint32_t eaddr,uint32_t saddr,uint32_t argc,char **argv, |
char **envp); |
long (*execute)(char *path,uint32_t argc,char **argv,char **envp); |
void (*halt)(void); |
void (*powerdown)(void); |
void (*restart)(void); |
void (*reboot)(void); |
void (*enterinteractivemode)(void); |
long (*reserved)(void); |
/* 10 */ |
arc_component * (*getpeer)(arc_component *c); |
arc_component * (*getchild)(arc_component *c); |
arc_component * (*getparent)(arc_component *c); |
long (*getconfigurationdata)(void *configdata, arc_component *c); |
long (*addchild)(arc_component *c, arc_component *template, |
void *configdata); |
long (*deletecomponet)(arc_component *current); |
long (*getcomponent)(char *path); |
long (*saveconfiguration)(void); |
arc_sysid_t (*getsystemid)(void); |
arc_memdescriptor_t * (*getmemorydescriptor)(arc_memdescriptor_t *cur); |
/* 20 */ |
long (*reserved2)(void); |
arc_timeinfo * (*gettime)(void); |
uint32_t (*getrelativetime)(void); |
long (*getdirectoryentry)(); |
long (*open)(void); /* ... */ |
long (*close)(uint32_t fileid); |
long (*read)(uint32_t fileid,void *buf,uint32_t n,uint32_t *cnt); |
long (*getreadstatus)(uint32_t fileid); |
long (*write)(uint32_t fileid, void *buf,uint32_t n,uint32_t *cnt); |
long (*seek)(void); /* ... */ |
/* 30 */ |
long (*mount)(void); /* ... */ |
char * (*getenvironmentvariable)(char *name); |
char * (*setenvironmentvariable)(char *name, char *value); |
long (*getfileinformation)(void); /* ... */ |
long (*setfileinformation)(uint32_t fileid,uint32_t attflags,uint32_t attmask); |
void (*flushallcaches)(void); |
long (*testunicodecharacter)(void); /* ... */ |
long (*getdisplaystatus)(void); /* ... */ |
} arc_func_vector_t; |
typedef struct { |
uint32_t signature; |
uint32_t length; |
uint16_t version; |
uint16_t revision; |
void *restartblock; |
void *debugblock; |
void *gevector; |
void *utlbmissvector; |
uint32_t firmwarevectorlen; |
arc_func_vector_t *firmwarevector; |
uint32_t privvectorlen; |
void *privvector; |
uint32_t adaptercount; |
} __attribute__ ((packed)) arc_sbp; |
extern int arc_init(void); |
extern int arc_reboot(void); |
extern int arc_frame_init(void); |
extern int arc_console(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/mips32/include/drivers/serial.h |
---|
0,0 → 1,71 |
/* |
* Copyright (c) 2005 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup mips32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_mips32_SERIAL_H_ |
#define KERN_mips32_SERIAL_H_ |
#include <console/chardev.h> |
#define SERIAL_MAX 4 |
#define SERIAL_COM1 0x3f8 |
#define SERIAL_COM1_IRQ 4 |
#define SERIAL_COM2 0x2f8 |
#define SERIAL_COM2_IRQ 3 |
#define P_WRITEB(where,what) (*((volatile char *) (0xB8000000+where))=what) |
#define P_READB(where) (*((volatile char *)(0xB8000000+where))) |
#define SERIAL_READ(x) P_READB(x) |
#define SERIAL_WRITE(x,c) P_WRITEB(x,c) |
/* Interrupt enable register */ |
#define SERIAL_READ_IER(x) (P_READB((x) + 1)) |
#define SERIAL_WRITE_IER(x,c) (P_WRITEB((x)+1,c)) |
/* Interrupt identification register */ |
#define SERIAL_READ_IIR(x) (P_READB((x) + 2)) |
/* Line status register */ |
#define SERIAL_READ_LSR(x) (P_READB((x) + 5)) |
#define TRANSMIT_EMPTY_BIT 5 |
typedef struct { |
int port; |
int irq; |
}serial_t; |
extern void serial_console(devno_t devno); |
extern int serial_init(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/mips32/include/drivers/msim.h |
---|
0,0 → 1,47 |
/* |
* Copyright (c) 2005 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup mips32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_mips32_MSIM_H_ |
#define KERN_mips32_MSIM_H_ |
#include <console/chardev.h> |
void msim_console(devno_t devno); |
void msim_kbd_release(void); |
void msim_kbd_grab(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/mips32/include/smp/order.h |
---|
0,0 → 1,34 |
/* |
* Copyright (c) 2007 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#ifndef KERN_mips32_ORDER_H_ |
#define KERN_mips32_ORDER_H_ |
extern void ipi_broadcast_arch(int ipi); |
#endif |
/tags/0.3.0/kernel/arch/mips32/include/interrupt.h |
---|
0,0 → 1,52 |
/* |
* Copyright (c) 2003-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup mips32interrupt |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_mips32_INTERRUPT_H_ |
#define KERN_mips32_INTERRUPT_H_ |
#include <typedefs.h> |
#include <arch/exception.h> |
#define IVT_ITEMS 32 |
#define IVT_FIRST 0 |
extern function virtual_timer_fnc; |
extern uint32_t count_hi; |
extern void interrupt_init(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/mips32/include/cycle.h |
---|
0,0 → 1,49 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup mips2 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_mips32_CYCLE_H_ |
#define KERN_mips32_CYCLE_H_ |
#include <arch/cp0.h> |
#include <arch/interrupt.h> |
static inline uint64_t get_cycle(void) |
{ |
return ((uint64_t) count_hi << 32) + ((uint64_t) cp0_count_read()); |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/mips32/include/stack.h |
---|
0,0 → 1,52 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup mips32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_mips32_STACK_H_ |
#define KERN_mips32_STACK_H_ |
#define STACK_ITEM_SIZE 4 |
#define STACK_ALIGNMENT 8 |
#define STACK_ARG0 0 |
#define STACK_ARG1 4 |
#define STACK_ARG2 8 |
#define STACK_ARG3 12 |
#define STACK_ARG4 16 |
#define STACK_ARG5 20 |
#define STACK_ARG6 24 |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/mips32/include/types.h |
---|
0,0 → 1,88 |
/* |
* Copyright (c) 2003-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup mips32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_mips32_TYPES_H_ |
#define KERN_mips32_TYPES_H_ |
#define NULL 0 |
#define false 0 |
#define true 1 |
typedef signed char int8_t; |
typedef signed short int16_t; |
typedef signed long int32_t; |
typedef signed long long int64_t; |
typedef unsigned char uint8_t; |
typedef unsigned short uint16_t; |
typedef unsigned long uint32_t; |
typedef unsigned long long uint64_t; |
typedef uint32_t size_t; |
typedef uint32_t count_t; |
typedef uint32_t index_t; |
typedef uint32_t uintptr_t; |
typedef uint32_t pfn_t; |
typedef uint32_t ipl_t; |
typedef uint32_t unative_t; |
typedef int32_t native_t; |
typedef uint8_t bool; |
typedef uint64_t thread_id_t; |
typedef uint64_t task_id_t; |
typedef uint32_t context_id_t; |
typedef int32_t inr_t; |
typedef int32_t devno_t; |
/** Page Table Entry. */ |
typedef struct { |
unsigned g : 1; /**< Global bit. */ |
unsigned p : 1; /**< Present bit. */ |
unsigned d : 1; /**< Dirty bit. */ |
unsigned cacheable : 1; /**< Cacheable bit. */ |
unsigned : 1; /**< Unused. */ |
unsigned soft_valid : 1; /**< Valid content even if not present. */ |
unsigned pfn : 24; /**< Physical frame number. */ |
unsigned w : 1; /**< Page writable bit. */ |
unsigned a : 1; /**< Accessed bit. */ |
} pte_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/mips32/include/exception.h |
---|
0,0 → 1,123 |
/* |
* Copyright (c) 2003-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup mips32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_mips32_EXCEPTION_H_ |
#define KERN_mips32_EXCEPTION_H_ |
#include <arch/types.h> |
#include <arch/cp0.h> |
#define EXC_Int 0 |
#define EXC_Mod 1 |
#define EXC_TLBL 2 |
#define EXC_TLBS 3 |
#define EXC_AdEL 4 |
#define EXC_AdES 5 |
#define EXC_IBE 6 |
#define EXC_DBE 7 |
#define EXC_Sys 8 |
#define EXC_Bp 9 |
#define EXC_RI 10 |
#define EXC_CpU 11 |
#define EXC_Ov 12 |
#define EXC_Tr 13 |
#define EXC_VCEI 14 |
#define EXC_FPE 15 |
#define EXC_WATCH 23 |
#define EXC_VCED 31 |
typedef struct { |
uint32_t at; |
uint32_t v0; |
uint32_t v1; |
uint32_t a0; |
uint32_t a1; |
uint32_t a2; |
uint32_t a3; |
uint32_t t0; |
uint32_t t1; |
uint32_t t2; |
uint32_t t3; |
uint32_t t4; |
uint32_t t5; |
uint32_t t6; |
uint32_t t7; |
uint32_t s0; |
uint32_t s1; |
uint32_t s2; |
uint32_t s3; |
uint32_t s4; |
uint32_t s5; |
uint32_t s6; |
uint32_t s7; |
uint32_t t8; |
uint32_t t9; |
uint32_t gp; |
uint32_t sp; |
uint32_t s8; |
uint32_t ra; |
uint32_t lo; |
uint32_t hi; |
uint32_t status; /* cp0_status */ |
uint32_t epc; /* cp0_epc */ |
uint32_t k1; /* We use it as thread-local pointer */ |
} istate_t; |
static inline void istate_set_retaddr(istate_t *istate, uintptr_t retaddr) |
{ |
istate->epc = retaddr; |
} |
/** Return true if exception happened while in userspace */ |
static inline int istate_from_uspace(istate_t *istate) |
{ |
return istate->status & cp0_status_um_bit; |
} |
static inline unative_t istate_get_pc(istate_t *istate) |
{ |
return istate->epc; |
} |
extern void exception(istate_t *istate); |
extern void tlb_refill_entry(void); |
extern void exception_entry(void); |
extern void cache_error_entry(void); |
extern void exception_init(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/mips32/include/cache.h |
---|
0,0 → 1,45 |
/* |
* Copyright (c) 2003-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup mips32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_mips32_CACHE_H_ |
#define KERN_mips32_CACHE_H_ |
#include <arch/exception.h> |
extern void cache_error(istate_t *istate); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/mips32/include/asm.h |
---|
0,0 → 1,76 |
/* |
* Copyright (c) 2003-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup mips32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_mips32_ASM_H_ |
#define KERN_mips32_ASM_H_ |
#include <arch/types.h> |
#include <config.h> |
static inline void cpu_sleep(void) |
{ |
/* Most of the simulators do not support */ |
/* asm volatile ("wait"); */ |
} |
/** Return base address of current stack |
* |
* Return the base address of the current stack. |
* The stack is assumed to be STACK_SIZE bytes long. |
* The stack must start on page boundary. |
*/ |
static inline uintptr_t get_stack_base(void) |
{ |
uintptr_t v; |
asm volatile ("and %0, $29, %1\n" : "=r" (v) : "r" (~(STACK_SIZE-1))); |
return v; |
} |
extern void cpu_halt(void); |
extern void asm_delay_loop(uint32_t t); |
extern void userspace_asm(uintptr_t ustack, uintptr_t uspace_uarg, |
uintptr_t entry); |
extern ipl_t interrupts_disable(void); |
extern ipl_t interrupts_enable(void); |
extern void interrupts_restore(ipl_t ipl); |
extern ipl_t interrupts_read(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/mips32/include/cp0.h |
---|
0,0 → 1,122 |
/* |
* Copyright (c) 2003-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup mips32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_mips32_CP0_H_ |
#define KERN_mips32_CP0_H_ |
#include <arch/types.h> |
#define cp0_status_ie_enabled_bit (1 << 0) |
#define cp0_status_exl_exception_bit (1 << 1) |
#define cp0_status_erl_error_bit (1 << 2) |
#define cp0_status_um_bit (1 << 4) |
#define cp0_status_bev_bootstrap_bit (1 << 22) |
#define cp0_status_fpu_bit (1 << 29) |
#define cp0_status_im_shift 8 |
#define cp0_status_im_mask 0xff00 |
#define cp0_cause_excno(cause) ((cause >> 2) & 0x1f) |
#define cp0_cause_coperr(cause) ((cause >> 28) & 0x3) |
#define fpu_cop_id 1 |
/* |
* Magic value for use in msim. |
*/ |
#define cp0_compare_value 100000 |
#define cp0_mask_all_int() cp0_status_write(cp0_status_read() & ~(cp0_status_im_mask)) |
#define cp0_unmask_all_int() cp0_status_write(cp0_status_read() | cp0_status_im_mask) |
#define cp0_mask_int(it) cp0_status_write(cp0_status_read() & ~(1 << (cp0_status_im_shift + (it)))) |
#define cp0_unmask_int(it) cp0_status_write(cp0_status_read() | (1 << (cp0_status_im_shift + (it)))) |
#define GEN_READ_CP0(nm,reg) static inline uint32_t cp0_ ##nm##_read(void) \ |
{ \ |
uint32_t retval; \ |
asm("mfc0 %0, $" #reg : "=r"(retval)); \ |
return retval; \ |
} |
#define GEN_WRITE_CP0(nm,reg) static inline void cp0_ ##nm##_write(uint32_t val) \ |
{ \ |
asm("mtc0 %0, $" #reg : : "r"(val) ); \ |
} |
GEN_READ_CP0(index, 0); |
GEN_WRITE_CP0(index, 0); |
GEN_READ_CP0(random, 1); |
GEN_READ_CP0(entry_lo0, 2); |
GEN_WRITE_CP0(entry_lo0, 2); |
GEN_READ_CP0(entry_lo1, 3); |
GEN_WRITE_CP0(entry_lo1, 3); |
GEN_READ_CP0(context, 4); |
GEN_WRITE_CP0(context, 4); |
GEN_READ_CP0(pagemask, 5); |
GEN_WRITE_CP0(pagemask, 5); |
GEN_READ_CP0(wired, 6); |
GEN_WRITE_CP0(wired, 6); |
GEN_READ_CP0(badvaddr, 8); |
GEN_READ_CP0(count, 9); |
GEN_WRITE_CP0(count, 9); |
GEN_READ_CP0(entry_hi, 10); |
GEN_WRITE_CP0(entry_hi, 10); |
GEN_READ_CP0(compare, 11); |
GEN_WRITE_CP0(compare, 11); |
GEN_READ_CP0(status, 12); |
GEN_WRITE_CP0(status, 12); |
GEN_READ_CP0(cause, 13); |
GEN_WRITE_CP0(cause, 13); |
GEN_READ_CP0(epc, 14); |
GEN_WRITE_CP0(epc, 14); |
GEN_READ_CP0(prid, 15); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/mips32/include/debugger.h |
---|
0,0 → 1,68 |
/* |
* Copyright (c) 2005 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup mips32debug |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_mips32_DEBUGGER_H_ |
#define KERN_mips32_DEBUGGER_H_ |
#include <arch/exception.h> |
#include <arch/types.h> |
#define BKPOINTS_MAX 10 |
#define BKPOINT_INPROG (1 << 0) /**< Breakpoint was shot */ |
#define BKPOINT_ONESHOT (1 << 1) /**< One-time breakpoint,mandatory for j/b |
instructions */ |
#define BKPOINT_REINST (1 << 2) /**< Breakpoint is set on the next |
instruction, so that it could be |
reinstalled on the previous one */ |
#define BKPOINT_FUNCCALL (1 << 3) /**< Call a predefined function */ |
typedef struct { |
uintptr_t address; /**< Breakpoint address */ |
unative_t instruction; /**< Original instruction */ |
unative_t nextinstruction; /**< Original instruction following break */ |
int flags; /**< Flags regarding breakpoint */ |
count_t counter; |
void (*bkfunc)(void *b, istate_t *istate); |
} bpinfo_t; |
extern void debugger_init(void); |
void debugger_bpoint(istate_t *istate); |
extern bpinfo_t breakpoints[BKPOINTS_MAX]; |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/mips32/include/cpu.h |
---|
0,0 → 1,49 |
/* |
* Copyright (c) 2003-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup mips32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_mips32_CPU_H_ |
#define KERN_mips32_CPU_H_ |
#include <arch/types.h> |
#include <arch/asm.h> |
typedef struct { |
uint32_t imp_num; |
uint32_t rev_num; |
} cpu_arch_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/mips32/include/fpu_context.h |
---|
0,0 → 1,50 |
/* |
* Copyright (c) 2005 Jakub Vana |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup mips32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_mips32_FPU_CONTEXT_H_ |
#define KERN_mips32_FPU_CONTEXT_H_ |
#include <arch/types.h> |
#define FPU_CONTEXT_ALIGN sizeof(unative_t) |
typedef struct { |
unative_t dregs[32]; |
unative_t cregs[32]; |
} fpu_context_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/mips32/include/context.h |
---|
0,0 → 1,78 |
/* |
* Copyright (c) 2003-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup mips32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_mips32_CONTEXT_H_ |
#define KERN_mips32_CONTEXT_H_ |
#include <align.h> |
#include <arch/stack.h> |
/* |
* Put one item onto the stack to support get_stack_base() and align it up. |
*/ |
#define SP_DELTA (0 + ALIGN_UP(STACK_ITEM_SIZE, STACK_ALIGNMENT)) |
#ifndef __ASM__ |
#include <arch/types.h> |
/* |
* Only save registers that must be preserved across |
* function calls. |
*/ |
typedef struct { |
uintptr_t sp; |
uintptr_t pc; |
uint32_t s0; |
uint32_t s1; |
uint32_t s2; |
uint32_t s3; |
uint32_t s4; |
uint32_t s5; |
uint32_t s6; |
uint32_t s7; |
uint32_t s8; |
uint32_t gp; |
ipl_t ipl; |
} context_t; |
#endif /* __ASM__ */ |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/mips32/include/atomic.h |
---|
0,0 → 1,76 |
/* |
* Copyright (c) 2005 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup mips32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_mips32_ATOMIC_H_ |
#define KERN_mips32_ATOMIC_H_ |
#define atomic_inc(x) ((void) atomic_add(x, 1)) |
#define atomic_dec(x) ((void) atomic_add(x, -1)) |
#define atomic_postinc(x) (atomic_add(x, 1) - 1) |
#define atomic_postdec(x) (atomic_add(x, -1) + 1) |
#define atomic_preinc(x) atomic_add(x, 1) |
#define atomic_predec(x) atomic_add(x, -1) |
/* Atomic addition of immediate value. |
* |
* @param val Memory location to which will be the immediate value added. |
* @param i Signed immediate that will be added to *val. |
* |
* @return Value after addition. |
*/ |
static inline long atomic_add(atomic_t *val, int i) |
{ |
long tmp, v; |
asm volatile ( |
"1:\n" |
" ll %0, %1\n" |
" addiu %0, %0, %3\n" /* same as addi, but never traps on overflow */ |
" move %2, %0\n" |
" sc %0, %1\n" |
" beq %0, %4, 1b\n" /* if the atomic operation failed, try again */ |
" nop\n" |
: "=r" (tmp), "=m" (val->count), "=r" (v) |
: "i" (i), "i" (0) |
); |
return v; |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/mips32/include/barrier.h |
---|
0,0 → 1,51 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup mips32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_mips32_BARRIER_H_ |
#define KERN_mips32_BARRIER_H_ |
/* |
* TODO: implement true MIPS memory barriers for macros below. |
*/ |
#define CS_ENTER_BARRIER() asm volatile ("" ::: "memory") |
#define CS_LEAVE_BARRIER() asm volatile ("" ::: "memory") |
#define memory_barrier() asm volatile ("" ::: "memory") |
#define read_barrier() asm volatile ("" ::: "memory") |
#define write_barrier() asm volatile ("" ::: "memory") |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/mips32/include/asm/regname.h |
---|
0,0 → 1,97 |
/* |
* Copyright (c) 2005 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup mips32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_mips32_REGNAME_H_ |
#define KERN_mips32_REGNAME_H_ |
#define zero 0 |
#define at 1 |
#define v0 2 |
#define v1 3 |
#define a0 4 |
#define a1 5 |
#define a2 6 |
#define a3 7 |
#define t0 8 |
#define t1 9 |
#define t2 10 |
#define t3 11 |
#define t4 12 |
#define t5 13 |
#define t6 14 |
#define t7 15 |
#define s0 16 |
#define s1 17 |
#define s2 18 |
#define s3 19 |
#define s4 20 |
#define s5 21 |
#define s6 22 |
#define s7 23 |
#define t8 24 |
#define t9 25 |
#define k0 26 |
#define k1 27 |
#define gp 28 |
#define sp 29 |
#define s8 30 |
#define ra 31 |
#define rindex 0 |
#define rrandom 1 |
#define entrylo0 2 |
#define entrylo1 3 |
#define context 4 |
#define pagemask 5 |
#define wired 6 |
#define badvaddr 8 |
#define count 9 |
#define entryhi 10 |
#define compare 11 |
#define status 12 |
#define cause 13 |
#define epc 14 |
#define rconfig 16 |
#define lladdr 17 |
#define watchlo 18 |
#define watchhi 19 |
#define xcontext 20 |
#define rdebug 23 |
#define depc 24 |
#define eepc 30 |
#endif /* KERN_mips32_REGNAME_H_ */ |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/mips32/include/asm/boot.h |
---|
0,0 → 1,45 |
/* |
* Copyright (c) 2005 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup mips32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_mips32_BOOT_H_ |
#define KERN_mips32_BOOT_H_ |
/* Temporary stack size for boot process */ |
#define TEMP_STACK_SIZE 0x100 |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/mips32/include/byteorder.h |
---|
0,0 → 1,61 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup mips32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_mips32_BYTEORDER_H_ |
#define KERN_mips32_BYTEORDER_H_ |
#include <byteorder.h> |
#ifdef BIG_ENDIAN |
#define uint32_t_le2host(n) uint32_t_byteorder_swap(n) |
#define uint64_t_le2host(n) uint64_t_byteorder_swap(n) |
#define uint32_t_be2host(n) (n) |
#define uint64_t_be2host(n) (n) |
#else |
#define uint32_t_le2host(n) (n) |
#define uint64_t_le2host(n) (n) |
#define uint32_t_be2host(n) uint32_t_byteorder_swap(n) |
#define uint64_t_be2host(n) uint64_t_byteorder_swap(n) |
#endif |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/mips32/include/console.h |
---|
0,0 → 1,43 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup mips32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_mips32_CONSOLE_H_ |
#define KERN_mips32_CONSOLE_H_ |
extern void console_init(devno_t devno); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/mips32/include/boot.h |
---|
0,0 → 1,48 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#ifndef KERN_mips32_BOOT_H_ |
#define KERN_mips32_BOOT_H_ |
#define TASKMAP_MAX_RECORDS 32 |
#include <arch/types.h> |
typedef struct { |
uintptr_t addr; |
uint32_t size; |
} utask_t; |
typedef struct { |
uint32_t cnt; |
utask_t tasks[TASKMAP_MAX_RECORDS]; |
} bootinfo_t; |
extern bootinfo_t bootinfo; |
#endif |
/tags/0.3.0/kernel/arch/mips32/include/elf.h |
---|
0,0 → 1,51 |
/* |
* Copyright (c) 2006 Sergey Bondari |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup mips32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_mips32_ELF_H_ |
#define KERN_mips32_ELF_H_ |
#define ELF_MACHINE EM_MIPS |
#ifdef BIG_ENDIAN |
# define ELF_DATA_ENCODING ELFDATA2MSB |
#else |
# define ELF_DATA_ENCODING ELFDATA2LSB |
#endif |
#define ELF_CLASS ELFCLASS32 |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/mips32/include/memstr.h |
---|
0,0 → 1,48 |
/* |
* Copyright (c) 2005 Sergey Bondari |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup mips32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_mips32_MEMSTR_H_ |
#define KERN_mips32_MEMSTR_H_ |
#define memcpy(dst, src, cnt) __builtin_memcpy((dst), (src), (cnt)) |
extern void memsetw(uintptr_t dst, size_t cnt, uint16_t x); |
extern void memsetb(uintptr_t dst, size_t cnt, uint8_t x); |
extern int memcmp(uintptr_t src, uintptr_t dst, int cnt); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/mips32/include/arg.h |
---|
0,0 → 1,60 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup mips32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_mips32_ARG_H_ |
#define KERN_mips32_ARG_H_ |
#include <arch/types.h> |
/** |
* va_arg macro for MIPS32 - problem is that 64 bit values must be aligned on an 8-byte boundary (32bit values not) |
* To satisfy this, paddings must be sometimes inserted. |
*/ |
typedef uintptr_t va_list; |
#define va_start(ap, lst) \ |
((ap) = (va_list)&(lst) + sizeof(lst)) |
#define va_arg(ap, type) \ |
(((type *)((ap) = (va_list)( (sizeof(type) <= 4) ? ((uintptr_t)((ap) + 2*4 - 1) & (~3)) : ((uintptr_t)((ap) + 2*8 -1) & (~7)) )))[-1]) |
#define va_copy(dst,src) ((dst)=(src)) |
#define va_end(ap) |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/mips32/include/arch.h |
---|
0,0 → 1,41 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup mips32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_mips32_ARCH_H_ |
#define KERN_mips32_ARCH_H_ |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/mips32/include/proc/task.h |
---|
0,0 → 1,47 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup mips32proc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_mips32_TASK_H_ |
#define KERN_mips32_TASK_H_ |
typedef struct { |
} task_arch_t; |
#define task_create_arch(t) |
#define task_destroy_arch(t) |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/mips32/include/proc/thread.h |
---|
0,0 → 1,49 |
/* |
* Copyright (c) 2003-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup mips32proc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_mips32_THREAD_H_ |
#define KERN_mips32_THREAD_H_ |
typedef struct { |
} thread_arch_t; |
#define thr_constructor_arch(t) |
#define thr_destructor_arch(t) |
#define thread_create_arch(t) |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/mips32/include/faddr.h |
---|
0,0 → 1,45 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup mips32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_mips32_FADDR_H_ |
#define KERN_mips32_FADDR_H_ |
#include <arch/types.h> |
#define FADDR(fptr) ((uintptr_t) (fptr)) |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/mips32/include/debug.h |
---|
0,0 → 1,52 |
/* |
* Copyright (c) 2005 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup mips32debug |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_mips32_DEBUG_H_ |
#define KERN_mips23_DEBUG_H_ |
/** simulator enters the trace mode */ |
#define ___traceon() asm volatile ( "\t.word\t0x39\n"); |
/** simulator leaves the trace mode */ |
#define ___traceoff() asm volatile ( "\t.word\t0x3d\n"); |
/** register dump */ |
#define ___regview() asm volatile ( "\t.word\t0x37\n"); |
/** halt the simulator */ |
#define ___halt() asm volatile ( "\t.word\t0x28\n"); |
/** simulator enters interactive mode */ |
#define ___intmode() asm volatile ( "\t.word\t0x29\n"); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/mips32/src/context.S |
---|
0,0 → 1,53 |
# |
# Copyright (c) 2003-2004 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
#include <arch/context_offset.h> |
.text |
.set noat |
.set noreorder |
.set nomacro |
.global context_save_arch |
.global context_restore_arch |
context_save_arch: |
CONTEXT_SAVE_ARCH_CORE $a0 |
# context_save returns 1 |
j $31 |
li $2, 1 |
context_restore_arch: |
CONTEXT_RESTORE_ARCH_CORE $a0 |
# context_restore returns 0 |
j $31 |
xor $2, $2 |
/tags/0.3.0/kernel/arch/mips32/src/cpu/cpu.c |
---|
0,0 → 1,132 |
/* |
* Copyright (c) 2003-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup mips32 |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/cpu.h> |
#include <cpu.h> |
#include <arch.h> |
#include <arch/cp0.h> |
#include <print.h> |
struct data_t { |
char *vendor; |
char *model; |
}; |
static struct data_t imp_data[] = { |
{ "Invalid", "Invalid" }, /* 0x00 */ |
{ "MIPS", "R2000" }, /* 0x01 */ |
{ "MIPS", "R3000" }, /* 0x02 */ |
{ "MIPS", "R6000" }, /* 0x03 */ |
{ "MIPS", " R4000/R4400" }, /* 0x04 */ |
{ "LSI Logic", "R3000" }, /* 0x05 */ |
{ "MIPS", "R6000A" }, /* 0x06 */ |
{ "IDT", "3051/3052" }, /* 0x07 */ |
{ "Invalid", "Invalid" }, /* 0x08 */ |
{ "MIPS", "R10000/T5" }, /* 0x09 */ |
{ "MIPS", "R4200" }, /* 0x0a */ |
{ "Unknown", "Unknown" }, /* 0x0b */ |
{ "Unknown", "Unknown" }, /* 0x0c */ |
{ "Invalid", "Invalid" }, /* 0x0d */ |
{ "Invalid", "Invalid" }, /* 0x0e */ |
{ "Invalid", "Invalid" }, /* 0x0f */ |
{ "MIPS", "R8000" }, /* 0x10 */ |
{ "Invalid", "Invalid" }, /* 0x11 */ |
{ "Invalid", "Invalid" }, /* 0x12 */ |
{ "Invalid", "Invalid" }, /* 0x13 */ |
{ "Invalid", "Invalid" }, /* 0x14 */ |
{ "Invalid", "Invalid" }, /* 0x15 */ |
{ "Invalid", "Invalid" }, /* 0x16 */ |
{ "Invalid", "Invalid" }, /* 0x17 */ |
{ "Invalid", "Invalid" }, /* 0x18 */ |
{ "Invalid", "Invalid" }, /* 0x19 */ |
{ "Invalid", "Invalid" }, /* 0x1a */ |
{ "Invalid", "Invalid" }, /* 0x1b */ |
{ "Invalid", "Invalid" }, /* 0x1c */ |
{ "Invalid", "Invalid" }, /* 0x1d */ |
{ "Invalid", "Invalid" }, /* 0x1e */ |
{ "Invalid", "Invalid" }, /* 0x1f */ |
{ "QED", "R4600" }, /* 0x20 */ |
{ "Sony", "R3000" }, /* 0x21 */ |
{ "Toshiba", "R3000" }, /* 0x22 */ |
{ "NKK", "R3000" }, /* 0x23 */ |
{ NULL, NULL } |
}; |
static struct data_t imp_data80[] = { |
{ "MIPS", "4Kc" }, /* 0x80 */ |
{"Invalid","Invalid"}, /* 0x81 */ |
{"Invalid","Invalid"}, /* 0x82 */ |
{"MIPS","4Km & 4Kp"}, /* 0x83 */ |
{ NULL, NULL} |
}; |
void cpu_arch_init(void) |
{ |
} |
void cpu_identify(void) |
{ |
CPU->arch.rev_num = cp0_prid_read() & 0xff; |
CPU->arch.imp_num = (cp0_prid_read() >> 8) & 0xff; |
} |
void cpu_print_report(cpu_t *m) |
{ |
struct data_t *data; |
unsigned int i; |
if (m->arch.imp_num & 0x80) { |
/* Count records */ |
for (i = 0; imp_data80[i].vendor; i++); |
if ((m->arch.imp_num & 0x7f) >= i) { |
printf("imp=%d\n", m->arch.imp_num); |
return; |
} |
data = &imp_data80[m->arch.imp_num & 0x7f]; |
} else { |
for (i = 0; imp_data[i].vendor; i++); |
if (m->arch.imp_num >= i) { |
printf("imp=%d\n", m->arch.imp_num); |
return; |
} |
data = &imp_data[m->arch.imp_num]; |
} |
printf("cpu%d: %s %s (rev=%d.%d, imp=%d)\n", |
m->id, data->vendor, data->model, m->arch.rev_num >> 4, |
m->arch.rev_num & 0xf, m->arch.imp_num); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/mips32/src/debugger.c |
---|
0,0 → 1,386 |
/* |
* Copyright (c) 2005 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup mips32debug |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/debugger.h> |
#include <memstr.h> |
#include <console/kconsole.h> |
#include <console/cmd.h> |
#include <symtab.h> |
#include <print.h> |
#include <panic.h> |
#include <arch.h> |
#include <arch/cp0.h> |
#include <func.h> |
bpinfo_t breakpoints[BKPOINTS_MAX]; |
SPINLOCK_INITIALIZE(bkpoint_lock); |
static int cmd_print_breakpoints(cmd_arg_t *argv); |
static cmd_info_t bkpts_info = { |
.name = "bkpts", |
.description = "Print breakpoint table.", |
.func = cmd_print_breakpoints, |
.argc = 0, |
}; |
static int cmd_del_breakpoint(cmd_arg_t *argv); |
static cmd_arg_t del_argv = { |
.type = ARG_TYPE_INT |
}; |
static cmd_info_t delbkpt_info = { |
.name = "delbkpt", |
.description = "delbkpt <number> - Delete breakpoint.", |
.func = cmd_del_breakpoint, |
.argc = 1, |
.argv = &del_argv |
}; |
static int cmd_add_breakpoint(cmd_arg_t *argv); |
static cmd_arg_t add_argv = { |
.type = ARG_TYPE_INT |
}; |
static cmd_info_t addbkpt_info = { |
.name = "addbkpt", |
.description = "addbkpt <&symbol> - new bkpoint. Break on J/Branch insts unsupported.", |
.func = cmd_add_breakpoint, |
.argc = 1, |
.argv = &add_argv |
}; |
static cmd_arg_t adde_argv[] = { |
{ .type = ARG_TYPE_INT }, |
{ .type = ARG_TYPE_INT } |
}; |
static cmd_info_t addbkpte_info = { |
.name = "addbkpte", |
.description = "addebkpte <&symbol> <&func> - new bkpoint. Call func(or Nothing if 0).", |
.func = cmd_add_breakpoint, |
.argc = 2, |
.argv = adde_argv |
}; |
static struct { |
uint32_t andmask; |
uint32_t value; |
}jmpinstr[] = { |
{0xf3ff0000, 0x41000000}, /* BCzF */ |
{0xf3ff0000, 0x41020000}, /* BCzFL */ |
{0xf3ff0000, 0x41010000}, /* BCzT */ |
{0xf3ff0000, 0x41030000}, /* BCzTL */ |
{0xfc000000, 0x10000000}, /* BEQ */ |
{0xfc000000, 0x50000000}, /* BEQL */ |
{0xfc1f0000, 0x04010000}, /* BEQL */ |
{0xfc1f0000, 0x04110000}, /* BGEZAL */ |
{0xfc1f0000, 0x04130000}, /* BGEZALL */ |
{0xfc1f0000, 0x04030000}, /* BGEZL */ |
{0xfc1f0000, 0x1c000000}, /* BGTZ */ |
{0xfc1f0000, 0x5c000000}, /* BGTZL */ |
{0xfc1f0000, 0x18000000}, /* BLEZ */ |
{0xfc1f0000, 0x58000000}, /* BLEZL */ |
{0xfc1f0000, 0x04000000}, /* BLTZ */ |
{0xfc1f0000, 0x04100000}, /* BLTZAL */ |
{0xfc1f0000, 0x04120000}, /* BLTZALL */ |
{0xfc1f0000, 0x04020000}, /* BLTZL */ |
{0xfc000000, 0x14000000}, /* BNE */ |
{0xfc000000, 0x54000000}, /* BNEL */ |
{0xfc000000, 0x08000000}, /* J */ |
{0xfc000000, 0x0c000000}, /* JAL */ |
{0xfc1f07ff, 0x00000009}, /* JALR */ |
{0,0} /* EndOfTable */ |
}; |
/** Test, if the given instruction is a jump or branch instruction |
* |
* @param instr Instruction code |
* @return true - it is jump instruction, false otherwise |
*/ |
static bool is_jump(unative_t instr) |
{ |
int i; |
for (i=0;jmpinstr[i].andmask;i++) { |
if ((instr & jmpinstr[i].andmask) == jmpinstr[i].value) |
return true; |
} |
return false; |
} |
/** Add new breakpoint to table */ |
int cmd_add_breakpoint(cmd_arg_t *argv) |
{ |
bpinfo_t *cur = NULL; |
ipl_t ipl; |
int i; |
if (argv->intval & 0x3) { |
printf("Not aligned instruction, forgot to use &symbol?\n"); |
return 1; |
} |
ipl = interrupts_disable(); |
spinlock_lock(&bkpoint_lock); |
/* Check, that the breakpoints do not conflict */ |
for (i=0; i<BKPOINTS_MAX; i++) { |
if (breakpoints[i].address == (uintptr_t)argv->intval) { |
printf("Duplicate breakpoint %d.\n", i); |
spinlock_unlock(&bkpoints_lock); |
return 0; |
} else if (breakpoints[i].address == (uintptr_t)argv->intval + sizeof(unative_t) || \ |
breakpoints[i].address == (uintptr_t)argv->intval - sizeof(unative_t)) { |
printf("Adjacent breakpoints not supported, conflict with %d.\n", i); |
spinlock_unlock(&bkpoints_lock); |
return 0; |
} |
} |
for (i=0; i<BKPOINTS_MAX; i++) |
if (!breakpoints[i].address) { |
cur = &breakpoints[i]; |
break; |
} |
if (!cur) { |
printf("Too many breakpoints.\n"); |
spinlock_unlock(&bkpoint_lock); |
interrupts_restore(ipl); |
return 0; |
} |
cur->address = (uintptr_t) argv->intval; |
printf("Adding breakpoint on address: %p\n", argv->intval); |
cur->instruction = ((unative_t *)cur->address)[0]; |
cur->nextinstruction = ((unative_t *)cur->address)[1]; |
if (argv == &add_argv) { |
cur->flags = 0; |
} else { /* We are add extended */ |
cur->flags = BKPOINT_FUNCCALL; |
cur->bkfunc = (void (*)(void *, istate_t *)) argv[1].intval; |
} |
if (is_jump(cur->instruction)) |
cur->flags |= BKPOINT_ONESHOT; |
cur->counter = 0; |
/* Set breakpoint */ |
*((unative_t *)cur->address) = 0x0d; |
spinlock_unlock(&bkpoint_lock); |
interrupts_restore(ipl); |
return 1; |
} |
/** Remove breakpoint from table */ |
int cmd_del_breakpoint(cmd_arg_t *argv) |
{ |
bpinfo_t *cur; |
ipl_t ipl; |
if (argv->intval > BKPOINTS_MAX) { |
printf("Invalid breakpoint number.\n"); |
return 0; |
} |
ipl = interrupts_disable(); |
spinlock_lock(&bkpoint_lock); |
cur = &breakpoints[argv->intval]; |
if (!cur->address) { |
printf("Breakpoint does not exist.\n"); |
spinlock_unlock(&bkpoint_lock); |
interrupts_restore(ipl); |
return 0; |
} |
if ((cur->flags & BKPOINT_INPROG) && (cur->flags & BKPOINT_ONESHOT)) { |
printf("Cannot remove one-shot breakpoint in-progress\n"); |
spinlock_unlock(&bkpoint_lock); |
interrupts_restore(ipl); |
return 0; |
} |
((uint32_t *)cur->address)[0] = cur->instruction; |
((uint32_t *)cur->address)[1] = cur->nextinstruction; |
cur->address = NULL; |
spinlock_unlock(&bkpoint_lock); |
interrupts_restore(ipl); |
return 1; |
} |
/** Print table of active breakpoints */ |
int cmd_print_breakpoints(cmd_arg_t *argv) |
{ |
unsigned int i; |
char *symbol; |
printf("# Count Address INPROG ONESHOT FUNCCALL In symbol\n"); |
printf("-- ----- ---------- ------ ------- -------- ---------\n"); |
for (i = 0; i < BKPOINTS_MAX; i++) |
if (breakpoints[i].address) { |
symbol = get_symtab_entry(breakpoints[i].address); |
printf("%-2u %-5d %#10zx %-6s %-7s %-8s %s\n", i, |
breakpoints[i].counter, breakpoints[i].address, |
((breakpoints[i].flags & BKPOINT_INPROG) ? "true" : "false"), |
((breakpoints[i].flags & BKPOINT_ONESHOT) ? "true" : "false"), |
((breakpoints[i].flags & BKPOINT_FUNCCALL) ? "true" : "false"), |
symbol); |
} |
return 1; |
} |
/** Initialize debugger */ |
void debugger_init() |
{ |
int i; |
for (i=0; i<BKPOINTS_MAX; i++) |
breakpoints[i].address = NULL; |
cmd_initialize(&bkpts_info); |
if (!cmd_register(&bkpts_info)) |
panic("could not register command %s\n", bkpts_info.name); |
cmd_initialize(&delbkpt_info); |
if (!cmd_register(&delbkpt_info)) |
panic("could not register command %s\n", delbkpt_info.name); |
cmd_initialize(&addbkpt_info); |
if (!cmd_register(&addbkpt_info)) |
panic("could not register command %s\n", addbkpt_info.name); |
cmd_initialize(&addbkpte_info); |
if (!cmd_register(&addbkpte_info)) |
panic("could not register command %s\n", addbkpte_info.name); |
} |
/** Handle breakpoint |
* |
* Find breakpoint in breakpoint table. |
* If found, call kconsole, set break on next instruction and reexecute. |
* If we are on "next instruction", set it back on the first and reexecute. |
* If breakpoint not found in breakpoint table, call kconsole and start |
* next instruction. |
*/ |
void debugger_bpoint(istate_t *istate) |
{ |
bpinfo_t *cur = NULL; |
uintptr_t fireaddr = istate->epc; |
int i; |
/* test branch delay slot */ |
if (cp0_cause_read() & 0x80000000) |
panic("Breakpoint in branch delay slot not supported.\n"); |
spinlock_lock(&bkpoint_lock); |
for (i=0; i<BKPOINTS_MAX; i++) { |
/* Normal breakpoint */ |
if (fireaddr == breakpoints[i].address \ |
&& !(breakpoints[i].flags & BKPOINT_REINST)) { |
cur = &breakpoints[i]; |
break; |
} |
/* Reinst only breakpoint */ |
if ((breakpoints[i].flags & BKPOINT_REINST) \ |
&& (fireaddr ==breakpoints[i].address+sizeof(unative_t))) { |
cur = &breakpoints[i]; |
break; |
} |
} |
if (cur) { |
if (cur->flags & BKPOINT_REINST) { |
/* Set breakpoint on first instruction */ |
((uint32_t *)cur->address)[0] = 0x0d; |
/* Return back the second */ |
((uint32_t *)cur->address)[1] = cur->nextinstruction; |
cur->flags &= ~BKPOINT_REINST; |
spinlock_unlock(&bkpoint_lock); |
return; |
} |
if (cur->flags & BKPOINT_INPROG) |
printf("Warning: breakpoint recursion\n"); |
if (!(cur->flags & BKPOINT_FUNCCALL)) |
printf("***Breakpoint %d: %p in %s.\n", i, |
fireaddr, get_symtab_entry(istate->epc)); |
/* Return first instruction back */ |
((uint32_t *)cur->address)[0] = cur->instruction; |
if (! (cur->flags & BKPOINT_ONESHOT)) { |
/* Set Breakpoint on next instruction */ |
((uint32_t *)cur->address)[1] = 0x0d; |
cur->flags |= BKPOINT_REINST; |
} |
cur->flags |= BKPOINT_INPROG; |
} else { |
printf("***Breakpoint %p in %s.\n", fireaddr, |
get_symtab_entry(fireaddr)); |
/* Move on to next instruction */ |
istate->epc += 4; |
} |
if (cur) |
cur->counter++; |
if (cur && (cur->flags & BKPOINT_FUNCCALL)) { |
/* Allow zero bkfunc, just for counting */ |
if (cur->bkfunc) |
cur->bkfunc(cur, istate); |
} else { |
printf("***Type 'exit' to exit kconsole.\n"); |
/* This disables all other processors - we are not SMP, |
* actually this gets us to cpu_halt, if scheduler() is run |
* - we generally do not want scheduler to be run from debug, |
* so this is a good idea |
*/ |
atomic_set(&haltstate,1); |
spinlock_unlock(&bkpoint_lock); |
kconsole("debug"); |
spinlock_lock(&bkpoint_lock); |
atomic_set(&haltstate,0); |
} |
if (cur && cur->address == fireaddr && (cur->flags & BKPOINT_INPROG)) { |
/* Remove one-shot breakpoint */ |
if ((cur->flags & BKPOINT_ONESHOT)) |
cur->address = NULL; |
/* Remove in-progress flag */ |
cur->flags &= ~BKPOINT_INPROG; |
} |
spinlock_unlock(&bkpoint_lock); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/mips32/src/mm/tlb.c |
---|
0,0 → 1,616 |
/* |
* Copyright (c) 2003-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup mips32mm |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/mm/tlb.h> |
#include <mm/asid.h> |
#include <mm/tlb.h> |
#include <mm/page.h> |
#include <mm/as.h> |
#include <arch/cp0.h> |
#include <panic.h> |
#include <arch.h> |
#include <symtab.h> |
#include <synch/spinlock.h> |
#include <print.h> |
#include <debug.h> |
#include <align.h> |
#include <interrupt.h> |
static void tlb_refill_fail(istate_t *istate); |
static void tlb_invalid_fail(istate_t *istate); |
static void tlb_modified_fail(istate_t *istate); |
static pte_t *find_mapping_and_check(uintptr_t badvaddr, int access, istate_t *istate, int *pfrc); |
static void prepare_entry_lo(entry_lo_t *lo, bool g, bool v, bool d, bool cacheable, uintptr_t pfn); |
static void prepare_entry_hi(entry_hi_t *hi, asid_t asid, uintptr_t addr); |
/** Initialize TLB |
* |
* Initialize TLB. |
* Invalidate all entries and mark wired entries. |
*/ |
void tlb_arch_init(void) |
{ |
int i; |
cp0_pagemask_write(TLB_PAGE_MASK_16K); |
cp0_entry_hi_write(0); |
cp0_entry_lo0_write(0); |
cp0_entry_lo1_write(0); |
/* Clear and initialize TLB. */ |
for (i = 0; i < TLB_ENTRY_COUNT; i++) { |
cp0_index_write(i); |
tlbwi(); |
} |
/* |
* The kernel is going to make use of some wired |
* entries (e.g. mapping kernel stacks in kseg3). |
*/ |
cp0_wired_write(TLB_WIRED); |
} |
/** Process TLB Refill Exception |
* |
* Process TLB Refill Exception. |
* |
* @param istate Interrupted register context. |
*/ |
void tlb_refill(istate_t *istate) |
{ |
entry_lo_t lo; |
entry_hi_t hi; |
asid_t asid; |
uintptr_t badvaddr; |
pte_t *pte; |
int pfrc; |
badvaddr = cp0_badvaddr_read(); |
spinlock_lock(&AS->lock); |
asid = AS->asid; |
spinlock_unlock(&AS->lock); |
page_table_lock(AS, true); |
pte = find_mapping_and_check(badvaddr, PF_ACCESS_READ, istate, &pfrc); |
if (!pte) { |
switch (pfrc) { |
case AS_PF_FAULT: |
goto fail; |
break; |
case AS_PF_DEFER: |
/* |
* The page fault came during copy_from_uspace() |
* or copy_to_uspace(). |
*/ |
page_table_unlock(AS, true); |
return; |
default: |
panic("unexpected pfrc (%d)\n", pfrc); |
} |
} |
/* |
* Record access to PTE. |
*/ |
pte->a = 1; |
prepare_entry_hi(&hi, asid, badvaddr); |
prepare_entry_lo(&lo, pte->g, pte->p, pte->d, pte->cacheable, pte->pfn); |
/* |
* New entry is to be inserted into TLB |
*/ |
cp0_entry_hi_write(hi.value); |
if ((badvaddr/PAGE_SIZE) % 2 == 0) { |
cp0_entry_lo0_write(lo.value); |
cp0_entry_lo1_write(0); |
} |
else { |
cp0_entry_lo0_write(0); |
cp0_entry_lo1_write(lo.value); |
} |
cp0_pagemask_write(TLB_PAGE_MASK_16K); |
tlbwr(); |
page_table_unlock(AS, true); |
return; |
fail: |
page_table_unlock(AS, true); |
tlb_refill_fail(istate); |
} |
/** Process TLB Invalid Exception |
* |
* Process TLB Invalid Exception. |
* |
* @param istate Interrupted register context. |
*/ |
void tlb_invalid(istate_t *istate) |
{ |
tlb_index_t index; |
uintptr_t badvaddr; |
entry_lo_t lo; |
entry_hi_t hi; |
pte_t *pte; |
int pfrc; |
badvaddr = cp0_badvaddr_read(); |
/* |
* Locate the faulting entry in TLB. |
*/ |
hi.value = cp0_entry_hi_read(); |
prepare_entry_hi(&hi, hi.asid, badvaddr); |
cp0_entry_hi_write(hi.value); |
tlbp(); |
index.value = cp0_index_read(); |
page_table_lock(AS, true); |
/* |
* Fail if the entry is not in TLB. |
*/ |
if (index.p) { |
printf("TLB entry not found.\n"); |
goto fail; |
} |
pte = find_mapping_and_check(badvaddr, PF_ACCESS_READ, istate, &pfrc); |
if (!pte) { |
switch (pfrc) { |
case AS_PF_FAULT: |
goto fail; |
break; |
case AS_PF_DEFER: |
/* |
* The page fault came during copy_from_uspace() |
* or copy_to_uspace(). |
*/ |
page_table_unlock(AS, true); |
return; |
default: |
panic("unexpected pfrc (%d)\n", pfrc); |
} |
} |
/* |
* Read the faulting TLB entry. |
*/ |
tlbr(); |
/* |
* Record access to PTE. |
*/ |
pte->a = 1; |
prepare_entry_lo(&lo, pte->g, pte->p, pte->d, pte->cacheable, pte->pfn); |
/* |
* The entry is to be updated in TLB. |
*/ |
if ((badvaddr/PAGE_SIZE) % 2 == 0) |
cp0_entry_lo0_write(lo.value); |
else |
cp0_entry_lo1_write(lo.value); |
cp0_pagemask_write(TLB_PAGE_MASK_16K); |
tlbwi(); |
page_table_unlock(AS, true); |
return; |
fail: |
page_table_unlock(AS, true); |
tlb_invalid_fail(istate); |
} |
/** Process TLB Modified Exception |
* |
* Process TLB Modified Exception. |
* |
* @param istate Interrupted register context. |
*/ |
void tlb_modified(istate_t *istate) |
{ |
tlb_index_t index; |
uintptr_t badvaddr; |
entry_lo_t lo; |
entry_hi_t hi; |
pte_t *pte; |
int pfrc; |
badvaddr = cp0_badvaddr_read(); |
/* |
* Locate the faulting entry in TLB. |
*/ |
hi.value = cp0_entry_hi_read(); |
prepare_entry_hi(&hi, hi.asid, badvaddr); |
cp0_entry_hi_write(hi.value); |
tlbp(); |
index.value = cp0_index_read(); |
page_table_lock(AS, true); |
/* |
* Fail if the entry is not in TLB. |
*/ |
if (index.p) { |
printf("TLB entry not found.\n"); |
goto fail; |
} |
pte = find_mapping_and_check(badvaddr, PF_ACCESS_WRITE, istate, &pfrc); |
if (!pte) { |
switch (pfrc) { |
case AS_PF_FAULT: |
goto fail; |
break; |
case AS_PF_DEFER: |
/* |
* The page fault came during copy_from_uspace() |
* or copy_to_uspace(). |
*/ |
page_table_unlock(AS, true); |
return; |
default: |
panic("unexpected pfrc (%d)\n", pfrc); |
} |
} |
/* |
* Fail if the page is not writable. |
*/ |
if (!pte->w) |
goto fail; |
/* |
* Read the faulting TLB entry. |
*/ |
tlbr(); |
/* |
* Record access and write to PTE. |
*/ |
pte->a = 1; |
pte->d = 1; |
prepare_entry_lo(&lo, pte->g, pte->p, pte->w, pte->cacheable, pte->pfn); |
/* |
* The entry is to be updated in TLB. |
*/ |
if ((badvaddr/PAGE_SIZE) % 2 == 0) |
cp0_entry_lo0_write(lo.value); |
else |
cp0_entry_lo1_write(lo.value); |
cp0_pagemask_write(TLB_PAGE_MASK_16K); |
tlbwi(); |
page_table_unlock(AS, true); |
return; |
fail: |
page_table_unlock(AS, true); |
tlb_modified_fail(istate); |
} |
void tlb_refill_fail(istate_t *istate) |
{ |
char *symbol = ""; |
char *sym2 = ""; |
char *s = get_symtab_entry(istate->epc); |
if (s) |
symbol = s; |
s = get_symtab_entry(istate->ra); |
if (s) |
sym2 = s; |
fault_if_from_uspace(istate, "TLB Refill Exception on %p", cp0_badvaddr_read()); |
panic("%x: TLB Refill Exception at %x(%s<-%s)\n", cp0_badvaddr_read(), istate->epc, symbol, sym2); |
} |
void tlb_invalid_fail(istate_t *istate) |
{ |
char *symbol = ""; |
char *s = get_symtab_entry(istate->epc); |
if (s) |
symbol = s; |
fault_if_from_uspace(istate, "TLB Invalid Exception on %p", cp0_badvaddr_read()); |
panic("%x: TLB Invalid Exception at %x(%s)\n", cp0_badvaddr_read(), istate->epc, symbol); |
} |
void tlb_modified_fail(istate_t *istate) |
{ |
char *symbol = ""; |
char *s = get_symtab_entry(istate->epc); |
if (s) |
symbol = s; |
fault_if_from_uspace(istate, "TLB Modified Exception on %p", cp0_badvaddr_read()); |
panic("%x: TLB Modified Exception at %x(%s)\n", cp0_badvaddr_read(), istate->epc, symbol); |
} |
/** Try to find PTE for faulting address |
* |
* Try to find PTE for faulting address. |
* The AS->lock must be held on entry to this function. |
* |
* @param badvaddr Faulting virtual address. |
* @param access Access mode that caused the fault. |
* @param istate Pointer to interrupted state. |
* @param pfrc Pointer to variable where as_page_fault() return code will be stored. |
* |
* @return PTE on success, NULL otherwise. |
*/ |
pte_t *find_mapping_and_check(uintptr_t badvaddr, int access, istate_t *istate, int *pfrc) |
{ |
entry_hi_t hi; |
pte_t *pte; |
hi.value = cp0_entry_hi_read(); |
/* |
* Handler cannot succeed if the ASIDs don't match. |
*/ |
if (hi.asid != AS->asid) { |
printf("EntryHi.asid=%d, AS->asid=%d\n", hi.asid, AS->asid); |
return NULL; |
} |
/* |
* Check if the mapping exists in page tables. |
*/ |
pte = page_mapping_find(AS, badvaddr); |
if (pte && pte->p) { |
/* |
* Mapping found in page tables. |
* Immediately succeed. |
*/ |
return pte; |
} else { |
int rc; |
/* |
* Mapping not found in page tables. |
* Resort to higher-level page fault handler. |
*/ |
page_table_unlock(AS, true); |
switch (rc = as_page_fault(badvaddr, access, istate)) { |
case AS_PF_OK: |
/* |
* The higher-level page fault handler succeeded, |
* The mapping ought to be in place. |
*/ |
page_table_lock(AS, true); |
pte = page_mapping_find(AS, badvaddr); |
ASSERT(pte && pte->p); |
return pte; |
break; |
case AS_PF_DEFER: |
page_table_lock(AS, true); |
*pfrc = AS_PF_DEFER; |
return NULL; |
break; |
case AS_PF_FAULT: |
page_table_lock(AS, true); |
printf("Page fault.\n"); |
*pfrc = AS_PF_FAULT; |
return NULL; |
break; |
default: |
panic("unexpected rc (%d)\n", rc); |
} |
} |
} |
void prepare_entry_lo(entry_lo_t *lo, bool g, bool v, bool d, bool cacheable, uintptr_t pfn) |
{ |
lo->value = 0; |
lo->g = g; |
lo->v = v; |
lo->d = d; |
lo->c = cacheable ? PAGE_CACHEABLE_EXC_WRITE : PAGE_UNCACHED; |
lo->pfn = pfn; |
} |
void prepare_entry_hi(entry_hi_t *hi, asid_t asid, uintptr_t addr) |
{ |
hi->value = ALIGN_DOWN(addr, PAGE_SIZE * 2); |
hi->asid = asid; |
} |
/** Print contents of TLB. */ |
void tlb_print(void) |
{ |
page_mask_t mask; |
entry_lo_t lo0, lo1; |
entry_hi_t hi, hi_save; |
unsigned int i; |
hi_save.value = cp0_entry_hi_read(); |
printf("# ASID VPN2 MASK G V D C PFN\n"); |
printf("-- ---- ------ ---- - - - - ------\n"); |
for (i = 0; i < TLB_ENTRY_COUNT; i++) { |
cp0_index_write(i); |
tlbr(); |
mask.value = cp0_pagemask_read(); |
hi.value = cp0_entry_hi_read(); |
lo0.value = cp0_entry_lo0_read(); |
lo1.value = cp0_entry_lo1_read(); |
printf("%-2u %-4u %#6x %#4x %1u %1u %1u %1u %#6x\n", |
i, hi.asid, hi.vpn2, mask.mask, |
lo0.g, lo0.v, lo0.d, lo0.c, lo0.pfn); |
printf(" %1u %1u %1u %1u %#6x\n", |
lo1.g, lo1.v, lo1.d, lo1.c, lo1.pfn); |
} |
cp0_entry_hi_write(hi_save.value); |
} |
/** Invalidate all not wired TLB entries. */ |
void tlb_invalidate_all(void) |
{ |
ipl_t ipl; |
entry_lo_t lo0, lo1; |
entry_hi_t hi_save; |
int i; |
hi_save.value = cp0_entry_hi_read(); |
ipl = interrupts_disable(); |
for (i = TLB_WIRED; i < TLB_ENTRY_COUNT; i++) { |
cp0_index_write(i); |
tlbr(); |
lo0.value = cp0_entry_lo0_read(); |
lo1.value = cp0_entry_lo1_read(); |
lo0.v = 0; |
lo1.v = 0; |
cp0_entry_lo0_write(lo0.value); |
cp0_entry_lo1_write(lo1.value); |
tlbwi(); |
} |
interrupts_restore(ipl); |
cp0_entry_hi_write(hi_save.value); |
} |
/** Invalidate all TLB entries belonging to specified address space. |
* |
* @param asid Address space identifier. |
*/ |
void tlb_invalidate_asid(asid_t asid) |
{ |
ipl_t ipl; |
entry_lo_t lo0, lo1; |
entry_hi_t hi, hi_save; |
int i; |
ASSERT(asid != ASID_INVALID); |
hi_save.value = cp0_entry_hi_read(); |
ipl = interrupts_disable(); |
for (i = 0; i < TLB_ENTRY_COUNT; i++) { |
cp0_index_write(i); |
tlbr(); |
hi.value = cp0_entry_hi_read(); |
if (hi.asid == asid) { |
lo0.value = cp0_entry_lo0_read(); |
lo1.value = cp0_entry_lo1_read(); |
lo0.v = 0; |
lo1.v = 0; |
cp0_entry_lo0_write(lo0.value); |
cp0_entry_lo1_write(lo1.value); |
tlbwi(); |
} |
} |
interrupts_restore(ipl); |
cp0_entry_hi_write(hi_save.value); |
} |
/** Invalidate TLB entries for specified page range belonging to specified address space. |
* |
* @param asid Address space identifier. |
* @param page First page whose TLB entry is to be invalidated. |
* @param cnt Number of entries to invalidate. |
*/ |
void tlb_invalidate_pages(asid_t asid, uintptr_t page, count_t cnt) |
{ |
unsigned int i; |
ipl_t ipl; |
entry_lo_t lo0, lo1; |
entry_hi_t hi, hi_save; |
tlb_index_t index; |
ASSERT(asid != ASID_INVALID); |
hi_save.value = cp0_entry_hi_read(); |
ipl = interrupts_disable(); |
for (i = 0; i < cnt + 1; i += 2) { |
hi.value = 0; |
prepare_entry_hi(&hi, asid, page + i * PAGE_SIZE); |
cp0_entry_hi_write(hi.value); |
tlbp(); |
index.value = cp0_index_read(); |
if (!index.p) { |
/* Entry was found, index register contains valid index. */ |
tlbr(); |
lo0.value = cp0_entry_lo0_read(); |
lo1.value = cp0_entry_lo1_read(); |
lo0.v = 0; |
lo1.v = 0; |
cp0_entry_lo0_write(lo0.value); |
cp0_entry_lo1_write(lo1.value); |
tlbwi(); |
} |
} |
interrupts_restore(ipl); |
cp0_entry_hi_write(hi_save.value); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/mips32/src/mm/frame.c |
---|
0,0 → 1,58 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup mips32mm |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/mm/frame.h> |
#include <mm/frame.h> |
#include <config.h> |
#include <arch/drivers/arc.h> |
/** Create memory zones |
* |
* If ARC is known, read information from ARC, otherwise |
* assume some defaults. |
* - blacklist first FRAME because there is an exception vector |
*/ |
void frame_arch_init(void) |
{ |
if (!arc_frame_init()) { |
zone_create(0, ADDR2PFN(CONFIG_MEMORY_SIZE), 1, 0); |
/* |
* Blacklist interrupt vector |
*/ |
frame_mark_unavailable(0, 1); |
} |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/mips32/src/mm/as.c |
---|
0,0 → 1,71 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup mips32mm |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/mm/as.h> |
#include <genarch/mm/as_pt.h> |
#include <genarch/mm/page_pt.h> |
#include <genarch/mm/asid_fifo.h> |
#include <arch/mm/tlb.h> |
#include <mm/tlb.h> |
#include <mm/as.h> |
#include <arch/cp0.h> |
/** Architecture dependent address space init. */ |
void as_arch_init(void) |
{ |
as_operations = &as_pt_operations; |
asid_fifo_init(); |
} |
/** Install address space. |
* |
* Install ASID. |
* |
* @param as Address space structure. |
*/ |
void as_install_arch(as_t *as) |
{ |
entry_hi_t hi; |
/* |
* Install ASID. |
*/ |
hi.value = cp0_entry_hi_read(); |
hi.asid = as->asid; |
cp0_entry_hi_write(hi.value); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/mips32/src/mm/page.c |
---|
0,0 → 1,54 |
/* |
* Copyright (c) 2003-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup mips32mm |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/mm/page.h> |
#include <genarch/mm/page_pt.h> |
#include <mm/page.h> |
void page_arch_init(void) |
{ |
page_mapping_operations = &pt_mapping_operations; |
} |
/** Map device into kernel space |
* - on mips, all devices are already mapped into kernel space, |
* translate the physical address to uncached area |
*/ |
uintptr_t hw_map(uintptr_t physaddr, size_t size) |
{ |
return physaddr + 0xa0000000; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/mips32/src/drivers/arc.c |
---|
0,0 → 1,394 |
/* |
* Copyright (c) 2005 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup mips32 |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/drivers/arc.h> |
#include <arch/mm/page.h> |
#include <print.h> |
#include <arch.h> |
#include <arch/byteorder.h> |
#include <arch/mm/frame.h> |
#include <mm/frame.h> |
#include <interrupt.h> |
#include <align.h> |
#include <console/console.h> |
#include <console/kconsole.h> |
#include <console/cmd.h> |
#include <mm/slab.h> |
/* This is a good joke, SGI HAS different types than NT bioses... */ |
/* Here is the SGI type */ |
static char *basetypes[] = { |
"ExceptionBlock", |
"SystemParameterBlock", |
"FreeContiguous", |
"FreeMemory", |
"BadMemory", |
"LoadedProgram", |
"FirmwareTemporary", |
"FirmwarePermanent" |
}; |
static char *ctypes[] = { |
"ARC_type", |
"CPU_type", |
"FPU_type", |
"PrimaryICache", |
"PrimaryDCache", |
"SecondaryICache", |
"SecondaryDCache", |
"SecondaryCache", |
"Memory", |
"EISAAdapter", |
"TCAdapter", |
"SCSIAdapter", |
"DTIAdapter", |
"MultiFunctionAdapter", |
"DiskController", |
"TapeController", |
"CDROMController", |
"WORMController", |
"SerialController", |
"NetworkController", |
"DisplayController", |
"ParallelController", |
"PointerController", |
"KeyboardController", |
"AudioController", |
"OtherController", |
"DiskPeripheral", |
"FloppyDiskPeripheral", |
"TapePeripheral", |
"ModemPeripheral", |
"MonitorPeripheral", |
"PrinterPeripheral", |
"PointerPeripheral", |
"KeyboardPeripheral", |
"TerminalPeripheral", |
"OtherPeripheral", |
"LinePeripheral", |
"NetworkPeripheral" |
"OtherPeripheral", |
"XTalkAdapter", |
"PCIAdapter", |
"GIOAdapter", |
"TPUAdapter", |
"Anonymous" |
}; |
static arc_sbp *sbp = (arc_sbp *) PA2KA(0x1000); |
static arc_func_vector_t *arc_entry; |
/** Return true if ARC is available */ |
#define arc_enabled() (sbp != NULL) |
/** Print configuration data that ARC reports about component */ |
static void arc_print_confdata(arc_component *c) |
{ |
cm_resource_list *configdata; |
unsigned int i; |
if (!c->configdatasize) |
return; /* No configuration data */ |
configdata = malloc(c->configdatasize, 0); |
if (arc_entry->getconfigurationdata(configdata, c)) { |
free(configdata); |
return; |
} |
/* Does not seem to return meaningful data, don't use now */ |
free(configdata); |
return; |
for (i = 0; i < configdata->count; i++) { |
switch (configdata->descr[i].type) { |
case CmResourceTypePort: |
printf("Port: %p-size:%d ", |
(uintptr_t) configdata->descr[i].u.port.start, |
configdata->descr[i].u.port.length); |
break; |
case CmResourceTypeInterrupt: |
printf("Irq: level(%d) vector(%d) ", |
configdata->descr[i].u.interrupt.level, |
configdata->descr[i].u.interrupt.vector); |
break; |
case CmResourceTypeMemory: |
printf("Memory: %p-size:%d ", |
(uintptr_t)configdata->descr[i].u.port.start, |
configdata->descr[i].u.port.length); |
break; |
default: |
break; |
} |
} |
free(configdata); |
} |
/** Print information about component */ |
static void arc_print_component(arc_component *c) |
{ |
unsigned int i; |
printf("%s: ",ctypes[c->type]); |
for (i = 0; i < c->identifier_len; i++) |
printf("%c", c->identifier[i]); |
printf(" "); |
arc_print_confdata(c); |
printf("\n"); |
} |
/** |
* Read from ARC bios configuration data and print it |
*/ |
static int cmd_arc_print_devices(cmd_arg_t *argv) |
{ |
arc_component *c, *next; |
c = arc_entry->getchild(NULL); |
while (c) { |
arc_print_component(c); |
next = arc_entry->getchild(c); |
while (!next) { |
next = arc_entry->getpeer(c); |
if (!next) |
c = arc_entry->getparent(c); |
if (!c) |
return 0; |
} |
c = next; |
} |
return 1; |
} |
static cmd_info_t devlist_info = { |
.name = "arcdevlist", |
.description = "Print arc device list", |
.func = cmd_arc_print_devices, |
.argc = 0 |
}; |
/** Read from arc bios memory map and print it |
* |
*/ |
void physmem_print(void) |
{ |
printf("Base Size Type\n"); |
printf("---------- ---------- ---------\n"); |
if (arc_enabled()) { |
arc_memdescriptor_t *desc = arc_entry->getmemorydescriptor(NULL); |
while (desc) { |
printf("%#10x %#10x %s\n", |
desc->basepage * ARC_FRAME, desc->basecount * ARC_FRAME, |
basetypes[desc->type]); |
desc = arc_entry->getmemorydescriptor(desc); |
} |
} else |
printf("%#10x %#10x free\n", 0, CONFIG_MEMORY_SIZE); |
} |
/** Print charactor to console */ |
static void arc_putchar(char ch) |
{ |
uint32_t cnt; |
ipl_t ipl; |
/* TODO: Should be spinlock? */ |
ipl = interrupts_disable(); |
arc_entry->write(1, &ch, 1, &cnt); |
interrupts_restore(ipl); |
} |
/** Initialize ARC structure |
* |
* @return 0 - ARC OK, -1 - ARC does not exist |
*/ |
int arc_init(void) |
{ |
if (sbp->signature != ARC_MAGIC) { |
sbp = NULL; |
return -1; |
} |
arc_entry = sbp->firmwarevector; |
arc_putchar('A'); |
arc_putchar('R'); |
arc_putchar('C'); |
arc_putchar('\n'); |
/* Add command for resetting the computer */ |
cmd_initialize(&devlist_info); |
cmd_register(&devlist_info); |
return 0; |
} |
int arc_reboot(void) |
{ |
if (arc_enabled()) { |
arc_entry->reboot(); |
return true; |
} |
return false; |
} |
static bool kbd_polling_enabled; |
static chardev_t console; |
/** Try to get character, return character or -1 if not available */ |
static void arc_keyboard_poll(void) |
{ |
char ch; |
uint32_t count; |
long result; |
if (!kbd_polling_enabled) |
return; |
if (arc_entry->getreadstatus(0)) |
return; |
result = arc_entry->read(0, &ch, 1, &count); |
if ((result) || (count != 1)) { |
return; |
} |
if (ch == '\r') |
ch = '\n'; |
if (ch == 0x7f) |
ch = '\b'; |
chardev_push_character(&console, ch); |
} |
static char arc_read(chardev_t *dev) |
{ |
char ch; |
uint32_t count; |
long result; |
result = arc_entry->read(0, &ch, 1, &count); |
if ((result) || (count != 1)) { |
printf("Error reading from ARC keyboard.\n"); |
cpu_halt(); |
} |
if (ch == '\r') |
return '\n'; |
if (ch == 0x7f) |
return '\b'; |
return ch; |
} |
static void arc_write(chardev_t *dev, const char ch) |
{ |
arc_putchar(ch); |
} |
static void arc_enable(chardev_t *dev) |
{ |
kbd_polling_enabled = true; |
} |
static void arc_disable(chardev_t *dev) |
{ |
kbd_polling_enabled = false; |
} |
static chardev_operations_t arc_ops = { |
.resume = arc_enable, |
.suspend = arc_disable, |
.write = arc_write, |
.read = arc_read |
}; |
int arc_console(void) |
{ |
if (arc_enabled()) { |
kbd_polling_enabled = true; |
chardev_initialize("arc_console", &console, &arc_ops); |
virtual_timer_fnc = &arc_keyboard_poll; |
stdin = &console; |
stdout = &console; |
return true; |
} |
return false; |
} |
/* Initialize frame zones from ARC firmware. |
* In the future we may use even the FirmwareTemporary regions, |
* currently we use the FreeMemory (what about the LoadedProgram?) |
*/ |
int arc_frame_init(void) |
{ |
if (arc_enabled()) { |
arc_memdescriptor_t *desc; |
uintptr_t base; |
size_t basesize; |
desc = arc_entry->getmemorydescriptor(NULL); |
while (desc) { |
if ((desc->type == FreeMemory) || |
(desc->type == FreeContiguous)) { |
base = desc->basepage*ARC_FRAME; |
basesize = desc->basecount*ARC_FRAME; |
if (base % FRAME_SIZE ) { |
basesize -= FRAME_SIZE - (base % FRAME_SIZE); |
base = ALIGN_UP(base, FRAME_SIZE); |
} |
basesize = ALIGN_DOWN(basesize, FRAME_SIZE); |
zone_create(ADDR2PFN(base), SIZE2FRAMES(basesize), |
ADDR2PFN(base), 0); |
} |
desc = arc_entry->getmemorydescriptor(desc); |
} |
return true; |
} |
return false; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/mips32/src/drivers/serial.c |
---|
0,0 → 1,159 |
/* |
* Copyright (c) 2005 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup mips32 |
* @{ |
*/ |
/** @file |
*/ |
#include <interrupt.h> |
#include <arch/cp0.h> |
#include <ipc/irq.h> |
#include <arch/drivers/serial.h> |
#include <console/chardev.h> |
#include <console/console.h> |
#define SERIAL_IRQ 2 |
static irq_t serial_irq; |
static chardev_t console; |
static serial_t sconf[SERIAL_MAX]; |
static bool kb_enabled; |
static void serial_write(chardev_t *d, const char ch) |
{ |
serial_t *sd = (serial_t *)d->data; |
if (ch == '\n') |
serial_write(d, '\r'); |
/* Wait until transmit buffer empty */ |
while (! (SERIAL_READ_LSR(sd->port) & (1<<TRANSMIT_EMPTY_BIT))) |
; |
SERIAL_WRITE(sd->port, ch); |
} |
static void serial_enable(chardev_t *d) |
{ |
kb_enabled = true; |
} |
static void serial_disable(chardev_t *d) |
{ |
kb_enabled = false; |
} |
int serial_init(void) |
{ |
int i = 0; |
if (SERIAL_READ_LSR(SERIAL_COM1) == 0x60) { |
sconf[i].port = SERIAL_COM1; |
sconf[i].irq = SERIAL_COM1_IRQ; |
/* Enable interrupt on available data */ |
i++; |
} |
return i; |
} |
/** Read character from serial port, wait until available */ |
static char serial_do_read(chardev_t *dev) |
{ |
serial_t *sd = (serial_t *)dev->data; |
char ch; |
while (!(SERIAL_READ_LSR(sd->port) & 1)) |
; |
ch = SERIAL_READ(sd->port); |
if (ch =='\r') |
ch = '\n'; |
return ch; |
} |
static void serial_handler(void) |
{ |
serial_t *sd = (serial_t *) console.data; |
char ch; |
if (!(SERIAL_READ_LSR(sd->port) & 1)) |
return; |
ch = SERIAL_READ(sd->port); |
if (ch =='\r') |
ch = '\n'; |
chardev_push_character(&console, ch); |
} |
/** Process keyboard interrupt. Does not work in simics? */ |
static void serial_irq_handler(irq_t *irq, void *arg, ...) |
{ |
if ((irq->notif_cfg.notify) && (irq->notif_cfg.answerbox)) |
ipc_irq_send_notif(irq); |
else |
serial_handler(); |
} |
static irq_ownership_t serial_claim(void) |
{ |
return IRQ_ACCEPT; |
} |
static chardev_operations_t serial_ops = { |
.resume = serial_enable, |
.suspend = serial_disable, |
.write = serial_write, |
.read = serial_do_read |
}; |
void serial_console(devno_t devno) |
{ |
serial_t *sd = &sconf[0]; |
chardev_initialize("serial_console", &console, &serial_ops); |
console.data = sd; |
kb_enabled = true; |
irq_initialize(&serial_irq); |
serial_irq.devno = devno; |
serial_irq.inr = SERIAL_IRQ; |
serial_irq.claim = serial_claim; |
serial_irq.handler = serial_irq_handler; |
irq_register(&serial_irq); |
/* I don't know why, but the serial interrupts simply |
* don't work on simics |
*/ |
virtual_timer_fnc = &serial_handler; |
stdin = &console; |
stdout = &console; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/mips32/src/drivers/msim.c |
---|
0,0 → 1,164 |
/* |
* Copyright (c) 2005 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup mips32 |
* @{ |
*/ |
/** @file |
*/ |
#include <interrupt.h> |
#include <ipc/irq.h> |
#include <console/chardev.h> |
#include <arch/drivers/msim.h> |
#include <arch/cp0.h> |
#include <console/console.h> |
#include <sysinfo/sysinfo.h> |
/** Address of devices. */ |
#define MSIM_VIDEORAM 0xB0000000 |
#define MSIM_KBD_ADDRESS 0xB0000000 |
#define MSIM_KBD_IRQ 2 |
static chardev_t console; |
static irq_t msim_irq; |
static void msim_write(chardev_t *dev, const char ch); |
static void msim_enable(chardev_t *dev); |
static void msim_disable(chardev_t *dev); |
static char msim_do_read(chardev_t *dev); |
static chardev_operations_t msim_ops = { |
.resume = msim_enable, |
.suspend = msim_disable, |
.write = msim_write, |
.read = msim_do_read, |
}; |
/** Putchar that works with MSIM & gxemul */ |
void msim_write(chardev_t *dev, const char ch) |
{ |
*((char *) MSIM_VIDEORAM) = ch; |
} |
/* Called from getc(). */ |
void msim_enable(chardev_t *dev) |
{ |
cp0_unmask_int(MSIM_KBD_IRQ); |
} |
/* Called from getc(). */ |
void msim_disable(chardev_t *dev) |
{ |
cp0_mask_int(MSIM_KBD_IRQ); |
} |
#include <print.h> |
/** Read character using polling, assume interrupts disabled */ |
static char msim_do_read(chardev_t *dev) |
{ |
char ch; |
while (1) { |
ch = *((volatile char *) MSIM_KBD_ADDRESS); |
if (ch) { |
if (ch == '\r') |
return '\n'; |
if (ch == 0x7f) |
return '\b'; |
return ch; |
} |
} |
} |
/** Process keyboard interrupt. */ |
static void msim_irq_handler(irq_t *irq, void *arg, ...) |
{ |
if ((irq->notif_cfg.notify) && (irq->notif_cfg.answerbox)) |
ipc_irq_send_notif(irq); |
else { |
char ch = 0; |
ch = *((char *) MSIM_KBD_ADDRESS); |
if (ch =='\r') |
ch = '\n'; |
if (ch == 0x7f) |
ch = '\b'; |
chardev_push_character(&console, ch); |
} |
} |
static irq_ownership_t msim_claim(void) |
{ |
return IRQ_ACCEPT; |
} |
void msim_kbd_grab(void) |
{ |
ipl_t ipl = interrupts_disable(); |
spinlock_lock(&msim_irq.lock); |
msim_irq.notif_cfg.notify = false; |
spinlock_unlock(&msim_irq.lock); |
interrupts_restore(ipl); |
} |
void msim_kbd_release(void) |
{ |
ipl_t ipl = interrupts_disable(); |
spinlock_lock(&msim_irq.lock); |
if (msim_irq.notif_cfg.answerbox) |
msim_irq.notif_cfg.notify = true; |
spinlock_unlock(&msim_irq.lock); |
interrupts_restore(ipl); |
} |
/* Return console object representing msim console */ |
void msim_console(devno_t devno) |
{ |
chardev_initialize("msim_console", &console, &msim_ops); |
stdin = &console; |
stdout = &console; |
irq_initialize(&msim_irq); |
msim_irq.devno = devno; |
msim_irq.inr = MSIM_KBD_IRQ; |
msim_irq.claim = msim_claim; |
msim_irq.handler = msim_irq_handler; |
irq_register(&msim_irq); |
cp0_unmask_int(MSIM_KBD_IRQ); |
sysinfo_set_item_val("kbd", NULL, true); |
sysinfo_set_item_val("kbd.devno", NULL, devno); |
sysinfo_set_item_val("kbd.inr", NULL, MSIM_KBD_IRQ); |
sysinfo_set_item_val("kbd.address.virtual", NULL, MSIM_KBD_ADDRESS); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/mips32/src/console.c |
---|
0,0 → 1,68 |
/* |
* Copyright (c) 2005 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup mips32 |
* @{ |
*/ |
/** @file |
*/ |
#include <console/console.h> |
#include <arch/console.h> |
#include <arch/drivers/arc.h> |
#include <arch/drivers/serial.h> |
#include <arch/drivers/msim.h> |
void console_init(devno_t devno) |
{ |
if (!arc_console()) { |
if (serial_init()) |
serial_console(devno); |
else |
msim_console(devno); |
} |
} |
/** Acquire console back for kernel |
* |
*/ |
void arch_grab_console(void) |
{ |
msim_kbd_grab(); |
} |
/** Return console to userspace |
* |
*/ |
void arch_release_console(void) |
{ |
msim_kbd_release(); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/mips32/src/mips32.c |
---|
0,0 → 1,189 |
/* |
* Copyright (c) 2003-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup mips32 |
* @{ |
*/ |
/** @file |
*/ |
#include <arch.h> |
#include <arch/boot.h> |
#include <arch/cp0.h> |
#include <arch/exception.h> |
#include <mm/as.h> |
#include <userspace.h> |
#include <arch/console.h> |
#include <memstr.h> |
#include <proc/thread.h> |
#include <proc/uarg.h> |
#include <print.h> |
#include <syscall/syscall.h> |
#include <sysinfo/sysinfo.h> |
#include <arch/interrupt.h> |
#include <arch/drivers/arc.h> |
#include <console/chardev.h> |
#include <arch/debugger.h> |
#include <genarch/fb/fb.h> |
#include <genarch/fb/visuals.h> |
#include <macros.h> |
#include <ddi/device.h> |
#include <arch/asm/regname.h> |
/* Size of the code jumping to the exception handler code |
* - J+NOP |
*/ |
#define EXCEPTION_JUMP_SIZE 8 |
#define TLB_EXC ((char *) 0x80000000) |
#define NORM_EXC ((char *) 0x80000180) |
#define CACHE_EXC ((char *) 0x80000100) |
/* Why the linker moves the variable 64K away in assembler |
* when not in .text section ???????? |
*/ |
uintptr_t supervisor_sp __attribute__ ((section (".text"))); |
/* Stack pointer saved when entering user mode */ |
/* TODO: How do we do it on SMP system???? */ |
bootinfo_t bootinfo __attribute__ ((section (".text"))); |
void arch_pre_main(void) |
{ |
/* Setup usermode */ |
init.cnt = bootinfo.cnt; |
uint32_t i; |
for (i = 0; i < bootinfo.cnt; i++) { |
init.tasks[i].addr = bootinfo.tasks[i].addr; |
init.tasks[i].size = bootinfo.tasks[i].size; |
} |
} |
void arch_pre_mm_init(void) |
{ |
/* It is not assumed by default */ |
interrupts_disable(); |
/* Initialize dispatch table */ |
exception_init(); |
arc_init(); |
/* Copy the exception vectors to the right places */ |
memcpy(TLB_EXC, (char *) tlb_refill_entry, EXCEPTION_JUMP_SIZE); |
memcpy(NORM_EXC, (char *) exception_entry, EXCEPTION_JUMP_SIZE); |
memcpy(CACHE_EXC, (char *) cache_error_entry, EXCEPTION_JUMP_SIZE); |
/* |
* Switch to BEV normal level so that exception vectors point to the kernel. |
* Clear the error level. |
*/ |
cp0_status_write(cp0_status_read() & ~(cp0_status_bev_bootstrap_bit|cp0_status_erl_error_bit)); |
/* |
* Mask all interrupts |
*/ |
cp0_mask_all_int(); |
debugger_init(); |
} |
void arch_post_mm_init(void) |
{ |
interrupt_init(); |
console_init(device_assign_devno()); |
#ifdef CONFIG_FB |
fb_init(0x12000000, 640, 480, 1920, VISUAL_RGB_8_8_8); // gxemul framebuffer |
#endif |
sysinfo_set_item_val("machine." STRING(MACHINE), NULL, 1); |
} |
void arch_post_cpu_init(void) |
{ |
} |
void arch_pre_smp_init(void) |
{ |
} |
void arch_post_smp_init(void) |
{ |
} |
void userspace(uspace_arg_t *kernel_uarg) |
{ |
/* EXL = 1, UM = 1, IE = 1 */ |
cp0_status_write(cp0_status_read() | (cp0_status_exl_exception_bit | |
cp0_status_um_bit | cp0_status_ie_enabled_bit)); |
cp0_epc_write((uintptr_t) kernel_uarg->uspace_entry); |
userspace_asm(((uintptr_t) kernel_uarg->uspace_stack + PAGE_SIZE), |
(uintptr_t) kernel_uarg->uspace_uarg, |
(uintptr_t) kernel_uarg->uspace_entry); |
while (1); |
} |
/** Perform mips32 specific tasks needed before the new task is run. */ |
void before_task_runs_arch(void) |
{ |
} |
/** Perform mips32 specific tasks needed before the new thread is scheduled. */ |
void before_thread_runs_arch(void) |
{ |
supervisor_sp = (uintptr_t) &THREAD->kstack[THREAD_STACK_SIZE-SP_DELTA]; |
} |
void after_thread_ran_arch(void) |
{ |
} |
/** Set thread-local-storage pointer |
* |
* We have it currently in K1, it is |
* possible to have it separately in the future. |
*/ |
unative_t sys_tls_set(unative_t addr) |
{ |
return 0; |
} |
void arch_reboot(void) |
{ |
if (!arc_reboot()) |
___halt(); |
while (1); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/mips32/src/smp/order.c |
---|
0,0 → 1,45 |
/* |
* Copyright (c) 2007 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup mips32 |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/smp/order.h> |
#define MSIM_ORDER_ADDRESS 0xB0000004 |
void ipi_broadcast_arch(int ipi) |
{ |
*((volatile unsigned int *) MSIM_ORDER_ADDRESS) = 0x7FFFFFFF; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/mips32/src/interrupt.c |
---|
0,0 → 1,155 |
/* |
* Copyright (c) 2003-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup mips32interrupt |
* @{ |
*/ |
/** @file |
*/ |
#include <interrupt.h> |
#include <arch/interrupt.h> |
#include <arch/types.h> |
#include <arch.h> |
#include <arch/cp0.h> |
#include <time/clock.h> |
#include <arch/drivers/arc.h> |
#include <ipc/sysipc.h> |
#include <ddi/device.h> |
#define IRQ_COUNT 8 |
#define TIMER_IRQ 7 |
function virtual_timer_fnc = NULL; |
static irq_t timer_irq; |
/** Disable interrupts. |
* |
* @return Old interrupt priority level. |
*/ |
ipl_t interrupts_disable(void) |
{ |
ipl_t ipl = (ipl_t) cp0_status_read(); |
cp0_status_write(ipl & ~cp0_status_ie_enabled_bit); |
return ipl; |
} |
/** Enable interrupts. |
* |
* @return Old interrupt priority level. |
*/ |
ipl_t interrupts_enable(void) |
{ |
ipl_t ipl = (ipl_t) cp0_status_read(); |
cp0_status_write(ipl | cp0_status_ie_enabled_bit); |
return ipl; |
} |
/** Restore interrupt priority level. |
* |
* @param ipl Saved interrupt priority level. |
*/ |
void interrupts_restore(ipl_t ipl) |
{ |
cp0_status_write(cp0_status_read() | (ipl & cp0_status_ie_enabled_bit)); |
} |
/** Read interrupt priority level. |
* |
* @return Current interrupt priority level. |
*/ |
ipl_t interrupts_read(void) |
{ |
return cp0_status_read(); |
} |
/* TODO: This is SMP unsafe!!! */ |
uint32_t count_hi = 0; |
static unsigned long nextcount; |
static unsigned long lastcount; |
/** Start hardware clock */ |
static void timer_start(void) |
{ |
lastcount = cp0_count_read(); |
nextcount = cp0_compare_value + cp0_count_read(); |
cp0_compare_write(nextcount); |
} |
static irq_ownership_t timer_claim(void) |
{ |
return IRQ_ACCEPT; |
} |
static void timer_irq_handler(irq_t *irq, void *arg, ...) |
{ |
unsigned long drift; |
if (cp0_count_read() < lastcount) |
/* Count overflow detected */ |
count_hi++; |
lastcount = cp0_count_read(); |
drift = cp0_count_read() - nextcount; |
while (drift > cp0_compare_value) { |
drift -= cp0_compare_value; |
CPU->missed_clock_ticks++; |
} |
nextcount = cp0_count_read() + cp0_compare_value - drift; |
cp0_compare_write(nextcount); |
/* |
* We are holding a lock which prevents preemption. |
* Release the lock, call clock() and reacquire the lock again. |
*/ |
spinlock_unlock(&irq->lock); |
clock(); |
spinlock_lock(&irq->lock); |
if (virtual_timer_fnc != NULL) |
virtual_timer_fnc(); |
} |
/* Initialize basic tables for exception dispatching */ |
void interrupt_init(void) |
{ |
irq_init(IRQ_COUNT, IRQ_COUNT); |
irq_initialize(&timer_irq); |
timer_irq.devno = device_assign_devno(); |
timer_irq.inr = TIMER_IRQ; |
timer_irq.claim = timer_claim; |
timer_irq.handler = timer_irq_handler; |
irq_register(&timer_irq); |
timer_start(); |
cp0_unmask_int(TIMER_IRQ); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/mips32/src/start.S |
---|
0,0 → 1,353 |
# |
# Copyright (c) 2003-2004 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
#include <arch/asm/regname.h> |
#include <arch/mm/page.h> |
#include <arch/asm/boot.h> |
#include <arch/context_offset.h> |
#include <arch/stack.h> |
.text |
.set noat |
.set noreorder |
.set nomacro |
.global kernel_image_start |
.global tlb_refill_entry |
.global cache_error_entry |
.global exception_entry |
.global userspace_asm |
# Which status bits should are thread-local |
#define REG_SAVE_MASK 0x1f # KSU(UM), EXL, ERL, IE |
# Save registers to space defined by \r |
# We will change status: Disable ERL,EXL,UM,IE |
# These changes will be automatically reversed in REGISTER_LOAD |
# SP is NOT saved as part of these registers |
.macro REGISTERS_STORE_AND_EXC_RESET r |
sw $at, EOFFSET_AT(\r) |
sw $v0, EOFFSET_V0(\r) |
sw $v1, EOFFSET_V1(\r) |
sw $a0, EOFFSET_A0(\r) |
sw $a1, EOFFSET_A1(\r) |
sw $a2, EOFFSET_A2(\r) |
sw $a3, EOFFSET_A3(\r) |
sw $t0, EOFFSET_T0(\r) |
sw $t1, EOFFSET_T1(\r) |
sw $t2, EOFFSET_T2(\r) |
sw $t3, EOFFSET_T3(\r) |
sw $t4, EOFFSET_T4(\r) |
sw $t5, EOFFSET_T5(\r) |
sw $t6, EOFFSET_T6(\r) |
sw $t7, EOFFSET_T7(\r) |
sw $t8, EOFFSET_T8(\r) |
sw $t9, EOFFSET_T9(\r) |
mflo $at |
sw $at, EOFFSET_LO(\r) |
mfhi $at |
sw $at, EOFFSET_HI(\r) |
#ifdef CONFIG_DEBUG_ALLREGS |
sw $s0, EOFFSET_S0(\r) |
sw $s1, EOFFSET_S1(\r) |
sw $s2, EOFFSET_S2(\r) |
sw $s3, EOFFSET_S3(\r) |
sw $s4, EOFFSET_S4(\r) |
sw $s5, EOFFSET_S5(\r) |
sw $s6, EOFFSET_S6(\r) |
sw $s7, EOFFSET_S7(\r) |
sw $s8, EOFFSET_S8(\r) |
#endif |
sw $gp, EOFFSET_GP(\r) |
sw $ra, EOFFSET_RA(\r) |
sw $k1, EOFFSET_K1(\r) |
mfc0 $t0, $status |
mfc0 $t1, $epc |
and $t2, $t0, REG_SAVE_MASK # Save only KSU,EXL,ERL,IE |
li $t3, ~(0x1f) |
and $t0, $t0, $t3 # Clear KSU,EXL,ERL,IE |
sw $t2,EOFFSET_STATUS(\r) |
sw $t1,EOFFSET_EPC(\r) |
mtc0 $t0, $status |
.endm |
.macro REGISTERS_LOAD r |
# Update only UM,EXR,IE from status, the rest |
# is controlled by OS and not bound to task |
mfc0 $t0, $status |
lw $t1,EOFFSET_STATUS(\r) |
li $t2, ~REG_SAVE_MASK # Mask UM,EXL,ERL,IE |
and $t0, $t0, $t2 |
or $t0, $t0, $t1 # Copy UM,EXL, ERL, IE from saved status |
mtc0 $t0, $status |
lw $v0, EOFFSET_V0(\r) |
lw $v1, EOFFSET_V1(\r) |
lw $a0, EOFFSET_A0(\r) |
lw $a1, EOFFSET_A1(\r) |
lw $a2, EOFFSET_A2(\r) |
lw $a3, EOFFSET_A3(\r) |
lw $t0, EOFFSET_T0(\r) |
lw $t1, EOFFSET_T1(\r) |
lw $t2, EOFFSET_T2(\r) |
lw $t3, EOFFSET_T3(\r) |
lw $t4, EOFFSET_T4(\r) |
lw $t5, EOFFSET_T5(\r) |
lw $t6, EOFFSET_T6(\r) |
lw $t7, EOFFSET_T7(\r) |
lw $t8, EOFFSET_T8(\r) |
lw $t9, EOFFSET_T9(\r) |
#ifdef CONFIG_DEBUG_ALLREGS |
lw $s0, EOFFSET_S0(\r) |
lw $s1, EOFFSET_S1(\r) |
lw $s2, EOFFSET_S2(\r) |
lw $s3, EOFFSET_S3(\r) |
lw $s4, EOFFSET_S4(\r) |
lw $s5, EOFFSET_S5(\r) |
lw $s6, EOFFSET_S6(\r) |
lw $s7, EOFFSET_S7(\r) |
lw $s8, EOFFSET_S8(\r) |
#endif |
lw $gp, EOFFSET_GP(\r) |
lw $ra, EOFFSET_RA(\r) |
lw $k1, EOFFSET_K1(\r) |
lw $at, EOFFSET_LO(\r) |
mtlo $at |
lw $at, EOFFSET_HI(\r) |
mthi $at |
lw $at, EOFFSET_EPC(\r) |
mtc0 $at, $epc |
lw $at, EOFFSET_AT(\r) |
lw $sp, EOFFSET_SP(\r) |
.endm |
# Move kernel stack pointer address to register K0 |
# - if we are in user mode, load the appropriate stack |
# address |
.macro KERNEL_STACK_TO_K0 |
# If we are in user mode |
mfc0 $k0, $status |
andi $k0, 0x10 |
beq $k0, $0, 1f |
add $k0, $sp, 0 |
# Move $k0 pointer to kernel stack |
lui $k0, %hi(supervisor_sp) |
ori $k0, $k0, %lo(supervisor_sp) |
# Move $k0 (superveisor_sp) |
lw $k0, 0($k0) |
1: |
.endm |
.org 0x0 |
kernel_image_start: |
/* Load temporary stack */ |
lui $sp, %hi(end_stack) |
ori $sp, $sp, %lo(end_stack) |
/* $a1 contains physical address of bootinfo_t */ |
/* $a2 contains size of bootinfo_t */ |
beq $a2, $0, bootinfo_end |
/* Not sure about this, but might be needed for PIC code???? */ |
lui $gp, 0x8000 |
lui $a3, %hi(bootinfo) |
ori $a3, $a3, %lo(bootinfo) |
bootinfo_loop: |
lw $v0, 0($a1) |
sw $v0, 0($a3) |
addi $a1, $a1, 4 |
addi $a3, $a3, 4 |
addi $a2, $a2, -4 |
bgtz $a2, bootinfo_loop |
nop |
bootinfo_end: |
jal arch_pre_main |
nop |
j main_bsp |
nop |
.space TEMP_STACK_SIZE |
end_stack: |
tlb_refill_entry: |
j tlb_refill_handler |
nop |
cache_error_entry: |
j cache_error_handler |
nop |
exception_entry: |
j exception_handler |
nop |
exception_handler: |
KERNEL_STACK_TO_K0 |
sub $k0, REGISTER_SPACE |
sw $sp, EOFFSET_SP($k0) |
move $sp, $k0 |
mfc0 $k0, $cause |
sra $k0, $k0, 0x2 # cp0_exc_cause() part 1 |
andi $k0, $k0, 0x1f # cp0_exc_cause() part 2 |
sub $k0, 8 # 8 = SYSCALL |
beqz $k0, syscall_shortcut |
add $k0, 8 # Revert $k0 back to correct exc number |
REGISTERS_STORE_AND_EXC_RESET $sp |
move $a1, $sp |
jal exc_dispatch # exc_dispatch(excno, register_space) |
move $a0, $k0 |
REGISTERS_LOAD $sp |
# The $sp is automatically restored to former value |
eret |
## Syscall entry |
# |
# Registers: |
# |
# @param v0 Syscall number. |
# @param a0 1st argument. |
# @param a1 2nd argument. |
# @param a2 3rd argument. |
# @param a3 4th argument. |
# @param t0 5th argument. |
# @param t1 6th argument. |
# |
# @return The return value will be stored in v0. |
# |
#define SS_SP EOFFSET_SP |
#define SS_STATUS EOFFSET_STATUS |
#define SS_EPC EOFFSET_EPC |
#define SS_K1 EOFFSET_K1 |
syscall_shortcut: |
# We have a lot of space on the stack, with free use |
mfc0 $t3, $epc |
mfc0 $t2, $status |
sw $t3, SS_EPC($sp) # Save EPC |
sw $k1, SS_K1($sp) # Save k1 not saved on context switch |
and $t4, $t2, REG_SAVE_MASK # Save only KSU, EXL, ERL, IE |
li $t5, ~(0x1f) |
and $t2, $t2, $t5 # Clear KSU, EXL, ERL |
ori $t2, $t2, 0x1 # Set IE |
sw $t4, SS_STATUS($sp) |
mtc0 $t2, $status |
# |
# Call the higher level system call handler |
# We are going to reuse part of the unused exception stack frame |
# |
sw $t0, STACK_ARG4($sp) # save the 5th argument on the stack |
sw $t1, STACK_ARG5($sp) # save the 6th argument on the stack |
jal syscall_handler |
sw $v0, STACK_ARG6($sp) # save the syscall number on the stack |
# restore status |
mfc0 $t2, $status |
lw $t3, SS_STATUS($sp) |
# Change back to EXL = 1 (from last exception), otherwise |
# an interrupt could rewrite the CP0 - EPC |
li $t4, ~REG_SAVE_MASK # Mask UM, EXL, ERL, IE |
and $t2, $t2, $t4 |
or $t2, $t2, $t3 # Copy saved UM, EXL, ERL, IE |
mtc0 $t2, $status |
# restore epc + 4 |
lw $t2, SS_EPC($sp) |
lw $k1, SS_K1($sp) |
addi $t2, $t2, 4 |
mtc0 $t2, $epc |
lw $sp, SS_SP($sp) # restore sp |
eret |
tlb_refill_handler: |
KERNEL_STACK_TO_K0 |
sub $k0, REGISTER_SPACE |
REGISTERS_STORE_AND_EXC_RESET $k0 |
sw $sp,EOFFSET_SP($k0) |
add $sp, $k0, 0 |
jal tlb_refill |
add $a0, $sp, 0 |
REGISTERS_LOAD $sp |
eret |
cache_error_handler: |
KERNEL_STACK_TO_K0 |
sub $k0, REGISTER_SPACE |
REGISTERS_STORE_AND_EXC_RESET $k0 |
sw $sp,EOFFSET_SP($k0) |
add $sp, $k0, 0 |
jal cache_error |
add $a0, $sp, 0 |
REGISTERS_LOAD $sp |
eret |
userspace_asm: |
add $sp, $a0, 0 |
add $v0, $a1, 0 |
add $t9, $a2, 0 # Set up correct entry into PIC code |
eret |
/tags/0.3.0/kernel/arch/mips32/src/exception.c |
---|
0,0 → 1,198 |
/* |
* Copyright (c) 2003-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup mips32 |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/exception.h> |
#include <arch/interrupt.h> |
#include <arch/mm/tlb.h> |
#include <panic.h> |
#include <arch/cp0.h> |
#include <arch/types.h> |
#include <arch.h> |
#include <debug.h> |
#include <proc/thread.h> |
#include <symtab.h> |
#include <print.h> |
#include <interrupt.h> |
#include <func.h> |
#include <console/kconsole.h> |
#include <ddi/irq.h> |
#include <arch/debugger.h> |
static char * exctable[] = { |
"Interrupt", |
"TLB Modified", |
"TLB Invalid", |
"TLB Invalid Store", |
"Address Error - load/instr. fetch", |
"Address Error - store", |
"Bus Error - fetch instruction", |
"Bus Error - data reference", |
"Syscall", |
"BreakPoint", |
"Reserved Instruction", |
"Coprocessor Unusable", |
"Arithmetic Overflow", |
"Trap", |
"Virtual Coherency - instruction", |
"Floating Point", |
NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
"WatchHi/WatchLo", /* 23 */ |
NULL, NULL, NULL, NULL, NULL, NULL, NULL, |
"Virtual Coherency - data", |
}; |
static void print_regdump(istate_t *istate) |
{ |
char *pcsymbol = ""; |
char *rasymbol = ""; |
char *s = get_symtab_entry(istate->epc); |
if (s) |
pcsymbol = s; |
s = get_symtab_entry(istate->ra); |
if (s) |
rasymbol = s; |
printf("PC: %#x(%s) RA: %#x(%s), SP(%p)\n", istate->epc, pcsymbol, istate->ra, rasymbol, istate->sp); |
} |
static void unhandled_exception(int n, istate_t *istate) |
{ |
fault_if_from_uspace(istate, "unhandled exception %s", exctable[n]); |
print_regdump(istate); |
panic("unhandled exception %s\n", exctable[n]); |
} |
static void reserved_instr_exception(int n, istate_t *istate) |
{ |
if (*((uint32_t *)istate->epc) == 0x7c03e83b) { |
ASSERT(THREAD); |
istate->epc += 4; |
istate->v1 = istate->k1; |
} else |
unhandled_exception(n, istate); |
} |
static void breakpoint_exception(int n, istate_t *istate) |
{ |
#ifdef CONFIG_DEBUG |
debugger_bpoint(istate); |
#else |
/* it is necessary to not re-execute BREAK instruction after |
returning from Exception handler |
(see page 138 in R4000 Manual for more information) */ |
istate->epc += 4; |
#endif |
} |
static void tlbmod_exception(int n, istate_t *istate) |
{ |
tlb_modified(istate); |
} |
static void tlbinv_exception(int n, istate_t *istate) |
{ |
tlb_invalid(istate); |
} |
#ifdef CONFIG_FPU_LAZY |
static void cpuns_exception(int n, istate_t *istate) |
{ |
if (cp0_cause_coperr(cp0_cause_read()) == fpu_cop_id) |
scheduler_fpu_lazy_request(); |
else { |
fault_if_from_uspace(istate, "unhandled Coprocessor Unusable Exception"); |
panic("unhandled Coprocessor Unusable Exception\n"); |
} |
} |
#endif |
static void interrupt_exception(int n, istate_t *istate) |
{ |
uint32_t cause; |
int i; |
/* decode interrupt number and process the interrupt */ |
cause = (cp0_cause_read() >> 8) &0xff; |
for (i = 0; i < 8; i++) { |
if (cause & (1 << i)) { |
irq_t *irq = irq_dispatch_and_lock(i); |
if (irq) { |
/* |
* The IRQ handler was found. |
*/ |
irq->handler(irq, irq->arg); |
spinlock_unlock(&irq->lock); |
} else { |
/* |
* Spurious interrupt. |
*/ |
#ifdef CONFIG_DEBUG |
printf("cpu%d: spurious interrupt (inum=%d)\n", CPU->id, i); |
#endif |
} |
} |
} |
} |
/** Handle syscall userspace call */ |
static void syscall_exception(int n, istate_t *istate) |
{ |
panic("Syscall is handled through shortcut"); |
} |
void exception_init(void) |
{ |
int i; |
/* Clear exception table */ |
for (i = 0; i < IVT_ITEMS; i++) |
exc_register(i, "undef", (iroutine) unhandled_exception); |
exc_register(EXC_Bp, "bkpoint", (iroutine) breakpoint_exception); |
exc_register(EXC_RI, "resinstr", (iroutine) reserved_instr_exception); |
exc_register(EXC_Mod, "tlb_mod", (iroutine) tlbmod_exception); |
exc_register(EXC_TLBL, "tlbinvl", (iroutine) tlbinv_exception); |
exc_register(EXC_TLBS, "tlbinvl", (iroutine) tlbinv_exception); |
exc_register(EXC_Int, "interrupt", (iroutine) interrupt_exception); |
#ifdef CONFIG_FPU_LAZY |
exc_register(EXC_CpU, "cpunus", (iroutine) cpuns_exception); |
#endif |
exc_register(EXC_Sys, "syscall", (iroutine) syscall_exception); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/mips32/src/cache.c |
---|
0,0 → 1,45 |
/* |
* Copyright (c) 2003-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup mips32 |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/cache.h> |
#include <arch/exception.h> |
#include <panic.h> |
void cache_error(istate_t *istate) |
{ |
panic("cache_error exception (epc=%p)\n", istate->epc); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/mips32/src/ddi/ddi.c |
---|
0,0 → 1,58 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup mips32ddi |
* @{ |
*/ |
/** @file |
*/ |
#include <ddi/ddi.h> |
#include <proc/task.h> |
#include <arch/types.h> |
#include <security/cap.h> |
#include <arch.h> |
#include <arch/cp0.h> |
/** Enable I/O space range for task. |
* |
* Interrupts are disabled and task is locked. |
* |
* @param task Task. |
* @param ioaddr Startign I/O space address. |
* @param size Size of the enabled I/O range. |
* |
* @return 0 on success or an error code from errno.h. |
*/ |
int ddi_iospace_enable_arch(task_t *task, uintptr_t ioaddr, size_t size) |
{ |
return 0; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/mips32/src/fpu_context.c |
---|
0,0 → 1,61 |
/* |
* Copyright (c) 2005 Jakub Vana |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup mips32 |
* @{ |
*/ |
/** @file |
* |
*/ |
#include <fpu_context.h> |
#include <arch.h> |
#include <arch/cp0.h> |
#include <proc/thread.h> |
void fpu_disable(void) |
{ |
#ifdef ARCH_HAS_FPU |
cp0_status_write(cp0_status_read() & ~cp0_status_fpu_bit); |
#endif |
} |
void fpu_enable(void) |
{ |
#ifdef ARCH_HAS_FPU |
cp0_status_write(cp0_status_read() | cp0_status_fpu_bit); |
#endif |
} |
void fpu_init() |
{ |
/* TODO: Zero all registers */ |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/mips32/src/asm.S |
---|
0,0 → 1,299 |
# |
# Copyright (c) 2003-2004 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
#include <arch/asm/regname.h> |
.text |
.macro cp0_read reg |
mfc0 $2,\reg |
j $31 |
nop |
.endm |
.macro cp0_write reg |
mtc0 $4,\reg |
j $31 |
nop |
.endm |
.set noat |
.set noreorder |
.set nomacro |
.global cpu_halt |
cpu_halt: |
j cpu_halt |
nop |
.global memsetb |
memsetb: |
j _memsetb |
nop |
.global memcpy |
.global memcpy_from_uspace |
.global memcpy_to_uspace |
.global memcpy_from_uspace_failover_address |
.global memcpy_to_uspace_failover_address |
memcpy: |
memcpy_from_uspace: |
memcpy_to_uspace: |
addiu $v0,$a1,3 |
li $v1,-4 # 0xfffffffffffffffc |
and $v0,$v0,$v1 |
beq $a1,$v0,3f |
move $t0,$a0 |
0: |
beq $a2,$zero,2f |
move $a3,$zero |
1: |
addu $v0,$a1,$a3 |
lbu $a0,0($v0) |
addu $v1,$t0,$a3 |
addiu $a3,$a3,1 |
bne $a3,$a2,1b |
sb $a0,0($v1) |
2: |
jr $ra |
move $v0,$a1 |
3: |
addiu $v0,$a0,3 |
and $v0,$v0,$v1 |
bne $a0,$v0,0b |
srl $t1,$a2,2 |
beq $t1,$zero,5f |
move $a3,$zero |
move $a3,$zero |
move $a0,$zero |
4: |
addu $v0,$a1,$a0 |
lw $v1,0($v0) |
addiu $a3,$a3,1 |
addu $v0,$t0,$a0 |
sw $v1,0($v0) |
bne $a3,$t1,4b |
addiu $a0,$a0,4 |
5: |
andi $a2,$a2,0x3 |
beq $a2,$zero,2b |
nop |
sll $v0,$a3,2 |
addu $t1,$v0,$t0 |
move $a3,$zero |
addu $t0,$v0,$a1 |
6: |
addu $v0,$t0,$a3 |
lbu $a0,0($v0) |
addu $v1,$t1,$a3 |
addiu $a3,$a3,1 |
bne $a3,$a2,6b |
sb $a0,0($v1) |
jr $ra |
move $v0,$a1 |
memcpy_from_uspace_failover_address: |
memcpy_to_uspace_failover_address: |
jr $ra |
move $v0, $zero |
.macro fpu_gp_save reg ctx |
mfc1 $t0,$\reg |
sw $t0, \reg*4(\ctx) |
.endm |
.macro fpu_gp_restore reg ctx |
lw $t0, \reg*4(\ctx) |
mtc1 $t0,$\reg |
.endm |
.macro fpu_ct_save reg ctx |
cfc1 $t0,$1 |
sw $t0, (\reg+32)*4(\ctx) |
.endm |
.macro fpu_ct_restore reg ctx |
lw $t0, (\reg+32)*4(\ctx) |
ctc1 $t0,$\reg |
.endm |
.global fpu_context_save |
fpu_context_save: |
#ifdef ARCH_HAS_FPU |
fpu_gp_save 0,$a0 |
fpu_gp_save 1,$a0 |
fpu_gp_save 2,$a0 |
fpu_gp_save 3,$a0 |
fpu_gp_save 4,$a0 |
fpu_gp_save 5,$a0 |
fpu_gp_save 6,$a0 |
fpu_gp_save 7,$a0 |
fpu_gp_save 8,$a0 |
fpu_gp_save 9,$a0 |
fpu_gp_save 10,$a0 |
fpu_gp_save 11,$a0 |
fpu_gp_save 12,$a0 |
fpu_gp_save 13,$a0 |
fpu_gp_save 14,$a0 |
fpu_gp_save 15,$a0 |
fpu_gp_save 16,$a0 |
fpu_gp_save 17,$a0 |
fpu_gp_save 18,$a0 |
fpu_gp_save 19,$a0 |
fpu_gp_save 20,$a0 |
fpu_gp_save 21,$a0 |
fpu_gp_save 22,$a0 |
fpu_gp_save 23,$a0 |
fpu_gp_save 24,$a0 |
fpu_gp_save 25,$a0 |
fpu_gp_save 26,$a0 |
fpu_gp_save 27,$a0 |
fpu_gp_save 28,$a0 |
fpu_gp_save 29,$a0 |
fpu_gp_save 30,$a0 |
fpu_gp_save 31,$a0 |
fpu_ct_save 1,$a0 |
fpu_ct_save 2,$a0 |
fpu_ct_save 3,$a0 |
fpu_ct_save 4,$a0 |
fpu_ct_save 5,$a0 |
fpu_ct_save 6,$a0 |
fpu_ct_save 7,$a0 |
fpu_ct_save 8,$a0 |
fpu_ct_save 9,$a0 |
fpu_ct_save 10,$a0 |
fpu_ct_save 11,$a0 |
fpu_ct_save 12,$a0 |
fpu_ct_save 13,$a0 |
fpu_ct_save 14,$a0 |
fpu_ct_save 15,$a0 |
fpu_ct_save 16,$a0 |
fpu_ct_save 17,$a0 |
fpu_ct_save 18,$a0 |
fpu_ct_save 19,$a0 |
fpu_ct_save 20,$a0 |
fpu_ct_save 21,$a0 |
fpu_ct_save 22,$a0 |
fpu_ct_save 23,$a0 |
fpu_ct_save 24,$a0 |
fpu_ct_save 25,$a0 |
fpu_ct_save 26,$a0 |
fpu_ct_save 27,$a0 |
fpu_ct_save 28,$a0 |
fpu_ct_save 29,$a0 |
fpu_ct_save 30,$a0 |
fpu_ct_save 31,$a0 |
#endif |
j $ra |
nop |
.global fpu_context_restore |
fpu_context_restore: |
#ifdef ARCH_HAS_FPU |
fpu_gp_restore 0,$a0 |
fpu_gp_restore 1,$a0 |
fpu_gp_restore 2,$a0 |
fpu_gp_restore 3,$a0 |
fpu_gp_restore 4,$a0 |
fpu_gp_restore 5,$a0 |
fpu_gp_restore 6,$a0 |
fpu_gp_restore 7,$a0 |
fpu_gp_restore 8,$a0 |
fpu_gp_restore 9,$a0 |
fpu_gp_restore 10,$a0 |
fpu_gp_restore 11,$a0 |
fpu_gp_restore 12,$a0 |
fpu_gp_restore 13,$a0 |
fpu_gp_restore 14,$a0 |
fpu_gp_restore 15,$a0 |
fpu_gp_restore 16,$a0 |
fpu_gp_restore 17,$a0 |
fpu_gp_restore 18,$a0 |
fpu_gp_restore 19,$a0 |
fpu_gp_restore 20,$a0 |
fpu_gp_restore 21,$a0 |
fpu_gp_restore 22,$a0 |
fpu_gp_restore 23,$a0 |
fpu_gp_restore 24,$a0 |
fpu_gp_restore 25,$a0 |
fpu_gp_restore 26,$a0 |
fpu_gp_restore 27,$a0 |
fpu_gp_restore 28,$a0 |
fpu_gp_restore 29,$a0 |
fpu_gp_restore 30,$a0 |
fpu_gp_restore 31,$a0 |
fpu_ct_restore 1,$a0 |
fpu_ct_restore 2,$a0 |
fpu_ct_restore 3,$a0 |
fpu_ct_restore 4,$a0 |
fpu_ct_restore 5,$a0 |
fpu_ct_restore 6,$a0 |
fpu_ct_restore 7,$a0 |
fpu_ct_restore 8,$a0 |
fpu_ct_restore 9,$a0 |
fpu_ct_restore 10,$a0 |
fpu_ct_restore 11,$a0 |
fpu_ct_restore 12,$a0 |
fpu_ct_restore 13,$a0 |
fpu_ct_restore 14,$a0 |
fpu_ct_restore 15,$a0 |
fpu_ct_restore 16,$a0 |
fpu_ct_restore 17,$a0 |
fpu_ct_restore 18,$a0 |
fpu_ct_restore 19,$a0 |
fpu_ct_restore 20,$a0 |
fpu_ct_restore 21,$a0 |
fpu_ct_restore 22,$a0 |
fpu_ct_restore 23,$a0 |
fpu_ct_restore 24,$a0 |
fpu_ct_restore 25,$a0 |
fpu_ct_restore 26,$a0 |
fpu_ct_restore 27,$a0 |
fpu_ct_restore 28,$a0 |
fpu_ct_restore 29,$a0 |
fpu_ct_restore 30,$a0 |
fpu_ct_restore 31,$a0 |
#endif |
j $ra |
nop |
/tags/0.3.0/kernel/arch/mips32/src/panic.S |
---|
0,0 → 1,48 |
# |
# Copyright (c) 2003-2004 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
.text |
.set noat |
.set noreorder |
.set nomacro |
#include <arch/asm/regname.h> |
.global panic_printf |
/* From printf return directly to halt() */ |
panic_printf: |
jal printf |
nop |
j halt |
nop |
/* This code does not work, god knows why */ |
/* lui $ra, %hi(halt) |
j printf |
ori $ra, %lo(halt) */ |
/tags/0.3.0/kernel/arch/mips32/src/dummy.S |
---|
0,0 → 1,41 |
# |
# Copyright (c) 2003-2004 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
.text |
.set noat |
.global calibrate_delay_loop |
.global asm_delay_loop |
.global dummy |
calibrate_delay_loop: |
asm_delay_loop: |
dummy: |
j $31 |
nop |
/tags/0.3.0/kernel/arch/mips32/Makefile.inc |
---|
0,0 → 1,129 |
# |
# Copyright (c) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
## Toolchain configuration |
# |
BFD_ARCH = mips |
TARGET = mipsel-linux-gnu |
TOOLCHAIN_DIR = /usr/local/mipsel |
KERNEL_LOAD_ADDRESS = 0x80100000 |
INIT_ADDRESS = 0x81000000 |
INIT_SIZE = 262144 |
GCC_CFLAGS += -mno-abicalls -G 0 -fno-zero-initialized-in-bss |
DEFS += -D__32_BITS__ -DMACHINE=$(MACHINE) -DKERNEL_LOAD_ADDRESS=${KERNEL_LOAD_ADDRESS} -DINIT_ADDRESS=${INIT_ADDRESS} -DINIT_SIZE=${INIT_SIZE} |
## Compile with hierarchical page tables support. |
# |
CONFIG_PAGE_PT = y |
DEFS += -DCONFIG_PAGE_PT |
## Compile with support for address space identifiers. |
# |
CONFIG_ASID = y |
CONFIG_ASID_FIFO = y |
## Accepted MACHINEs |
# |
ifeq ($(MACHINE),indy) |
# GCC 4.0.1 compiled for mipsEL has problems compiling in |
# BigEndian mode with the swl/swr/lwl/lwr instructions. |
# We have to compile it with mips-sgi-irix5 to get it right. |
BFD_NAME = elf32-bigmips |
BFD = ecoff-bigmips --impure |
TARGET = mips-sgi-irix5 |
TOOLCHAIN_DIR = /usr/local/mips/bin |
KERNEL_LOAD_ADDRESS = 0x88002000 |
GCC_CFLAGS += -EB -DBIG_ENDIAN -DARCH_HAS_FPU -march=r4600 |
INIT_ADDRESS = 0 |
INIT_SIZE = 0 |
endif |
ifeq ($(MACHINE),lgxemul) |
BFD_NAME = elf32-tradlittlemips |
BFD = binary |
GCC_CFLAGS += -DFB_INVERT_ENDIAN -DARCH_HAS_FPU -mips3 |
endif |
ifeq ($(MACHINE),bgxemul) |
BFD_NAME = elf32-bigmips |
BFD = ecoff-bigmips |
TARGET = mips-sgi-irix5 |
TOOLCHAIN_DIR = /usr/local/mips/bin |
GCC_CFLAGS += -EB -DBIG_ENDIAN -DARCH_HAS_FPU -mips3 |
INIT_ADDRESS = 0x81800000 |
endif |
ifeq ($(MACHINE),simics) |
# SIMICS 4kc emulation is broken, although for instructions |
# that do not bother us |
BFD_NAME = elf32-tradlittlemips |
BFD = elf32-tradlittlemips |
GCC_CFLAGS += -mhard-float -mips3 -DTLBCNT=16 |
TLBCNT = 16 |
endif |
ifeq ($(MACHINE),msim) |
BFD_NAME = elf32-tradlittlemips |
BFD = binary |
GCC_CFLAGS += -mhard-float -mips3 |
endif |
## Compile with support for software integer division. |
# |
CONFIG_SOFTINT = y |
ARCH_SOURCES = \ |
arch/$(ARCH)/src/start.S \ |
arch/$(ARCH)/src/context.S \ |
arch/$(ARCH)/src/panic.S \ |
arch/$(ARCH)/src/mips32.c \ |
arch/$(ARCH)/src/dummy.S \ |
arch/$(ARCH)/src/console.c \ |
arch/$(ARCH)/src/asm.S \ |
arch/$(ARCH)/src/exception.c \ |
arch/$(ARCH)/src/interrupt.c \ |
arch/$(ARCH)/src/cache.c \ |
arch/$(ARCH)/src/debugger.c \ |
arch/$(ARCH)/src/cpu/cpu.c \ |
arch/$(ARCH)/src/mm/frame.c \ |
arch/$(ARCH)/src/mm/page.c \ |
arch/$(ARCH)/src/mm/tlb.c \ |
arch/$(ARCH)/src/mm/as.c \ |
arch/$(ARCH)/src/fpu_context.c \ |
arch/$(ARCH)/src/ddi/ddi.c \ |
arch/$(ARCH)/src/drivers/arc.c \ |
arch/$(ARCH)/src/drivers/msim.c \ |
arch/$(ARCH)/src/drivers/serial.c \ |
arch/$(ARCH)/src/smp/order.c |
/tags/0.3.0/kernel/arch/mips32/_link.ld.in |
---|
0,0 → 1,53 |
/* |
* MIPS32 linker script |
* |
* kernel text |
* kernel data |
* |
*/ |
#undef mips |
#define mips mips |
OUTPUT_ARCH(mips) |
ENTRY(kernel_image_start) |
SECTIONS { |
. = KERNEL_LOAD_ADDRESS; |
.text : { |
ktext_start = .; |
*(.text); |
ktext_end = .; |
} |
.data : { |
kdata_start = .; |
*(.data); /* initialized data */ |
hardcoded_ktext_size = .; |
LONG(ktext_end - ktext_start); |
hardcoded_kdata_size = .; |
LONG(kdata_end - kdata_start); |
hardcoded_load_address = .; |
LONG(KERNEL_LOAD_ADDRESS); |
*(.rodata*); |
*(.sdata); |
*(.reginfo); |
*(.sbss); |
*(.scommon); |
*(.bss); /* uninitialized static variables */ |
*(COMMON); /* global variables */ |
symbol_table = .; |
*(symtab.*); |
} |
_gp = . + 0x8000; |
.lit8 : { *(.lit8) } |
.lit4 : { *(.lit4) } |
kdata_end = .; |
/DISCARD/ : { |
*(.mdebug*); |
*(.pdr); |
*(.comment); |
*(.note); |
} |
} |
/tags/0.3.0/kernel/arch/amd64/include/context_offset.h |
---|
0,0 → 1,79 |
/* |
* Copyright (c) 2005 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#ifndef KERN_amd64_CONTEXT_OFFSET_H_ |
#define KERN_amd64_CONTEXT_OFFSET_H_ |
#define OFFSET_SP 0x0 |
#define OFFSET_PC 0x8 |
#define OFFSET_RBX 0x10 |
#define OFFSET_RBP 0x18 |
#define OFFSET_R12 0x20 |
#define OFFSET_R13 0x28 |
#define OFFSET_R14 0x30 |
#define OFFSET_R15 0x38 |
#ifdef KERNEL |
# define OFFSET_IPL 0x40 |
#else |
# define OFFSET_TLS 0x40 |
#endif |
#ifdef __ASM__ |
# ctx: address of the structure with saved context |
# pc: return address |
.macro CONTEXT_SAVE_ARCH_CORE ctx:req pc:req |
movq \pc, OFFSET_PC(\ctx) |
movq %rsp, OFFSET_SP(\ctx) |
movq %rbx, OFFSET_RBX(\ctx) |
movq %rbp, OFFSET_RBP(\ctx) |
movq %r12, OFFSET_R12(\ctx) |
movq %r13, OFFSET_R13(\ctx) |
movq %r14, OFFSET_R14(\ctx) |
movq %r15, OFFSET_R15(\ctx) |
.endm |
# ctx: address of the structure with saved context |
.macro CONTEXT_RESTORE_ARCH_CORE ctx:req pc:req |
movq OFFSET_R15(\ctx), %r15 |
movq OFFSET_R14(\ctx), %r14 |
movq OFFSET_R13(\ctx), %r13 |
movq OFFSET_R12(\ctx), %r12 |
movq OFFSET_RBP(\ctx), %rbp |
movq OFFSET_RBX(\ctx), %rbx |
movq OFFSET_SP(\ctx), %rsp # ctx->sp -> %rsp |
movq OFFSET_PC(\ctx), \pc |
.endm |
#endif |
#endif |
/tags/0.3.0/kernel/arch/amd64/include/context.h |
---|
0,0 → 1,71 |
/* |
* Copyright (c) 2005 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup amd64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_amd64_CONTEXT_H_ |
#define KERN_amd64_CONTEXT_H_ |
#ifdef KERNEL |
#include <arch/types.h> |
/* According to ABI the stack MUST be aligned on |
* 16-byte boundary. If it is not, the va_arg calling will |
* panic sooner or later |
*/ |
#define SP_DELTA 16 |
#endif /* KERNEL */ |
/* We include only registers that must be preserved |
* during function call |
*/ |
typedef struct { |
uintptr_t sp; |
uintptr_t pc; |
uint64_t rbx; |
uint64_t rbp; |
uint64_t r12; |
uint64_t r13; |
uint64_t r14; |
uint64_t r15; |
ipl_t ipl; |
} __attribute__ ((packed)) context_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/amd64/include/mm/frame.h |
---|
0,0 → 1,54 |
/* |
* Copyright (c) 2005 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup amd64mm |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_amd64_FRAME_H_ |
#define KERN_amd64_FRAME_H_ |
#ifndef __ASM__ |
#include <arch/types.h> |
#endif /* __ASM__ */ |
#define FRAME_WIDTH 12 /* 4K */ |
#define FRAME_SIZE (1 << FRAME_WIDTH) |
#ifndef __ASM__ |
extern uintptr_t last_frame; |
extern void frame_arch_init(void); |
extern void physmem_print(void); |
#endif /* __ASM__ */ |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/amd64/include/mm/as.h |
---|
0,0 → 1,64 |
/* |
* Copyright (c) 2005 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup amd64mm |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_amd64_AS_H_ |
#define KERN_amd64_AS_H_ |
#define KERNEL_ADDRESS_SPACE_SHADOWED_ARCH 0 |
#define KERNEL_ADDRESS_SPACE_START_ARCH (unsigned long) 0xffff800000000000 |
#define KERNEL_ADDRESS_SPACE_END_ARCH (unsigned long) 0xffffffff80000000 |
#define USER_ADDRESS_SPACE_START_ARCH (unsigned long) 0x0000000000000000 |
#define USER_ADDRESS_SPACE_END_ARCH (unsigned long) 0x00007fffffffffff |
#define USTACK_ADDRESS_ARCH (USER_ADDRESS_SPACE_END_ARCH-(PAGE_SIZE-1)) |
#define as_constructor_arch(as, flags) (as != as) |
#define as_destructor_arch(as) (as != as) |
#define as_create_arch(as, flags) (as != as) |
#define as_install_arch(as) |
#define as_deinstall_arch(as) |
#define as_invalidate_translation_cache(as, page, cnt) |
typedef struct { |
} as_arch_t; |
#include <genarch/mm/as_pt.h> |
extern void as_arch_init(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/amd64/include/mm/page.h |
---|
0,0 → 1,229 |
/* |
* Copyright (c) 2005 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup amd64mm |
* @{ |
*/ |
/** @file |
*/ |
/** Paging on AMD64 |
* |
* The space is divided in positive numbers - userspace and |
* negative numbers - kernel space. The 'negative' space starting |
* with 0xffff800000000000 and ending with 0xffffffff80000000 |
* (-2GB) is identically mapped physical memory. The area |
* (0xffffffff80000000 ... 0xffffffffffffffff is again identically |
* mapped first 2GB. |
* |
* ATTENTION - PA2KA(KA2PA(x)) != x if 'x' is in kernel |
*/ |
#ifndef KERN_amd64_PAGE_H_ |
#define KERN_amd64_PAGE_H_ |
#include <arch/mm/frame.h> |
#define PAGE_WIDTH FRAME_WIDTH |
#define PAGE_SIZE FRAME_SIZE |
#define PAGE_COLOR_BITS 0 /* dummy */ |
#ifdef KERNEL |
#ifndef __ASM__ |
# include <mm/mm.h> |
# include <arch/types.h> |
# include <arch/interrupt.h> |
static inline uintptr_t ka2pa(uintptr_t x) |
{ |
if (x > 0xffffffff80000000) |
return x - 0xffffffff80000000; |
else |
return x - 0xffff800000000000; |
} |
# define KA2PA(x) ka2pa((uintptr_t) x) |
# define PA2KA_CODE(x) (((uintptr_t) (x)) + 0xffffffff80000000) |
# define PA2KA(x) (((uintptr_t) (x)) + 0xffff800000000000) |
#else |
# define KA2PA(x) ((x) - 0xffffffff80000000) |
# define PA2KA(x) ((x) + 0xffffffff80000000) |
#endif |
/* Number of entries in each level. */ |
#define PTL0_ENTRIES_ARCH 512 |
#define PTL1_ENTRIES_ARCH 512 |
#define PTL2_ENTRIES_ARCH 512 |
#define PTL3_ENTRIES_ARCH 512 |
/* Page table sizes for each level. */ |
#define PTL0_SIZE_ARCH ONE_FRAME |
#define PTL1_SIZE_ARCH ONE_FRAME |
#define PTL2_SIZE_ARCH ONE_FRAME |
#define PTL3_SIZE_ARCH ONE_FRAME |
/* Macros calculating indices into page tables in each level. */ |
#define PTL0_INDEX_ARCH(vaddr) (((vaddr) >> 39) & 0x1ff) |
#define PTL1_INDEX_ARCH(vaddr) (((vaddr) >> 30) & 0x1ff) |
#define PTL2_INDEX_ARCH(vaddr) (((vaddr) >> 21) & 0x1ff) |
#define PTL3_INDEX_ARCH(vaddr) (((vaddr) >> 12) & 0x1ff) |
/* Get PTE address accessors for each level. */ |
#define GET_PTL1_ADDRESS_ARCH(ptl0, i) \ |
((pte_t *) ((((uint64_t) ((pte_t *) (ptl0))[(i)].addr_12_31) << 12) | \ |
(((uint64_t) ((pte_t *) (ptl0))[(i)].addr_32_51) << 32))) |
#define GET_PTL2_ADDRESS_ARCH(ptl1, i) \ |
((pte_t *) ((((uint64_t) ((pte_t *) (ptl1))[(i)].addr_12_31) << 12) | \ |
(((uint64_t) ((pte_t *) (ptl1))[(i)].addr_32_51) << 32))) |
#define GET_PTL3_ADDRESS_ARCH(ptl2, i) \ |
((pte_t *) ((((uint64_t) ((pte_t *) (ptl2))[(i)].addr_12_31) << 12) | \ |
(((uint64_t) ((pte_t *) (ptl2))[(i)].addr_32_51) << 32))) |
#define GET_FRAME_ADDRESS_ARCH(ptl3, i) \ |
((uintptr_t *) \ |
((((uint64_t) ((pte_t *) (ptl3))[(i)].addr_12_31) << 12) | \ |
(((uint64_t) ((pte_t *) (ptl3))[(i)].addr_32_51) << 32))) |
/* Set PTE address accessors for each level. */ |
#define SET_PTL0_ADDRESS_ARCH(ptl0) \ |
(write_cr3((uintptr_t) (ptl0))) |
#define SET_PTL1_ADDRESS_ARCH(ptl0, i, a) \ |
set_pt_addr((pte_t *) (ptl0), (index_t) (i), a) |
#define SET_PTL2_ADDRESS_ARCH(ptl1, i, a) \ |
set_pt_addr((pte_t *) (ptl1), (index_t) (i), a) |
#define SET_PTL3_ADDRESS_ARCH(ptl2, i, a) \ |
set_pt_addr((pte_t *) (ptl2), (index_t) (i), a) |
#define SET_FRAME_ADDRESS_ARCH(ptl3, i, a) \ |
set_pt_addr((pte_t *) (ptl3), (index_t) (i), a) |
/* Get PTE flags accessors for each level. */ |
#define GET_PTL1_FLAGS_ARCH(ptl0, i) \ |
get_pt_flags((pte_t *) (ptl0), (index_t) (i)) |
#define GET_PTL2_FLAGS_ARCH(ptl1, i) \ |
get_pt_flags((pte_t *) (ptl1), (index_t) (i)) |
#define GET_PTL3_FLAGS_ARCH(ptl2, i) \ |
get_pt_flags((pte_t *) (ptl2), (index_t) (i)) |
#define GET_FRAME_FLAGS_ARCH(ptl3, i) \ |
get_pt_flags((pte_t *) (ptl3), (index_t) (i)) |
/* Set PTE flags accessors for each level. */ |
#define SET_PTL1_FLAGS_ARCH(ptl0, i, x) \ |
set_pt_flags((pte_t *) (ptl0), (index_t) (i), (x)) |
#define SET_PTL2_FLAGS_ARCH(ptl1, i, x) \ |
set_pt_flags((pte_t *) (ptl1), (index_t) (i), (x)) |
#define SET_PTL3_FLAGS_ARCH(ptl2, i, x) \ |
set_pt_flags((pte_t *) (ptl2), (index_t) (i), (x)) |
#define SET_FRAME_FLAGS_ARCH(ptl3, i, x) \ |
set_pt_flags((pte_t *) (ptl3), (index_t) (i), (x)) |
/* Macros for querying the last-level PTE entries. */ |
#define PTE_VALID_ARCH(p) \ |
(*((uint64_t *) (p)) != 0) |
#define PTE_PRESENT_ARCH(p) \ |
((p)->present != 0) |
#define PTE_GET_FRAME_ARCH(p) \ |
((((uintptr_t) (p)->addr_12_31) << 12) | \ |
((uintptr_t) (p)->addr_32_51 << 32)) |
#define PTE_WRITABLE_ARCH(p) \ |
((p)->writeable != 0) |
#define PTE_EXECUTABLE_ARCH(p) \ |
((p)->no_execute == 0) |
#ifndef __ASM__ |
/* Page fault error codes. */ |
/** When bit on this position is 0, the page fault was caused by a not-present |
* page. |
*/ |
#define PFERR_CODE_P (1 << 0) |
/** When bit on this position is 1, the page fault was caused by a write. */ |
#define PFERR_CODE_RW (1 << 1) |
/** When bit on this position is 1, the page fault was caused in user mode. */ |
#define PFERR_CODE_US (1 << 2) |
/** When bit on this position is 1, a reserved bit was set in page directory. */ |
#define PFERR_CODE_RSVD (1 << 3) |
/** When bit on this position os 1, the page fault was caused during instruction |
* fecth. |
*/ |
#define PFERR_CODE_ID (1 << 4) |
static inline int get_pt_flags(pte_t *pt, index_t i) |
{ |
pte_t *p = &pt[i]; |
return ((!p->page_cache_disable) << PAGE_CACHEABLE_SHIFT | |
(!p->present) << PAGE_PRESENT_SHIFT | |
p->uaccessible << PAGE_USER_SHIFT | |
1 << PAGE_READ_SHIFT | |
p->writeable << PAGE_WRITE_SHIFT | |
(!p->no_execute) << PAGE_EXEC_SHIFT | |
p->global << PAGE_GLOBAL_SHIFT); |
} |
static inline void set_pt_addr(pte_t *pt, index_t i, uintptr_t a) |
{ |
pte_t *p = &pt[i]; |
p->addr_12_31 = (a >> 12) & 0xfffff; |
p->addr_32_51 = a >> 32; |
} |
static inline void set_pt_flags(pte_t *pt, index_t i, int flags) |
{ |
pte_t *p = &pt[i]; |
p->page_cache_disable = !(flags & PAGE_CACHEABLE); |
p->present = !(flags & PAGE_NOT_PRESENT); |
p->uaccessible = (flags & PAGE_USER) != 0; |
p->writeable = (flags & PAGE_WRITE) != 0; |
p->no_execute = (flags & PAGE_EXEC) == 0; |
p->global = (flags & PAGE_GLOBAL) != 0; |
/* |
* Ensure that there is at least one bit set even if the present bit is cleared. |
*/ |
p->soft_valid = 1; |
} |
extern void page_arch_init(void); |
extern void page_fault(int n, istate_t *istate); |
#endif /* __ASM__ */ |
#endif /* KERNEL */ |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/amd64/include/mm/ptl.h |
---|
0,0 → 1,51 |
/* |
* Copyright (c) 2005 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup amd64mm |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_amd64_PTL_H_ |
#define KERN_amd64_PTL_H_ |
#define PTL_NO_EXEC (1<<63) |
#define PTL_ACCESSED (1<<5) |
#define PTL_CACHE_DISABLE (1<<4) |
#define PTL_CACHE_THROUGH (1<<3) |
#define PTL_USER (1<<2) |
#define PTL_WRITABLE (1<<1) |
#define PTL_PRESENT 1 |
#define PTL_2MB_PAGE (1<<7) |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/amd64/include/mm/tlb.h |
---|
0,0 → 1,44 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup amd64mm |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_amd64_TLB_H_ |
#define KERN_amd64_TLB_H_ |
#define tlb_arch_init() |
#define tlb_print() |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/amd64/include/mm/asid.h |
---|
0,0 → 1,0 |
link ../../../ia32/include/mm/asid.h |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/arch/amd64/include/cpuid.h |
---|
0,0 → 1,66 |
/* |
* Copyright (c) 2001-2004 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup amd64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_amd64_CPUID_H_ |
#define KERN_amd64_CPUID_H_ |
#define AMD_CPUID_EXTENDED 0x80000001 |
#define AMD_EXT_NOEXECUTE 20 |
#define AMD_EXT_LONG_MODE 29 |
#define INTEL_CPUID_STANDARD 0x00000001 |
#define INTEL_CPUID_EXTENDED 0x80000000 |
#define INTEL_SSE2 26 |
#define INTEL_FXSAVE 24 |
#ifndef __ASM__ |
#include <arch/types.h> |
typedef struct { |
uint32_t cpuid_eax; |
uint32_t cpuid_ebx; |
uint32_t cpuid_ecx; |
uint32_t cpuid_edx; |
} __attribute__ ((packed)) cpu_info_t; |
extern int has_cpuid(void); |
extern void cpuid(uint32_t cmd, cpu_info_t *info); |
#endif /* !def __ASM__ */ |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/amd64/include/proc/task.h |
---|
0,0 → 1,51 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup amd64proc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_amd64_TASK_H_ |
#define KERN_amd64_TASK_H_ |
#include <arch/types.h> |
#include <adt/bitmap.h> |
typedef struct { |
/** I/O Permission bitmap Generation counter. */ |
count_t iomapver; |
/** I/O Permission bitmap. */ |
bitmap_t iomap; |
} task_arch_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/amd64/include/proc/thread.h |
---|
0,0 → 1,54 |
/* |
* Copyright (c) 2005 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup amd64proc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_amd64_THREAD_H_ |
#define KERN_amd64_THREAD_H_ |
/* CAUTION: keep these in sync with low level assembly code in syscall_entry */ |
#define SYSCALL_USTACK_RSP 0 |
#define SYSCALL_KSTACK_RSP 1 |
typedef struct { |
unative_t tls; |
/** User and kernel RSP for syscalls. */ |
uint64_t syscall_rsp[2]; |
} thread_arch_t; |
#define thr_constructor_arch(t) |
#define thr_destructor_arch(t) |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/amd64/include/interrupt.h |
---|
0,0 → 1,124 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup amd64interrupt |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_amd64_INTERRUPT_H_ |
#define KERN_amd64_INTERRUPT_H_ |
#include <arch/types.h> |
#include <arch/pm.h> |
#define IVT_ITEMS IDT_ITEMS |
#define IVT_FIRST 0 |
#define EXC_COUNT 32 |
#define IRQ_COUNT 16 |
#define IVT_EXCBASE 0 |
#define IVT_IRQBASE (IVT_EXCBASE + EXC_COUNT) |
#define IVT_FREEBASE (IVT_IRQBASE + IRQ_COUNT) |
#define IRQ_CLK 0 |
#define IRQ_KBD 1 |
#define IRQ_PIC1 2 |
#define IRQ_PIC_SPUR 7 |
#define IRQ_MOUSE 12 |
/* this one must have four least significant bits set to ones */ |
#define VECTOR_APIC_SPUR (IVT_ITEMS - 1) |
#if (((VECTOR_APIC_SPUR + 1) % 16) || VECTOR_APIC_SPUR >= IVT_ITEMS) |
#error Wrong definition of VECTOR_APIC_SPUR |
#endif |
#define VECTOR_DEBUG 1 |
#define VECTOR_CLK (IVT_IRQBASE + IRQ_CLK) |
#define VECTOR_PIC_SPUR (IVT_IRQBASE + IRQ_PIC_SPUR) |
#define VECTOR_SYSCALL IVT_FREEBASE |
#define VECTOR_TLB_SHOOTDOWN_IPI (IVT_FREEBASE + 1) |
#define VECTOR_DEBUG_IPI (IVT_FREEBASE + 2) |
/** This is passed to interrupt handlers */ |
typedef struct { |
uint64_t rax; |
uint64_t rbx; |
uint64_t rcx; |
uint64_t rdx; |
uint64_t rsi; |
uint64_t rdi; |
uint64_t r8; |
uint64_t r9; |
uint64_t r10; |
uint64_t r11; |
uint64_t r12; |
uint64_t r13; |
uint64_t r14; |
uint64_t r15; |
uint64_t rbp; |
uint64_t error_word; |
uint64_t rip; |
uint64_t cs; |
uint64_t rflags; |
uint64_t stack[]; /* Additional data on stack */ |
} istate_t; |
/** Return true if exception happened while in userspace */ |
static inline int istate_from_uspace(istate_t *istate) |
{ |
return !(istate->rip & 0x8000000000000000); |
} |
static inline void istate_set_retaddr(istate_t *istate, uintptr_t retaddr) |
{ |
istate->rip = retaddr; |
} |
static inline unative_t istate_get_pc(istate_t *istate) |
{ |
return istate->rip; |
} |
extern void (* disable_irqs_function)(uint16_t irqmask); |
extern void (* enable_irqs_function)(uint16_t irqmask); |
extern void (* eoi_function)(void); |
extern void decode_istate(int n, istate_t *istate); |
extern void interrupt_init(void); |
extern void trap_virtual_enable_irqs(uint16_t irqmask); |
extern void trap_virtual_disable_irqs(uint16_t irqmask); |
/* AMD64 - specific page handler */ |
extern void ident_page_fault(int n, istate_t *istate); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/amd64/include/asm.h |
---|
0,0 → 1,300 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup amd64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_amd64_ASM_H_ |
#define KERN_amd64_ASM_H_ |
#include <config.h> |
extern void asm_delay_loop(uint32_t t); |
extern void asm_fake_loop(uint32_t t); |
/** Return base address of current stack. |
* |
* Return the base address of the current stack. |
* The stack is assumed to be STACK_SIZE bytes long. |
* The stack must start on page boundary. |
*/ |
static inline uintptr_t get_stack_base(void) |
{ |
uintptr_t v; |
asm volatile ("andq %%rsp, %0\n" : "=r" (v) : "0" (~((uint64_t)STACK_SIZE-1))); |
return v; |
} |
static inline void cpu_sleep(void) |
{ |
asm volatile ("hlt\n"); |
} |
static inline void cpu_halt(void) |
{ |
asm volatile ("hlt\n"); |
} |
/** Byte from port |
* |
* Get byte from port |
* |
* @param port Port to read from |
* @return Value read |
*/ |
static inline uint8_t inb(uint16_t port) |
{ |
uint8_t val; |
asm volatile ("inb %w1, %b0 \n" : "=a" (val) : "d" (port)); |
return val; |
} |
/** Byte to port |
* |
* Output byte to port |
* |
* @param port Port to write to |
* @param val Value to write |
*/ |
static inline void outb(uint16_t port, uint8_t val) |
{ |
asm volatile ("outb %b0, %w1\n" : : "a" (val), "d" (port)); |
} |
/** Swap Hidden part of GS register with visible one */ |
static inline void swapgs(void) |
{ |
asm volatile("swapgs"); |
} |
/** Enable interrupts. |
* |
* Enable interrupts and return previous |
* value of EFLAGS. |
* |
* @return Old interrupt priority level. |
*/ |
static inline ipl_t interrupts_enable(void) { |
ipl_t v; |
__asm__ volatile ( |
"pushfq\n" |
"popq %0\n" |
"sti\n" |
: "=r" (v) |
); |
return v; |
} |
/** Disable interrupts. |
* |
* Disable interrupts and return previous |
* value of EFLAGS. |
* |
* @return Old interrupt priority level. |
*/ |
static inline ipl_t interrupts_disable(void) { |
ipl_t v; |
__asm__ volatile ( |
"pushfq\n" |
"popq %0\n" |
"cli\n" |
: "=r" (v) |
); |
return v; |
} |
/** Restore interrupt priority level. |
* |
* Restore EFLAGS. |
* |
* @param ipl Saved interrupt priority level. |
*/ |
static inline void interrupts_restore(ipl_t ipl) { |
__asm__ volatile ( |
"pushq %0\n" |
"popfq\n" |
: : "r" (ipl) |
); |
} |
/** Return interrupt priority level. |
* |
* Return EFLAFS. |
* |
* @return Current interrupt priority level. |
*/ |
static inline ipl_t interrupts_read(void) { |
ipl_t v; |
__asm__ volatile ( |
"pushfq\n" |
"popq %0\n" |
: "=r" (v) |
); |
return v; |
} |
/** Write to MSR */ |
static inline void write_msr(uint32_t msr, uint64_t value) |
{ |
__asm__ volatile ( |
"wrmsr;" : : "c" (msr), |
"a" ((uint32_t)(value)), |
"d" ((uint32_t)(value >> 32)) |
); |
} |
static inline unative_t read_msr(uint32_t msr) |
{ |
uint32_t ax, dx; |
__asm__ volatile ( |
"rdmsr;" : "=a"(ax), "=d"(dx) : "c" (msr) |
); |
return ((uint64_t)dx << 32) | ax; |
} |
/** Enable local APIC |
* |
* Enable local APIC in MSR. |
*/ |
static inline void enable_l_apic_in_msr() |
{ |
__asm__ volatile ( |
"movl $0x1b, %%ecx\n" |
"rdmsr\n" |
"orl $(1<<11),%%eax\n" |
"orl $(0xfee00000),%%eax\n" |
"wrmsr\n" |
: |
: |
:"%eax","%ecx","%edx" |
); |
} |
static inline uintptr_t * get_ip() |
{ |
uintptr_t *ip; |
__asm__ volatile ( |
"mov %%rip, %0" |
: "=r" (ip) |
); |
return ip; |
} |
/** Invalidate TLB Entry. |
* |
* @param addr Address on a page whose TLB entry is to be invalidated. |
*/ |
static inline void invlpg(uintptr_t addr) |
{ |
__asm__ volatile ("invlpg %0\n" :: "m" (*((unative_t *)addr))); |
} |
/** Load GDTR register from memory. |
* |
* @param gdtr_reg Address of memory from where to load GDTR. |
*/ |
static inline void gdtr_load(struct ptr_16_64 *gdtr_reg) |
{ |
__asm__ volatile ("lgdtq %0\n" : : "m" (*gdtr_reg)); |
} |
/** Store GDTR register to memory. |
* |
* @param gdtr_reg Address of memory to where to load GDTR. |
*/ |
static inline void gdtr_store(struct ptr_16_64 *gdtr_reg) |
{ |
__asm__ volatile ("sgdtq %0\n" : : "m" (*gdtr_reg)); |
} |
/** Load IDTR register from memory. |
* |
* @param idtr_reg Address of memory from where to load IDTR. |
*/ |
static inline void idtr_load(struct ptr_16_64 *idtr_reg) |
{ |
__asm__ volatile ("lidtq %0\n" : : "m" (*idtr_reg)); |
} |
/** Load TR from descriptor table. |
* |
* @param sel Selector specifying descriptor of TSS segment. |
*/ |
static inline void tr_load(uint16_t sel) |
{ |
__asm__ volatile ("ltr %0" : : "r" (sel)); |
} |
#define GEN_READ_REG(reg) static inline unative_t read_ ##reg (void) \ |
{ \ |
unative_t res; \ |
__asm__ volatile ("movq %%" #reg ", %0" : "=r" (res) ); \ |
return res; \ |
} |
#define GEN_WRITE_REG(reg) static inline void write_ ##reg (unative_t regn) \ |
{ \ |
__asm__ volatile ("movq %0, %%" #reg : : "r" (regn)); \ |
} |
GEN_READ_REG(cr0) |
GEN_READ_REG(cr2) |
GEN_READ_REG(cr3) |
GEN_WRITE_REG(cr3) |
GEN_READ_REG(dr0) |
GEN_READ_REG(dr1) |
GEN_READ_REG(dr2) |
GEN_READ_REG(dr3) |
GEN_READ_REG(dr6) |
GEN_READ_REG(dr7) |
GEN_WRITE_REG(dr0) |
GEN_WRITE_REG(dr1) |
GEN_WRITE_REG(dr2) |
GEN_WRITE_REG(dr3) |
GEN_WRITE_REG(dr6) |
GEN_WRITE_REG(dr7) |
extern size_t interrupt_handler_size; |
extern void interrupt_handlers(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/amd64/include/debugger.h |
---|
0,0 → 1,57 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup amd64debug |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_amd64_DEBUGGER_H_ |
#define KERN_amd64_DEBUGGER_H_ |
#include <arch/types.h> |
#define BKPOINTS_MAX 4 |
/* Flags that are passed to breakpoint_add function */ |
#define BKPOINT_INSTR 0x1 |
#define BKPOINT_WRITE 0x2 |
#define BKPOINT_READ_WRITE 0x4 |
#define BKPOINT_CHECK_ZERO 0x8 |
extern void debugger_init(void); |
extern int breakpoint_add(const void *where, const int flags, int curidx); |
extern void breakpoint_del(int slot); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/amd64/include/types.h |
---|
0,0 → 1,93 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup amd64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_amd64_TYPES_H_ |
#define KERN_amd64_TYPES_H_ |
#define NULL 0 |
#define false 0 |
#define true 1 |
typedef signed char int8_t; |
typedef signed short int16_t; |
typedef signed int int32_t; |
typedef signed long long int64_t; |
typedef unsigned char uint8_t; |
typedef unsigned short uint16_t; |
typedef unsigned int uint32_t; |
typedef unsigned long long uint64_t; |
typedef uint64_t size_t; |
typedef uint64_t count_t; |
typedef uint64_t index_t; |
typedef uint64_t uintptr_t; |
typedef uint64_t pfn_t; |
typedef uint64_t ipl_t; |
typedef uint64_t unative_t; |
typedef int64_t native_t; |
typedef uint8_t bool; |
typedef uint64_t thread_id_t; |
typedef uint64_t task_id_t; |
typedef uint32_t context_id_t; |
typedef int32_t inr_t; |
typedef int32_t devno_t; |
/** Page Table Entry. */ |
typedef struct { |
unsigned present : 1; |
unsigned writeable : 1; |
unsigned uaccessible : 1; |
unsigned page_write_through : 1; |
unsigned page_cache_disable : 1; |
unsigned accessed : 1; |
unsigned dirty : 1; |
unsigned unused: 1; |
unsigned global : 1; |
unsigned soft_valid : 1; /**< Valid content even if present bit is cleared. */ |
unsigned avl : 2; |
unsigned addr_12_31 : 30; |
unsigned addr_32_51 : 21; |
unsigned no_execute : 1; |
} __attribute__ ((packed)) pte_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/amd64/include/atomic.h |
---|
0,0 → 1,128 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup amd64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_amd64_ATOMIC_H_ |
#define KERN_amd64_ATOMIC_H_ |
#include <arch/types.h> |
#include <arch/barrier.h> |
#include <preemption.h> |
static inline void atomic_inc(atomic_t *val) { |
#ifdef CONFIG_SMP |
asm volatile ("lock incq %0\n" : "=m" (val->count)); |
#else |
asm volatile ("incq %0\n" : "=m" (val->count)); |
#endif /* CONFIG_SMP */ |
} |
static inline void atomic_dec(atomic_t *val) { |
#ifdef CONFIG_SMP |
asm volatile ("lock decq %0\n" : "=m" (val->count)); |
#else |
asm volatile ("decq %0\n" : "=m" (val->count)); |
#endif /* CONFIG_SMP */ |
} |
static inline long atomic_postinc(atomic_t *val) |
{ |
long r = 1; |
asm volatile ( |
"lock xaddq %1, %0\n" |
: "=m" (val->count), "+r" (r) |
); |
return r; |
} |
static inline long atomic_postdec(atomic_t *val) |
{ |
long r = -1; |
asm volatile ( |
"lock xaddq %1, %0\n" |
: "=m" (val->count), "+r" (r) |
); |
return r; |
} |
#define atomic_preinc(val) (atomic_postinc(val)+1) |
#define atomic_predec(val) (atomic_postdec(val)-1) |
static inline uint64_t test_and_set(atomic_t *val) { |
uint64_t v; |
asm volatile ( |
"movq $1, %0\n" |
"xchgq %0, %1\n" |
: "=r" (v),"=m" (val->count) |
); |
return v; |
} |
/** amd64 specific fast spinlock */ |
static inline void atomic_lock_arch(atomic_t *val) |
{ |
uint64_t tmp; |
preemption_disable(); |
asm volatile ( |
"0:;" |
#ifdef CONFIG_HT |
"pause;" |
#endif |
"mov %0, %1;" |
"testq %1, %1;" |
"jnz 0b;" /* Lightweight looping on locked spinlock */ |
"incq %1;" /* now use the atomic operation */ |
"xchgq %0, %1;" |
"testq %1, %1;" |
"jnz 0b;" |
: "=m"(val->count),"=r"(tmp) |
); |
/* |
* Prevent critical section code from bleeding out this way up. |
*/ |
CS_ENTER_BARRIER(); |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/amd64/include/pm.h |
---|
0,0 → 1,197 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup amd64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_amd64_PM_H_ |
#define KERN_amd64_PM_H_ |
#ifndef __ASM__ |
# include <arch/types.h> |
# include <arch/context.h> |
#endif |
#define IDT_ITEMS 64 |
#define GDT_ITEMS 8 |
#define NULL_DES 0 |
/* Warning: Do not reorder next items, unless you look into syscall.c!!! */ |
#define KTEXT_DES 1 |
#define KDATA_DES 2 |
#define UDATA_DES 3 |
#define UTEXT_DES 4 |
#define KTEXT32_DES 5 |
/* EndOfWarning */ |
#define TSS_DES 6 |
#ifdef CONFIG_FB |
#define VESA_INIT_DES 8 |
#define VESA_INIT_SEGMENT 0x8000 |
#undef GDT_ITEMS |
#define GDT_ITEMS 9 |
#endif /*CONFIG_FB*/ |
#define gdtselector(des) ((des) << 3) |
#define idtselector(des) ((des) << 4) |
#define PL_KERNEL 0 |
#define PL_USER 3 |
#define AR_PRESENT (1<<7) |
#define AR_DATA (2<<3) |
#define AR_CODE (3<<3) |
#define AR_WRITABLE (1<<1) |
#define AR_READABLE (1<<1) |
#define AR_TSS (0x9) |
#define AR_INTERRUPT (0xe) |
#define AR_TRAP (0xf) |
#define DPL_KERNEL (PL_KERNEL<<5) |
#define DPL_USER (PL_USER<<5) |
#define TSS_BASIC_SIZE 104 |
#define TSS_IOMAP_SIZE (16*1024+1) /* 16K for bitmap + 1 terminating byte for convenience */ |
#define IO_PORTS (64*1024) |
#ifndef __ASM__ |
struct descriptor { |
unsigned limit_0_15: 16; |
unsigned base_0_15: 16; |
unsigned base_16_23: 8; |
unsigned access: 8; |
unsigned limit_16_19: 4; |
unsigned available: 1; |
unsigned longmode: 1; |
unsigned special: 1; |
unsigned granularity : 1; |
unsigned base_24_31: 8; |
} __attribute__ ((packed)); |
typedef struct descriptor descriptor_t; |
struct tss_descriptor { |
unsigned limit_0_15: 16; |
unsigned base_0_15: 16; |
unsigned base_16_23: 8; |
unsigned type: 4; |
unsigned : 1; |
unsigned dpl : 2; |
unsigned present : 1; |
unsigned limit_16_19: 4; |
unsigned available: 1; |
unsigned : 2; |
unsigned granularity : 1; |
unsigned base_24_31: 8; |
unsigned base_32_63 : 32; |
unsigned : 32; |
} __attribute__ ((packed)); |
typedef struct tss_descriptor tss_descriptor_t; |
struct idescriptor { |
unsigned offset_0_15: 16; |
unsigned selector: 16; |
unsigned ist:3; |
unsigned unused: 5; |
unsigned type: 5; |
unsigned dpl: 2; |
unsigned present : 1; |
unsigned offset_16_31: 16; |
unsigned offset_32_63: 32; |
unsigned : 32; |
} __attribute__ ((packed)); |
typedef struct idescriptor idescriptor_t; |
struct ptr_16_64 { |
uint16_t limit; |
uint64_t base; |
} __attribute__ ((packed)); |
typedef struct ptr_16_64 ptr_16_64_t; |
struct ptr_16_32 { |
uint16_t limit; |
uint32_t base; |
} __attribute__ ((packed)); |
typedef struct ptr_16_32 ptr_16_32_t; |
struct tss { |
uint32_t reserve1; |
uint64_t rsp0; |
uint64_t rsp1; |
uint64_t rsp2; |
uint64_t reserve2; |
uint64_t ist1; |
uint64_t ist2; |
uint64_t ist3; |
uint64_t ist4; |
uint64_t ist5; |
uint64_t ist6; |
uint64_t ist7; |
uint64_t reserve3; |
uint16_t reserve4; |
uint16_t iomap_base; |
uint8_t iomap[TSS_IOMAP_SIZE]; |
} __attribute__ ((packed)); |
typedef struct tss tss_t; |
extern tss_t *tss_p; |
extern descriptor_t gdt[]; |
extern idescriptor_t idt[]; |
extern ptr_16_64_t gdtr; |
extern ptr_16_32_t bootstrap_gdtr; |
extern ptr_16_32_t protected_ap_gdtr; |
extern void pm_init(void); |
extern void gdt_tss_setbase(descriptor_t *d, uintptr_t base); |
extern void gdt_tss_setlimit(descriptor_t *d, uint32_t limit); |
extern void idt_init(void); |
extern void idt_setoffset(idescriptor_t *d, uintptr_t offset); |
extern void tss_initialize(tss_t *t); |
#endif /* __ASM__ */ |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/amd64/include/cpu.h |
---|
0,0 → 1,86 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup amd64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_amd64_CPU_H_ |
#define KERN_amd64_CPU_H_ |
#define RFLAGS_IF (1 << 9) |
#define RFLAGS_RF (1 << 16) |
#define EFER_MSR_NUM 0xc0000080 |
#define AMD_SCE_FLAG 0 |
#define AMD_LME_FLAG 8 |
#define AMD_LMA_FLAG 10 |
#define AMD_FFXSR_FLAG 14 |
#define AMD_NXE_FLAG 11 |
/* MSR registers */ |
#define AMD_MSR_STAR 0xc0000081 |
#define AMD_MSR_LSTAR 0xc0000082 |
#define AMD_MSR_SFMASK 0xc0000084 |
#define AMD_MSR_FS 0xc0000100 |
#define AMD_MSR_GS 0xc0000101 |
#ifndef __ASM__ |
#include <arch/pm.h> |
typedef struct { |
int vendor; |
int family; |
int model; |
int stepping; |
struct tss *tss; |
count_t iomapver_copy; /** Copy of TASK's I/O Permission bitmap generation count. */ |
} cpu_arch_t; |
struct star_msr { |
}; |
struct lstar_msr { |
}; |
extern void set_efer_flag(int flag); |
extern uint64_t read_efer_flag(void); |
void cpu_setup_fpu(void); |
#endif /* __ASM__ */ |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/amd64/include/memstr.h |
---|
0,0 → 1,145 |
/* |
* Copyright (c) 2005 Sergey Bondari |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup amd64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_amd64_MEMSTR_H_ |
#define KERN_amd64_MEMSTR_H_ |
/** Copy memory |
* |
* Copy a given number of bytes (3rd argument) |
* from the memory location defined by 2nd argument |
* to the memory location defined by 1st argument. |
* The memory areas cannot overlap. |
* |
* @param dst Destination |
* @param src Source |
* @param cnt Number of bytes |
* @return Destination |
*/ |
static inline void * memcpy(void * dst, const void * src, size_t cnt) |
{ |
unative_t d0, d1, d2; |
asm volatile( |
"rep movsq\n\t" |
"movq %4, %%rcx\n\t" |
"andq $7, %%rcx\n\t" |
"jz 1f\n\t" |
"rep movsb\n\t" |
"1:\n" |
: "=&c" (d0), "=&D" (d1), "=&S" (d2) |
: "0" ((unative_t)(cnt / 8)), "g" ((unative_t)cnt), "1" ((unative_t) dst), "2" ((unative_t) src) |
: "memory"); |
return dst; |
} |
/** Compare memory regions for equality |
* |
* Compare a given number of bytes (3rd argument) |
* at memory locations defined by 1st and 2nd argument |
* for equality. If bytes are equal function returns 0. |
* |
* @param src Region 1 |
* @param dst Region 2 |
* @param cnt Number of bytes |
* @return Zero if bytes are equal, non-zero otherwise |
*/ |
static inline int memcmp(const void * src, const void * dst, size_t cnt) |
{ |
unative_t d0, d1, d2; |
unative_t ret; |
asm ( |
"repe cmpsb\n\t" |
"je 1f\n\t" |
"movq %3, %0\n\t" |
"addq $1, %0\n\t" |
"1:\n" |
: "=a" (ret), "=%S" (d0), "=&D" (d1), "=&c" (d2) |
: "0" (0), "1" (src), "2" (dst), "3" ((unative_t)cnt) |
); |
return ret; |
} |
/** Fill memory with words |
* Fill a given number of words (2nd argument) |
* at memory defined by 1st argument with the |
* word value defined by 3rd argument. |
* |
* @param dst Destination |
* @param cnt Number of words |
* @param x Value to fill |
*/ |
static inline void memsetw(uintptr_t dst, size_t cnt, uint16_t x) |
{ |
unative_t d0, d1; |
asm volatile ( |
"rep stosw\n\t" |
: "=&D" (d0), "=&c" (d1), "=a" (x) |
: "0" (dst), "1" ((unative_t)cnt), "2" (x) |
: "memory" |
); |
} |
/** Fill memory with bytes |
* Fill a given number of bytes (2nd argument) |
* at memory defined by 1st argument with the |
* word value defined by 3rd argument. |
* |
* @param dst Destination |
* @param cnt Number of bytes |
* @param x Value to fill |
*/ |
static inline void memsetb(uintptr_t dst, size_t cnt, uint8_t x) |
{ |
unative_t d0, d1; |
asm volatile ( |
"rep stosb\n\t" |
: "=&D" (d0), "=&c" (d1), "=a" (x) |
: "0" (dst), "1" ((unative_t)cnt), "2" (x) |
: "memory" |
); |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/amd64/include/cycle.h |
---|
0,0 → 1,43 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup amd64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_amd64_CYCLE_H_ |
#define KERN_amd64_CYCLE_H_ |
extern uint64_t get_cycle(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/amd64/include/byteorder.h |
---|
0,0 → 1,50 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup amd64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_amd64_BYTEORDER_H_ |
#define KERN_amd64_BYTEORDER_H_ |
#include <byteorder.h> |
/* AMD64 is little-endian */ |
#define uint32_t_le2host(n) (n) |
#define uint64_t_le2host(n) (n) |
#define uint32_t_be2host(n) uint32_t_byteorder_swap(n) |
#define uint64_t_be2host(n) uint64_t_byteorder_swap(n) |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/amd64/include/elf.h |
---|
0,0 → 1,45 |
/* |
* Copyright (c) 2006 Sergey Bondari |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup amd64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_amd64_ELF_H_ |
#define KERN_amd64_ELF_H_ |
#define ELF_MACHINE EM_X86_64 |
#define ELF_DATA_ENCODING ELFDATA2LSB |
#define ELF_CLASS ELFCLASS64 |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/amd64/include/arg.h |
---|
0,0 → 1,44 |
/* |
* Copyright (c) 2005 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup amd64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_amd64_ARG_H_ |
#define KERN_amd64_ARG_H_ |
#include <stdarg.h> |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/amd64/include/ddi/ddi.h |
---|
0,0 → 1,46 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup amd64ddi |
* @{ |
*/ |
/** |
* @file |
* @brief amd64 specific DDI declarations and macros. |
*/ |
#ifndef KERN_amd64_DDI_H_ |
#define KERN_amd64_DDI_H_ |
extern void io_perm_bitmap_install(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/amd64/include/syscall.h |
---|
0,0 → 1,45 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup amd64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_amd64_SYSCALL_H_ |
#define KERN_amd64_SYSCALL_H_ |
#include <arch/types.h> |
extern void syscall_setup_cpu(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/amd64/include/boot/boot.h |
---|
0,0 → 1,50 |
/* |
* Copyright (c) 2005 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup amd64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_amd64_BOOT_H_ |
#define KERN_amd64_BOOT_H_ |
#define BOOT_OFFSET 0x108000 |
#define AP_BOOT_OFFSET 0x8000 |
#define BOOT_STACK_SIZE 0x400 |
#define MULTIBOOT_HEADER_MAGIC 0x1BADB002 |
#define MULTIBOOT_HEADER_FLAGS 0x00010003 |
#define MULTIBOOT_LOADER_MAGIC 0x2BADB002 |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/amd64/include/boot/memmap.h |
---|
0,0 → 1,0 |
link ../../../ia32/include/boot/memmap.h |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/arch/amd64/include/arch.h |
---|
0,0 → 1,41 |
/* |
* Copyright (c) 2005 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup amd64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_amd64_ARCH_H_ |
#define KERN_amd64_ARCH_H_ |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/amd64/include/faddr.h |
---|
0,0 → 1,45 |
/* |
* Copyright (c) 2005 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup amd64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_amd64_FADDR_H_ |
#define KERN_amd64_FADDR_H_ |
#include <arch/types.h> |
#define FADDR(fptr) ((uintptr_t) (fptr)) |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/amd64/include/drivers/vesa.h |
---|
0,0 → 1,44 |
/* |
* Copyright (c) 2006-2006 Jakub Vana |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup amd64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_amd64_VESA_H_ |
#define KERN_amd64_VESA_H_ |
int vesa_present(void); |
void vesa_init(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/amd64/include/drivers/i8254.h |
---|
0,0 → 1,0 |
link ../../../ia32/include/drivers/i8254.h |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/arch/amd64/include/drivers/i8259.h |
---|
0,0 → 1,0 |
link ../../../ia32/include/drivers/i8259.h |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/arch/amd64/include/drivers/ega.h |
---|
0,0 → 1,0 |
link ../../../ia32/include/drivers/ega.h |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/arch/amd64/include/drivers/i8042.h |
---|
0,0 → 1,0 |
link ../../../ia32/include/drivers/i8042.h |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/arch/amd64/include/debug.h |
---|
0,0 → 1,0 |
link ../../ia32/include/debug.h |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/arch/amd64/include/fpu_context.h |
---|
0,0 → 1,0 |
link ../../ia32/include/fpu_context.h |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/arch/amd64/include/bios |
---|
0,0 → 1,0 |
link ../../ia32/include/bios |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/arch/amd64/include/smp |
---|
0,0 → 1,0 |
link ../../ia32/include/smp |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/arch/amd64/include/barrier.h |
---|
0,0 → 1,0 |
link ../../ia32/include/barrier.h |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/arch/amd64/src/context.S |
---|
0,0 → 1,64 |
# |
# Copyright (c) 2001-2004 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
.text |
.global context_save_arch |
.global context_restore_arch |
#include <arch/context_offset.h> |
## Save current CPU context |
# |
# Save CPU context to context_t variable |
# pointed by the 1st argument. Returns 1 in EAX. |
# |
context_save_arch: |
movq (%rsp), %rdx # the caller's return %eip |
# In %edi is passed 1st argument |
CONTEXT_SAVE_ARCH_CORE %rdi %rdx |
xorq %rax,%rax # context_save returns 1 |
incq %rax |
ret |
## Restore current CPU context |
# |
# Restore CPU context from context_t variable |
# pointed by the 1st argument. Returns 0 in EAX. |
# |
context_restore_arch: |
CONTEXT_RESTORE_ARCH_CORE %rdi %rdx |
movq %rdx,(%rsp) |
xorq %rax,%rax # context_restore returns 0 |
ret |
/tags/0.3.0/kernel/arch/amd64/src/debugger.c |
---|
0,0 → 1,396 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup amd64debug |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/debugger.h> |
#include <console/kconsole.h> |
#include <console/cmd.h> |
#include <symtab.h> |
#include <print.h> |
#include <panic.h> |
#include <interrupt.h> |
#include <arch/asm.h> |
#include <arch/cpu.h> |
#include <debug.h> |
#include <func.h> |
#include <smp/ipi.h> |
typedef struct { |
uintptr_t address; /**< Breakpoint address */ |
int flags; /**< Flags regarding breakpoint */ |
int counter; /**< How many times the exception occured */ |
} bpinfo_t; |
static bpinfo_t breakpoints[BKPOINTS_MAX]; |
SPINLOCK_INITIALIZE(bkpoint_lock); |
static int cmd_print_breakpoints(cmd_arg_t *argv); |
static cmd_info_t bkpts_info = { |
.name = "bkpts", |
.description = "Print breakpoint table.", |
.func = cmd_print_breakpoints, |
.argc = 0, |
}; |
#ifndef CONFIG_DEBUG_AS_WATCHPOINT |
static int cmd_del_breakpoint(cmd_arg_t *argv); |
static cmd_arg_t del_argv = { |
.type = ARG_TYPE_INT |
}; |
static cmd_info_t delbkpt_info = { |
.name = "delbkpt", |
.description = "delbkpt <number> - Delete breakpoint.", |
.func = cmd_del_breakpoint, |
.argc = 1, |
.argv = &del_argv |
}; |
static int cmd_add_breakpoint(cmd_arg_t *argv); |
static cmd_arg_t add_argv = { |
.type = ARG_TYPE_INT |
}; |
static cmd_info_t addbkpt_info = { |
.name = "addbkpt", |
.description = "addbkpt <&symbol> - new breakpoint.", |
.func = cmd_add_breakpoint, |
.argc = 1, |
.argv = &add_argv |
}; |
static cmd_arg_t addw_argv = { |
.type = ARG_TYPE_INT |
}; |
static cmd_info_t addwatchp_info = { |
.name = "addwatchp", |
.description = "addbwatchp <&symbol> - new write watchpoint.", |
.func = cmd_add_breakpoint, |
.argc = 1, |
.argv = &addw_argv |
}; |
#endif |
/** Print table of active breakpoints */ |
int cmd_print_breakpoints(cmd_arg_t *argv __attribute__((unused))) |
{ |
unsigned int i; |
char *symbol; |
if (sizeof(void *) == 4) { |
printf("# Count Address In symbol\n"); |
printf("-- ----- ---------- ---------\n"); |
} else { |
printf("# Count Address In symbol\n"); |
printf("-- ----- ------------------ ---------\n"); |
} |
for (i = 0; i < BKPOINTS_MAX; i++) |
if (breakpoints[i].address) { |
symbol = get_symtab_entry(breakpoints[i].address); |
if (sizeof(void *) == 4) |
printf("%-2u %-5d %#10zx %s\n", i, breakpoints[i].counter, |
breakpoints[i].address, symbol); |
else |
printf("%-2u %-5d %#18zx %s\n", i, breakpoints[i].counter, |
breakpoints[i].address, symbol); |
} |
return 1; |
} |
/* Setup DR register according to table */ |
static void setup_dr(int curidx) |
{ |
unative_t dr7; |
bpinfo_t *cur = &breakpoints[curidx]; |
int flags = breakpoints[curidx].flags; |
/* Disable breakpoint in DR7 */ |
dr7 = read_dr7(); |
dr7 &= ~(0x2 << (curidx*2)); |
if (cur->address) { /* Setup DR register */ |
/* Set breakpoint to debug registers */ |
switch (curidx) { |
case 0: |
write_dr0(cur->address); |
break; |
case 1: |
write_dr1(cur->address); |
break; |
case 2: |
write_dr2(cur->address); |
break; |
case 3: |
write_dr3(cur->address); |
break; |
} |
/* Set type to requested breakpoint & length*/ |
dr7 &= ~ (0x3 << (16 + 4*curidx)); |
dr7 &= ~ (0x3 << (18 + 4*curidx)); |
if ((flags & BKPOINT_INSTR)) { |
; |
} else { |
if (sizeof(int) == 4) |
dr7 |= ((unative_t) 0x3) << (18 + 4*curidx); |
else /* 8 */ |
dr7 |= ((unative_t) 0x2) << (18 + 4*curidx); |
if ((flags & BKPOINT_WRITE)) |
dr7 |= ((unative_t) 0x1) << (16 + 4*curidx); |
else if ((flags & BKPOINT_READ_WRITE)) |
dr7 |= ((unative_t) 0x3) << (16 + 4*curidx); |
} |
/* Enable global breakpoint */ |
dr7 |= 0x2 << (curidx*2); |
write_dr7(dr7); |
} |
} |
/** Enable hardware breakpoint |
* |
* @param where Address of HW breakpoint |
* @param flags Type of breakpoint (EXECUTE, WRITE) |
* @return Debug slot on success, -1 - no available HW breakpoint |
*/ |
int breakpoint_add(const void *where, const int flags, int curidx) |
{ |
ipl_t ipl; |
int i; |
bpinfo_t *cur; |
ASSERT(flags & (BKPOINT_INSTR | BKPOINT_WRITE | BKPOINT_READ_WRITE)); |
ipl = interrupts_disable(); |
spinlock_lock(&bkpoint_lock); |
if (curidx == -1) { |
/* Find free space in slots */ |
for (i = 0; i < BKPOINTS_MAX; i++) |
if (!breakpoints[i].address) { |
curidx = i; |
break; |
} |
if (curidx == -1) { |
/* Too many breakpoints */ |
spinlock_unlock(&bkpoint_lock); |
interrupts_restore(ipl); |
return -1; |
} |
} |
cur = &breakpoints[curidx]; |
cur->address = (uintptr_t) where; |
cur->flags = flags; |
cur->counter = 0; |
setup_dr(curidx); |
spinlock_unlock(&bkpoint_lock); |
interrupts_restore(ipl); |
/* Send IPI */ |
#ifdef CONFIG_SMP |
// ipi_broadcast(VECTOR_DEBUG_IPI); |
#endif |
return curidx; |
} |
#ifdef amd64 |
# define getip(x) ((x)->rip) |
#else |
# define getip(x) ((x)->eip) |
#endif |
static void handle_exception(int slot, istate_t *istate) |
{ |
ASSERT(breakpoints[slot].address); |
/* Handle zero checker */ |
if (! (breakpoints[slot].flags & BKPOINT_INSTR)) { |
if ((breakpoints[slot].flags & BKPOINT_CHECK_ZERO)) { |
if (*((unative_t *) breakpoints[slot].address) != 0) |
return; |
printf("**** Found ZERO on address %lx (slot %d) ****\n", |
breakpoints[slot].address, slot); |
} else { |
printf("Data watchpoint - new data: %lx\n", |
*((unative_t *) breakpoints[slot].address)); |
} |
} |
printf("Reached breakpoint %d:%lx(%s)\n", slot, getip(istate), |
get_symtab_entry(getip(istate))); |
printf("***Type 'exit' to exit kconsole.\n"); |
atomic_set(&haltstate,1); |
kconsole((void *) "debug"); |
atomic_set(&haltstate,0); |
} |
void breakpoint_del(int slot) |
{ |
bpinfo_t *cur; |
ipl_t ipl; |
ipl = interrupts_disable(); |
spinlock_lock(&bkpoint_lock); |
cur = &breakpoints[slot]; |
if (!cur->address) { |
spinlock_unlock(&bkpoint_lock); |
interrupts_restore(ipl); |
return; |
} |
cur->address = NULL; |
setup_dr(slot); |
spinlock_unlock(&bkpoint_lock); |
interrupts_restore(ipl); |
#ifdef CONFIG_SMP |
// ipi_broadcast(VECTOR_DEBUG_IPI); |
#endif |
} |
#ifndef CONFIG_DEBUG_AS_WATCHPOINT |
/** Remove breakpoint from table */ |
int cmd_del_breakpoint(cmd_arg_t *argv) |
{ |
unative_t bpno = argv->intval; |
if (bpno > BKPOINTS_MAX) { |
printf("Invalid breakpoint number.\n"); |
return 0; |
} |
breakpoint_del(argv->intval); |
return 1; |
} |
/** Add new breakpoint to table */ |
static int cmd_add_breakpoint(cmd_arg_t *argv) |
{ |
int flags; |
int id; |
if (argv == &add_argv) { |
flags = BKPOINT_INSTR; |
} else { /* addwatchp */ |
flags = BKPOINT_WRITE; |
} |
printf("Adding breakpoint on address: %p\n", argv->intval); |
id = breakpoint_add((void *)argv->intval, flags, -1); |
if (id < 0) |
printf("Add breakpoint failed.\n"); |
else |
printf("Added breakpoint %d.\n", id); |
return 1; |
} |
#endif |
static void debug_exception(int n __attribute__((unused)), istate_t *istate) |
{ |
unative_t dr6; |
int i; |
/* Set RF to restart the instruction */ |
#ifdef amd64 |
istate->rflags |= RFLAGS_RF; |
#else |
istate->eflags |= EFLAGS_RF; |
#endif |
dr6 = read_dr6(); |
for (i=0; i < BKPOINTS_MAX; i++) { |
if (dr6 & (1 << i)) { |
dr6 &= ~ (1 << i); |
write_dr6(dr6); |
handle_exception(i, istate); |
} |
} |
} |
#ifdef CONFIG_SMP |
static void debug_ipi(int n __attribute__((unused)), istate_t *istate __attribute__((unused))) |
{ |
int i; |
spinlock_lock(&bkpoint_lock); |
for (i = 0; i < BKPOINTS_MAX; i++) |
setup_dr(i); |
spinlock_unlock(&bkpoint_lock); |
} |
#endif |
/** Initialize debugger */ |
void debugger_init() |
{ |
int i; |
for (i=0; i<BKPOINTS_MAX; i++) |
breakpoints[i].address = NULL; |
cmd_initialize(&bkpts_info); |
if (!cmd_register(&bkpts_info)) |
panic("could not register command %s\n", bkpts_info.name); |
#ifndef CONFIG_DEBUG_AS_WATCHPOINT |
cmd_initialize(&delbkpt_info); |
if (!cmd_register(&delbkpt_info)) |
panic("could not register command %s\n", delbkpt_info.name); |
cmd_initialize(&addbkpt_info); |
if (!cmd_register(&addbkpt_info)) |
panic("could not register command %s\n", addbkpt_info.name); |
cmd_initialize(&addwatchp_info); |
if (!cmd_register(&addwatchp_info)) |
panic("could not register command %s\n", addwatchp_info.name); |
#endif |
exc_register(VECTOR_DEBUG, "debugger", |
debug_exception); |
#ifdef CONFIG_SMP |
exc_register(VECTOR_DEBUG_IPI, "debugger_smp", |
debug_ipi); |
#endif |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/amd64/src/mm/page.c |
---|
0,0 → 1,218 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup amd64mm |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/mm/page.h> |
#include <genarch/mm/page_pt.h> |
#include <arch/mm/frame.h> |
#include <mm/page.h> |
#include <mm/frame.h> |
#include <mm/as.h> |
#include <arch/interrupt.h> |
#include <arch/asm.h> |
#include <config.h> |
#include <memstr.h> |
#include <interrupt.h> |
#include <print.h> |
#include <panic.h> |
#include <align.h> |
/* Definitions for identity page mapper */ |
pte_t helper_ptl1[512] __attribute__((aligned (PAGE_SIZE))); |
pte_t helper_ptl2[512] __attribute__((aligned (PAGE_SIZE))); |
pte_t helper_ptl3[512] __attribute__((aligned (PAGE_SIZE))); |
extern pte_t ptl_0; /* From boot.S */ |
#define PTL1_PRESENT(ptl0, page) (!(GET_PTL1_FLAGS_ARCH(ptl0, PTL0_INDEX_ARCH(page)) & PAGE_NOT_PRESENT)) |
#define PTL2_PRESENT(ptl1, page) (!(GET_PTL2_FLAGS_ARCH(ptl1, PTL1_INDEX_ARCH(page)) & PAGE_NOT_PRESENT)) |
#define PTL3_PRESENT(ptl2, page) (!(GET_PTL3_FLAGS_ARCH(ptl2, PTL2_INDEX_ARCH(page)) & PAGE_NOT_PRESENT)) |
#define PTL1_ADDR(ptl0, page) ((pte_t *)PA2KA(GET_PTL1_ADDRESS_ARCH(ptl0, PTL0_INDEX_ARCH(page)))) |
#define PTL2_ADDR(ptl1, page) ((pte_t *)PA2KA(GET_PTL2_ADDRESS_ARCH(ptl1, PTL1_INDEX_ARCH(page)))) |
#define PTL3_ADDR(ptl2, page) ((pte_t *)PA2KA(GET_PTL3_ADDRESS_ARCH(ptl2, PTL2_INDEX_ARCH(page)))) |
#define SETUP_PTL1(ptl0, page, tgt) { \ |
SET_PTL1_ADDRESS_ARCH(ptl0, PTL0_INDEX_ARCH(page), (uintptr_t)KA2PA(tgt)); \ |
SET_PTL1_FLAGS_ARCH(ptl0, PTL0_INDEX_ARCH(page), PAGE_WRITE | PAGE_EXEC); \ |
} |
#define SETUP_PTL2(ptl1, page, tgt) { \ |
SET_PTL2_ADDRESS_ARCH(ptl1, PTL1_INDEX_ARCH(page), (uintptr_t)KA2PA(tgt)); \ |
SET_PTL2_FLAGS_ARCH(ptl1, PTL1_INDEX_ARCH(page), PAGE_WRITE | PAGE_EXEC); \ |
} |
#define SETUP_PTL3(ptl2, page, tgt) { \ |
SET_PTL3_ADDRESS_ARCH(ptl2, PTL2_INDEX_ARCH(page), (uintptr_t)KA2PA(tgt)); \ |
SET_PTL3_FLAGS_ARCH(ptl2, PTL2_INDEX_ARCH(page), PAGE_WRITE | PAGE_EXEC); \ |
} |
#define SETUP_FRAME(ptl3, page, tgt) { \ |
SET_FRAME_ADDRESS_ARCH(ptl3, PTL3_INDEX_ARCH(page), (uintptr_t)KA2PA(tgt)); \ |
SET_FRAME_FLAGS_ARCH(ptl3, PTL3_INDEX_ARCH(page), PAGE_WRITE | PAGE_EXEC); \ |
} |
void page_arch_init(void) |
{ |
uintptr_t cur; |
unsigned int i; |
int identity_flags = PAGE_CACHEABLE | PAGE_EXEC | PAGE_GLOBAL | PAGE_WRITE; |
if (config.cpu_active == 1) { |
page_mapping_operations = &pt_mapping_operations; |
/* |
* PA2KA(identity) mapping for all frames. |
*/ |
for (cur = 0; cur < last_frame; cur += FRAME_SIZE) { |
/* Standard identity mapping */ |
page_mapping_insert(AS_KERNEL, PA2KA(cur), cur, identity_flags); |
} |
/* Upper kernel mapping |
* - from zero to top of kernel (include bottom addresses |
* because some are needed for init) |
*/ |
for (cur = PA2KA_CODE(0); cur < config.base + config.kernel_size; cur += FRAME_SIZE) |
page_mapping_insert(AS_KERNEL, cur, KA2PA(cur), identity_flags); |
for (cur = config.stack_base; cur < config.stack_base + config.stack_size; cur += FRAME_SIZE) |
page_mapping_insert(AS_KERNEL, cur, KA2PA(cur), identity_flags); |
for (i = 0; i < init.cnt; i++) { |
for (cur = init.tasks[i].addr; cur < init.tasks[i].addr + init.tasks[i].size; cur += FRAME_SIZE) |
page_mapping_insert(AS_KERNEL, PA2KA_CODE(KA2PA(cur)), KA2PA(cur), identity_flags); |
} |
exc_register(14, "page_fault", (iroutine) page_fault); |
write_cr3((uintptr_t) AS_KERNEL->genarch.page_table); |
} else |
write_cr3((uintptr_t) AS_KERNEL->genarch.page_table); |
} |
/** Identity page mapper |
* |
* We need to map whole physical memory identically before the page subsystem |
* is initializaed. This thing clears page table and fills in the specific |
* items. |
*/ |
void ident_page_fault(int n, istate_t *istate) |
{ |
uintptr_t page; |
static uintptr_t oldpage = 0; |
pte_t *aptl_1, *aptl_2, *aptl_3; |
page = read_cr2(); |
if (oldpage) { |
/* Unmap old address */ |
aptl_1 = PTL1_ADDR(&ptl_0, oldpage); |
aptl_2 = PTL2_ADDR(aptl_1, oldpage); |
aptl_3 = PTL3_ADDR(aptl_2, oldpage); |
SET_FRAME_FLAGS_ARCH(aptl_3, PTL3_INDEX_ARCH(oldpage), PAGE_NOT_PRESENT); |
if (KA2PA(aptl_3) == KA2PA(helper_ptl3)) |
SET_PTL3_FLAGS_ARCH(aptl_2, PTL2_INDEX_ARCH(oldpage), PAGE_NOT_PRESENT); |
if (KA2PA(aptl_2) == KA2PA(helper_ptl2)) |
SET_PTL2_FLAGS_ARCH(aptl_1, PTL1_INDEX_ARCH(oldpage), PAGE_NOT_PRESENT); |
if (KA2PA(aptl_1) == KA2PA(helper_ptl1)) |
SET_PTL1_FLAGS_ARCH(&ptl_0, PTL0_INDEX_ARCH(oldpage), PAGE_NOT_PRESENT); |
} |
if (PTL1_PRESENT(&ptl_0, page)) |
aptl_1 = PTL1_ADDR(&ptl_0, page); |
else { |
SETUP_PTL1(&ptl_0, page, helper_ptl1); |
aptl_1 = helper_ptl1; |
} |
if (PTL2_PRESENT(aptl_1, page)) |
aptl_2 = PTL2_ADDR(aptl_1, page); |
else { |
SETUP_PTL2(aptl_1, page, helper_ptl2); |
aptl_2 = helper_ptl2; |
} |
if (PTL3_PRESENT(aptl_2, page)) |
aptl_3 = PTL3_ADDR(aptl_2, page); |
else { |
SETUP_PTL3(aptl_2, page, helper_ptl3); |
aptl_3 = helper_ptl3; |
} |
SETUP_FRAME(aptl_3, page, page); |
oldpage = page; |
} |
void page_fault(int n, istate_t *istate) |
{ |
uintptr_t page; |
pf_access_t access; |
page = read_cr2(); |
if (istate->error_word & PFERR_CODE_RSVD) |
panic("Reserved bit set in page table entry.\n"); |
if (istate->error_word & PFERR_CODE_RW) |
access = PF_ACCESS_WRITE; |
else if (istate->error_word & PFERR_CODE_ID) |
access = PF_ACCESS_EXEC; |
else |
access = PF_ACCESS_READ; |
if (as_page_fault(page, access, istate) == AS_PF_FAULT) { |
fault_if_from_uspace(istate, "Page fault: %#x", page); |
decode_istate(n, istate); |
printf("Page fault address: %llx\n", page); |
panic("page fault\n"); |
} |
} |
uintptr_t hw_map(uintptr_t physaddr, size_t size) |
{ |
if (last_frame + ALIGN_UP(size, PAGE_SIZE) > KA2PA(KERNEL_ADDRESS_SPACE_END_ARCH)) |
panic("Unable to map physical memory %p (%d bytes)", physaddr, size) |
uintptr_t virtaddr = PA2KA(last_frame); |
pfn_t i; |
for (i = 0; i < ADDR2PFN(ALIGN_UP(size, PAGE_SIZE)); i++) |
page_mapping_insert(AS_KERNEL, virtaddr + PFN2ADDR(i), physaddr + PFN2ADDR(i), PAGE_NOT_CACHEABLE | PAGE_WRITE); |
last_frame = ALIGN_UP(last_frame + size, FRAME_SIZE); |
return virtaddr; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/amd64/src/mm/as.c |
---|
0,0 → 1,0 |
link ../../../ia32/src/mm/as.c |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/arch/amd64/src/mm/tlb.c |
---|
0,0 → 1,0 |
link ../../../ia32/src/mm/tlb.c |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/arch/amd64/src/mm/frame.c |
---|
0,0 → 1,0 |
link ../../../ia32/src/mm/frame.c |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/arch/amd64/src/amd64.c |
---|
0,0 → 1,222 |
/* |
* Copyright (c) 2005 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup amd64 |
* @{ |
*/ |
/** @file |
*/ |
#include <arch.h> |
#include <arch/types.h> |
#include <config.h> |
#include <proc/thread.h> |
#include <arch/drivers/ega.h> |
#include <arch/drivers/vesa.h> |
#include <genarch/kbd/i8042.h> |
#include <arch/drivers/i8254.h> |
#include <arch/drivers/i8259.h> |
#ifdef CONFIG_SMP |
#include <arch/smp/apic.h> |
#endif |
#include <arch/bios/bios.h> |
#include <arch/cpu.h> |
#include <print.h> |
#include <arch/cpuid.h> |
#include <genarch/acpi/acpi.h> |
#include <panic.h> |
#include <interrupt.h> |
#include <arch/syscall.h> |
#include <arch/debugger.h> |
#include <syscall/syscall.h> |
#include <console/console.h> |
#include <ddi/irq.h> |
#include <ddi/device.h> |
/** Disable I/O on non-privileged levels |
* |
* Clean IOPL(12,13) and NT(14) flags in EFLAGS register |
*/ |
static void clean_IOPL_NT_flags(void) |
{ |
asm ( |
"pushfq\n" |
"pop %%rax\n" |
"and $~(0x7000), %%rax\n" |
"pushq %%rax\n" |
"popfq\n" |
: |
: |
: "%rax" |
); |
} |
/** Disable alignment check |
* |
* Clean AM(18) flag in CR0 register |
*/ |
static void clean_AM_flag(void) |
{ |
asm ( |
"mov %%cr0, %%rax\n" |
"and $~(0x40000), %%rax\n" |
"mov %%rax, %%cr0\n" |
: |
: |
: "%rax" |
); |
} |
void arch_pre_mm_init(void) |
{ |
/* Enable no-execute pages */ |
set_efer_flag(AMD_NXE_FLAG); |
/* Enable FPU */ |
cpu_setup_fpu(); |
/* Initialize segmentation */ |
pm_init(); |
/* Disable I/O on nonprivileged levels |
* clear the NT (nested-thread) flag |
*/ |
clean_IOPL_NT_flags(); |
/* Disable alignment check */ |
clean_AM_flag(); |
if (config.cpu_active == 1) { |
interrupt_init(); |
bios_init(); |
/* PIC */ |
i8259_init(); |
} |
} |
void arch_post_mm_init(void) |
{ |
if (config.cpu_active == 1) { |
/* Initialize IRQ routing */ |
irq_init(IRQ_COUNT, IRQ_COUNT); |
/* hard clock */ |
i8254_init(); |
#ifdef CONFIG_FB |
if (vesa_present()) |
vesa_init(); |
else |
#endif |
ega_init(); /* video */ |
/* Enable debugger */ |
debugger_init(); |
/* Merge all memory zones to 1 big zone */ |
zone_merge_all(); |
} |
/* Setup fast SYSCALL/SYSRET */ |
syscall_setup_cpu(); |
} |
void arch_post_cpu_init() |
{ |
#ifdef CONFIG_SMP |
if (config.cpu_active > 1) { |
l_apic_init(); |
l_apic_debug(); |
} |
#endif |
} |
void arch_pre_smp_init(void) |
{ |
if (config.cpu_active == 1) { |
#ifdef CONFIG_SMP |
acpi_init(); |
#endif /* CONFIG_SMP */ |
} |
} |
void arch_post_smp_init(void) |
{ |
/* keyboard controller */ |
i8042_init(device_assign_devno(), IRQ_KBD, device_assign_devno(), IRQ_MOUSE); |
} |
void calibrate_delay_loop(void) |
{ |
i8254_calibrate_delay_loop(); |
if (config.cpu_active == 1) { |
/* |
* This has to be done only on UP. |
* On SMP, i8254 is not used for time keeping and its interrupt pin remains masked. |
*/ |
i8254_normal_operation(); |
} |
} |
/** Set thread-local-storage pointer |
* |
* TLS pointer is set in FS register. Unfortunately the 64-bit |
* part can be set only in CPL0 mode. |
* |
* The specs say, that on %fs:0 there is stored contents of %fs register, |
* we need not to go to CPL0 to read it. |
*/ |
unative_t sys_tls_set(unative_t addr) |
{ |
THREAD->arch.tls = addr; |
write_msr(AMD_MSR_FS, addr); |
return 0; |
} |
/** Acquire console back for kernel |
* |
*/ |
void arch_grab_console(void) |
{ |
i8042_grab(); |
} |
/** Return console to userspace |
* |
*/ |
void arch_release_console(void) |
{ |
i8042_release(); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/amd64/src/boot/boot.S |
---|
0,0 → 1,679 |
# Copyright (c) 2005 Ondrej Palkovsky |
# Copyright (c) 2006 Martin Decky |
# Copyright (c) 2008 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
#include <arch/boot/boot.h> |
#include <arch/boot/memmap.h> |
#include <arch/mm/page.h> |
#include <arch/mm/ptl.h> |
#include <arch/pm.h> |
#include <arch/cpu.h> |
#include <arch/cpuid.h> |
#define START_STACK (BOOT_OFFSET - BOOT_STACK_SIZE) |
.section K_TEXT_START, "ax" |
.code32 |
.align 4 |
.global multiboot_image_start |
multiboot_header: |
.long MULTIBOOT_HEADER_MAGIC |
.long MULTIBOOT_HEADER_FLAGS |
.long -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS) # checksum |
.long multiboot_header |
.long unmapped_ktext_start |
.long 0 |
.long 0 |
.long multiboot_image_start |
multiboot_image_start: |
movl $START_STACK, %esp # initialize stack pointer |
lgdtl bootstrap_gdtr # initialize Global Descriptor Table register |
movw $gdtselector(KDATA_DES), %cx |
movw %cx, %es |
movw %cx, %ds # kernel data + stack |
movw %cx, %ss |
# Simics seems to remove hidden part of GS on entering user mode |
# when _visible_ part of GS does not point to user-mode segment |
movw $gdtselector(UDATA_DES), %cx |
movw %cx, %fs |
movw %cx, %gs |
jmpl $gdtselector(KTEXT32_DES), $multiboot_meeting_point |
multiboot_meeting_point: |
movl %eax, grub_eax # save parameters from GRUB |
movl %ebx, grub_ebx |
# Protected 32-bit. We want to reuse the code-seg descriptor, |
# the Default operand size must not be 1 when entering long mode |
movl $(INTEL_CPUID_EXTENDED), %eax |
cpuid |
cmp $(INTEL_CPUID_EXTENDED), %eax |
ja extended_cpuid_supported |
movl $extended_cpuid_msg, %esi |
jmp error_halt |
extended_cpuid_supported: |
movl $(AMD_CPUID_EXTENDED), %eax |
cpuid |
bt $(AMD_EXT_LONG_MODE), %edx |
jc long_mode_supported |
movl $long_mode_msg, %esi |
jmp error_halt |
long_mode_supported: |
bt $(AMD_EXT_NOEXECUTE), %edx |
jc noexecute_supported |
movl $noexecute_msg, %esi |
jmp error_halt |
noexecute_supported: |
movl $(INTEL_CPUID_STANDARD), %eax |
cpuid |
bt $(INTEL_FXSAVE), %edx |
jc fx_supported |
movl $fx_msg, %esi |
jmp error_halt |
fx_supported: |
bt $(INTEL_SSE2), %edx |
jc sse2_supported |
movl $sse2_msg, %esi |
jmp error_halt |
sse2_supported: |
#ifdef CONFIG_FB |
mov $vesa_init, %esi |
mov $VESA_INIT_SEGMENT << 4, %edi |
mov $e_vesa_init - vesa_init, %ecx |
cld |
rep movsb |
mov $VESA_INIT_SEGMENT << 4, %edi |
jmpl *%edi |
vesa_meeting_point: |
mov %esi, KA2PA(vesa_ph_addr) |
mov %di, KA2PA(vesa_height) |
shr $16, %edi |
mov %di, KA2PA(vesa_width) |
mov %bx, KA2PA(vesa_scanline) |
shr $16, %ebx |
mov %bx, KA2PA(vesa_bpp) |
#endif |
# Enable 64-bit page translation entries - CR4.PAE = 1. |
# Paging is not enabled until after long mode is enabled |
movl %cr4, %eax |
btsl $5, %eax |
movl %eax, %cr4 |
# Set up paging tables |
leal ptl_0, %eax |
movl %eax, %cr3 |
# Enable long mode |
movl $EFER_MSR_NUM, %ecx # EFER MSR number |
rdmsr # Read EFER |
btsl $AMD_LME_FLAG, %eax # Set LME = 1 |
wrmsr # Write EFER |
# Enable paging to activate long mode (set CR0.PG = 1) |
movl %cr0, %eax |
btsl $31, %eax |
movl %eax, %cr0 |
# At this point we are in compatibility mode |
jmpl $gdtselector(KTEXT_DES), $start64 |
.code64 |
start64: |
movq $(PA2KA(START_STACK)), %rsp |
movl grub_eax, %eax |
movl grub_ebx, %ebx |
cmpl $MULTIBOOT_LOADER_MAGIC, %eax # compare GRUB signature |
je valid_boot |
xorl %ecx, %ecx # no memory size or map available |
movl %ecx, e820counter |
jmp invalid_boot |
valid_boot: |
movl (%ebx), %eax # ebx = physical address of struct multiboot_info |
bt $3, %eax # mbi->flags[3] (mods_count, mods_addr valid) |
jc mods_valid |
xorq %rcx, %rcx |
movq %rcx, init |
jmp mods_end |
mods_valid: |
xorq %rcx, %rcx |
movl 20(%ebx), %ecx # mbi->mods_count |
movq %rcx, init |
cmpl $0, %ecx |
je mods_end |
movl 24(%ebx), %esi # mbi->mods_addr |
movq $init, %rdi |
mods_loop: |
xorq %rdx, %rdx |
movl 0(%esi), %edx # mods->mod_start |
movq $0xffff800000000000, %r10 |
addq %r10, %rdx |
movq %rdx, 8(%rdi) |
xorq %rdx, %rdx |
movl 4(%esi), %edx |
subl 0(%esi), %edx # mods->mod_end - mods->mod_start |
movq %rdx, 16(%rdi) |
addl $16, %esi |
addq $16, %rdi |
loop mods_loop |
mods_end: |
bt $6, %eax # mbi->flags[6] (mmap_length, mmap_addr valid) |
jc mmap_valid |
xorl %edx, %edx |
jmp mmap_invalid |
mmap_valid: |
movl 44(%ebx), %ecx # mbi->mmap_length |
movl 48(%ebx), %esi # mbi->mmap_addr |
movq $e820table, %rdi |
xorl %edx, %edx |
mmap_loop: |
cmpl $0, %ecx |
jle mmap_end |
movl 4(%esi), %eax # mmap->base_addr_low |
movl %eax, (%rdi) |
movl 8(%esi), %eax # mmap->base_addr_high |
movl %eax, 4(%rdi) |
movl 12(%esi), %eax # mmap->length_low |
movl %eax, 8(%rdi) |
movl 16(%esi), %eax # mmap->length_high |
movl %eax, 12(%rdi) |
movl 20(%esi), %eax # mmap->type |
movl %eax, 16(%rdi) |
movl (%esi), %eax # mmap->size |
addl $0x4, %eax |
addl %eax, %esi |
subl %eax, %ecx |
addq $MEMMAP_E820_RECORD_SIZE, %rdi |
incl %edx |
jmp mmap_loop |
mmap_end: |
mmap_invalid: |
movl %edx, e820counter |
invalid_boot: |
#ifdef CONFIG_SMP |
# copy AP bootstrap routines below 1 MB |
movq $BOOT_OFFSET, %rsi |
movq $AP_BOOT_OFFSET, %rdi |
movq $_hardcoded_unmapped_size, %rcx |
cld |
rep movsb |
#endif |
call main_bsp # never returns |
cli |
hlt |
#ifdef CONFIG_FB |
.code32 |
vesa_init: |
jmp $gdtselector(VESA_INIT_DES), $vesa_init_real - vesa_init |
.code16 |
vesa_init_real: |
mov %cr0, %eax |
and $~1, %eax |
mov %eax, %cr0 |
jmp $VESA_INIT_SEGMENT, $vesa_init_real2 - vesa_init |
vesa_init_real2: |
mov $VESA_INIT_SEGMENT, %bx |
mov %bx, %es |
mov %bx, %fs |
mov %bx, %gs |
mov %bx, %ds |
mov %bx, %ss |
movl $0x0000fffc, %esp |
movl $0x0000fffc, %ebp |
#define VESA_INFO_SIZE 1024 |
#define VESA_MODE_ATTRIBUTES_OFFSET 0 |
#define VESA_MODE_LIST_PTR_OFFSET 14 |
#define VESA_MODE_SCANLINE_OFFSET 16 |
#define VESA_MODE_WIDTH_OFFSET 18 |
#define VESA_MODE_HEIGHT_OFFSET 20 |
#define VESA_MODE_BPP_OFFSET 25 |
#define VESA_MODE_PHADDR_OFFSET 40 |
#define VESA_END_OF_MODES 0xffff |
#define VESA_OK 0x4f |
#define VESA_GET_INFO 0x4f00 |
#define VESA_GET_MODE_INFO 0x4f01 |
#define VESA_SET_MODE 0x4f02 |
#define VESA_SET_PALETTE 0x4f09 |
#define CONFIG_VESA_BPP_a 255 |
#if CONFIG_VESA_BPP == 24 |
#define CONFIG_VESA_BPP_VARIANT 32 |
#endif |
mov $VESA_GET_INFO, %ax |
mov $e_vesa_init - vesa_init, %di |
push %di |
int $0x10 |
pop %di |
cmp $VESA_OK, %al |
jnz 0f |
mov 2 + VESA_MODE_LIST_PTR_OFFSET(%di), %si |
mov %si, %gs |
mov VESA_MODE_LIST_PTR_OFFSET(%di), %si |
add $VESA_INFO_SIZE, %di |
1:# Try next mode |
mov %gs:(%si), %cx |
cmp $VESA_END_OF_MODES, %cx |
jz 0f |
inc %si |
inc %si |
push %cx |
push %di |
push %si |
mov $VESA_GET_MODE_INFO, %ax |
int $0x10 |
pop %si |
pop %di |
pop %cx |
cmp $VESA_OK, %al |
jnz 0f |
mov $CONFIG_VESA_WIDTH, %ax |
cmp VESA_MODE_WIDTH_OFFSET(%di), %ax |
jnz 1b |
mov $CONFIG_VESA_HEIGHT, %ax |
cmp VESA_MODE_HEIGHT_OFFSET(%di), %ax |
jnz 1b |
mov $CONFIG_VESA_BPP, %al |
cmp VESA_MODE_BPP_OFFSET(%di), %al |
#ifdef CONFIG_VESA_BPP_VARIANT |
jz 2f |
mov $CONFIG_VESA_BPP_VARIANT, %al |
cmp VESA_MODE_BPP_OFFSET(%di), %al |
#endif |
jnz 1b |
2: |
mov %cx, %bx |
or $0xc000, %bx |
push %di |
mov $VESA_SET_MODE, %ax |
int $0x10 |
pop %di |
cmp $VESA_OK, %al |
jnz 0f |
#if CONFIG_VESA_BPP == 8 |
# Set 3:2:3 VGA palette |
mov VESA_MODE_ATTRIBUTES_OFFSET(%di), %ax |
push %di |
mov $vga323 - vesa_init, %di |
mov $0x100, %ecx |
bt $5, %ax # Test if VGA compatible registers are present |
jnc vga_compat |
# Try VESA routine to set palette |
mov $VESA_SET_PALETTE, %ax |
xor %bl, %bl |
xor %dx, %dx |
int $0x10 |
jmp vga_not_compat |
vga_compat: |
# Try VGA registers to set palette |
movw $0x3c6, %dx # Set palette mask |
movb $0xff, %al |
outb %al, %dx |
movw $0x3c8, %dx # First index to set |
xor %al, %al |
outb %al, %dx |
movw $0x3c9, %dx # Data port |
vga_loop: |
movb %es:2(%di), %al |
outb %al, %dx |
movb %es:1(%di), %al |
outb %al, %dx |
movb %es:(%di), %al |
outb %al, %dx |
addw $4, %di |
loop vga_loop |
vga_not_compat: |
pop %di |
#endif |
mov VESA_MODE_PHADDR_OFFSET(%di), %esi |
mov VESA_MODE_WIDTH_OFFSET(%di), %ax |
shl $16, %eax |
mov VESA_MODE_HEIGHT_OFFSET(%di), %ax |
mov VESA_MODE_BPP_OFFSET(%di), %bl |
xor %bh, %bh |
shl $16, %ebx |
mov VESA_MODE_SCANLINE_OFFSET(%di), %bx |
mov %eax, %edi |
8: |
mov %cr0, %eax |
or $1, %eax |
mov %eax, %cr0 |
jmp 9f |
9: |
ljmpl $gdtselector(KTEXT32_DES), $(vesa_init_protect - vesa_init + VESA_INIT_SEGMENT << 4) |
0:# No prefered mode found |
mov $0x111, %cx |
push %di |
push %cx |
mov $VESA_GET_MODE_INFO, %ax |
int $0x10 |
pop %cx |
pop %di |
cmp $VESA_OK, %al |
jnz 1f |
jz 2b # Force relative jump |
1: |
mov $0x0003, %ax |
int $0x10 |
mov $0xffffffff, %edi # EGA text mode used, because of problems with VESA |
xor %ax, %ax |
jz 8b # Force relative jump |
vga323: |
#include "vga323.pal" |
.code32 |
vesa_init_protect: |
movw $gdtselector(KDATA_DES), %cx |
movw %cx, %es |
movw %cx, %ds # kernel data + stack |
movw %cx, %ss |
# Simics seems to remove hidden part of GS on entering user mode |
# when _visible_ part of GS does not point to user-mode segment |
movw $gdtselector(UDATA_DES), %cx |
movw %cx, %fs |
movw %cx, %gs |
movl $START_STACK, %esp # initialize stack pointer |
jmpl $gdtselector(KTEXT32_DES), $vesa_meeting_point |
.align 4 |
e_vesa_init: |
#endif |
# Print string from %esi to EGA display (in red) and halt |
error_halt: |
movl $0xb8000, %edi # base of EGA text mode memory |
xorl %eax, %eax |
movw $0x3d4, %dx # read bits 8 - 15 of the cursor address |
movb $0xe, %al |
outb %al, %dx |
movw $0x3d5, %dx |
inb %dx, %al |
shl $8, %ax |
movw $0x3d4, %dx # read bits 0 - 7 of the cursor address |
movb $0xf, %al |
outb %al, %dx |
movw $0x3d5, %dx |
inb %dx, %al |
cmp $1920, %ax |
jbe cursor_ok |
movw $1920, %ax # sanity check for the cursor on the last line |
cursor_ok: |
movw %ax, %bx |
shl $1, %eax |
addl %eax, %edi |
movw $0x0c00, %ax # black background, light red foreground |
cld |
ploop: |
lodsb |
cmp $0, %al |
je ploop_end |
stosw |
inc %bx |
jmp ploop |
ploop_end: |
movw $0x3d4, %dx # write bits 8 - 15 of the cursor address |
movb $0xe, %al |
outb %al, %dx |
movw $0x3d5, %dx |
movb %bh, %al |
outb %al, %dx |
movw $0x3d4, %dx # write bits 0 - 7 of the cursor address |
movb $0xf, %al |
outb %al, %dx |
movw $0x3d5, %dx |
movb %bl, %al |
outb %al, %dx |
cli |
hlt |
.section K_INI_PTLS, "aw", @progbits |
# |
# Macro for generating initial page table contents. |
# @param cnt Number of entries to generat. Must be multiple of 8. |
# @param g Number of GB that will be added to the mapping. |
# |
.macro ptl2gen cnt g |
.if \cnt |
ptl2gen "\cnt - 8" \g |
.quad ((\cnt - 8) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) |
.quad ((\cnt - 7) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) |
.quad ((\cnt - 6) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) |
.quad ((\cnt - 5) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) |
.quad ((\cnt - 4) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) |
.quad ((\cnt - 3) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) |
.quad ((\cnt - 2) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) |
.quad ((\cnt - 1) * 0x200000) + (\g * 1024 * 1024 * 1024) | (PTL_WRITABLE | PTL_PRESENT | PTL_2MB_PAGE) |
.endif |
.endm |
# Page table for pages in the first gigabyte. |
.align 4096 |
.global ptl_2_0g |
ptl_2_0g: |
ptl2gen 512 0 |
# Page table for pages in the second gigabyte. |
.align 4096 |
.global ptl_2_1g |
ptl_2_1g: |
ptl2gen 512 1 |
# Page table for pages in the third gigabyte. |
.align 4096 |
.global ptl_2_2g |
ptl_2_2g: |
ptl2gen 512 2 |
# Page table for pages in the fourth gigabyte. |
.align 4096 |
.global ptl_2_3g |
ptl_2_3g: |
ptl2gen 512 3 |
.align 4096 |
.global ptl_1 |
ptl_1: |
# Identity mapping for [0; 4G) |
.quad ptl_2_0g + (PTL_WRITABLE | PTL_PRESENT) |
.quad ptl_2_1g + (PTL_WRITABLE | PTL_PRESENT) |
.quad ptl_2_2g + (PTL_WRITABLE | PTL_PRESENT) |
.quad ptl_2_3g + (PTL_WRITABLE | PTL_PRESENT) |
.fill 506, 8, 0 |
# Mapping of [0; 1G) at -2G |
.quad ptl_2_0g + (PTL_WRITABLE | PTL_PRESENT) |
.fill 1, 8, 0 |
.align 4096 |
.global ptl_0 |
ptl_0: |
.quad ptl_1 + (PTL_WRITABLE | PTL_PRESENT) |
.fill 255,8,0 |
.quad ptl_1 + (PTL_WRITABLE | PTL_PRESENT) |
.fill 254,8,0 |
.quad ptl_1 + (PTL_WRITABLE | PTL_PRESENT) |
.section K_DATA_START, "aw", @progbits |
.global bootstrap_gdtr |
bootstrap_gdtr: |
.word gdtselector(GDT_ITEMS) |
.long KA2PA(gdt) |
grub_eax: |
.long 0 |
grub_ebx: |
.long 0 |
extended_cpuid_msg: |
.asciz "Extended CPUID not supported. System halted." |
long_mode_msg: |
.asciz "64 bit long mode not supported. System halted." |
noexecute_msg: |
.asciz "No-execute pages not supported. System halted." |
fx_msg: |
.asciz "FXSAVE/FXRESTORE instructions not supported. System halted." |
sse2_msg: |
.asciz "SSE2 instructions not supported. System halted." |
/tags/0.3.0/kernel/arch/amd64/src/boot/memmap.c |
---|
0,0 → 1,41 |
/* |
* Copyright (c) 2005 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup amd64mm |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/boot/memmap.h> |
uint8_t e820counter = 0xff; |
e820memmap_t e820table[MEMMAP_E820_MAX_RECORDS]; |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/amd64/src/boot/vga323.pal |
---|
0,0 → 1,0 |
link ../../../ia32/src/boot/vga323.pal |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/arch/amd64/src/smp/ap.S |
---|
0,0 → 1,114 |
# |
# Copyright (c) 2008 Jakub Jermar |
# Copyright (c) 2005-2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
# |
# Init code for application processors. |
# |
#include <arch/boot/boot.h> |
#include <arch/boot/memmap.h> |
#include <arch/mm/page.h> |
#include <arch/pm.h> |
#include <arch/cpu.h> |
#include <arch/cpuid.h> |
.section K_TEXT_START, "ax" |
#ifdef CONFIG_SMP |
.global unmapped_ap_boot |
# This piece of code is real-mode and is meant to be alligned at 4K boundary. |
# The requirement for such an alignment comes from MP Specification's STARTUP |
# IPI requirements. |
.align 4096 |
unmapped_ap_boot: |
.code16 |
cli |
xorw %ax, %ax |
movw %ax, %ds |
lgdtl ap_gdtr # initialize Global Descriptor Table register |
movl %cr0, %eax |
orl $1, %eax |
movl %eax, %cr0 # switch to protected mode |
jmpl $gdtselector(KTEXT32_DES), $jump_to_kernel - BOOT_OFFSET + AP_BOOT_OFFSET |
jump_to_kernel: |
.code32 |
movw $gdtselector(KDATA_DES), %ax |
movw %ax, %ds |
movw %ax, %es |
movw %ax, %ss |
movw $gdtselector(UDATA_DES), %ax |
movw %ax, %gs |
# Enable 64-bit page transaltion entries - CR4.PAE = 1. |
# Paging is not enabled until after long mode is enabled |
movl %cr4, %eax |
btsl $5, %eax |
movl %eax, %cr4 |
leal ptl_0, %eax |
movl %eax, %cr3 |
# Enable long mode |
movl $EFER_MSR_NUM, %ecx # EFER MSR number |
rdmsr # Read EFER |
btsl $AMD_LME_FLAG, %eax # Set LME=1 |
wrmsr # Write EFER |
# Enable paging to activate long mode (set CR0.PG=1) |
movl %cr0, %eax |
btsl $31, %eax |
movl %eax, %cr0 |
# At this point we are in compatibility mode |
jmpl $gdtselector(KTEXT_DES), $start64 - BOOT_OFFSET + AP_BOOT_OFFSET |
.code64 |
start64: |
movq (ctx), %rsp |
call main_ap - AP_BOOT_OFFSET + BOOT_OFFSET # never returns |
#endif /* CONFIG_SMP */ |
.section K_DATA_START, "aw", @progbits |
#ifdef CONFIG_SMP |
.global unmapped_ap_gdtr |
unmapped_ap_gdtr: |
.word 0 |
.long 0 |
#endif /* CONFIG_SMP */ |
/tags/0.3.0/kernel/arch/amd64/src/smp/mps.c |
---|
0,0 → 1,0 |
link ../../../ia32/src/smp/mps.c |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/arch/amd64/src/smp/smp.c |
---|
0,0 → 1,0 |
link ../../../ia32/src/smp/smp.c |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/arch/amd64/src/smp/ipi.c |
---|
0,0 → 1,0 |
link ../../../ia32/src/smp/ipi.c |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/arch/amd64/src/smp/apic.c |
---|
0,0 → 1,0 |
link ../../../ia32/src/smp/apic.c |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/arch/amd64/src/pm.c |
---|
0,0 → 1,254 |
/* |
* Copyright (c) 2008 Jakub Jermar |
* Copyright (c) 2005-2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup amd64 |
* @{ |
*/ |
/** @file |
*/ |
#include <arch.h> |
#include <arch/pm.h> |
#include <arch/asm.h> |
#include <mm/as.h> |
#include <mm/frame.h> |
#include <memstr.h> |
#include <mm/slab.h> |
/* |
* There is no segmentation in long mode so we set up flat mode. In this |
* mode, we use, for each privilege level, two segments spanning the |
* whole memory. One is for code and one is for data. |
*/ |
descriptor_t gdt[GDT_ITEMS] = { |
/* NULL descriptor */ |
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, |
/* KTEXT descriptor */ |
{ .limit_0_15 = 0xffff, |
.base_0_15 = 0, |
.base_16_23 = 0, |
.access = AR_PRESENT | AR_CODE | DPL_KERNEL | AR_READABLE, |
.limit_16_19 = 0xf, |
.available = 0, |
.longmode = 1, |
.special = 0, |
.granularity = 1, |
.base_24_31 = 0 }, |
/* KDATA descriptor */ |
{ .limit_0_15 = 0xffff, |
.base_0_15 = 0, |
.base_16_23 = 0, |
.access = AR_PRESENT | AR_DATA | AR_WRITABLE | DPL_KERNEL, |
.limit_16_19 = 0xf, |
.available = 0, |
.longmode = 0, |
.special = 0, |
.granularity = 1, |
.base_24_31 = 0 }, |
/* UDATA descriptor */ |
{ .limit_0_15 = 0xffff, |
.base_0_15 = 0, |
.base_16_23 = 0, |
.access = AR_PRESENT | AR_DATA | AR_WRITABLE | DPL_USER, |
.limit_16_19 = 0xf, |
.available = 0, |
.longmode = 0, |
.special = 1, |
.granularity = 1, |
.base_24_31 = 0 }, |
/* UTEXT descriptor */ |
{ .limit_0_15 = 0xffff, |
.base_0_15 = 0, |
.base_16_23 = 0, |
.access = AR_PRESENT | AR_CODE | DPL_USER, |
.limit_16_19 = 0xf, |
.available = 0, |
.longmode = 1, |
.special = 0, |
.granularity = 1, |
.base_24_31 = 0 }, |
/* KTEXT 32-bit protected, for protected mode before long mode */ |
{ .limit_0_15 = 0xffff, |
.base_0_15 = 0, |
.base_16_23 = 0, |
.access = AR_PRESENT | AR_CODE | DPL_KERNEL | AR_READABLE, |
.limit_16_19 = 0xf, |
.available = 0, |
.longmode = 0, |
.special = 1, |
.granularity = 1, |
.base_24_31 = 0 }, |
/* TSS descriptor - set up will be completed later, |
* on AMD64 it is 64-bit - 2 items in table */ |
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, |
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, |
/* VESA Init descriptor */ |
#ifdef CONFIG_FB |
{ 0xffff, 0, VESA_INIT_SEGMENT >> 12, AR_PRESENT | AR_CODE | DPL_KERNEL, |
0xf, 0, 0, 0, 0, 0 |
} |
#endif |
}; |
idescriptor_t idt[IDT_ITEMS]; |
ptr_16_64_t gdtr = {.limit = sizeof(gdt), .base = (uint64_t) gdt }; |
ptr_16_64_t idtr = {.limit = sizeof(idt), .base = (uint64_t) idt }; |
static tss_t tss; |
tss_t *tss_p = NULL; |
void gdt_tss_setbase(descriptor_t *d, uintptr_t base) |
{ |
tss_descriptor_t *td = (tss_descriptor_t *) d; |
td->base_0_15 = base & 0xffff; |
td->base_16_23 = ((base) >> 16) & 0xff; |
td->base_24_31 = ((base) >> 24) & 0xff; |
td->base_32_63 = ((base) >> 32); |
} |
void gdt_tss_setlimit(descriptor_t *d, uint32_t limit) |
{ |
struct tss_descriptor *td = (tss_descriptor_t *) d; |
td->limit_0_15 = limit & 0xffff; |
td->limit_16_19 = (limit >> 16) & 0xf; |
} |
void idt_setoffset(idescriptor_t *d, uintptr_t offset) |
{ |
/* |
* Offset is a linear address. |
*/ |
d->offset_0_15 = offset & 0xffff; |
d->offset_16_31 = offset >> 16 & 0xffff; |
d->offset_32_63 = offset >> 32; |
} |
void tss_initialize(tss_t *t) |
{ |
memsetb((uintptr_t) t, sizeof(tss_t), 0); |
} |
/* |
* This function takes care of proper setup of IDT and IDTR. |
*/ |
void idt_init(void) |
{ |
idescriptor_t *d; |
int i; |
for (i = 0; i < IDT_ITEMS; i++) { |
d = &idt[i]; |
d->unused = 0; |
d->selector = gdtselector(KTEXT_DES); |
d->present = 1; |
d->type = AR_INTERRUPT; /* masking interrupt */ |
idt_setoffset(d, ((uintptr_t) interrupt_handlers) + |
i * interrupt_handler_size); |
} |
} |
/** Initialize segmentation - code/data/idt tables |
* |
*/ |
void pm_init(void) |
{ |
descriptor_t *gdt_p = (struct descriptor *) gdtr.base; |
tss_descriptor_t *tss_desc; |
/* |
* Each CPU has its private GDT and TSS. |
* All CPUs share one IDT. |
*/ |
if (config.cpu_active == 1) { |
idt_init(); |
/* |
* NOTE: bootstrap CPU has statically allocated TSS, because |
* the heap hasn't been initialized so far. |
*/ |
tss_p = &tss; |
} |
else { |
/* We are going to use malloc, which may return |
* non boot-mapped pointer, initialize the CR3 register |
* ahead of page_init */ |
write_cr3((uintptr_t) AS_KERNEL->genarch.page_table); |
tss_p = (struct tss *) malloc(sizeof(tss_t), FRAME_ATOMIC); |
if (!tss_p) |
panic("could not allocate TSS\n"); |
} |
tss_initialize(tss_p); |
tss_desc = (tss_descriptor_t *) (&gdt_p[TSS_DES]); |
tss_desc->present = 1; |
tss_desc->type = AR_TSS; |
tss_desc->dpl = PL_KERNEL; |
gdt_tss_setbase(&gdt_p[TSS_DES], (uintptr_t) tss_p); |
gdt_tss_setlimit(&gdt_p[TSS_DES], TSS_BASIC_SIZE - 1); |
gdtr_load(&gdtr); |
idtr_load(&idtr); |
/* |
* As of this moment, the current CPU has its own GDT pointing |
* to its own TSS. We just need to load the TR register. |
*/ |
tr_load(gdtselector(TSS_DES)); |
} |
/* Reboot the machine by initiating |
* a triple fault |
*/ |
void arch_reboot(void) |
{ |
preemption_disable(); |
ipl_t ipl = interrupts_disable(); |
memsetb((uintptr_t) idt, sizeof(idt), 0); |
idtr_load(&idtr); |
interrupts_restore(ipl); |
asm volatile ( |
"int $0x03\n" |
"cli\n" |
"hlt\n" |
); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/amd64/src/ddi/ddi.c |
---|
0,0 → 1,169 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup amd64ddi |
* @{ |
*/ |
/** @file |
*/ |
#include <ddi/ddi.h> |
#include <arch/ddi/ddi.h> |
#include <proc/task.h> |
#include <arch/types.h> |
#include <adt/bitmap.h> |
#include <mm/slab.h> |
#include <arch/pm.h> |
#include <errno.h> |
#include <arch/cpu.h> |
#include <arch.h> |
#include <align.h> |
/** Enable I/O space range for task. |
* |
* Interrupts are disabled and task is locked. |
* |
* @param task Task. |
* @param ioaddr Startign I/O space address. |
* @param size Size of the enabled I/O range. |
* |
* @return 0 on success or an error code from errno.h. |
*/ |
int ddi_iospace_enable_arch(task_t *task, uintptr_t ioaddr, size_t size) |
{ |
count_t bits; |
bits = ioaddr + size; |
if (bits > IO_PORTS) |
return ENOENT; |
if (task->arch.iomap.bits < bits) { |
bitmap_t oldiomap; |
uint8_t *newmap; |
/* |
* The I/O permission bitmap is too small and needs to be grown. |
*/ |
newmap = (uint8_t *) malloc(BITS2BYTES(bits), FRAME_ATOMIC); |
if (!newmap) |
return ENOMEM; |
bitmap_initialize(&oldiomap, task->arch.iomap.map, |
task->arch.iomap.bits); |
bitmap_initialize(&task->arch.iomap, newmap, bits); |
/* |
* Mark the new range inaccessible. |
*/ |
bitmap_set_range(&task->arch.iomap, oldiomap.bits, |
bits - oldiomap.bits); |
/* |
* In case there really existed smaller iomap, |
* copy its contents and deallocate it. |
*/ |
if (oldiomap.bits) { |
bitmap_copy(&task->arch.iomap, &oldiomap, |
oldiomap.bits); |
free(oldiomap.map); |
} |
} |
/* |
* Enable the range and we are done. |
*/ |
bitmap_clear_range(&task->arch.iomap, (index_t) ioaddr, (count_t) size); |
/* |
* Increment I/O Permission bitmap generation counter. |
*/ |
task->arch.iomapver++; |
return 0; |
} |
/** Install I/O Permission bitmap. |
* |
* Current task's I/O permission bitmap, if any, is installed |
* in the current CPU's TSS. |
* |
* Interrupts must be disabled prior this call. |
*/ |
void io_perm_bitmap_install(void) |
{ |
count_t bits; |
ptr_16_64_t cpugdtr; |
descriptor_t *gdt_p; |
tss_descriptor_t *tss_desc; |
count_t ver; |
/* First, copy the I/O Permission Bitmap. */ |
spinlock_lock(&TASK->lock); |
ver = TASK->arch.iomapver; |
if ((bits = TASK->arch.iomap.bits)) { |
bitmap_t iomap; |
ASSERT(TASK->arch.iomap.map); |
bitmap_initialize(&iomap, CPU->arch.tss->iomap, |
TSS_IOMAP_SIZE * 8); |
bitmap_copy(&iomap, &TASK->arch.iomap, TASK->arch.iomap.bits); |
/* |
* It is safe to set the trailing eight bits because of the |
* extra convenience byte in TSS_IOMAP_SIZE. |
*/ |
bitmap_set_range(&iomap, ALIGN_UP(TASK->arch.iomap.bits, 8), 8); |
} |
spinlock_unlock(&TASK->lock); |
/* |
* Second, adjust TSS segment limit. |
* Take the extra ending byte will all bits set into account. |
*/ |
gdtr_store(&cpugdtr); |
gdt_p = (descriptor_t *) cpugdtr.base; |
gdt_tss_setlimit(&gdt_p[TSS_DES], TSS_BASIC_SIZE + BITS2BYTES(bits)); |
gdtr_load(&cpugdtr); |
/* |
* Before we load new TSS limit, the current TSS descriptor |
* type must be changed to describe inactive TSS. |
*/ |
tss_desc = (tss_descriptor_t *) &gdt_p[TSS_DES]; |
tss_desc->type = AR_TSS; |
tr_load(gdtselector(TSS_DES)); |
/* |
* Update the generation count so that faults caused by |
* early accesses can be serviced. |
*/ |
CPU->arch.iomapver_copy = ver; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/amd64/src/syscall.c |
---|
0,0 → 1,71 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup amd64 |
* @{ |
*/ |
/** @file |
*/ |
#include <syscall/syscall.h> |
#include <arch/syscall.h> |
#include <panic.h> |
#include <arch/cpu.h> |
#include <arch/pm.h> |
#include <arch/asm.h> |
#include <print.h> |
#include <arch/cpu.h> |
extern void syscall_entry(void); |
/** Enable & setup support for SYSCALL/SYSRET */ |
void syscall_setup_cpu(void) |
{ |
/* Enable SYSCALL/SYSRET */ |
set_efer_flag(AMD_SCE_FLAG); |
/* Setup syscall entry address */ |
/* This is _mess_ - the 64-bit CS is argument + 16, |
* the SS is argument + 8. The order is: |
* +0(KDATA_DES), +8(UDATA_DES), +16(UTEXT_DES) |
*/ |
write_msr(AMD_MSR_STAR, |
((uint64_t)(gdtselector(KDATA_DES) | PL_USER) << 48) | |
((uint64_t)(gdtselector(KTEXT_DES) | PL_KERNEL) << 32)); |
write_msr(AMD_MSR_LSTAR, (uint64_t)syscall_entry); |
/* Mask RFLAGS on syscall |
* - disable interrupts, until we exchange the stack register |
* (mask the IE bit) |
*/ |
write_msr(AMD_MSR_SFMASK, 0x200); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/amd64/src/asm_utils.S |
---|
0,0 → 1,323 |
# |
# Copyright (c) 2005 Ondrej Palkovsky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
#define IREGISTER_SPACE 120 |
#define IOFFSET_RAX 0x0 |
#define IOFFSET_RBX 0x8 |
#define IOFFSET_RCX 0x10 |
#define IOFFSET_RDX 0x18 |
#define IOFFSET_RSI 0x20 |
#define IOFFSET_RDI 0x28 |
#define IOFFSET_R8 0x30 |
#define IOFFSET_R9 0x38 |
#define IOFFSET_R10 0x40 |
#define IOFFSET_R11 0x48 |
#define IOFFSET_R12 0x50 |
#define IOFFSET_R13 0x58 |
#define IOFFSET_R14 0x60 |
#define IOFFSET_R15 0x68 |
#define IOFFSET_RBP 0x70 |
# Mask for interrupts 0 - 31 (bits 0 - 31) where 0 means that int has no error word |
# and 1 means interrupt with error word |
#define ERROR_WORD_INTERRUPT_LIST 0x00027D00 |
#include <arch/pm.h> |
#include <arch/mm/page.h> |
.text |
.global interrupt_handlers |
.global syscall_entry |
.global panic_printf |
panic_printf: |
movq $halt, (%rsp) |
jmp printf |
.global cpuid |
.global has_cpuid |
.global get_cycle |
.global read_efer_flag |
.global set_efer_flag |
.global memcpy |
.global memcpy_from_uspace |
.global memcpy_to_uspace |
.global memcpy_from_uspace_failover_address |
.global memcpy_to_uspace_failover_address |
#define MEMCPY_DST %rdi |
#define MEMCPY_SRC %rsi |
#define MEMCPY_SIZE %rdx |
/** |
* Copy memory from/to userspace. |
* |
* This is almost conventional memcpy(). |
* The difference is that there is a failover part |
* to where control is returned from a page fault if |
* the page fault occurs during copy_from_uspace() |
* or copy_to_uspace(). |
* |
* @param MEMCPY_DST Destination address. |
* @param MEMCPY_SRC Source address. |
* @param MEMCPY_SIZE Number of bytes to copy. |
* |
* @retrun MEMCPY_SRC on success, 0 on failure. |
*/ |
memcpy: |
memcpy_from_uspace: |
memcpy_to_uspace: |
movq MEMCPY_SRC, %rax |
movq MEMCPY_SIZE, %rcx |
shrq $3, %rcx /* size / 8 */ |
rep movsq /* copy as much as possible word by word */ |
movq MEMCPY_SIZE, %rcx |
andq $7, %rcx /* size % 8 */ |
jz 0f |
rep movsb /* copy the rest byte by byte */ |
0: |
ret /* return MEMCPY_SRC, success */ |
memcpy_from_uspace_failover_address: |
memcpy_to_uspace_failover_address: |
xorq %rax, %rax /* return 0, failure */ |
ret |
## Determine CPUID support |
# |
# Return 0 in EAX if CPUID is not support, 1 if supported. |
# |
has_cpuid: |
pushfq # store flags |
popq %rax # read flags |
movq %rax,%rdx # copy flags |
btcl $21,%edx # swap the ID bit |
pushq %rdx |
popfq # propagate the change into flags |
pushfq |
popq %rdx # read flags |
andl $(1<<21),%eax # interested only in ID bit |
andl $(1<<21),%edx |
xorl %edx,%eax # 0 if not supported, 1 if supported |
ret |
cpuid: |
movq %rbx, %r10 # we have to preserve rbx across function calls |
movl %edi,%eax # load the command into %eax |
cpuid |
movl %eax,0(%rsi) |
movl %ebx,4(%rsi) |
movl %ecx,8(%rsi) |
movl %edx,12(%rsi) |
movq %r10, %rbx |
ret |
get_cycle: |
xorq %rax,%rax |
rdtsc |
ret |
set_efer_flag: |
movq $0xc0000080, %rcx |
rdmsr |
btsl %edi, %eax |
wrmsr |
ret |
read_efer_flag: |
movq $0xc0000080, %rcx |
rdmsr |
ret |
# Push all general purpose registers on stack except %rbp, %rsp |
.macro save_all_gpr |
movq %rax, IOFFSET_RAX(%rsp) |
movq %rcx, IOFFSET_RCX(%rsp) |
movq %rdx, IOFFSET_RDX(%rsp) |
movq %rsi, IOFFSET_RSI(%rsp) |
movq %rdi, IOFFSET_RDI(%rsp) |
movq %r8, IOFFSET_R8(%rsp) |
movq %r9, IOFFSET_R9(%rsp) |
movq %r10, IOFFSET_R10(%rsp) |
movq %r11, IOFFSET_R11(%rsp) |
#ifdef CONFIG_DEBUG_ALLREGS |
movq %rbx, IOFFSET_RBX(%rsp) |
movq %rbp, IOFFSET_RBP(%rsp) |
movq %r12, IOFFSET_R12(%rsp) |
movq %r13, IOFFSET_R13(%rsp) |
movq %r14, IOFFSET_R14(%rsp) |
movq %r15, IOFFSET_R15(%rsp) |
#endif |
.endm |
.macro restore_all_gpr |
movq IOFFSET_RAX(%rsp), %rax |
movq IOFFSET_RCX(%rsp), %rcx |
movq IOFFSET_RDX(%rsp), %rdx |
movq IOFFSET_RSI(%rsp), %rsi |
movq IOFFSET_RDI(%rsp), %rdi |
movq IOFFSET_R8(%rsp), %r8 |
movq IOFFSET_R9(%rsp), %r9 |
movq IOFFSET_R10(%rsp), %r10 |
movq IOFFSET_R11(%rsp), %r11 |
#ifdef CONFIG_DEBUG_ALLREGS |
movq IOFFSET_RBX(%rsp), %rbx |
movq IOFFSET_RBP(%rsp), %rbp |
movq IOFFSET_R12(%rsp), %r12 |
movq IOFFSET_R13(%rsp), %r13 |
movq IOFFSET_R14(%rsp), %r14 |
movq IOFFSET_R15(%rsp), %r15 |
#endif |
.endm |
#ifdef CONFIG_DEBUG_ALLREGS |
# define INTERRUPT_ALIGN 256 |
#else |
# define INTERRUPT_ALIGN 128 |
#endif |
## Declare interrupt handlers |
# |
# Declare interrupt handlers for n interrupt |
# vectors starting at vector i. |
# |
# The handlers call exc_dispatch(). |
# |
.macro handler i n |
/* |
* Choose between version with error code and version without error |
* code. Both versions have to be of the same size. amd64 assembly is, |
* however, a little bit tricky. For instance, subq $0x80, %rsp and |
* subq $0x78, %rsp can result in two instructions with different |
* op-code lengths. |
* Therefore we align the interrupt handlers. |
*/ |
.iflt \i-32 |
.if (1 << \i) & ERROR_WORD_INTERRUPT_LIST |
/* |
* Version with error word. |
*/ |
subq $IREGISTER_SPACE, %rsp |
.else |
/* |
* Version without error word, |
*/ |
subq $(IREGISTER_SPACE+8), %rsp |
.endif |
.else |
/* |
* Version without error word, |
*/ |
subq $(IREGISTER_SPACE+8), %rsp |
.endif |
save_all_gpr |
movq $(\i), %rdi # %rdi - first parameter |
movq %rsp, %rsi # %rsi - pointer to istate |
call exc_dispatch # exc_dispatch(i, istate) |
restore_all_gpr |
# $8 = Skip error word |
addq $(IREGISTER_SPACE+8), %rsp |
iretq |
.align INTERRUPT_ALIGN |
.if (\n-\i)-1 |
handler "(\i+1)",\n |
.endif |
.endm |
.align INTERRUPT_ALIGN |
interrupt_handlers: |
h_start: |
handler 0 IDT_ITEMS |
h_end: |
## Low-level syscall handler |
# |
# Registers on entry: |
# |
# @param rcx Userspace return address. |
# @param r11 Userspace RLFAGS. |
# |
# @param rax Syscall number. |
# @param rdi 1st syscall argument. |
# @param rsi 2nd syscall argument. |
# @param rdx 3rd syscall argument. |
# @param r10 4th syscall argument. Used instead of RCX because the |
# SYSCALL instruction clobbers it. |
# @param r8 5th syscall argument. |
# @param r9 6th syscall argument. |
# |
# @return Return value is in rax. |
# |
syscall_entry: |
swapgs # Switch to hidden gs |
# |
# %gs:0 Scratch space for this thread's user RSP |
# %gs:8 Address to be used as this thread's kernel RSP |
# |
movq %rsp, %gs:0 # Save this thread's user RSP |
movq %gs:8, %rsp # Set this thread's kernel RSP |
swapgs # Switch back to remain consistent |
sti |
pushq %rcx |
pushq %r11 |
movq %r10, %rcx # Copy the 4th argument where it is expected |
pushq %rax |
call syscall_handler |
addq $8, %rsp |
popq %r11 |
popq %rcx |
cli |
swapgs |
movq %gs:0, %rsp # Restore the user RSP |
swapgs |
sysretq |
.data |
.global interrupt_handler_size |
interrupt_handler_size: .quad (h_end-h_start)/IDT_ITEMS |
/tags/0.3.0/kernel/arch/amd64/src/proc/scheduler.c |
---|
0,0 → 1,85 |
/* |
* Copyright (c) 2005 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup amd64proc |
* @{ |
*/ |
/** @file |
*/ |
#include <proc/scheduler.h> |
#include <cpu.h> |
#include <proc/task.h> |
#include <proc/thread.h> |
#include <arch.h> |
#include <arch/context.h> /* SP_DELTA */ |
#include <arch/asm.h> |
#include <arch/debugger.h> |
#include <print.h> |
#include <arch/pm.h> |
#include <arch/ddi/ddi.h> |
/** Perform amd64 specific tasks needed before the new task is run. |
* |
* Interrupts are disabled. |
*/ |
void before_task_runs_arch(void) |
{ |
io_perm_bitmap_install(); |
} |
/** Perform amd64 specific tasks needed before the new thread is scheduled. */ |
void before_thread_runs_arch(void) |
{ |
CPU->arch.tss->rsp0 = |
(uintptr_t) &THREAD->kstack[THREAD_STACK_SIZE - SP_DELTA]; |
/* |
* Syscall support. |
*/ |
swapgs(); |
write_msr(AMD_MSR_GS, (uintptr_t)THREAD->arch.syscall_rsp); |
swapgs(); |
/* TLS support - set FS to thread local storage */ |
write_msr(AMD_MSR_FS, THREAD->arch.tls); |
#ifdef CONFIG_DEBUG_AS_WATCHPOINT |
/* Set watchpoint on AS to ensure that nobody sets it to zero */ |
if (CPU->id < BKPOINTS_MAX) |
breakpoint_add(&((the_t *) THREAD->kstack)->as, |
BKPOINT_WRITE | BKPOINT_CHECK_ZERO, CPU->id); |
#endif |
} |
void after_thread_ran_arch(void) |
{ |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/amd64/src/proc/thread.c |
---|
0,0 → 1,53 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup amd64proc |
* @{ |
*/ |
/** @file |
*/ |
#include <proc/thread.h> |
/** Perform amd64 specific thread initialization. |
* |
* @param t Thread to be initialized. |
*/ |
void thread_create_arch(thread_t *t) |
{ |
t->arch.tls = 0; |
t->arch.syscall_rsp[SYSCALL_USTACK_RSP] = 0; |
/* |
* Kernel RSP can be precalculated at thread creation time. |
*/ |
t->arch.syscall_rsp[SYSCALL_KSTACK_RSP] = |
(uintptr_t)&t->kstack[PAGE_SIZE - sizeof(uint64_t)]; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/amd64/src/proc/task.c |
---|
0,0 → 1,60 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup amd64proc |
* @{ |
*/ |
/** @file |
*/ |
#include <proc/task.h> |
#include <mm/slab.h> |
#include <arch/types.h> |
/** Perform amd64 specific task initialization. |
* |
* @param t Task to be initialized. |
*/ |
void task_create_arch(task_t *t) |
{ |
t->arch.iomapver = 0; |
bitmap_initialize(&t->arch.iomap, NULL, 0); |
} |
/** Perform amd64 specific task destruction. |
* |
* @param t Task to be initialized. |
*/ |
void task_destroy_arch(task_t *t) |
{ |
if (t->arch.iomap.map) |
free(t->arch.iomap.map); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/amd64/src/interrupt.c |
---|
0,0 → 1,236 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup amd64interrupt |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/interrupt.h> |
#include <print.h> |
#include <debug.h> |
#include <panic.h> |
#include <arch/drivers/i8259.h> |
#include <func.h> |
#include <cpu.h> |
#include <arch/asm.h> |
#include <mm/tlb.h> |
#include <mm/as.h> |
#include <arch.h> |
#include <symtab.h> |
#include <arch/asm.h> |
#include <proc/scheduler.h> |
#include <proc/thread.h> |
#include <proc/task.h> |
#include <synch/spinlock.h> |
#include <arch/ddi/ddi.h> |
#include <interrupt.h> |
#include <ddi/irq.h> |
/* |
* Interrupt and exception dispatching. |
*/ |
void (* disable_irqs_function)(uint16_t irqmask) = NULL; |
void (* enable_irqs_function)(uint16_t irqmask) = NULL; |
void (* eoi_function)(void) = NULL; |
void decode_istate(int n, istate_t *istate) |
{ |
char *symbol; |
/* uint64_t *x = &istate->stack[0]; */ |
if (!(symbol = get_symtab_entry(istate->rip))) |
symbol = ""; |
printf("-----EXCEPTION(%d) OCCURED----- ( %s )\n", n, __func__); |
printf("%%rip: %#llx (%s)\n", istate->rip, symbol); |
printf("ERROR_WORD=%#llx\n", istate->error_word); |
printf("%%cs=%#llx, rflags=%#llx, %%cr0=%#llx\n", istate->cs, |
istate->rflags, read_cr0()); |
printf("%%rax=%#llx, %%rcx=%#llx, %%rdx=%#llx\n", istate->rax, |
istate->rcx, istate->rdx); |
printf("%%rsi=%#llx, %%rdi=%#llx, %%r8=%#llx\n", istate->rsi, |
istate->rdi, istate->r8); |
printf("%%r9=%#llx, %%r10=%#llx, %%r11=%#llx\n", istate->r9, |
istate->r10, istate->r11); |
#ifdef CONFIG_DEBUG_ALLREGS |
printf("%%r12=%#llx, %%r13=%#llx, %%r14=%#llx\n", istate->r12, |
istate->r13, istate->r14); |
printf("%%r15=%#llx, %%rbx=%#llx, %%rbp=%#llx\n", istate->r15, |
istate->rbx, &istate->rbp); |
#endif |
printf("%%rsp=%#llx\n", &istate->stack[0]); |
} |
static void trap_virtual_eoi(void) |
{ |
if (eoi_function) |
eoi_function(); |
else |
panic("no eoi_function\n"); |
} |
static void null_interrupt(int n, istate_t *istate) |
{ |
fault_if_from_uspace(istate, "unserviced interrupt: %d", n); |
decode_istate(n, istate); |
panic("unserviced interrupt\n"); |
} |
/** General Protection Fault. */ |
static void gp_fault(int n, istate_t *istate) |
{ |
if (TASK) { |
count_t ver; |
spinlock_lock(&TASK->lock); |
ver = TASK->arch.iomapver; |
spinlock_unlock(&TASK->lock); |
if (CPU->arch.iomapver_copy != ver) { |
/* |
* This fault can be caused by an early access |
* to I/O port because of an out-dated |
* I/O Permission bitmap installed on CPU. |
* Install the fresh copy and restart |
* the instruction. |
*/ |
io_perm_bitmap_install(); |
return; |
} |
fault_if_from_uspace(istate, "general protection fault"); |
} |
decode_istate(n, istate); |
panic("general protection fault\n"); |
} |
static void ss_fault(int n, istate_t *istate) |
{ |
fault_if_from_uspace(istate, "stack fault"); |
decode_istate(n, istate); |
panic("stack fault\n"); |
} |
static void nm_fault(int n, istate_t *istate) |
{ |
#ifdef CONFIG_FPU_LAZY |
scheduler_fpu_lazy_request(); |
#else |
fault_if_from_uspace(istate, "fpu fault"); |
panic("fpu fault"); |
#endif |
} |
static void tlb_shootdown_ipi(int n, istate_t *istate) |
{ |
trap_virtual_eoi(); |
tlb_shootdown_ipi_recv(); |
} |
/** Handler of IRQ exceptions */ |
static void irq_interrupt(int n, istate_t *istate) |
{ |
ASSERT(n >= IVT_IRQBASE); |
int inum = n - IVT_IRQBASE; |
bool ack = false; |
ASSERT(inum < IRQ_COUNT); |
ASSERT((inum != IRQ_PIC_SPUR) && (inum != IRQ_PIC1)); |
irq_t *irq = irq_dispatch_and_lock(inum); |
if (irq) { |
/* |
* The IRQ handler was found. |
*/ |
if (irq->preack) { |
/* Send EOI before processing the interrupt */ |
trap_virtual_eoi(); |
ack = true; |
} |
irq->handler(irq, irq->arg); |
spinlock_unlock(&irq->lock); |
} else { |
/* |
* Spurious interrupt. |
*/ |
#ifdef CONFIG_DEBUG |
printf("cpu%d: spurious interrupt (inum=%d)\n", CPU->id, inum); |
#endif |
} |
if (!ack) |
trap_virtual_eoi(); |
} |
void interrupt_init(void) |
{ |
int i; |
for (i = 0; i < IVT_ITEMS; i++) |
exc_register(i, "null", (iroutine) null_interrupt); |
for (i = 0; i < IRQ_COUNT; i++) { |
if ((i != IRQ_PIC_SPUR) && (i != IRQ_PIC1)) |
exc_register(IVT_IRQBASE + i, "irq", |
(iroutine) irq_interrupt); |
} |
exc_register(7, "nm_fault", (iroutine) nm_fault); |
exc_register(12, "ss_fault", (iroutine) ss_fault); |
exc_register(13, "gp_fault", (iroutine) gp_fault); |
exc_register(14, "ident_mapper", (iroutine) ident_page_fault); |
#ifdef CONFIG_SMP |
exc_register(VECTOR_TLB_SHOOTDOWN_IPI, "tlb_shootdown", |
(iroutine) tlb_shootdown_ipi); |
#endif |
} |
void trap_virtual_enable_irqs(uint16_t irqmask) |
{ |
if (enable_irqs_function) |
enable_irqs_function(irqmask); |
else |
panic("no enable_irqs_function\n"); |
} |
void trap_virtual_disable_irqs(uint16_t irqmask) |
{ |
if (disable_irqs_function) |
disable_irqs_function(irqmask); |
else |
panic("no disable_irqs_function\n"); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/amd64/src/fpu_context.c |
---|
0,0 → 1,65 |
/* |
* Copyright (c) 2005 Jakub Vana |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup amd64 |
* @{ |
*/ |
/** @file |
* |
*/ |
#include <fpu_context.h> |
/** Save FPU (mmx, sse) context using fxsave instruction */ |
void fpu_context_save(fpu_context_t *fctx) |
{ |
asm volatile ( |
"fxsave %0" |
: "=m"(*fctx) |
); |
} |
/** Restore FPU (mmx,sse) context using fxrstor instruction */ |
void fpu_context_restore(fpu_context_t *fctx) |
{ |
asm volatile ( |
"fxrstor %0" |
: "=m"(*fctx) |
); |
} |
void fpu_init() |
{ |
/* TODO: Zero all SSE, MMX etc. registers */ |
asm volatile ( |
"fninit;" |
); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/amd64/src/cpu/cpu.c |
---|
0,0 → 1,168 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup amd64 |
* @{ |
*/ |
/** @file |
*/ |
#include <cpu.h> |
#include <arch/cpu.h> |
#include <arch/cpuid.h> |
#include <arch/pm.h> |
#include <arch.h> |
#include <arch/types.h> |
#include <print.h> |
#include <fpu_context.h> |
/* |
* Identification of CPUs. |
* Contains only non-MP-Specification specific SMP code. |
*/ |
#define AMD_CPUID_EBX 0x68747541 |
#define AMD_CPUID_ECX 0x444d4163 |
#define AMD_CPUID_EDX 0x69746e65 |
#define INTEL_CPUID_EBX 0x756e6547 |
#define INTEL_CPUID_ECX 0x6c65746e |
#define INTEL_CPUID_EDX 0x49656e69 |
enum vendor { |
VendorUnknown = 0, |
VendorAMD, |
VendorIntel |
}; |
static char *vendor_str[] = { |
"Unknown Vendor", |
"AuthenticAMD", |
"GenuineIntel" |
}; |
/** Setup flags on processor so that we can use the FPU |
* |
* cr0.osfxsr = 1 -> we do support fxstor/fxrestor |
* cr0.em = 0 -> we do not emulate coprocessor |
* cr0.mp = 1 -> we do want lazy context switch |
*/ |
void cpu_setup_fpu(void) |
{ |
asm volatile ( |
"movq %%cr0, %%rax;" |
"btsq $1, %%rax;" /* cr0.mp */ |
"btrq $2, %%rax;" /* cr0.em */ |
"movq %%rax, %%cr0;" |
"movq %%cr4, %%rax;" |
"bts $9, %%rax;" /* cr4.osfxsr */ |
"movq %%rax, %%cr4;" |
: |
: |
:"%rax" |
); |
} |
/** Set the TS flag to 1. |
* |
* If a thread accesses coprocessor, exception is run, which |
* does a lazy fpu context switch. |
* |
*/ |
void fpu_disable(void) |
{ |
asm volatile ( |
"mov %%cr0,%%rax;" |
"bts $3,%%rax;" |
"mov %%rax,%%cr0;" |
: |
: |
:"%rax" |
); |
} |
void fpu_enable(void) |
{ |
asm volatile ( |
"mov %%cr0,%%rax;" |
"btr $3,%%rax;" |
"mov %%rax,%%cr0;" |
: |
: |
:"%rax" |
); |
} |
void cpu_arch_init(void) |
{ |
CPU->arch.tss = tss_p; |
CPU->arch.tss->iomap_base = &CPU->arch.tss->iomap[0] - ((uint8_t *) CPU->arch.tss); |
CPU->fpu_owner = NULL; |
} |
void cpu_identify(void) |
{ |
cpu_info_t info; |
CPU->arch.vendor = VendorUnknown; |
if (has_cpuid()) { |
cpuid(0, &info); |
/* |
* Check for AMD processor. |
*/ |
if (info.cpuid_ebx==AMD_CPUID_EBX && info.cpuid_ecx==AMD_CPUID_ECX && info.cpuid_edx==AMD_CPUID_EDX) { |
CPU->arch.vendor = VendorAMD; |
} |
/* |
* Check for Intel processor. |
*/ |
if (info.cpuid_ebx==INTEL_CPUID_EBX && info.cpuid_ecx==INTEL_CPUID_ECX && info.cpuid_edx==INTEL_CPUID_EDX) { |
CPU->arch.vendor = VendorIntel; |
} |
cpuid(1, &info); |
CPU->arch.family = (info.cpuid_eax>>8)&0xf; |
CPU->arch.model = (info.cpuid_eax>>4)&0xf; |
CPU->arch.stepping = (info.cpuid_eax>>0)&0xf; |
} |
} |
void cpu_print_report(cpu_t* m) |
{ |
printf("cpu%d: (%s family=%d model=%d stepping=%d) %dMHz\n", |
m->id, vendor_str[m->arch.vendor], m->arch.family, m->arch.model, m->arch.stepping, |
m->frequency_mhz); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/amd64/src/userspace.c |
---|
0,0 → 1,81 |
/* |
* Copyright (c) 2005 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup amd64 |
* @{ |
*/ |
/** @file |
*/ |
#include <userspace.h> |
#include <arch/pm.h> |
#include <arch/types.h> |
#include <arch.h> |
#include <proc/uarg.h> |
#include <mm/as.h> |
/** Enter userspace |
* |
* Change CPU protection level to 3, enter userspace. |
* |
*/ |
void userspace(uspace_arg_t *kernel_uarg) |
{ |
ipl_t ipl; |
ipl = interrupts_disable(); |
/* Clear CF,PF,AF,ZF,SF,DF,OF */ |
ipl &= ~(0xcd4); |
asm volatile ("" |
"pushq %0\n" |
"pushq %1\n" |
"pushq %2\n" |
"pushq %3\n" |
"pushq %4\n" |
"movq %5, %%rax\n" |
"iretq\n" |
: : |
"i" (gdtselector(UDATA_DES) | PL_USER), |
"r" (kernel_uarg->uspace_stack+THREAD_STACK_SIZE), |
"r" (ipl), |
"i" (gdtselector(UTEXT_DES) | PL_USER), |
"r" (kernel_uarg->uspace_entry), |
"r" (kernel_uarg->uspace_uarg) |
: "rax" |
); |
/* Unreachable */ |
for(;;) |
; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/amd64/src/delay.S |
---|
0,0 → 1,46 |
# |
# Copyright (c) 2001-2004 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
# |
# Micro second delay loop functions. |
# |
.text |
.global asm_delay_loop |
.global asm_fake_loop |
asm_delay_loop: |
0: dec %rdi |
jnz 0b |
ret |
asm_fake_loop: |
0: dec %rdi |
jz 0b |
ret |
/tags/0.3.0/kernel/arch/amd64/src/bios |
---|
0,0 → 1,0 |
link ../../ia32/src/bios |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/arch/amd64/src/drivers |
---|
0,0 → 1,0 |
link ../../ia32/src/drivers |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/arch/amd64/Makefile.inc |
---|
0,0 → 1,122 |
# |
# Copyright (c) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
## Toolchain configuration |
# |
BFD_NAME = elf64-x86-64 |
BFD_ARCH = i386:x86-64 |
BFD = binary |
TARGET = amd64-linux-gnu |
TOOLCHAIN_DIR = /usr/local/amd64 |
CMN1 = -m64 -mcmodel=kernel -mno-red-zone -fno-unwind-tables |
GCC_CFLAGS += $(CMN1) |
ICC_CFLAGS += $(CMN1) |
SUNCC_CFLAGS += -m64 -xmodel=kernel |
DEFS += -DMACHINE=$(MACHINE) -D__64_BITS__ |
## Accepted CPUs |
# |
ifeq ($(MACHINE),opteron) |
CMN2 := -march=opteron |
GCC_CFLAGS += $(CMN2) |
ICC_CFLAGS += $(CMN2) |
SUNCC_CFLAGS += -xtarget=opteron |
DEFS += -DFENCES=p4 |
endif |
## Own configuration directives |
# |
CONFIG_ACPI = y |
## Compile with hierarchical page tables support. |
# |
CONFIG_PAGE_PT = y |
DEFS += -DCONFIG_PAGE_PT |
## Compile with i8042 support. |
# |
CONFIG_I8042 = y |
DEFS += -DCONFIG_I8042 |
## Accepted configuration directives |
# |
ifeq ($(CONFIG_SMP),y) |
DEFS += -DCONFIG_SMP |
endif |
ifeq ($(CONFIG_HT),y) |
DEFS += -DCONFIG_HT |
endif |
ifeq ($(CONFIG_SIMICS_FIX),y) |
DEFS += -DCONFIG_SIMICS_FIX |
endif |
ARCH_SOURCES = \ |
arch/$(ARCH)/src/fpu_context.c \ |
arch/$(ARCH)/src/boot/boot.S \ |
arch/$(ARCH)/src/boot/memmap.c \ |
arch/$(ARCH)/src/pm.c \ |
arch/$(ARCH)/src/context.S \ |
arch/$(ARCH)/src/ddi/ddi.c \ |
arch/$(ARCH)/src/drivers/ega.c \ |
arch/$(ARCH)/src/drivers/vesa.c \ |
arch/$(ARCH)/src/drivers/i8254.c \ |
arch/$(ARCH)/src/drivers/i8259.c \ |
arch/$(ARCH)/src/delay.S \ |
arch/$(ARCH)/src/amd64.c \ |
arch/$(ARCH)/src/bios/bios.c \ |
arch/$(ARCH)/src/interrupt.c \ |
arch/$(ARCH)/src/mm/as.c \ |
arch/$(ARCH)/src/mm/frame.c \ |
arch/$(ARCH)/src/mm/page.c \ |
arch/$(ARCH)/src/mm/tlb.c \ |
arch/$(ARCH)/src/asm_utils.S \ |
arch/$(ARCH)/src/cpu/cpu.c \ |
arch/$(ARCH)/src/proc/scheduler.c \ |
arch/$(ARCH)/src/proc/task.c \ |
arch/$(ARCH)/src/proc/thread.c \ |
arch/$(ARCH)/src/userspace.c \ |
arch/$(ARCH)/src/syscall.c \ |
arch/$(ARCH)/src/debugger.c |
ifeq ($(CONFIG_SMP),y) |
ARCH_SOURCES += \ |
arch/$(ARCH)/src/smp/ap.S \ |
arch/$(ARCH)/src/smp/apic.c \ |
arch/$(ARCH)/src/smp/ipi.c \ |
arch/$(ARCH)/src/smp/mps.c \ |
arch/$(ARCH)/src/smp/smp.c |
endif |
/tags/0.3.0/kernel/arch/amd64/_link.ld.in |
---|
0,0 → 1,64 |
/** AMD64 linker script |
* |
* umapped section: |
* kernel text |
* kernel data |
* mapped section: |
* kernel text |
* kernel data |
*/ |
#include <arch/boot/boot.h> |
#include <arch/mm/page.h> |
SECTIONS { |
.unmapped BOOT_OFFSET: AT (0) { |
unmapped_ktext_start = .; |
*(K_TEXT_START); |
unmapped_ktext_end = .; |
unmapped_kdata_start = .; |
*(K_DATA_START); |
*(K_INI_PTLS); |
unmapped_kdata_end = .; |
} |
.mapped (PA2KA(BOOT_OFFSET)+SIZEOF(.unmapped)) : AT (SIZEOF(.unmapped)) { |
ktext_start = .; |
*(.text); |
ktext_end = .; |
kdata_start = .; |
*(.data); /* initialized data */ |
*(.rodata*); /* string literals */ |
hardcoded_load_address = .; |
QUAD(PA2KA(BOOT_OFFSET)); |
hardcoded_ktext_size = .; |
QUAD(ktext_end - ktext_start + (unmapped_ktext_end - unmapped_ktext_start)); |
hardcoded_kdata_size = .; |
QUAD(kdata_end - kdata_start + (unmapped_kdata_end - unmapped_kdata_start)); |
hardcoded_unmapped_ktext_size = .; |
QUAD(unmapped_ktext_end - unmapped_ktext_start); |
hardcoded_unmapped_kdata_size = .; |
QUAD(unmapped_kdata_end - unmapped_kdata_start); |
*(COMMON); /* global variables */ |
*(.eh_frame); |
symbol_table = .; |
*(symtab.*); /* Symbol table, must be LAST symbol!*/ |
*(.bss); /* uninitialized static variables */ |
kdata_end = .; |
} |
#ifdef CONFIG_SMP |
_hardcoded_unmapped_size = (unmapped_ktext_end - unmapped_ktext_start) + (unmapped_kdata_end - unmapped_kdata_start); |
ap_boot = unmapped_ap_boot - BOOT_OFFSET + AP_BOOT_OFFSET; |
ap_gdtr = unmapped_ap_gdtr - BOOT_OFFSET + AP_BOOT_OFFSET; |
protected_ap_gdtr = PA2KA(ap_gdtr); |
#endif /* CONFIG_SMP */ |
} |
/tags/0.3.0/kernel/arch/ia32/src/context.S |
---|
0,0 → 1,67 |
# |
# Copyright (c) 2001-2004 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
#include <arch/context_offset.h> |
.text |
.global context_save_arch |
.global context_restore_arch |
## Save current CPU context |
# |
# Save CPU context to the context_t variable |
# pointed by the 1st argument. Returns 1 in EAX. |
# |
context_save_arch: |
movl 0(%esp),%eax # save pc value into eax |
movl 4(%esp),%edx # address of the context variable to save context to |
# save registers to given structure |
CONTEXT_SAVE_ARCH_CORE %edx %eax |
xorl %eax,%eax # context_save returns 1 |
incl %eax |
ret |
## Restore saved CPU context |
# |
# Restore CPU context from context_t variable |
# pointed by the 1st argument. Returns 0 in EAX. |
# |
context_restore_arch: |
movl 4(%esp),%eax # address of the context variable to restore context from |
# restore registers from given structure |
CONTEXT_RESTORE_ARCH_CORE %eax %edx |
movl %edx,0(%esp) # put saved pc on stack |
xorl %eax,%eax # context_restore returns 0 |
ret |
/tags/0.3.0/kernel/arch/ia32/src/ia32.c |
---|
0,0 → 1,173 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32 |
* @{ |
*/ |
/** @file |
*/ |
#include <arch.h> |
#include <arch/types.h> |
#include <arch/pm.h> |
#include <arch/drivers/ega.h> |
#include <arch/drivers/vesa.h> |
#include <genarch/kbd/i8042.h> |
#include <arch/drivers/i8254.h> |
#include <arch/drivers/i8259.h> |
#include <arch/context.h> |
#include <config.h> |
#include <arch/interrupt.h> |
#include <arch/asm.h> |
#include <genarch/acpi/acpi.h> |
#include <arch/bios/bios.h> |
#include <interrupt.h> |
#include <ddi/irq.h> |
#include <arch/debugger.h> |
#include <proc/thread.h> |
#include <syscall/syscall.h> |
#include <console/console.h> |
#include <ddi/device.h> |
#ifdef CONFIG_SMP |
#include <arch/smp/apic.h> |
#endif |
void arch_pre_mm_init(void) |
{ |
pm_init(); |
if (config.cpu_active == 1) { |
interrupt_init(); |
bios_init(); |
/* PIC */ |
i8259_init(); |
} |
} |
void arch_post_mm_init(void) |
{ |
if (config.cpu_active == 1) { |
/* Initialize IRQ routing */ |
irq_init(IRQ_COUNT, IRQ_COUNT); |
/* hard clock */ |
i8254_init(); |
#ifdef CONFIG_FB |
if (vesa_present()) |
vesa_init(); |
else |
#endif |
ega_init(); /* video */ |
/* Enable debugger */ |
debugger_init(); |
/* Merge all memory zones to 1 big zone */ |
zone_merge_all(); |
} |
} |
void arch_post_cpu_init() |
{ |
#ifdef CONFIG_SMP |
if (config.cpu_active > 1) { |
l_apic_init(); |
l_apic_debug(); |
} |
#endif |
} |
void arch_pre_smp_init(void) |
{ |
if (config.cpu_active == 1) { |
#ifdef CONFIG_SMP |
acpi_init(); |
#endif /* CONFIG_SMP */ |
} |
} |
void arch_post_smp_init(void) |
{ |
devno_t kbd = device_assign_devno(); |
devno_t mouse = device_assign_devno(); |
/* keyboard controller */ |
i8042_init(kbd, IRQ_KBD, mouse, IRQ_MOUSE); |
} |
void calibrate_delay_loop(void) |
{ |
i8254_calibrate_delay_loop(); |
if (config.cpu_active == 1) { |
/* |
* This has to be done only on UP. |
* On SMP, i8254 is not used for time keeping and its interrupt pin remains masked. |
*/ |
i8254_normal_operation(); |
} |
} |
/** Set thread-local-storage pointer |
* |
* TLS pointer is set in GS register. That means, the GS contains |
* selector, and the descriptor->base is the correct address. |
*/ |
unative_t sys_tls_set(unative_t addr) |
{ |
THREAD->arch.tls = addr; |
set_tls_desc(addr); |
return 0; |
} |
/** Acquire console back for kernel |
* |
*/ |
void arch_grab_console(void) |
{ |
i8042_grab(); |
} |
/** Return console to userspace |
* |
*/ |
void arch_release_console(void) |
{ |
i8042_release(); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/src/boot/boot.S |
---|
0,0 → 1,555 |
# |
# Copyright (c) 2001-2004 Jakub Jermar |
# Copyright (c) 2005-2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
#include <arch/boot/boot.h> |
#include <arch/boot/memmap.h> |
#include <arch/mm/page.h> |
#include <arch/pm.h> |
#define START_STACK (BOOT_OFFSET - BOOT_STACK_SIZE) |
.section K_TEXT_START, "ax" |
.code32 |
.align 4 |
.global multiboot_image_start |
multiboot_header: |
.long MULTIBOOT_HEADER_MAGIC |
.long MULTIBOOT_HEADER_FLAGS |
.long -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS) # checksum |
.long multiboot_header |
.long unmapped_ktext_start |
.long 0 |
.long 0 |
.long multiboot_image_start |
multiboot_image_start: |
movl $START_STACK, %esp # initialize stack pointer |
lgdt KA2PA(bootstrap_gdtr) # initialize Global Descriptor Table register |
movw $selector(KDATA_DES), %cx |
movw %cx, %es |
movw %cx, %fs |
movw %cx, %gs |
movw %cx, %ds # kernel data + stack |
movw %cx, %ss |
jmpl $selector(KTEXT_DES), $multiboot_meeting_point |
multiboot_meeting_point: |
movl %eax, grub_eax # save parameters from GRUB |
movl %ebx, grub_ebx |
xorl %eax, %eax |
cpuid |
cmp $0x0, %eax # any function > 0? |
jbe pse_unsupported |
movl $0x1, %eax # Basic function code 1 |
cpuid |
bt $3, %edx # Test if PSE is supported |
jc pse_supported |
pse_unsupported: |
movl $pse_msg, %esi |
jmp error_halt |
pse_supported: |
#ifdef CONFIG_FB |
mov $vesa_init, %esi |
mov $VESA_INIT_SEGMENT << 4, %edi |
mov $e_vesa_init - vesa_init, %ecx |
cld |
rep movsb |
mov $VESA_INIT_SEGMENT << 4, %edi |
jmpl *%edi |
vesa_meeting_point: |
mov %esi, KA2PA(vesa_ph_addr) |
mov %di, KA2PA(vesa_height) |
shr $16, %edi |
mov %di, KA2PA(vesa_width) |
mov %bx, KA2PA(vesa_scanline) |
shr $16, %ebx |
mov %bx, KA2PA(vesa_bpp) |
#endif |
call map_kernel # map kernel and turn paging on |
movl grub_eax, %eax |
movl grub_ebx, %ebx |
cmpl $MULTIBOOT_LOADER_MAGIC, %eax # compare GRUB signature |
je valid_boot |
xorl %ecx, %ecx # no memory map available |
movl %ecx, e820counter |
jmp invalid_boot |
valid_boot: |
movl (%ebx), %eax # ebx = physical address of struct multiboot_info |
bt $3, %eax # mbi->flags[3] (mods_count, mods_addr valid) |
jc mods_valid |
xorl %ecx, %ecx |
movl %ecx, init |
jmp mods_end |
mods_valid: |
movl 20(%ebx), %ecx # mbi->mods_count |
movl %ecx, init |
cmpl $0, %ecx |
je mods_end |
movl 24(%ebx), %esi # mbi->mods_addr |
movl $init, %edi |
mods_loop: |
movl 0(%esi), %edx # mods->mod_start |
addl $0x80000000, %edx |
movl %edx, 4(%edi) |
movl 4(%esi), %edx |
subl 0(%esi), %edx # mods->mod_end - mods->mod_start |
movl %edx, 8(%edi) |
addl $16, %esi |
addl $8 , %edi |
loop mods_loop |
mods_end: |
bt $6, %eax # mbi->flags[6] (mmap_length, mmap_addr valid) |
jc mmap_valid |
xorl %edx, %edx |
jmp mmap_invalid |
mmap_valid: |
movl 44(%ebx), %ecx # mbi->mmap_length |
movl 48(%ebx), %esi # mbi->mmap_addr |
movl $e820table, %edi |
xorl %edx, %edx |
mmap_loop: |
cmpl $0, %ecx |
jle mmap_end |
movl 4(%esi), %eax # mmap->base_addr_low |
movl %eax, (%edi) |
movl 8(%esi), %eax # mmap->base_addr_high |
movl %eax, 4(%edi) |
movl 12(%esi), %eax # mmap->length_low |
movl %eax, 8(%edi) |
movl 16(%esi), %eax # mmap->length_high |
movl %eax, 12(%edi) |
movl 20(%esi), %eax # mmap->type |
movl %eax, 16(%edi) |
movl (%esi), %eax # mmap->size |
addl $0x4, %eax |
addl %eax, %esi |
subl %eax, %ecx |
addl $MEMMAP_E820_RECORD_SIZE, %edi |
incl %edx |
jmp mmap_loop |
mmap_end: |
mmap_invalid: |
movl %edx, e820counter |
invalid_boot: |
#ifdef CONFIG_SMP |
# copy AP bootstrap routines below 1 MB |
movl $BOOT_OFFSET, %esi |
movl $AP_BOOT_OFFSET, %edi |
movl $_hardcoded_unmapped_size, %ecx |
cld |
rep movsb |
#endif |
call main_bsp # never returns |
cli |
hlt |
.global map_kernel |
map_kernel: |
# |
# Here we setup mapping for both the unmapped and mapped sections of the kernel. |
# For simplicity, we map the entire 4G space. |
# |
movl %cr4, %ecx |
orl $(1 << 4), %ecx # turn PSE on |
andl $(~(1 << 5)), %ecx # turn PAE off |
movl %ecx, %cr4 |
movl $(page_directory + 0), %esi |
movl $(page_directory + 2048), %edi |
xorl %ecx, %ecx |
xorl %ebx, %ebx |
0: |
movl $((1 << 7) | (1 << 1) | (1 << 0)), %eax |
orl %ebx, %eax |
movl %eax, (%esi, %ecx, 4) # mapping 0x00000000 + %ecx * 4M => 0x00000000 + %ecx * 4M |
movl %eax, (%edi, %ecx, 4) # mapping 0x80000000 + %ecx * 4M => 0x00000000 + %ecx * 4M |
addl $(4 * 1024 * 1024), %ebx |
incl %ecx |
cmpl $512, %ecx |
jl 0b |
movl %esi, %cr3 |
movl %cr0, %ebx |
orl $(1 << 31), %ebx # turn paging on |
movl %ebx, %cr0 |
ret |
# Print string from %esi to EGA display (in red) and halt |
error_halt: |
movl $0xb8000, %edi # base of EGA text mode memory |
xorl %eax, %eax |
movw $0x3d4, %dx # read bits 8 - 15 of the cursor address |
movb $0xe, %al |
outb %al, %dx |
movw $0x3d5, %dx |
inb %dx, %al |
shl $8, %ax |
movw $0x3d4, %dx # read bits 0 - 7 of the cursor address |
movb $0xf, %al |
outb %al, %dx |
movw $0x3d5, %dx |
inb %dx, %al |
cmp $1920, %ax |
jbe cursor_ok |
movw $1920, %ax # sanity check for the cursor on the last line |
cursor_ok: |
movw %ax, %bx |
shl $1, %eax |
addl %eax, %edi |
movw $0x0c00, %ax # black background, light red foreground |
cld |
ploop: |
lodsb |
cmp $0, %al |
je ploop_end |
stosw |
inc %bx |
jmp ploop |
ploop_end: |
movw $0x3d4, %dx # write bits 8 - 15 of the cursor address |
movb $0xe, %al |
outb %al, %dx |
movw $0x3d5, %dx |
movb %bh, %al |
outb %al, %dx |
movw $0x3d4, %dx # write bits 0 - 7 of the cursor address |
movb $0xf, %al |
outb %al, %dx |
movw $0x3d5, %dx |
movb %bl, %al |
outb %al, %dx |
cli |
hlt |
#ifdef CONFIG_FB |
vesa_init: |
jmp $selector(VESA_INIT_DES), $vesa_init_real - vesa_init |
.code16 |
vesa_init_real: |
mov %cr0, %eax |
and $~1, %eax |
mov %eax, %cr0 |
jmp $VESA_INIT_SEGMENT, $vesa_init_real2 - vesa_init |
vesa_init_real2: |
mov $VESA_INIT_SEGMENT, %bx |
mov %bx, %es |
mov %bx, %fs |
mov %bx, %gs |
mov %bx, %ds |
mov %bx, %ss |
movl %esp, %eax |
movl $0x0000fffc, %esp |
movl $0x0000fffc, %ebp |
pushl %eax |
#define VESA_INFO_SIZE 1024 |
#define VESA_MODE_ATTRIBUTES_OFFSET 0 |
#define VESA_MODE_LIST_PTR_OFFSET 14 |
#define VESA_MODE_SCANLINE_OFFSET 16 |
#define VESA_MODE_WIDTH_OFFSET 18 |
#define VESA_MODE_HEIGHT_OFFSET 20 |
#define VESA_MODE_BPP_OFFSET 25 |
#define VESA_MODE_PHADDR_OFFSET 40 |
#define VESA_END_OF_MODES 0xffff |
#define VESA_OK 0x4f |
#define VESA_GET_INFO 0x4f00 |
#define VESA_GET_MODE_INFO 0x4f01 |
#define VESA_SET_MODE 0x4f02 |
#define VESA_SET_PALETTE 0x4f09 |
#if CONFIG_VESA_BPP == 24 |
#define CONFIG_VESA_BPP_VARIANT 32 |
#endif |
mov $VESA_GET_INFO, %ax |
mov $e_vesa_init - vesa_init, %di |
push %di |
int $0x10 |
pop %di |
cmp $VESA_OK, %al |
jnz 0f |
mov 2 + VESA_MODE_LIST_PTR_OFFSET(%di), %si |
mov %si, %gs |
mov VESA_MODE_LIST_PTR_OFFSET(%di), %si |
add $VESA_INFO_SIZE, %di |
1:# Try next mode |
mov %gs:(%si), %cx |
cmp $VESA_END_OF_MODES, %cx |
jz 0f |
inc %si |
inc %si |
push %cx |
push %di |
push %si |
mov $VESA_GET_MODE_INFO, %ax |
int $0x10 |
pop %si |
pop %di |
pop %cx |
cmp $VESA_OK, %al |
jnz 0f |
mov $CONFIG_VESA_WIDTH, %ax |
cmp VESA_MODE_WIDTH_OFFSET(%di), %ax |
jnz 1b |
mov $CONFIG_VESA_HEIGHT, %ax |
cmp VESA_MODE_HEIGHT_OFFSET(%di), %ax |
jnz 1b |
mov $CONFIG_VESA_BPP, %al |
cmp VESA_MODE_BPP_OFFSET(%di), %al |
#ifdef CONFIG_VESA_BPP_VARIANT |
jz 2f |
mov $CONFIG_VESA_BPP_VARIANT, %al |
cmp VESA_MODE_BPP_OFFSET(%di), %al |
#endif |
jnz 1b |
2: |
mov %cx, %bx |
or $0xc000, %bx |
push %di |
mov $VESA_SET_MODE, %ax |
int $0x10 |
pop %di |
cmp $VESA_OK, %al |
jnz 0f |
#if CONFIG_VESA_BPP == 8 |
# Set 3:2:3 VGA palette |
mov VESA_MODE_ATTRIBUTES_OFFSET(%di), %ax |
push %di |
mov $vga323 - vesa_init, %di |
mov $0x100, %ecx |
bt $5, %ax # Test if VGA compatible registers are present |
jnc vga_compat |
# Try VESA routine to set palette |
mov $VESA_SET_PALETTE, %ax |
xor %bl, %bl |
xor %dx, %dx |
int $0x10 |
jmp vga_not_compat |
vga_compat: |
# Try VGA registers to set palette |
movw $0x3c6, %dx # Set palette mask |
movb $0xff, %al |
outb %al, %dx |
movw $0x3c8, %dx # First index to set |
xor %al, %al |
outb %al, %dx |
movw $0x3c9, %dx # Data port |
vga_loop: |
movb %es:2(%di), %al |
outb %al, %dx |
movb %es:1(%di), %al |
outb %al, %dx |
movb %es:(%di), %al |
outb %al, %dx |
addw $4, %di |
loop vga_loop |
vga_not_compat: |
pop %di |
#endif |
mov VESA_MODE_PHADDR_OFFSET(%di), %esi |
mov VESA_MODE_WIDTH_OFFSET(%di), %ax |
shl $16, %eax |
mov VESA_MODE_HEIGHT_OFFSET(%di), %ax |
mov VESA_MODE_BPP_OFFSET(%di), %bl |
xor %bh, %bh |
shl $16, %ebx |
mov VESA_MODE_SCANLINE_OFFSET(%di), %bx |
mov %eax, %edi |
8: |
mov %cr0, %eax |
or $1, %eax |
mov %eax, %cr0 |
jmp 9f |
9: |
ljmpl $selector(KTEXT_DES), $(vesa_init_protect - vesa_init + VESA_INIT_SEGMENT << 4) |
0:# No prefered mode found |
mov $0x111, %cx |
push %di |
push %cx |
mov $VESA_GET_MODE_INFO, %ax |
int $0x10 |
pop %cx |
pop %di |
cmp $VESA_OK, %al |
jnz 1f |
jz 2b # Force relative jump |
1: |
mov $0x0003, %ax |
int $0x10 |
mov $0xffffffff, %edi # EGA text mode used, because of problems with VESA |
xor %ax, %ax |
jz 8b # Force relative jump |
vga323: |
#include "vga323.pal" |
.code32 |
vesa_init_protect: |
movw $selector(KDATA_DES), %cx |
movw %cx, %es |
movw %cx, %fs |
movw %cx, %gs |
movw %cx, %ds # kernel data + stack |
movw %cx, %ss |
movl $START_STACK, %esp # initialize stack pointer |
jmpl $selector(KTEXT_DES), $vesa_meeting_point |
.align 4 |
e_vesa_init: |
#endif |
.section K_DATA_START, "aw", @progbits |
.align 4096 |
page_directory: |
.space 4096, 0 |
grub_eax: |
.long 0 |
grub_ebx: |
.long 0 |
pse_msg: |
.asciz "Page Size Extension not supported. System halted." |
/tags/0.3.0/kernel/arch/ia32/src/boot/memmap.c |
---|
0,0 → 1,41 |
/* |
* Copyright (c) 2005 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32mm |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/boot/memmap.h> |
uint8_t e820counter = 0xff; |
e820memmap_t e820table[MEMMAP_E820_MAX_RECORDS]; |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/src/boot/vga323.pal |
---|
0,0 → 1,256 |
.byte 0x00, 0x00, 0x00, 0x00 |
.byte 0x09, 0x00, 0x00, 0x00 |
.byte 0x12, 0x00, 0x00, 0x00 |
.byte 0x1b, 0x00, 0x00, 0x00 |
.byte 0x24, 0x00, 0x00, 0x00 |
.byte 0x2d, 0x00, 0x00, 0x00 |
.byte 0x36, 0x00, 0x00, 0x00 |
.byte 0x3f, 0x00, 0x00, 0x00 |
.byte 0x00, 0x15, 0x00, 0x00 |
.byte 0x09, 0x15, 0x00, 0x00 |
.byte 0x12, 0x15, 0x00, 0x00 |
.byte 0x1b, 0x15, 0x00, 0x00 |
.byte 0x24, 0x15, 0x00, 0x00 |
.byte 0x2d, 0x15, 0x00, 0x00 |
.byte 0x36, 0x15, 0x00, 0x00 |
.byte 0x3f, 0x15, 0x00, 0x00 |
.byte 0x00, 0x2a, 0x00, 0x00 |
.byte 0x09, 0x2a, 0x00, 0x00 |
.byte 0x12, 0x2a, 0x00, 0x00 |
.byte 0x1b, 0x2a, 0x00, 0x00 |
.byte 0x24, 0x2a, 0x00, 0x00 |
.byte 0x2d, 0x2a, 0x00, 0x00 |
.byte 0x36, 0x2a, 0x00, 0x00 |
.byte 0x3f, 0x2a, 0x00, 0x00 |
.byte 0x00, 0x3f, 0x00, 0x00 |
.byte 0x09, 0x3f, 0x00, 0x00 |
.byte 0x12, 0x3f, 0x00, 0x00 |
.byte 0x1b, 0x3f, 0x00, 0x00 |
.byte 0x24, 0x3f, 0x00, 0x00 |
.byte 0x2d, 0x3f, 0x00, 0x00 |
.byte 0x36, 0x3f, 0x00, 0x00 |
.byte 0x3f, 0x3f, 0x00, 0x00 |
.byte 0x00, 0x00, 0x09, 0x00 |
.byte 0x09, 0x00, 0x09, 0x00 |
.byte 0x12, 0x00, 0x09, 0x00 |
.byte 0x1b, 0x00, 0x09, 0x00 |
.byte 0x24, 0x00, 0x09, 0x00 |
.byte 0x2d, 0x00, 0x09, 0x00 |
.byte 0x36, 0x00, 0x09, 0x00 |
.byte 0x3f, 0x00, 0x09, 0x00 |
.byte 0x00, 0x15, 0x09, 0x00 |
.byte 0x09, 0x15, 0x09, 0x00 |
.byte 0x12, 0x15, 0x09, 0x00 |
.byte 0x1b, 0x15, 0x09, 0x00 |
.byte 0x24, 0x15, 0x09, 0x00 |
.byte 0x2d, 0x15, 0x09, 0x00 |
.byte 0x36, 0x15, 0x09, 0x00 |
.byte 0x3f, 0x15, 0x09, 0x00 |
.byte 0x00, 0x2a, 0x09, 0x00 |
.byte 0x09, 0x2a, 0x09, 0x00 |
.byte 0x12, 0x2a, 0x09, 0x00 |
.byte 0x1b, 0x2a, 0x09, 0x00 |
.byte 0x24, 0x2a, 0x09, 0x00 |
.byte 0x2d, 0x2a, 0x09, 0x00 |
.byte 0x36, 0x2a, 0x09, 0x00 |
.byte 0x3f, 0x2a, 0x09, 0x00 |
.byte 0x00, 0x3f, 0x09, 0x00 |
.byte 0x09, 0x3f, 0x09, 0x00 |
.byte 0x12, 0x3f, 0x09, 0x00 |
.byte 0x1b, 0x3f, 0x09, 0x00 |
.byte 0x24, 0x3f, 0x09, 0x00 |
.byte 0x2d, 0x3f, 0x09, 0x00 |
.byte 0x36, 0x3f, 0x09, 0x00 |
.byte 0x3f, 0x3f, 0x09, 0x00 |
.byte 0x00, 0x00, 0x12, 0x00 |
.byte 0x09, 0x00, 0x12, 0x00 |
.byte 0x12, 0x00, 0x12, 0x00 |
.byte 0x1b, 0x00, 0x12, 0x00 |
.byte 0x24, 0x00, 0x12, 0x00 |
.byte 0x2d, 0x00, 0x12, 0x00 |
.byte 0x36, 0x00, 0x12, 0x00 |
.byte 0x3f, 0x00, 0x12, 0x00 |
.byte 0x00, 0x15, 0x12, 0x00 |
.byte 0x09, 0x15, 0x12, 0x00 |
.byte 0x12, 0x15, 0x12, 0x00 |
.byte 0x1b, 0x15, 0x12, 0x00 |
.byte 0x24, 0x15, 0x12, 0x00 |
.byte 0x2d, 0x15, 0x12, 0x00 |
.byte 0x36, 0x15, 0x12, 0x00 |
.byte 0x3f, 0x15, 0x12, 0x00 |
.byte 0x00, 0x2a, 0x12, 0x00 |
.byte 0x09, 0x2a, 0x12, 0x00 |
.byte 0x12, 0x2a, 0x12, 0x00 |
.byte 0x1b, 0x2a, 0x12, 0x00 |
.byte 0x24, 0x2a, 0x12, 0x00 |
.byte 0x2d, 0x2a, 0x12, 0x00 |
.byte 0x36, 0x2a, 0x12, 0x00 |
.byte 0x3f, 0x2a, 0x12, 0x00 |
.byte 0x00, 0x3f, 0x12, 0x00 |
.byte 0x09, 0x3f, 0x12, 0x00 |
.byte 0x12, 0x3f, 0x12, 0x00 |
.byte 0x1b, 0x3f, 0x12, 0x00 |
.byte 0x24, 0x3f, 0x12, 0x00 |
.byte 0x2d, 0x3f, 0x12, 0x00 |
.byte 0x36, 0x3f, 0x12, 0x00 |
.byte 0x3f, 0x3f, 0x12, 0x00 |
.byte 0x00, 0x00, 0x1b, 0x00 |
.byte 0x09, 0x00, 0x1b, 0x00 |
.byte 0x12, 0x00, 0x1b, 0x00 |
.byte 0x1b, 0x00, 0x1b, 0x00 |
.byte 0x24, 0x00, 0x1b, 0x00 |
.byte 0x2d, 0x00, 0x1b, 0x00 |
.byte 0x36, 0x00, 0x1b, 0x00 |
.byte 0x3f, 0x00, 0x1b, 0x00 |
.byte 0x00, 0x15, 0x1b, 0x00 |
.byte 0x09, 0x15, 0x1b, 0x00 |
.byte 0x12, 0x15, 0x1b, 0x00 |
.byte 0x1b, 0x15, 0x1b, 0x00 |
.byte 0x24, 0x15, 0x1b, 0x00 |
.byte 0x2d, 0x15, 0x1b, 0x00 |
.byte 0x36, 0x15, 0x1b, 0x00 |
.byte 0x3f, 0x15, 0x1b, 0x00 |
.byte 0x00, 0x2a, 0x1b, 0x00 |
.byte 0x09, 0x2a, 0x1b, 0x00 |
.byte 0x12, 0x2a, 0x1b, 0x00 |
.byte 0x1b, 0x2a, 0x1b, 0x00 |
.byte 0x24, 0x2a, 0x1b, 0x00 |
.byte 0x2d, 0x2a, 0x1b, 0x00 |
.byte 0x36, 0x2a, 0x1b, 0x00 |
.byte 0x3f, 0x2a, 0x1b, 0x00 |
.byte 0x00, 0x3f, 0x1b, 0x00 |
.byte 0x09, 0x3f, 0x1b, 0x00 |
.byte 0x12, 0x3f, 0x1b, 0x00 |
.byte 0x1b, 0x3f, 0x1b, 0x00 |
.byte 0x24, 0x3f, 0x1b, 0x00 |
.byte 0x2d, 0x3f, 0x1b, 0x00 |
.byte 0x36, 0x3f, 0x1b, 0x00 |
.byte 0x3f, 0x3f, 0x1b, 0x00 |
.byte 0x00, 0x00, 0x24, 0x00 |
.byte 0x09, 0x00, 0x24, 0x00 |
.byte 0x12, 0x00, 0x24, 0x00 |
.byte 0x1b, 0x00, 0x24, 0x00 |
.byte 0x24, 0x00, 0x24, 0x00 |
.byte 0x2d, 0x00, 0x24, 0x00 |
.byte 0x36, 0x00, 0x24, 0x00 |
.byte 0x3f, 0x00, 0x24, 0x00 |
.byte 0x00, 0x15, 0x24, 0x00 |
.byte 0x09, 0x15, 0x24, 0x00 |
.byte 0x12, 0x15, 0x24, 0x00 |
.byte 0x1b, 0x15, 0x24, 0x00 |
.byte 0x24, 0x15, 0x24, 0x00 |
.byte 0x2d, 0x15, 0x24, 0x00 |
.byte 0x36, 0x15, 0x24, 0x00 |
.byte 0x3f, 0x15, 0x24, 0x00 |
.byte 0x00, 0x2a, 0x24, 0x00 |
.byte 0x09, 0x2a, 0x24, 0x00 |
.byte 0x12, 0x2a, 0x24, 0x00 |
.byte 0x1b, 0x2a, 0x24, 0x00 |
.byte 0x24, 0x2a, 0x24, 0x00 |
.byte 0x2d, 0x2a, 0x24, 0x00 |
.byte 0x36, 0x2a, 0x24, 0x00 |
.byte 0x3f, 0x2a, 0x24, 0x00 |
.byte 0x00, 0x3f, 0x24, 0x00 |
.byte 0x09, 0x3f, 0x24, 0x00 |
.byte 0x12, 0x3f, 0x24, 0x00 |
.byte 0x1b, 0x3f, 0x24, 0x00 |
.byte 0x24, 0x3f, 0x24, 0x00 |
.byte 0x2d, 0x3f, 0x24, 0x00 |
.byte 0x36, 0x3f, 0x24, 0x00 |
.byte 0x3f, 0x3f, 0x24, 0x00 |
.byte 0x00, 0x00, 0x2d, 0x00 |
.byte 0x09, 0x00, 0x2d, 0x00 |
.byte 0x12, 0x00, 0x2d, 0x00 |
.byte 0x1b, 0x00, 0x2d, 0x00 |
.byte 0x24, 0x00, 0x2d, 0x00 |
.byte 0x2d, 0x00, 0x2d, 0x00 |
.byte 0x36, 0x00, 0x2d, 0x00 |
.byte 0x3f, 0x00, 0x2d, 0x00 |
.byte 0x00, 0x15, 0x2d, 0x00 |
.byte 0x09, 0x15, 0x2d, 0x00 |
.byte 0x12, 0x15, 0x2d, 0x00 |
.byte 0x1b, 0x15, 0x2d, 0x00 |
.byte 0x24, 0x15, 0x2d, 0x00 |
.byte 0x2d, 0x15, 0x2d, 0x00 |
.byte 0x36, 0x15, 0x2d, 0x00 |
.byte 0x3f, 0x15, 0x2d, 0x00 |
.byte 0x00, 0x2a, 0x2d, 0x00 |
.byte 0x09, 0x2a, 0x2d, 0x00 |
.byte 0x12, 0x2a, 0x2d, 0x00 |
.byte 0x1b, 0x2a, 0x2d, 0x00 |
.byte 0x24, 0x2a, 0x2d, 0x00 |
.byte 0x2d, 0x2a, 0x2d, 0x00 |
.byte 0x36, 0x2a, 0x2d, 0x00 |
.byte 0x3f, 0x2a, 0x2d, 0x00 |
.byte 0x00, 0x3f, 0x2d, 0x00 |
.byte 0x09, 0x3f, 0x2d, 0x00 |
.byte 0x12, 0x3f, 0x2d, 0x00 |
.byte 0x1b, 0x3f, 0x2d, 0x00 |
.byte 0x24, 0x3f, 0x2d, 0x00 |
.byte 0x2d, 0x3f, 0x2d, 0x00 |
.byte 0x36, 0x3f, 0x2d, 0x00 |
.byte 0x3f, 0x3f, 0x2d, 0x00 |
.byte 0x00, 0x00, 0x36, 0x00 |
.byte 0x09, 0x00, 0x36, 0x00 |
.byte 0x12, 0x00, 0x36, 0x00 |
.byte 0x1b, 0x00, 0x36, 0x00 |
.byte 0x24, 0x00, 0x36, 0x00 |
.byte 0x2d, 0x00, 0x36, 0x00 |
.byte 0x36, 0x00, 0x36, 0x00 |
.byte 0x3f, 0x00, 0x36, 0x00 |
.byte 0x00, 0x15, 0x36, 0x00 |
.byte 0x09, 0x15, 0x36, 0x00 |
.byte 0x12, 0x15, 0x36, 0x00 |
.byte 0x1b, 0x15, 0x36, 0x00 |
.byte 0x24, 0x15, 0x36, 0x00 |
.byte 0x2d, 0x15, 0x36, 0x00 |
.byte 0x36, 0x15, 0x36, 0x00 |
.byte 0x3f, 0x15, 0x36, 0x00 |
.byte 0x00, 0x2a, 0x36, 0x00 |
.byte 0x09, 0x2a, 0x36, 0x00 |
.byte 0x12, 0x2a, 0x36, 0x00 |
.byte 0x1b, 0x2a, 0x36, 0x00 |
.byte 0x24, 0x2a, 0x36, 0x00 |
.byte 0x2d, 0x2a, 0x36, 0x00 |
.byte 0x36, 0x2a, 0x36, 0x00 |
.byte 0x3f, 0x2a, 0x36, 0x00 |
.byte 0x00, 0x3f, 0x36, 0x00 |
.byte 0x09, 0x3f, 0x36, 0x00 |
.byte 0x12, 0x3f, 0x36, 0x00 |
.byte 0x1b, 0x3f, 0x36, 0x00 |
.byte 0x24, 0x3f, 0x36, 0x00 |
.byte 0x2d, 0x3f, 0x36, 0x00 |
.byte 0x36, 0x3f, 0x36, 0x00 |
.byte 0x3f, 0x3f, 0x36, 0x00 |
.byte 0x00, 0x00, 0x3f, 0x00 |
.byte 0x09, 0x00, 0x3f, 0x00 |
.byte 0x12, 0x00, 0x3f, 0x00 |
.byte 0x1b, 0x00, 0x3f, 0x00 |
.byte 0x24, 0x00, 0x3f, 0x00 |
.byte 0x2d, 0x00, 0x3f, 0x00 |
.byte 0x36, 0x00, 0x3f, 0x00 |
.byte 0x3f, 0x00, 0x3f, 0x00 |
.byte 0x00, 0x15, 0x3f, 0x00 |
.byte 0x09, 0x15, 0x3f, 0x00 |
.byte 0x12, 0x15, 0x3f, 0x00 |
.byte 0x1b, 0x15, 0x3f, 0x00 |
.byte 0x24, 0x15, 0x3f, 0x00 |
.byte 0x2d, 0x15, 0x3f, 0x00 |
.byte 0x36, 0x15, 0x3f, 0x00 |
.byte 0x3f, 0x15, 0x3f, 0x00 |
.byte 0x00, 0x2a, 0x3f, 0x00 |
.byte 0x09, 0x2a, 0x3f, 0x00 |
.byte 0x12, 0x2a, 0x3f, 0x00 |
.byte 0x1b, 0x2a, 0x3f, 0x00 |
.byte 0x24, 0x2a, 0x3f, 0x00 |
.byte 0x2d, 0x2a, 0x3f, 0x00 |
.byte 0x36, 0x2a, 0x3f, 0x00 |
.byte 0x3f, 0x2a, 0x3f, 0x00 |
.byte 0x00, 0x3f, 0x3f, 0x00 |
.byte 0x09, 0x3f, 0x3f, 0x00 |
.byte 0x12, 0x3f, 0x3f, 0x00 |
.byte 0x1b, 0x3f, 0x3f, 0x00 |
.byte 0x24, 0x3f, 0x3f, 0x00 |
.byte 0x2d, 0x3f, 0x3f, 0x00 |
.byte 0x36, 0x3f, 0x3f, 0x00 |
.byte 0x3f, 0x3f, 0x3f, 0x00 |
/tags/0.3.0/kernel/arch/ia32/src/mm/frame.c |
---|
0,0 → 1,144 |
/* |
* Copyright (c) 2008 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32mm |
* @{ |
*/ |
/** @file |
* @ingroup ia32mm, amd64mm |
*/ |
#include <mm/frame.h> |
#include <arch/mm/frame.h> |
#include <mm/as.h> |
#include <config.h> |
#include <arch/boot/boot.h> |
#include <arch/boot/memmap.h> |
#include <panic.h> |
#include <debug.h> |
#include <align.h> |
#include <macros.h> |
#include <print.h> |
size_t hardcoded_unmapped_ktext_size = 0; |
size_t hardcoded_unmapped_kdata_size = 0; |
uintptr_t last_frame = 0; |
static void init_e820_memory(pfn_t minconf) |
{ |
unsigned int i; |
pfn_t start, conf; |
size_t size; |
for (i = 0; i < e820counter; i++) { |
if (e820table[i].type == MEMMAP_MEMORY_AVAILABLE) { |
start = ADDR2PFN(ALIGN_UP(e820table[i].base_address, FRAME_SIZE)); |
size = SIZE2FRAMES(ALIGN_DOWN(e820table[i].size, FRAME_SIZE)); |
if ((minconf < start) || (minconf >= start + size)) |
conf = start; |
else |
conf = minconf; |
zone_create(start, size, conf, 0); |
if (last_frame < ALIGN_UP(e820table[i].base_address + |
e820table[i].size, FRAME_SIZE)) |
last_frame = |
ALIGN_UP(e820table[i].base_address + e820table[i].size, FRAME_SIZE); |
} |
} |
} |
static char *e820names[] = { |
"invalid", |
"available", |
"reserved", |
"acpi", |
"nvs", |
"unusable" |
}; |
void physmem_print(void) |
{ |
unsigned int i; |
char *name; |
printf("Base Size Name\n"); |
printf("------------------ ------------------ ---------\n"); |
for (i = 0; i < e820counter; i++) { |
if (e820table[i].type <= MEMMAP_MEMORY_UNUSABLE) |
name = e820names[e820table[i].type]; |
else |
name = "invalid"; |
printf("%#18llx %#18llx %s\n", e820table[i].base_address, |
e820table[i].size, name); |
} |
} |
void frame_arch_init(void) |
{ |
pfn_t minconf; |
if (config.cpu_active == 1) { |
minconf = 1; |
#ifdef CONFIG_SMP |
minconf = max(minconf, |
ADDR2PFN(AP_BOOT_OFFSET + hardcoded_unmapped_ktext_size + |
hardcoded_unmapped_kdata_size)); |
#endif |
#ifdef CONFIG_SIMICS_FIX |
minconf = max(minconf, ADDR2PFN(0x10000)); |
#endif |
init_e820_memory(minconf); |
/* Reserve frame 0 (BIOS data) */ |
frame_mark_unavailable(0, 1); |
#ifdef CONFIG_SMP |
/* Reserve AP real mode bootstrap memory */ |
frame_mark_unavailable(AP_BOOT_OFFSET >> FRAME_WIDTH, |
(hardcoded_unmapped_ktext_size + |
hardcoded_unmapped_kdata_size) >> FRAME_WIDTH); |
#ifdef CONFIG_SIMICS_FIX |
/* Don't know why, but these addresses help */ |
frame_mark_unavailable(0xd000 >> FRAME_WIDTH, 3); |
#endif |
#endif |
} |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/src/mm/page.c |
---|
0,0 → 1,121 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32mm |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/mm/page.h> |
#include <genarch/mm/page_pt.h> |
#include <arch/mm/frame.h> |
#include <mm/frame.h> |
#include <mm/page.h> |
#include <mm/as.h> |
#include <arch/types.h> |
#include <align.h> |
#include <config.h> |
#include <func.h> |
#include <arch/interrupt.h> |
#include <arch/asm.h> |
#include <debug.h> |
#include <memstr.h> |
#include <print.h> |
#include <interrupt.h> |
void page_arch_init(void) |
{ |
uintptr_t cur; |
int flags; |
if (config.cpu_active == 1) { |
page_mapping_operations = &pt_mapping_operations; |
/* |
* PA2KA(identity) mapping for all frames until last_frame. |
*/ |
for (cur = 0; cur < last_frame; cur += FRAME_SIZE) { |
flags = PAGE_CACHEABLE | PAGE_WRITE; |
if ((PA2KA(cur) >= config.base) && (PA2KA(cur) < config.base + config.kernel_size)) |
flags |= PAGE_GLOBAL; |
page_mapping_insert(AS_KERNEL, PA2KA(cur), cur, flags); |
} |
exc_register(14, "page_fault", (iroutine) page_fault); |
write_cr3((uintptr_t) AS_KERNEL->genarch.page_table); |
} else |
write_cr3((uintptr_t) AS_KERNEL->genarch.page_table); |
paging_on(); |
} |
uintptr_t hw_map(uintptr_t physaddr, size_t size) |
{ |
if (last_frame + ALIGN_UP(size, PAGE_SIZE) > KA2PA(KERNEL_ADDRESS_SPACE_END_ARCH)) |
panic("Unable to map physical memory %p (%d bytes)", physaddr, size) |
uintptr_t virtaddr = PA2KA(last_frame); |
pfn_t i; |
for (i = 0; i < ADDR2PFN(ALIGN_UP(size, PAGE_SIZE)); i++) { |
uintptr_t addr = PFN2ADDR(i); |
page_mapping_insert(AS_KERNEL, virtaddr + addr, physaddr + addr, PAGE_NOT_CACHEABLE | PAGE_WRITE); |
} |
last_frame = ALIGN_UP(last_frame + size, FRAME_SIZE); |
return virtaddr; |
} |
void page_fault(int n __attribute__((unused)), istate_t *istate) |
{ |
uintptr_t page; |
pf_access_t access; |
page = read_cr2(); |
if (istate->error_word & PFERR_CODE_RSVD) |
panic("Reserved bit set in page directory.\n"); |
if (istate->error_word & PFERR_CODE_RW) |
access = PF_ACCESS_WRITE; |
else |
access = PF_ACCESS_READ; |
if (as_page_fault(page, access, istate) == AS_PF_FAULT) { |
fault_if_from_uspace(istate, "Page fault: %#x", page); |
decode_istate(istate); |
printf("page fault address: %#lx\n", page); |
panic("page fault\n"); |
} |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/src/mm/tlb.c |
---|
0,0 → 1,71 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32mm |
* @{ |
*/ |
/** @file |
* @ingroup ia32mm, amd64mm |
*/ |
#include <mm/tlb.h> |
#include <arch/mm/asid.h> |
#include <arch/asm.h> |
#include <arch/types.h> |
/** Invalidate all entries in TLB. */ |
void tlb_invalidate_all(void) |
{ |
write_cr3(read_cr3()); |
} |
/** Invalidate all entries in TLB that belong to specified address space. |
* |
* @param asid This parameter is ignored as the architecture doesn't support it. |
*/ |
void tlb_invalidate_asid(asid_t asid __attribute__((unused))) |
{ |
tlb_invalidate_all(); |
} |
/** Invalidate TLB entries for specified page range belonging to specified address space. |
* |
* @param asid This parameter is ignored as the architecture doesn't support it. |
* @param page Address of the first page whose entry is to be invalidated. |
* @param cnt Number of entries to invalidate. |
*/ |
void tlb_invalidate_pages(asid_t asid __attribute__((unused)), uintptr_t page, count_t cnt) |
{ |
unsigned int i; |
for (i = 0; i < cnt; i++) |
invlpg(page + i * PAGE_SIZE); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/src/mm/as.c |
---|
0,0 → 1,48 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32mm |
* @{ |
*/ |
/** @file |
* @ingroup ia32mm, amd64mm |
*/ |
#include <arch/mm/as.h> |
#include <genarch/mm/page_pt.h> |
/** Architecture dependent address space init. */ |
void as_arch_init(void) |
{ |
#ifndef __OBJC__ |
as_operations = &as_pt_operations; |
#endif |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/src/smp/mps.c |
---|
0,0 → 1,491 |
/* |
* Copyright (c) 2008 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32 |
* @{ |
*/ |
/** @file |
*/ |
#ifdef CONFIG_SMP |
#include <config.h> |
#include <print.h> |
#include <debug.h> |
#include <arch/smp/mps.h> |
#include <arch/smp/apic.h> |
#include <arch/smp/smp.h> |
#include <func.h> |
#include <arch/types.h> |
#include <cpu.h> |
#include <arch/asm.h> |
#include <arch/bios/bios.h> |
#include <mm/frame.h> |
/* |
* MultiProcessor Specification detection code. |
*/ |
#define FS_SIGNATURE 0x5f504d5f |
#define CT_SIGNATURE 0x504d4350 |
static int mps_fs_check(uint8_t *base); |
static int mps_ct_check(void); |
static int configure_via_ct(void); |
static int configure_via_default(uint8_t n); |
static int ct_processor_entry(struct __processor_entry *pr); |
static void ct_bus_entry(struct __bus_entry *bus); |
static void ct_io_apic_entry(struct __io_apic_entry *ioa); |
static void ct_io_intr_entry(struct __io_intr_entry *iointr); |
static void ct_l_intr_entry(struct __l_intr_entry *lintr); |
static void ct_extended_entries(void); |
static struct mps_fs *fs; |
static struct mps_ct *ct; |
struct __processor_entry *processor_entries = NULL; |
struct __bus_entry *bus_entries = NULL; |
struct __io_apic_entry *io_apic_entries = NULL; |
struct __io_intr_entry *io_intr_entries = NULL; |
struct __l_intr_entry *l_intr_entries = NULL; |
unsigned int processor_entry_cnt = 0; |
unsigned int bus_entry_cnt = 0; |
unsigned int io_apic_entry_cnt = 0; |
unsigned int io_intr_entry_cnt = 0; |
unsigned int l_intr_entry_cnt = 0; |
/* |
* Implementation of IA-32 SMP configuration interface. |
*/ |
static count_t get_cpu_count(void); |
static bool is_cpu_enabled(index_t i); |
static bool is_bsp(index_t i); |
static uint8_t get_cpu_apic_id(index_t i); |
static int mps_irq_to_pin(unsigned int irq); |
struct smp_config_operations mps_config_operations = { |
.cpu_count = get_cpu_count, |
.cpu_enabled = is_cpu_enabled, |
.cpu_bootstrap = is_bsp, |
.cpu_apic_id = get_cpu_apic_id, |
.irq_to_pin = mps_irq_to_pin |
}; |
count_t get_cpu_count(void) |
{ |
return processor_entry_cnt; |
} |
bool is_cpu_enabled(index_t i) |
{ |
ASSERT(i < processor_entry_cnt); |
return (bool) ((processor_entries[i].cpu_flags & 0x01) == 0x01); |
} |
bool is_bsp(index_t i) |
{ |
ASSERT(i < processor_entry_cnt); |
return (bool) ((processor_entries[i].cpu_flags & 0x02) == 0x02); |
} |
uint8_t get_cpu_apic_id(index_t i) |
{ |
ASSERT(i < processor_entry_cnt); |
return processor_entries[i].l_apic_id; |
} |
/* |
* Used to check the integrity of the MP Floating Structure. |
*/ |
int mps_fs_check(uint8_t *base) |
{ |
unsigned int i; |
uint8_t sum; |
for (i = 0, sum = 0; i < 16; i++) |
sum = (uint8_t) (sum + base[i]); |
return !sum; |
} |
/* |
* Used to check the integrity of the MP Configuration Table. |
*/ |
int mps_ct_check(void) |
{ |
uint8_t *base = (uint8_t *) ct; |
uint8_t *ext = base + ct->base_table_length; |
uint8_t sum; |
int i; |
/* count the checksum for the base table */ |
for (i = 0,sum = 0; i < ct->base_table_length; i++) |
sum = (uint8_t) (sum + base[i]); |
if (sum) |
return 0; |
/* count the checksum for the extended table */ |
for (i = 0, sum = 0; i < ct->ext_table_length; i++) |
sum = (uint8_t) (sum + ext[i]); |
return sum == ct->ext_table_checksum; |
} |
void mps_init(void) |
{ |
uint8_t *addr[2] = { NULL, (uint8_t *) PA2KA(0xf0000) }; |
unsigned int i, j, length[2] = { 1024, 64 * 1024 }; |
/* |
* Find MP Floating Pointer Structure |
* 1a. search first 1K of EBDA |
* 1b. if EBDA is undefined, search last 1K of base memory |
* 2. search 64K starting at 0xf0000 |
*/ |
addr[0] = (uint8_t *) PA2KA(ebda ? ebda : 639 * 1024); |
for (i = 0; i < 2; i++) { |
for (j = 0; j < length[i]; j += 16) { |
if (*((uint32_t *) &addr[i][j]) == |
FS_SIGNATURE && mps_fs_check(&addr[i][j])) { |
fs = (struct mps_fs *) &addr[i][j]; |
goto fs_found; |
} |
} |
} |
return; |
fs_found: |
printf("%p: MPS Floating Pointer Structure\n", fs); |
if (fs->config_type == 0 && fs->configuration_table) { |
if (fs->mpfib2 >> 7) { |
printf("%s: PIC mode not supported\n", __func__); |
return; |
} |
ct = (struct mps_ct *)PA2KA((uintptr_t)fs->configuration_table); |
config.cpu_count = configure_via_ct(); |
} |
else |
config.cpu_count = configure_via_default(fs->config_type); |
return; |
} |
int configure_via_ct(void) |
{ |
uint8_t *cur; |
unsigned int i, cnt; |
if (ct->signature != CT_SIGNATURE) { |
printf("%s: bad ct->signature\n", __func__); |
return 1; |
} |
if (!mps_ct_check()) { |
printf("%s: bad ct checksum\n", __func__); |
return 1; |
} |
if (ct->oem_table) { |
printf("%s: ct->oem_table not supported\n", __func__); |
return 1; |
} |
l_apic = (uint32_t *)(uintptr_t)ct->l_apic; |
cnt = 0; |
cur = &ct->base_table[0]; |
for (i = 0; i < ct->entry_count; i++) { |
switch (*cur) { |
/* Processor entry */ |
case 0: |
processor_entries = processor_entries ? |
processor_entries : |
(struct __processor_entry *) cur; |
processor_entry_cnt++; |
cnt += ct_processor_entry((struct __processor_entry *) |
cur); |
cur += 20; |
break; |
/* Bus entry */ |
case 1: |
bus_entries = bus_entries ? |
bus_entries : (struct __bus_entry *) cur; |
bus_entry_cnt++; |
ct_bus_entry((struct __bus_entry *) cur); |
cur += 8; |
break; |
/* I/O Apic */ |
case 2: |
io_apic_entries = io_apic_entries ? |
io_apic_entries : (struct __io_apic_entry *) cur; |
io_apic_entry_cnt++; |
ct_io_apic_entry((struct __io_apic_entry *) cur); |
cur += 8; |
break; |
/* I/O Interrupt Assignment */ |
case 3: |
io_intr_entries = io_intr_entries ? |
io_intr_entries : (struct __io_intr_entry *) cur; |
io_intr_entry_cnt++; |
ct_io_intr_entry((struct __io_intr_entry *) cur); |
cur += 8; |
break; |
/* Local Interrupt Assignment */ |
case 4: |
l_intr_entries = l_intr_entries ? |
l_intr_entries : (struct __l_intr_entry *) cur; |
l_intr_entry_cnt++; |
ct_l_intr_entry((struct __l_intr_entry *) cur); |
cur += 8; |
break; |
default: |
/* |
* Something is wrong. Fallback to UP mode. |
*/ |
printf("%s: ct badness\n", __func__); |
return 1; |
} |
} |
/* |
* Process extended entries. |
*/ |
ct_extended_entries(); |
return cnt; |
} |
int configure_via_default(uint8_t n __attribute__((unused))) |
{ |
/* |
* Not yet implemented. |
*/ |
printf("%s: not supported\n", __func__); |
return 1; |
} |
int ct_processor_entry(struct __processor_entry *pr __attribute__((unused))) |
{ |
/* |
* Ignore processors which are not marked enabled. |
*/ |
if ((pr->cpu_flags & (1 << 0)) == 0) |
return 0; |
apic_id_mask |= (1 << pr->l_apic_id); |
return 1; |
} |
void ct_bus_entry(struct __bus_entry *bus __attribute__((unused))) |
{ |
#ifdef MPSCT_VERBOSE |
char buf[7]; |
memcpy((void *) buf, (void *) bus->bus_type, 6); |
buf[6] = 0; |
printf("bus%d: %s\n", bus->bus_id, buf); |
#endif |
} |
void ct_io_apic_entry(struct __io_apic_entry *ioa) |
{ |
static unsigned int io_apic_count = 0; |
/* this ioapic is marked unusable */ |
if ((ioa->io_apic_flags & 1) == 0) |
return; |
if (io_apic_count++ > 0) { |
/* |
* Multiple IO APIC's are currently not supported. |
*/ |
return; |
} |
io_apic = (uint32_t *)(uintptr_t)ioa->io_apic; |
} |
//#define MPSCT_VERBOSE |
void ct_io_intr_entry(struct __io_intr_entry *iointr __attribute__((unused))) |
{ |
#ifdef MPSCT_VERBOSE |
switch (iointr->intr_type) { |
case 0: |
printf("INT"); |
break; |
case 1: |
printf("NMI"); |
break; |
case 2: |
printf("SMI"); |
break; |
case 3: |
printf("ExtINT"); |
break; |
} |
putchar(','); |
switch (iointr->poel & 3) { |
case 0: |
printf("bus-like"); |
break; |
case 1: |
printf("active high"); |
break; |
case 2: |
printf("reserved"); |
break; |
case 3: |
printf("active low"); |
break; |
} |
putchar(','); |
switch ((iointr->poel >> 2) & 3) { |
case 0: |
printf("bus-like"); |
break; |
case 1: |
printf("edge-triggered"); |
break; |
case 2: |
printf("reserved"); |
break; |
case 3: |
printf("level-triggered"); |
break; |
} |
putchar(','); |
printf("bus%d,irq%d", iointr->src_bus_id, iointr->src_bus_irq); |
putchar(','); |
printf("io_apic%d,pin%d", iointr->dst_io_apic_id, |
iointr->dst_io_apic_pin); |
putchar('\n'); |
#endif |
} |
void ct_l_intr_entry(struct __l_intr_entry *lintr __attribute__((unused))) |
{ |
#ifdef MPSCT_VERBOSE |
switch (lintr->intr_type) { |
case 0: |
printf("INT"); |
break; |
case 1: |
printf("NMI"); |
break; |
case 2: |
printf("SMI"); |
break; |
case 3: |
printf("ExtINT"); |
break; |
} |
putchar(','); |
switch (lintr->poel & 3) { |
case 0: |
printf("bus-like"); |
break; |
case 1: |
printf("active high"); |
break; |
case 2: |
printf("reserved"); |
break; |
case 3: |
printf("active low"); |
break; |
} |
putchar(','); |
switch ((lintr->poel >> 2) & 3) { |
case 0: |
printf("bus-like"); |
break; |
case 1: |
printf("edge-triggered"); |
break; |
case 2: |
printf("reserved"); |
break; |
case 3: |
printf("level-triggered"); |
break; |
} |
putchar(','); |
printf("bus%d,irq%d", lintr->src_bus_id, lintr->src_bus_irq); |
putchar(','); |
printf("l_apic%d,pin%d", lintr->dst_l_apic_id, lintr->dst_l_apic_pin); |
putchar('\n'); |
#endif |
} |
void ct_extended_entries(void) |
{ |
uint8_t *ext = (uint8_t *) ct + ct->base_table_length; |
uint8_t *cur; |
for (cur = ext; cur < ext + ct->ext_table_length; |
cur += cur[CT_EXT_ENTRY_LEN]) { |
switch (cur[CT_EXT_ENTRY_TYPE]) { |
default: |
printf("%p: skipping MP Configuration Table extended " |
"entry type %d\n", cur, cur[CT_EXT_ENTRY_TYPE]); |
break; |
} |
} |
} |
int mps_irq_to_pin(unsigned int irq) |
{ |
unsigned int i; |
for (i = 0; i < io_intr_entry_cnt; i++) { |
if (io_intr_entries[i].src_bus_irq == irq && |
io_intr_entries[i].intr_type == 0) |
return io_intr_entries[i].dst_io_apic_pin; |
} |
return -1; |
} |
#endif /* CONFIG_SMP */ |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/src/smp/smp.c |
---|
0,0 → 1,198 |
/* |
* Copyright (c) 2008 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32 |
* @{ |
*/ |
/** @file |
*/ |
#include <smp/smp.h> |
#include <arch/smp/smp.h> |
#include <arch/smp/mps.h> |
#include <arch/smp/ap.h> |
#include <arch/boot/boot.h> |
#include <genarch/acpi/acpi.h> |
#include <genarch/acpi/madt.h> |
#include <config.h> |
#include <synch/waitq.h> |
#include <synch/synch.h> |
#include <arch/pm.h> |
#include <func.h> |
#include <panic.h> |
#include <debug.h> |
#include <arch/asm.h> |
#include <mm/frame.h> |
#include <mm/page.h> |
#include <mm/slab.h> |
#include <mm/as.h> |
#include <print.h> |
#include <memstr.h> |
#include <arch/drivers/i8259.h> |
#ifdef CONFIG_SMP |
static struct smp_config_operations *ops = NULL; |
void smp_init(void) |
{ |
uintptr_t l_apic_address, io_apic_address; |
if (acpi_madt) { |
acpi_madt_parse(); |
ops = &madt_config_operations; |
} |
if (config.cpu_count == 1) { |
mps_init(); |
ops = &mps_config_operations; |
} |
l_apic_address = (uintptr_t) frame_alloc(ONE_FRAME, |
FRAME_ATOMIC | FRAME_KA); |
if (!l_apic_address) |
panic("cannot allocate address for l_apic\n"); |
io_apic_address = (uintptr_t) frame_alloc(ONE_FRAME, |
FRAME_ATOMIC | FRAME_KA); |
if (!io_apic_address) |
panic("cannot allocate address for io_apic\n"); |
if (config.cpu_count > 1) { |
page_mapping_insert(AS_KERNEL, l_apic_address, |
(uintptr_t) l_apic, PAGE_NOT_CACHEABLE | PAGE_WRITE); |
page_mapping_insert(AS_KERNEL, io_apic_address, |
(uintptr_t) io_apic, PAGE_NOT_CACHEABLE | PAGE_WRITE); |
l_apic = (uint32_t *) l_apic_address; |
io_apic = (uint32_t *) io_apic_address; |
} |
} |
/* |
* Kernel thread for bringing up application processors. It becomes clear |
* that we need an arrangement like this (AP's being initialized by a kernel |
* thread), for a thread has its dedicated stack. (The stack used during the |
* BSP initialization (prior the very first call to scheduler()) will be used |
* as an initialization stack for each AP.) |
*/ |
void kmp(void *arg __attribute__((unused))) |
{ |
unsigned int i; |
ASSERT(ops != NULL); |
/* |
* We need to access data in frame 0. |
* We boldly make use of kernel address space mapping. |
*/ |
/* |
* Set the warm-reset vector to the real-mode address of 4K-aligned ap_boot() |
*/ |
*((uint16_t *) (PA2KA(0x467 + 0))) = |
(uint16_t) (((uintptr_t) ap_boot) >> 4); /* segment */ |
*((uint16_t *) (PA2KA(0x467 + 2))) = 0; /* offset */ |
/* |
* Save 0xa to address 0xf of the CMOS RAM. |
* BIOS will not do the POST after the INIT signal. |
*/ |
outb(0x70, 0xf); |
outb(0x71, 0xa); |
pic_disable_irqs(0xffff); |
apic_init(); |
uint8_t apic = l_apic_id(); |
for (i = 0; i < ops->cpu_count(); i++) { |
struct descriptor *gdt_new; |
/* |
* Skip processors marked unusable. |
*/ |
if (!ops->cpu_enabled(i)) |
continue; |
/* |
* The bootstrap processor is already up. |
*/ |
if (ops->cpu_bootstrap(i)) |
continue; |
if (ops->cpu_apic_id(i) == apic) { |
printf("%s: bad processor entry #%u, will not send IPI " |
"to myself\n", __FUNCTION__, i); |
continue; |
} |
/* |
* Prepare new GDT for CPU in question. |
*/ |
gdt_new = (struct descriptor *) malloc(GDT_ITEMS * |
sizeof(struct descriptor), FRAME_ATOMIC); |
if (!gdt_new) |
panic("couldn't allocate memory for GDT\n"); |
memcpy(gdt_new, gdt, GDT_ITEMS * sizeof(struct descriptor)); |
memsetb((uintptr_t)(&gdt_new[TSS_DES]), |
sizeof(struct descriptor), 0); |
protected_ap_gdtr.limit = GDT_ITEMS * sizeof(struct descriptor); |
protected_ap_gdtr.base = KA2PA((uintptr_t) gdt_new); |
gdtr.base = (uintptr_t) gdt_new; |
if (l_apic_send_init_ipi(ops->cpu_apic_id(i))) { |
/* |
* There may be just one AP being initialized at |
* the time. After it comes completely up, it is |
* supposed to wake us up. |
*/ |
if (waitq_sleep_timeout(&ap_completion_wq, 1000000, |
SYNCH_FLAGS_NONE) == ESYNCH_TIMEOUT) { |
unsigned int cpu = (config.cpu_active > i) ? |
config.cpu_active : i; |
printf("%s: waiting for cpu%u (APIC ID = %d) " |
"timed out\n", __FUNCTION__, cpu, |
ops->cpu_apic_id(i)); |
} |
} else |
printf("INIT IPI for l_apic%d failed\n", |
ops->cpu_apic_id(i)); |
} |
} |
int smp_irq_to_pin(unsigned int irq) |
{ |
ASSERT(ops != NULL); |
return ops->irq_to_pin(irq); |
} |
#endif /* CONFIG_SMP */ |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/src/smp/apic.c |
---|
0,0 → 1,595 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32 |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/types.h> |
#include <arch/smp/apic.h> |
#include <arch/smp/ap.h> |
#include <arch/smp/mps.h> |
#include <arch/boot/boot.h> |
#include <mm/page.h> |
#include <time/delay.h> |
#include <interrupt.h> |
#include <arch/interrupt.h> |
#include <print.h> |
#include <arch/asm.h> |
#include <arch.h> |
#include <ddi/irq.h> |
#include <ddi/device.h> |
#ifdef CONFIG_SMP |
/* |
* Advanced Programmable Interrupt Controller for SMP systems. |
* Tested on: |
* Bochs 2.0.2 - Bochs 2.2.6 with 2-8 CPUs |
* Simics 2.0.28 - Simics 2.2.19 2-15 CPUs |
* VMware Workstation 5.5 with 2 CPUs |
* QEMU 0.8.0 with 2-15 CPUs |
* ASUS P/I-P65UP5 + ASUS C-P55T2D REV. 1.41 with 2x 200Mhz Pentium CPUs |
* ASUS PCH-DL with 2x 3000Mhz Pentium 4 Xeon (HT) CPUs |
* MSI K7D Master-L with 2x 2100MHz Athlon MP CPUs |
*/ |
/* |
* These variables either stay configured as initilalized, or are changed by |
* the MP configuration code. |
* |
* Pay special attention to the volatile keyword. Without it, gcc -O2 would |
* optimize the code too much and accesses to l_apic and io_apic, that must |
* always be 32-bit, would use byte oriented instructions. |
*/ |
volatile uint32_t *l_apic = (uint32_t *) 0xfee00000; |
volatile uint32_t *io_apic = (uint32_t *) 0xfec00000; |
uint32_t apic_id_mask = 0; |
static irq_t l_apic_timer_irq; |
static int apic_poll_errors(void); |
#ifdef LAPIC_VERBOSE |
static char *delmod_str[] = { |
"Fixed", |
"Lowest Priority", |
"SMI", |
"Reserved", |
"NMI", |
"INIT", |
"STARTUP", |
"ExtInt" |
}; |
static char *destmod_str[] = { |
"Physical", |
"Logical" |
}; |
static char *trigmod_str[] = { |
"Edge", |
"Level" |
}; |
static char *mask_str[] = { |
"Unmasked", |
"Masked" |
}; |
static char *delivs_str[] = { |
"Idle", |
"Send Pending" |
}; |
static char *tm_mode_str[] = { |
"One-shot", |
"Periodic" |
}; |
static char *intpol_str[] = { |
"Polarity High", |
"Polarity Low" |
}; |
#endif /* LAPIC_VERBOSE */ |
/** APIC spurious interrupt handler. |
* |
* @param n Interrupt vector. |
* @param istate Interrupted state. |
*/ |
static void apic_spurious(int n __attribute__((unused)), istate_t *istate __attribute__((unused))) |
{ |
#ifdef CONFIG_DEBUG |
printf("cpu%u: APIC spurious interrupt\n", CPU->id); |
#endif |
} |
static irq_ownership_t l_apic_timer_claim(void) |
{ |
return IRQ_ACCEPT; |
} |
static void l_apic_timer_irq_handler(irq_t *irq, void *arg __attribute__((unused)), ...) |
{ |
/* |
* Holding a spinlock could prevent clock() from preempting |
* the current thread. In this case, we don't need to hold the |
* irq->lock so we just unlock it and then lock it again. |
*/ |
spinlock_unlock(&irq->lock); |
clock(); |
spinlock_lock(&irq->lock); |
} |
/** Initialize APIC on BSP. */ |
void apic_init(void) |
{ |
io_apic_id_t idreg; |
exc_register(VECTOR_APIC_SPUR, "apic_spurious", (iroutine) apic_spurious); |
enable_irqs_function = io_apic_enable_irqs; |
disable_irqs_function = io_apic_disable_irqs; |
eoi_function = l_apic_eoi; |
/* |
* Configure interrupt routing. |
* IRQ 0 remains masked as the time signal is generated by l_apic's themselves. |
* Other interrupts will be forwarded to the lowest priority CPU. |
*/ |
io_apic_disable_irqs(0xffff); |
irq_initialize(&l_apic_timer_irq); |
l_apic_timer_irq.preack = true; |
l_apic_timer_irq.devno = device_assign_devno(); |
l_apic_timer_irq.inr = IRQ_CLK; |
l_apic_timer_irq.claim = l_apic_timer_claim; |
l_apic_timer_irq.handler = l_apic_timer_irq_handler; |
irq_register(&l_apic_timer_irq); |
uint8_t i; |
for (i = 0; i < IRQ_COUNT; i++) { |
int pin; |
if ((pin = smp_irq_to_pin(i)) != -1) |
io_apic_change_ioredtbl((uint8_t) pin, DEST_ALL, (uint8_t) (IVT_IRQBASE + i), LOPRI); |
} |
/* |
* Ensure that io_apic has unique ID. |
*/ |
idreg.value = io_apic_read(IOAPICID); |
if ((1 << idreg.apic_id) & apic_id_mask) { /* see if IO APIC ID is used already */ |
for (i = 0; i < APIC_ID_COUNT; i++) { |
if (!((1 << i) & apic_id_mask)) { |
idreg.apic_id = i; |
io_apic_write(IOAPICID, idreg.value); |
break; |
} |
} |
} |
/* |
* Configure the BSP's lapic. |
*/ |
l_apic_init(); |
l_apic_debug(); |
} |
/** Poll for APIC errors. |
* |
* Examine Error Status Register and report all errors found. |
* |
* @return 0 on error, 1 on success. |
*/ |
int apic_poll_errors(void) |
{ |
esr_t esr; |
esr.value = l_apic[ESR]; |
if (esr.send_checksum_error) |
printf("Send Checksum Error\n"); |
if (esr.receive_checksum_error) |
printf("Receive Checksum Error\n"); |
if (esr.send_accept_error) |
printf("Send Accept Error\n"); |
if (esr.receive_accept_error) |
printf("Receive Accept Error\n"); |
if (esr.send_illegal_vector) |
printf("Send Illegal Vector\n"); |
if (esr.received_illegal_vector) |
printf("Received Illegal Vector\n"); |
if (esr.illegal_register_address) |
printf("Illegal Register Address\n"); |
return !esr.err_bitmap; |
} |
/** Send all CPUs excluding CPU IPI vector. |
* |
* @param vector Interrupt vector to be sent. |
* |
* @return 0 on failure, 1 on success. |
*/ |
int l_apic_broadcast_custom_ipi(uint8_t vector) |
{ |
icr_t icr; |
icr.lo = l_apic[ICRlo]; |
icr.delmod = DELMOD_FIXED; |
icr.destmod = DESTMOD_LOGIC; |
icr.level = LEVEL_ASSERT; |
icr.shorthand = SHORTHAND_ALL_EXCL; |
icr.trigger_mode = TRIGMOD_LEVEL; |
icr.vector = vector; |
l_apic[ICRlo] = icr.lo; |
icr.lo = l_apic[ICRlo]; |
if (icr.delivs == DELIVS_PENDING) { |
#ifdef CONFIG_DEBUG |
printf("IPI is pending.\n"); |
#endif |
} |
return apic_poll_errors(); |
} |
/** Universal Start-up Algorithm for bringing up the AP processors. |
* |
* @param apicid APIC ID of the processor to be brought up. |
* |
* @return 0 on failure, 1 on success. |
*/ |
int l_apic_send_init_ipi(uint8_t apicid) |
{ |
icr_t icr; |
int i; |
/* |
* Read the ICR register in and zero all non-reserved fields. |
*/ |
icr.lo = l_apic[ICRlo]; |
icr.hi = l_apic[ICRhi]; |
icr.delmod = DELMOD_INIT; |
icr.destmod = DESTMOD_PHYS; |
icr.level = LEVEL_ASSERT; |
icr.trigger_mode = TRIGMOD_LEVEL; |
icr.shorthand = SHORTHAND_NONE; |
icr.vector = 0; |
icr.dest = apicid; |
l_apic[ICRhi] = icr.hi; |
l_apic[ICRlo] = icr.lo; |
/* |
* According to MP Specification, 20us should be enough to |
* deliver the IPI. |
*/ |
delay(20); |
if (!apic_poll_errors()) |
return 0; |
icr.lo = l_apic[ICRlo]; |
if (icr.delivs == DELIVS_PENDING) { |
#ifdef CONFIG_DEBUG |
printf("IPI is pending.\n"); |
#endif |
} |
icr.delmod = DELMOD_INIT; |
icr.destmod = DESTMOD_PHYS; |
icr.level = LEVEL_DEASSERT; |
icr.shorthand = SHORTHAND_NONE; |
icr.trigger_mode = TRIGMOD_LEVEL; |
icr.vector = 0; |
l_apic[ICRlo] = icr.lo; |
/* |
* Wait 10ms as MP Specification specifies. |
*/ |
delay(10000); |
if (!is_82489DX_apic(l_apic[LAVR])) { |
/* |
* If this is not 82489DX-based l_apic we must send two STARTUP IPI's. |
*/ |
for (i = 0; i<2; i++) { |
icr.lo = l_apic[ICRlo]; |
icr.vector = (uint8_t) (((uintptr_t) ap_boot) >> 12); /* calculate the reset vector */ |
icr.delmod = DELMOD_STARTUP; |
icr.destmod = DESTMOD_PHYS; |
icr.level = LEVEL_ASSERT; |
icr.shorthand = SHORTHAND_NONE; |
icr.trigger_mode = TRIGMOD_LEVEL; |
l_apic[ICRlo] = icr.lo; |
delay(200); |
} |
} |
return apic_poll_errors(); |
} |
/** Initialize Local APIC. */ |
void l_apic_init(void) |
{ |
lvt_error_t error; |
lvt_lint_t lint; |
tpr_t tpr; |
svr_t svr; |
icr_t icr; |
tdcr_t tdcr; |
lvt_tm_t tm; |
ldr_t ldr; |
dfr_t dfr; |
uint32_t t1, t2; |
/* Initialize LVT Error register. */ |
error.value = l_apic[LVT_Err]; |
error.masked = true; |
l_apic[LVT_Err] = error.value; |
/* Initialize LVT LINT0 register. */ |
lint.value = l_apic[LVT_LINT0]; |
lint.masked = true; |
l_apic[LVT_LINT0] = lint.value; |
/* Initialize LVT LINT1 register. */ |
lint.value = l_apic[LVT_LINT1]; |
lint.masked = true; |
l_apic[LVT_LINT1] = lint.value; |
/* Task Priority Register initialization. */ |
tpr.value = l_apic[TPR]; |
tpr.pri_sc = 0; |
tpr.pri = 0; |
l_apic[TPR] = tpr.value; |
/* Spurious-Interrupt Vector Register initialization. */ |
svr.value = l_apic[SVR]; |
svr.vector = VECTOR_APIC_SPUR; |
svr.lapic_enabled = true; |
svr.focus_checking = true; |
l_apic[SVR] = svr.value; |
if (CPU->arch.family >= 6) |
enable_l_apic_in_msr(); |
/* Interrupt Command Register initialization. */ |
icr.lo = l_apic[ICRlo]; |
icr.delmod = DELMOD_INIT; |
icr.destmod = DESTMOD_PHYS; |
icr.level = LEVEL_DEASSERT; |
icr.shorthand = SHORTHAND_ALL_INCL; |
icr.trigger_mode = TRIGMOD_LEVEL; |
l_apic[ICRlo] = icr.lo; |
/* Timer Divide Configuration Register initialization. */ |
tdcr.value = l_apic[TDCR]; |
tdcr.div_value = DIVIDE_1; |
l_apic[TDCR] = tdcr.value; |
/* Program local timer. */ |
tm.value = l_apic[LVT_Tm]; |
tm.vector = VECTOR_CLK; |
tm.mode = TIMER_PERIODIC; |
tm.masked = false; |
l_apic[LVT_Tm] = tm.value; |
/* |
* Measure and configure the timer to generate timer |
* interrupt with period 1s/HZ seconds. |
*/ |
t1 = l_apic[CCRT]; |
l_apic[ICRT] = 0xffffffff; |
while (l_apic[CCRT] == t1) |
; |
t1 = l_apic[CCRT]; |
delay(1000000/HZ); |
t2 = l_apic[CCRT]; |
l_apic[ICRT] = t1-t2; |
/* Program Logical Destination Register. */ |
ASSERT(CPU->id < 8) |
ldr.value = l_apic[LDR]; |
ldr.id = (uint8_t) (1 << CPU->id); |
l_apic[LDR] = ldr.value; |
/* Program Destination Format Register for Flat mode. */ |
dfr.value = l_apic[DFR]; |
dfr.model = MODEL_FLAT; |
l_apic[DFR] = dfr.value; |
} |
/** Local APIC End of Interrupt. */ |
void l_apic_eoi(void) |
{ |
l_apic[EOI] = 0; |
} |
/** Dump content of Local APIC registers. */ |
void l_apic_debug(void) |
{ |
#ifdef LAPIC_VERBOSE |
lvt_tm_t tm; |
lvt_lint_t lint; |
lvt_error_t error; |
printf("LVT on cpu%d, LAPIC ID: %d\n", CPU->id, l_apic_id()); |
tm.value = l_apic[LVT_Tm]; |
printf("LVT Tm: vector=%hhd, %s, %s, %s\n", tm.vector, delivs_str[tm.delivs], mask_str[tm.masked], tm_mode_str[tm.mode]); |
lint.value = l_apic[LVT_LINT0]; |
printf("LVT LINT0: vector=%hhd, %s, %s, %s, irr=%d, %s, %s\n", tm.vector, delmod_str[lint.delmod], delivs_str[lint.delivs], intpol_str[lint.intpol], lint.irr, trigmod_str[lint.trigger_mode], mask_str[lint.masked]); |
lint.value = l_apic[LVT_LINT1]; |
printf("LVT LINT1: vector=%hhd, %s, %s, %s, irr=%d, %s, %s\n", tm.vector, delmod_str[lint.delmod], delivs_str[lint.delivs], intpol_str[lint.intpol], lint.irr, trigmod_str[lint.trigger_mode], mask_str[lint.masked]); |
error.value = l_apic[LVT_Err]; |
printf("LVT Err: vector=%hhd, %s, %s\n", error.vector, delivs_str[error.delivs], mask_str[error.masked]); |
#endif |
} |
/** Get Local APIC ID. |
* |
* @return Local APIC ID. |
*/ |
uint8_t l_apic_id(void) |
{ |
l_apic_id_t idreg; |
idreg.value = l_apic[L_APIC_ID]; |
return idreg.apic_id; |
} |
/** Read from IO APIC register. |
* |
* @param address IO APIC register address. |
* |
* @return Content of the addressed IO APIC register. |
*/ |
uint32_t io_apic_read(uint8_t address) |
{ |
io_regsel_t regsel; |
regsel.value = io_apic[IOREGSEL]; |
regsel.reg_addr = address; |
io_apic[IOREGSEL] = regsel.value; |
return io_apic[IOWIN]; |
} |
/** Write to IO APIC register. |
* |
* @param address IO APIC register address. |
* @param x Content to be written to the addressed IO APIC register. |
*/ |
void io_apic_write(uint8_t address, uint32_t x) |
{ |
io_regsel_t regsel; |
regsel.value = io_apic[IOREGSEL]; |
regsel.reg_addr = address; |
io_apic[IOREGSEL] = regsel.value; |
io_apic[IOWIN] = x; |
} |
/** Change some attributes of one item in I/O Redirection Table. |
* |
* @param pin IO APIC pin number. |
* @param dest Interrupt destination address. |
* @param v Interrupt vector to trigger. |
* @param flags Flags. |
*/ |
void io_apic_change_ioredtbl(uint8_t pin, uint8_t dest, uint8_t v, int flags) |
{ |
io_redirection_reg_t reg; |
int dlvr = DELMOD_FIXED; |
if (flags & LOPRI) |
dlvr = DELMOD_LOWPRI; |
reg.lo = io_apic_read((uint8_t) (IOREDTBL + pin * 2)); |
reg.hi = io_apic_read((uint8_t) (IOREDTBL + pin * 2 + 1)); |
reg.dest = dest; |
reg.destmod = DESTMOD_LOGIC; |
reg.trigger_mode = TRIGMOD_EDGE; |
reg.intpol = POLARITY_HIGH; |
reg.delmod = dlvr; |
reg.intvec = v; |
io_apic_write((uint8_t) (IOREDTBL + pin * 2), reg.lo); |
io_apic_write((uint8_t) (IOREDTBL + pin * 2 + 1), reg.hi); |
} |
/** Mask IRQs in IO APIC. |
* |
* @param irqmask Bitmask of IRQs to be masked (0 = do not mask, 1 = mask). |
*/ |
void io_apic_disable_irqs(uint16_t irqmask) |
{ |
io_redirection_reg_t reg; |
unsigned int i; |
int pin; |
for (i = 0; i < 16; i++) { |
if (irqmask & (1 << i)) { |
/* |
* Mask the signal input in IO APIC if there is a |
* mapping for the respective IRQ number. |
*/ |
pin = smp_irq_to_pin(i); |
if (pin != -1) { |
reg.lo = io_apic_read((uint8_t) (IOREDTBL + pin * 2)); |
reg.masked = true; |
io_apic_write((uint8_t) (IOREDTBL + pin * 2), reg.lo); |
} |
} |
} |
} |
/** Unmask IRQs in IO APIC. |
* |
* @param irqmask Bitmask of IRQs to be unmasked (0 = do not unmask, 1 = unmask). |
*/ |
void io_apic_enable_irqs(uint16_t irqmask) |
{ |
unsigned int i; |
int pin; |
io_redirection_reg_t reg; |
for (i = 0; i < 16; i++) { |
if (irqmask & (1 << i)) { |
/* |
* Unmask the signal input in IO APIC if there is a |
* mapping for the respective IRQ number. |
*/ |
pin = smp_irq_to_pin(i); |
if (pin != -1) { |
reg.lo = io_apic_read((uint8_t) (IOREDTBL + pin * 2)); |
reg.masked = false; |
io_apic_write((uint8_t) (IOREDTBL + pin * 2), reg.lo); |
} |
} |
} |
} |
#endif /* CONFIG_SMP */ |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/src/smp/ap.S |
---|
0,0 → 1,95 |
# |
# Copyright (c) 2001-2004 Jakub Jermar |
# Copyright (c) 2005-2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
# |
# Init code for application processors. |
# |
#include <arch/boot/boot.h> |
#include <arch/boot/memmap.h> |
#include <arch/mm/page.h> |
#include <arch/pm.h> |
.section K_TEXT_START, "ax" |
#ifdef CONFIG_SMP |
.global unmapped_ap_boot |
KTEXT=8 |
KDATA=16 |
# This piece of code is real-mode and is meant to be alligned at 4K boundary. |
# The requirement for such an alignment comes from MP Specification's STARTUP IPI |
# requirements. |
.align 4096 |
unmapped_ap_boot: |
.code16 |
cli |
xorw %ax, %ax |
movw %ax, %ds |
lgdtl ap_gdtr # initialize Global Descriptor Table register |
movl %cr0, %eax |
orl $1, %eax |
movl %eax, %cr0 # switch to protected mode |
jmpl $KTEXT, $jump_to_kernel - BOOT_OFFSET + AP_BOOT_OFFSET |
jump_to_kernel: |
.code32 |
movw $KDATA, %ax |
movw %ax, %ds |
movw %ax, %es |
movw %ax, %ss |
movl $KA2PA(ctx), %eax # KA2PA((uintptr_t) &ctx) |
movl (%eax), %esp |
subl $0x80000000, %esp # KA2PA(ctx.sp) |
call map_kernel # map kernel and turn paging on |
addl $0x80000000, %esp # PA2KA(ctx.sp) |
jmpl $KTEXT, $main_ap |
#endif /* CONFIG_SMP */ |
.section K_DATA_START, "aw", @progbits |
#ifdef CONFIG_SMP |
.global unmapped_ap_gdtr |
unmapped_ap_gdtr: |
.word 0 |
.long 0 |
#endif /* CONFIG_SMP */ |
/tags/0.3.0/kernel/arch/ia32/src/smp/ipi.c |
---|
0,0 → 1,48 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32 |
* @{ |
*/ |
/** @file |
*/ |
#ifdef CONFIG_SMP |
#include <smp/ipi.h> |
#include <arch/smp/apic.h> |
void ipi_broadcast_arch(int ipi) |
{ |
(void) l_apic_broadcast_custom_ipi((uint8_t) ipi); |
} |
#endif /* CONFIG_SMP */ |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/src/ddi/ddi.c |
---|
0,0 → 1,169 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32ddi |
* @{ |
*/ |
/** @file |
*/ |
#include <ddi/ddi.h> |
#include <arch/ddi/ddi.h> |
#include <proc/task.h> |
#include <arch/types.h> |
#include <adt/bitmap.h> |
#include <mm/slab.h> |
#include <arch/pm.h> |
#include <errno.h> |
#include <arch/cpu.h> |
#include <cpu.h> |
#include <arch.h> |
#include <align.h> |
/** Enable I/O space range for task. |
* |
* Interrupts are disabled and task is locked. |
* |
* @param task Task. |
* @param ioaddr Startign I/O space address. |
* @param size Size of the enabled I/O range. |
* |
* @return 0 on success or an error code from errno.h. |
*/ |
int ddi_iospace_enable_arch(task_t *task, uintptr_t ioaddr, size_t size) |
{ |
count_t bits; |
bits = ioaddr + size; |
if (bits > IO_PORTS) |
return ENOENT; |
if (task->arch.iomap.bits < bits) { |
bitmap_t oldiomap; |
uint8_t *newmap; |
/* |
* The I/O permission bitmap is too small and needs to be grown. |
*/ |
newmap = (uint8_t *) malloc(BITS2BYTES(bits), FRAME_ATOMIC); |
if (!newmap) |
return ENOMEM; |
bitmap_initialize(&oldiomap, task->arch.iomap.map, |
task->arch.iomap.bits); |
bitmap_initialize(&task->arch.iomap, newmap, bits); |
/* |
* Mark the new range inaccessible. |
*/ |
bitmap_set_range(&task->arch.iomap, oldiomap.bits, |
bits - oldiomap.bits); |
/* |
* In case there really existed smaller iomap, |
* copy its contents and deallocate it. |
*/ |
if (oldiomap.bits) { |
bitmap_copy(&task->arch.iomap, &oldiomap, |
oldiomap.bits); |
free(oldiomap.map); |
} |
} |
/* |
* Enable the range and we are done. |
*/ |
bitmap_clear_range(&task->arch.iomap, (index_t) ioaddr, (count_t) size); |
/* |
* Increment I/O Permission bitmap generation counter. |
*/ |
task->arch.iomapver++; |
return 0; |
} |
/** Install I/O Permission bitmap. |
* |
* Current task's I/O permission bitmap, if any, is installed |
* in the current CPU's TSS. |
* |
* Interrupts must be disabled prior this call. |
*/ |
void io_perm_bitmap_install(void) |
{ |
count_t bits; |
ptr_16_32_t cpugdtr; |
descriptor_t *gdt_p; |
count_t ver; |
/* First, copy the I/O Permission Bitmap. */ |
spinlock_lock(&TASK->lock); |
ver = TASK->arch.iomapver; |
if ((bits = TASK->arch.iomap.bits)) { |
bitmap_t iomap; |
task_t *task = TASK; |
ASSERT(TASK->arch.iomap.map); |
bitmap_initialize(&iomap, CPU->arch.tss->iomap, |
TSS_IOMAP_SIZE * 8); |
bitmap_copy(&iomap, &task->arch.iomap, task->arch.iomap.bits); |
/* |
* It is safe to set the trailing eight bits because of the |
* extra convenience byte in TSS_IOMAP_SIZE. |
*/ |
bitmap_set_range(&iomap, ALIGN_UP(TASK->arch.iomap.bits, 8), 8); |
} |
spinlock_unlock(&TASK->lock); |
/* |
* Second, adjust TSS segment limit. |
* Take the extra ending byte with all bits set into account. |
*/ |
gdtr_store(&cpugdtr); |
gdt_p = (descriptor_t *) cpugdtr.base; |
gdt_setlimit(&gdt_p[TSS_DES], TSS_BASIC_SIZE + BITS2BYTES(bits)); |
gdtr_load(&cpugdtr); |
/* |
* Before we load new TSS limit, the current TSS descriptor |
* type must be changed to describe inactive TSS. |
*/ |
gdt_p[TSS_DES].access = AR_PRESENT | AR_TSS | DPL_KERNEL; |
tr_load(selector(TSS_DES)); |
/* |
* Update the generation count so that faults caused by |
* early accesses can be serviced. |
*/ |
CPU->arch.iomapver_copy = ver; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/src/proc/scheduler.c |
---|
0,0 → 1,83 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32proc |
* @{ |
*/ |
/** @file |
*/ |
#include <proc/scheduler.h> |
#include <cpu.h> |
#include <proc/task.h> |
#include <proc/thread.h> |
#include <arch.h> |
#include <arch/context.h> /* SP_DELTA */ |
#include <arch/debugger.h> |
#include <arch/pm.h> |
#include <arch/asm.h> |
#include <arch/ddi/ddi.h> |
/** Perform ia32 specific tasks needed before the new task is run. |
* |
* Interrupts are disabled. |
*/ |
void before_task_runs_arch(void) |
{ |
io_perm_bitmap_install(); |
} |
/** Perform ia32 specific tasks needed before the new thread is scheduled. |
* |
* THREAD is locked and interrupts are disabled. |
*/ |
void before_thread_runs_arch(void) |
{ |
CPU->arch.tss->esp0 = (uintptr_t) &THREAD->kstack[THREAD_STACK_SIZE - |
SP_DELTA]; |
CPU->arch.tss->ss0 = selector(KDATA_DES); |
/* Set up TLS in GS register */ |
set_tls_desc(THREAD->arch.tls); |
#ifdef CONFIG_DEBUG_AS_WATCHPOINT |
/* Set watchpoint on AS to ensure that nobody sets it to zero */ |
if (CPU->id < BKPOINTS_MAX) { |
the_t *the = THE; |
breakpoint_add(&((the_t *) the->thread->kstack)->as, |
BKPOINT_WRITE | BKPOINT_CHECK_ZERO, the->cpu->id); |
} |
#endif |
} |
void after_thread_ran_arch(void) |
{ |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/src/proc/task.c |
---|
0,0 → 1,61 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32proc |
* @{ |
*/ |
/** @file |
*/ |
#include <proc/task.h> |
#include <arch/types.h> |
#include <adt/bitmap.h> |
#include <mm/slab.h> |
/** Perform ia32 specific task initialization. |
* |
* @param t Task to be initialized. |
*/ |
void task_create_arch(task_t *t) |
{ |
t->arch.iomapver = 0; |
bitmap_initialize(&t->arch.iomap, NULL, 0); |
} |
/** Perform ia32 specific task destruction. |
* |
* @param t Task to be initialized. |
*/ |
void task_destroy_arch(task_t *t) |
{ |
if (t->arch.iomap.map) |
free(t->arch.iomap.map); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/src/proc/thread.c |
---|
0,0 → 1,47 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32proc |
* @{ |
*/ |
/** @file |
*/ |
#include <proc/thread.h> |
/** Perform ia32 specific thread initialization. |
* |
* @param t Thread to be initialized. |
*/ |
void thread_create_arch(thread_t *t) |
{ |
t->arch.tls = 0; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/src/asm.S |
---|
0,0 → 1,281 |
# |
# Copyright (c) 2001-2004 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
## very low and hardware-level functions |
# Mask for interrupts 0 - 31 (bits 0 - 31) where 0 means that int has no error |
# word and 1 means interrupt with error word |
#define ERROR_WORD_INTERRUPT_LIST 0x00027d00 |
.text |
.global paging_on |
.global enable_l_apic_in_msr |
.global interrupt_handlers |
.global memcpy |
.global memcpy_from_uspace |
.global memcpy_from_uspace_failover_address |
.global memcpy_to_uspace |
.global memcpy_to_uspace_failover_address |
#define MEMCPY_DST 4 |
#define MEMCPY_SRC 8 |
#define MEMCPY_SIZE 12 |
/** Copy memory to/from userspace. |
* |
* This is almost conventional memcpy(). |
* The difference is that there is a failover part |
* to where control is returned from a page fault |
* if the page fault occurs during copy_from_uspace() |
* or copy_to_uspace(). |
* |
* @param MEMCPY_DST(%esp) Destination address. |
* @param MEMCPY_SRC(%esp) Source address. |
* @param MEMCPY_SIZE(%esp) Size. |
* |
* @return MEMCPY_SRC(%esp) on success and 0 on failure. |
*/ |
memcpy: |
memcpy_from_uspace: |
memcpy_to_uspace: |
movl %edi, %edx /* save %edi */ |
movl %esi, %eax /* save %esi */ |
movl MEMCPY_SIZE(%esp), %ecx |
shrl $2, %ecx /* size / 4 */ |
movl MEMCPY_DST(%esp), %edi |
movl MEMCPY_SRC(%esp), %esi |
rep movsl /* copy whole words */ |
movl MEMCPY_SIZE(%esp), %ecx |
andl $3, %ecx /* size % 4 */ |
jz 0f |
rep movsb /* copy the rest byte by byte */ |
0: |
movl %edx, %edi |
movl %eax, %esi |
movl MEMCPY_SRC(%esp), %eax /* MEMCPY_SRC(%esp), success */ |
ret |
/* |
* We got here from as_page_fault() after the memory operations |
* above had caused a page fault. |
*/ |
memcpy_from_uspace_failover_address: |
memcpy_to_uspace_failover_address: |
movl %edx, %edi |
movl %eax, %esi |
xorl %eax, %eax /* return 0, failure */ |
ret |
## Turn paging on |
# |
# Enable paging and write-back caching in CR0. |
# |
paging_on: |
movl %cr0, %edx |
orl $(1 << 31), %edx # paging on |
# clear Cache Disable and not Write Though |
andl $~((1 << 30) | (1 << 29)), %edx |
movl %edx,%cr0 |
jmp 0f |
0: |
ret |
## Enable local APIC |
# |
# Enable local APIC in MSR. |
# |
enable_l_apic_in_msr: |
movl $0x1b, %ecx |
rdmsr |
orl $(1 << 11), %eax |
orl $(0xfee00000), %eax |
wrmsr |
ret |
# Clear nested flag |
# overwrites %ecx |
.macro CLEAR_NT_FLAG |
pushfl |
pop %ecx |
and $0xffffbfff, %ecx |
push %ecx |
popfl |
.endm |
## Declare interrupt handlers |
# |
# Declare interrupt handlers for n interrupt |
# vectors starting at vector i. |
# |
# The handlers setup data segment registers |
# and call exc_dispatch(). |
# |
#define INTERRUPT_ALIGN 64 |
.macro handler i n |
.ifeq \i - 0x30 # Syscall handler |
pushl %ds |
pushl %es |
pushl %fs |
pushl %gs |
# |
# Push syscall arguments onto the stack |
# |
# NOTE: The idea behind the order of arguments passed in registers is to |
# use all scratch registers first and preserved registers next. |
# An optimized libc syscall wrapper can make use of this setup. |
# |
pushl %eax |
pushl %ebp |
pushl %edi |
pushl %esi |
pushl %ebx |
pushl %ecx |
pushl %edx |
# we must fill the data segment registers |
movw $16, %ax |
movw %ax, %ds |
movw %ax, %es |
sti |
# syscall_handler(edx, ecx, ebx, esi, edi, ebp, eax) |
call syscall_handler |
cli |
addl $28, %esp # clean-up of parameters |
popl %gs |
popl %fs |
popl %es |
popl %ds |
CLEAR_NT_FLAG |
iret |
.else |
/* |
* This macro distinguishes between two versions of ia32 exceptions. |
* One version has error word and the other does not have it. |
* The latter version fakes the error word on the stack so that the |
* handlers and istate_t can be the same for both types. |
*/ |
.iflt \i - 32 |
.if (1 << \i) & ERROR_WORD_INTERRUPT_LIST |
/* |
* With error word, do nothing |
*/ |
.else |
/* |
* Version without error word, |
*/ |
subl $4, %esp |
.endif |
.else |
/* |
* Version without error word, |
*/ |
subl $4, %esp |
.endif |
pushl %ds |
pushl %es |
pushl %fs |
pushl %gs |
#ifdef CONFIG_DEBUG_ALLREGS |
pushl %ebx |
pushl %ebp |
pushl %edi |
pushl %esi |
#else |
subl $16, %esp |
#endif |
pushl %edx |
pushl %ecx |
pushl %eax |
# we must fill the data segment registers |
movw $16, %ax |
movw %ax, %ds |
movw %ax, %es |
pushl %esp # *istate |
pushl $(\i) # intnum |
call exc_dispatch # excdispatch(intnum, *istate) |
addl $8, %esp # Clear arguments from stack |
CLEAR_NT_FLAG # Modifies %ecx |
popl %eax |
popl %ecx |
popl %edx |
#ifdef CONFIG_DEBUG_ALLREGS |
popl %esi |
popl %edi |
popl %ebp |
popl %ebx |
#else |
addl $16, %esp |
#endif |
popl %gs |
popl %fs |
popl %es |
popl %ds |
addl $4, %esp # Skip error word, no matter whether real or fake. |
iret |
.endif |
.align INTERRUPT_ALIGN |
.if (\n- \i) - 1 |
handler "(\i + 1)", \n |
.endif |
.endm |
# keep in sync with pm.h !!! |
IDT_ITEMS = 64 |
.align INTERRUPT_ALIGN |
interrupt_handlers: |
h_start: |
handler 0 IDT_ITEMS |
h_end: |
.data |
.global interrupt_handler_size |
interrupt_handler_size: .long (h_end - h_start) / IDT_ITEMS |
/tags/0.3.0/kernel/arch/ia32/src/pm.c |
---|
0,0 → 1,259 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32 |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/pm.h> |
#include <config.h> |
#include <arch/types.h> |
#include <arch/interrupt.h> |
#include <arch/asm.h> |
#include <arch/context.h> |
#include <panic.h> |
#include <arch/mm/page.h> |
#include <mm/slab.h> |
#include <memstr.h> |
#include <arch/boot/boot.h> |
#include <interrupt.h> |
/* |
* Early ia32 configuration functions and data structures. |
*/ |
/* |
* We have no use for segmentation so we set up flat mode. In this |
* mode, we use, for each privilege level, two segments spanning the |
* whole memory. One is for code and one is for data. |
* |
* One is for GS register which holds pointer to the TLS thread |
* structure in it's base. |
*/ |
descriptor_t gdt[GDT_ITEMS] = { |
/* NULL descriptor */ |
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, |
/* KTEXT descriptor */ |
{ 0xffff, 0, 0, AR_PRESENT | AR_CODE | DPL_KERNEL, 0xf, 0, 0, 1, 1, 0 }, |
/* KDATA descriptor */ |
{ 0xffff, 0, 0, AR_PRESENT | AR_DATA | AR_WRITABLE | DPL_KERNEL, 0xf, 0, 0, 1, 1, 0 }, |
/* UTEXT descriptor */ |
{ 0xffff, 0, 0, AR_PRESENT | AR_CODE | DPL_USER, 0xf, 0, 0, 1, 1, 0 }, |
/* UDATA descriptor */ |
{ 0xffff, 0, 0, AR_PRESENT | AR_DATA | AR_WRITABLE | DPL_USER, 0xf, 0, 0, 1, 1, 0 }, |
/* TSS descriptor - set up will be completed later */ |
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, |
/* TLS descriptor */ |
{ 0xffff, 0, 0, AR_PRESENT | AR_DATA | AR_WRITABLE | DPL_USER, 0xf, 0, 0, 1, 1, 0 }, |
/* VESA Init descriptor */ |
#ifdef CONFIG_FB |
{ 0xffff, 0, VESA_INIT_SEGMENT>>12, AR_PRESENT | AR_CODE | DPL_KERNEL, 0xf, 0, 0, 0, 0, 0 } |
#endif |
}; |
static idescriptor_t idt[IDT_ITEMS]; |
static tss_t tss; |
tss_t *tss_p = NULL; |
/* gdtr is changed by kmp before next CPU is initialized */ |
ptr_16_32_t bootstrap_gdtr = { .limit = sizeof(gdt), .base = KA2PA((uintptr_t) gdt) }; |
ptr_16_32_t gdtr = { .limit = sizeof(gdt), .base = (uintptr_t) gdt }; |
void gdt_setbase(descriptor_t *d, uintptr_t base) |
{ |
d->base_0_15 = base & 0xffff; |
d->base_16_23 = ((base) >> 16) & 0xff; |
d->base_24_31 = ((base) >> 24) & 0xff; |
} |
void gdt_setlimit(descriptor_t *d, uint32_t limit) |
{ |
d->limit_0_15 = limit & 0xffff; |
d->limit_16_19 = (limit >> 16) & 0xf; |
} |
void idt_setoffset(idescriptor_t *d, uintptr_t offset) |
{ |
/* |
* Offset is a linear address. |
*/ |
d->offset_0_15 = offset & 0xffff; |
d->offset_16_31 = offset >> 16; |
} |
void tss_initialize(tss_t *t) |
{ |
memsetb((uintptr_t) t, sizeof(struct tss), 0); |
} |
/* |
* This function takes care of proper setup of IDT and IDTR. |
*/ |
void idt_init(void) |
{ |
idescriptor_t *d; |
unsigned int i; |
for (i = 0; i < IDT_ITEMS; i++) { |
d = &idt[i]; |
d->unused = 0; |
d->selector = selector(KTEXT_DES); |
d->access = AR_PRESENT | AR_INTERRUPT; /* masking interrupt */ |
if (i == VECTOR_SYSCALL) { |
/* |
* The syscall interrupt gate must be calleable from |
* userland. |
*/ |
d->access |= DPL_USER; |
} |
idt_setoffset(d, ((uintptr_t) interrupt_handlers) + |
i * interrupt_handler_size); |
} |
} |
/* Clean IOPL(12,13) and NT(14) flags in EFLAGS register */ |
static void clean_IOPL_NT_flags(void) |
{ |
asm volatile ( |
"pushfl\n" |
"pop %%eax\n" |
"and $0xffff8fff, %%eax\n" |
"push %%eax\n" |
"popfl\n" |
: : : "eax" |
); |
} |
/* Clean AM(18) flag in CR0 register */ |
static void clean_AM_flag(void) |
{ |
asm volatile ( |
"mov %%cr0, %%eax\n" |
"and $0xfffbffff, %%eax\n" |
"mov %%eax, %%cr0\n" |
: : : "eax" |
); |
} |
void pm_init(void) |
{ |
descriptor_t *gdt_p = (descriptor_t *) gdtr.base; |
ptr_16_32_t idtr; |
/* |
* Update addresses in GDT and IDT to their virtual counterparts. |
*/ |
idtr.limit = sizeof(idt); |
idtr.base = (uintptr_t) idt; |
gdtr_load(&gdtr); |
idtr_load(&idtr); |
/* |
* Each CPU has its private GDT and TSS. |
* All CPUs share one IDT. |
*/ |
if (config.cpu_active == 1) { |
idt_init(); |
/* |
* NOTE: bootstrap CPU has statically allocated TSS, because |
* the heap hasn't been initialized so far. |
*/ |
tss_p = &tss; |
} |
else { |
tss_p = (tss_t *) malloc(sizeof(tss_t), FRAME_ATOMIC); |
if (!tss_p) |
panic("could not allocate TSS\n"); |
} |
tss_initialize(tss_p); |
gdt_p[TSS_DES].access = AR_PRESENT | AR_TSS | DPL_KERNEL; |
gdt_p[TSS_DES].special = 1; |
gdt_p[TSS_DES].granularity = 0; |
gdt_setbase(&gdt_p[TSS_DES], (uintptr_t) tss_p); |
gdt_setlimit(&gdt_p[TSS_DES], TSS_BASIC_SIZE - 1); |
/* |
* As of this moment, the current CPU has its own GDT pointing |
* to its own TSS. We just need to load the TR register. |
*/ |
tr_load(selector(TSS_DES)); |
clean_IOPL_NT_flags(); /* Disable I/O on nonprivileged levels and clear NT flag. */ |
clean_AM_flag(); /* Disable alignment check */ |
} |
void set_tls_desc(uintptr_t tls) |
{ |
ptr_16_32_t cpugdtr; |
descriptor_t *gdt_p; |
gdtr_store(&cpugdtr); |
gdt_p = (descriptor_t *) cpugdtr.base; |
gdt_setbase(&gdt_p[TLS_DES], tls); |
/* Reload gdt register to update GS in CPU */ |
gdtr_load(&cpugdtr); |
} |
/* Reboot the machine by initiating |
* a triple fault |
*/ |
void arch_reboot(void) |
{ |
preemption_disable(); |
ipl_t ipl = interrupts_disable(); |
memsetb((uintptr_t) idt, sizeof(idt), 0); |
ptr_16_32_t idtr; |
idtr.limit = sizeof(idt); |
idtr.base = (uintptr_t) idt; |
idtr_load(&idtr); |
interrupts_restore(ipl); |
asm volatile ( |
"int $0x03\n" |
"cli\n" |
"hlt\n" |
); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/src/userspace.c |
---|
0,0 → 1,91 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32 |
* @{ |
*/ |
/** @file |
*/ |
#include <userspace.h> |
#include <arch/pm.h> |
#include <arch/types.h> |
#include <arch.h> |
#include <proc/uarg.h> |
#include <mm/as.h> |
/** Enter userspace |
* |
* Change CPU protection level to 3, enter userspace. |
* |
*/ |
void userspace(uspace_arg_t *kernel_uarg) |
{ |
ipl_t ipl; |
ipl = interrupts_disable(); |
asm volatile ( |
/* |
* Clear nested task flag. |
*/ |
"pushfl\n" |
"pop %%eax\n" |
"and $0xffffbfff, %%eax\n" |
"push %%eax\n" |
"popfl\n" |
/* Set up GS register (TLS) */ |
"movl %6, %%gs\n" |
"pushl %0\n" |
"pushl %1\n" |
"pushl %2\n" |
"pushl %3\n" |
"pushl %4\n" |
"movl %5, %%eax\n" |
"iret\n" |
: |
: "i" (selector(UDATA_DES) | PL_USER), |
"r" ((uint8_t *) kernel_uarg->uspace_stack + |
THREAD_STACK_SIZE), |
"r" (ipl), |
"i" (selector(UTEXT_DES) | PL_USER), |
"r" (kernel_uarg->uspace_entry), |
"r" (kernel_uarg->uspace_uarg), |
"r" (selector(TLS_DES)) |
: "eax"); |
/* Unreachable */ |
for(;;) |
; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/src/interrupt.c |
---|
0,0 → 1,248 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32interrupt |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/interrupt.h> |
#include <syscall/syscall.h> |
#include <print.h> |
#include <debug.h> |
#include <panic.h> |
#include <arch/drivers/i8259.h> |
#include <func.h> |
#include <cpu.h> |
#include <arch/asm.h> |
#include <mm/tlb.h> |
#include <mm/as.h> |
#include <arch.h> |
#include <symtab.h> |
#include <proc/thread.h> |
#include <proc/task.h> |
#include <synch/spinlock.h> |
#include <arch/ddi/ddi.h> |
#include <ipc/sysipc.h> |
#include <interrupt.h> |
#include <ddi/irq.h> |
/* |
* Interrupt and exception dispatching. |
*/ |
void (* disable_irqs_function)(uint16_t irqmask) = NULL; |
void (* enable_irqs_function)(uint16_t irqmask) = NULL; |
void (* eoi_function)(void) = NULL; |
void decode_istate(istate_t *istate) |
{ |
char *symbol = get_symtab_entry(istate->eip); |
if (!symbol) |
symbol = ""; |
if (CPU) |
printf("----------------EXCEPTION OCCURED (cpu%u)----------------\n", CPU->id); |
else |
printf("----------------EXCEPTION OCCURED----------------\n"); |
printf("%%eip: %#lx (%s)\n", istate->eip, symbol); |
printf("ERROR_WORD=%#lx\n", istate->error_word); |
printf("%%cs=%#lx,flags=%#lx\n", istate->cs, istate->eflags); |
printf("%%eax=%#lx, %%ecx=%#lx, %%edx=%#lx, %%esp=%p\n", istate->eax, istate->ecx, istate->edx, &istate->stack[0]); |
#ifdef CONFIG_DEBUG_ALLREGS |
printf("%%esi=%#lx, %%edi=%#lx, %%ebp=%#lx, %%ebx=%#lx\n", istate->esi, istate->edi, istate->ebp, istate->ebx); |
#endif |
printf("stack: %#lx, %#lx, %#lx, %#lx\n", istate->stack[0], istate->stack[1], istate->stack[2], istate->stack[3]); |
printf(" %#lx, %#lx, %#lx, %#lx\n", istate->stack[4], istate->stack[5], istate->stack[6], istate->stack[7]); |
} |
static void trap_virtual_eoi(void) |
{ |
if (eoi_function) |
eoi_function(); |
else |
panic("no eoi_function\n"); |
} |
static void null_interrupt(int n, istate_t *istate) |
{ |
fault_if_from_uspace(istate, "unserviced interrupt: %d", n); |
decode_istate(istate); |
panic("unserviced interrupt: %d\n", n); |
} |
/** General Protection Fault. */ |
static void gp_fault(int n __attribute__((unused)), istate_t *istate) |
{ |
if (TASK) { |
count_t ver; |
spinlock_lock(&TASK->lock); |
ver = TASK->arch.iomapver; |
spinlock_unlock(&TASK->lock); |
if (CPU->arch.iomapver_copy != ver) { |
/* |
* This fault can be caused by an early access |
* to I/O port because of an out-dated |
* I/O Permission bitmap installed on CPU. |
* Install the fresh copy and restart |
* the instruction. |
*/ |
io_perm_bitmap_install(); |
return; |
} |
fault_if_from_uspace(istate, "general protection fault"); |
} |
decode_istate(istate); |
panic("general protection fault\n"); |
} |
static void ss_fault(int n __attribute__((unused)), istate_t *istate) |
{ |
fault_if_from_uspace(istate, "stack fault"); |
decode_istate(istate); |
panic("stack fault\n"); |
} |
static void simd_fp_exception(int n __attribute__((unused)), istate_t *istate) |
{ |
uint32_t mxcsr; |
asm ( |
"stmxcsr %0;\n" |
: "=m" (mxcsr) |
); |
fault_if_from_uspace(istate, "SIMD FP exception(19), MXCSR: %#zx", |
(unative_t) mxcsr); |
decode_istate(istate); |
printf("MXCSR: %#lx\n", mxcsr); |
panic("SIMD FP exception(19)\n"); |
} |
static void nm_fault(int n __attribute__((unused)), istate_t *istate __attribute__((unused))) |
{ |
#ifdef CONFIG_FPU_LAZY |
scheduler_fpu_lazy_request(); |
#else |
fault_if_from_uspace(istate, "fpu fault"); |
panic("fpu fault"); |
#endif |
} |
#ifdef CONFIG_SMP |
static void tlb_shootdown_ipi(int n __attribute__((unused)), istate_t *istate __attribute__((unused))) |
{ |
trap_virtual_eoi(); |
tlb_shootdown_ipi_recv(); |
} |
#endif |
/** Handler of IRQ exceptions */ |
static void irq_interrupt(int n, istate_t *istate __attribute__((unused))) |
{ |
ASSERT(n >= IVT_IRQBASE); |
int inum = n - IVT_IRQBASE; |
bool ack = false; |
ASSERT(inum < IRQ_COUNT); |
ASSERT((inum != IRQ_PIC_SPUR) && (inum != IRQ_PIC1)); |
irq_t *irq = irq_dispatch_and_lock(inum); |
if (irq) { |
/* |
* The IRQ handler was found. |
*/ |
if (irq->preack) { |
/* Send EOI before processing the interrupt */ |
trap_virtual_eoi(); |
ack = true; |
} |
irq->handler(irq, irq->arg); |
spinlock_unlock(&irq->lock); |
} else { |
/* |
* Spurious interrupt. |
*/ |
#ifdef CONFIG_DEBUG |
printf("cpu%u: spurious interrupt (inum=%d)\n", CPU->id, inum); |
#endif |
} |
if (!ack) |
trap_virtual_eoi(); |
} |
void interrupt_init(void) |
{ |
int i; |
for (i = 0; i < IVT_ITEMS; i++) |
exc_register(i, "null", (iroutine) null_interrupt); |
for (i = 0; i < IRQ_COUNT; i++) { |
if ((i != IRQ_PIC_SPUR) && (i != IRQ_PIC1)) |
exc_register(IVT_IRQBASE + i, "irq", (iroutine) irq_interrupt); |
} |
exc_register(7, "nm_fault", (iroutine) nm_fault); |
exc_register(12, "ss_fault", (iroutine) ss_fault); |
exc_register(13, "gp_fault", (iroutine) gp_fault); |
exc_register(19, "simd_fp", (iroutine) simd_fp_exception); |
#ifdef CONFIG_SMP |
exc_register(VECTOR_TLB_SHOOTDOWN_IPI, "tlb_shootdown", (iroutine) tlb_shootdown_ipi); |
#endif |
} |
void trap_virtual_enable_irqs(uint16_t irqmask) |
{ |
if (enable_irqs_function) |
enable_irqs_function(irqmask); |
else |
panic("no enable_irqs_function\n"); |
} |
void trap_virtual_disable_irqs(uint16_t irqmask) |
{ |
if (disable_irqs_function) |
disable_irqs_function(irqmask); |
else |
panic("no disable_irqs_function\n"); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/src/drivers/i8259.c |
---|
0,0 → 1,134 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32 |
* @{ |
*/ |
/** |
* @file |
* @brief PIC driver. |
* |
* Programmable Interrupt Controller for UP systems based on i8259 chip. |
*/ |
#include <arch/drivers/i8259.h> |
#include <cpu.h> |
#include <arch/types.h> |
#include <arch/asm.h> |
#include <arch.h> |
#include <print.h> |
#include <interrupt.h> |
static void pic_spurious(int n, istate_t *istate); |
void i8259_init(void) |
{ |
/* ICW1: this is ICW1, ICW4 to follow */ |
outb(PIC_PIC0PORT1, PIC_ICW1 | PIC_NEEDICW4); |
/* ICW2: IRQ 0 maps to INT IRQBASE */ |
outb(PIC_PIC0PORT2, IVT_IRQBASE); |
/* ICW3: pic1 using IRQ IRQ_PIC1 */ |
outb(PIC_PIC0PORT2, 1 << IRQ_PIC1); |
/* ICW4: i8086 mode */ |
outb(PIC_PIC0PORT2, 1); |
/* ICW1: ICW1, ICW4 to follow */ |
outb(PIC_PIC1PORT1, PIC_ICW1 | PIC_NEEDICW4); |
/* ICW2: IRQ 8 maps to INT (IVT_IRQBASE + 8) */ |
outb(PIC_PIC1PORT2, IVT_IRQBASE + 8); |
/* ICW3: pic1 is known as IRQ_PIC1 */ |
outb(PIC_PIC1PORT2, IRQ_PIC1); |
/* ICW4: i8086 mode */ |
outb(PIC_PIC1PORT2, 1); |
/* |
* Register interrupt handler for the PIC spurious interrupt. |
*/ |
exc_register(VECTOR_PIC_SPUR, "pic_spurious", (iroutine) pic_spurious); |
/* |
* Set the enable/disable IRQs handlers. |
* Set the End-of-Interrupt handler. |
*/ |
enable_irqs_function = pic_enable_irqs; |
disable_irqs_function = pic_disable_irqs; |
eoi_function = pic_eoi; |
pic_disable_irqs(0xffff); /* disable all irq's */ |
pic_enable_irqs(1 << IRQ_PIC1); /* but enable pic1 */ |
} |
void pic_enable_irqs(uint16_t irqmask) |
{ |
uint8_t x; |
if (irqmask & 0xff) { |
x = inb(PIC_PIC0PORT2); |
outb(PIC_PIC0PORT2, (uint8_t) (x & (~(irqmask & 0xff)))); |
} |
if (irqmask >> 8) { |
x = inb(PIC_PIC1PORT2); |
outb(PIC_PIC1PORT2, (uint8_t) (x & (~(irqmask >> 8)))); |
} |
} |
void pic_disable_irqs(uint16_t irqmask) |
{ |
uint8_t x; |
if (irqmask & 0xff) { |
x = inb(PIC_PIC0PORT2); |
outb(PIC_PIC0PORT2, (uint8_t) (x | (irqmask & 0xff))); |
} |
if (irqmask >> 8) { |
x = inb(PIC_PIC1PORT2); |
outb(PIC_PIC1PORT2, (uint8_t) (x | (irqmask >> 8))); |
} |
} |
void pic_eoi(void) |
{ |
outb(0x20, 0x20); |
outb(0xa0, 0x20); |
} |
void pic_spurious(int n __attribute__((unused)), istate_t *istate __attribute__((unused))) |
{ |
#ifdef CONFIG_DEBUG |
printf("cpu%u: PIC spurious interrupt\n", CPU->id); |
#endif |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/src/drivers/i8254.c |
---|
0,0 → 1,162 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32 |
* @{ |
*/ |
/** |
* @file |
* @brief i8254 chip driver. |
* |
* Low level time functions. |
*/ |
#include <arch/types.h> |
#include <time/clock.h> |
#include <time/delay.h> |
#include <arch/cycle.h> |
#include <arch/interrupt.h> |
#include <arch/drivers/i8259.h> |
#include <arch/drivers/i8254.h> |
#include <cpu.h> |
#include <config.h> |
#include <arch/pm.h> |
#include <arch/asm.h> |
#include <arch/cpuid.h> |
#include <arch.h> |
#include <time/delay.h> |
#include <ddi/irq.h> |
#include <ddi/device.h> |
#define CLK_PORT1 0x40 |
#define CLK_PORT4 0x43 |
#define CLK_CONST 1193180 |
#define MAGIC_NUMBER 1194 |
static irq_t i8254_irq; |
static irq_ownership_t i8254_claim(void) |
{ |
return IRQ_ACCEPT; |
} |
static void i8254_irq_handler(irq_t *irq, void *arg __attribute__((unused)), ...) |
{ |
/* |
* This IRQ is responsible for kernel preemption. |
* Nevertheless, we are now holding a spinlock which prevents |
* preemption. For this particular IRQ, we don't need the |
* lock. We just release it, call clock() and then reacquire it again. |
*/ |
spinlock_unlock(&irq->lock); |
clock(); |
spinlock_lock(&irq->lock); |
} |
void i8254_init(void) |
{ |
irq_initialize(&i8254_irq); |
i8254_irq.preack = true; |
i8254_irq.devno = device_assign_devno(); |
i8254_irq.inr = IRQ_CLK; |
i8254_irq.claim = i8254_claim; |
i8254_irq.handler = i8254_irq_handler; |
irq_register(&i8254_irq); |
i8254_normal_operation(); |
} |
void i8254_normal_operation(void) |
{ |
outb(CLK_PORT4, 0x36); |
pic_disable_irqs(1 << IRQ_CLK); |
outb(CLK_PORT1, (CLK_CONST / HZ) & 0xf); |
outb(CLK_PORT1, (CLK_CONST / HZ) >> 8); |
pic_enable_irqs(1 << IRQ_CLK); |
} |
#define LOOPS 150000 |
#define SHIFT 11 |
void i8254_calibrate_delay_loop(void) |
{ |
uint64_t clk1, clk2; |
uint32_t t1, t2, o1, o2; |
uint8_t not_ok; |
/* |
* One-shot timer. Count-down from 0xffff at 1193180Hz |
* MAGIC_NUMBER is the magic value for 1ms. |
*/ |
outb(CLK_PORT4, 0x30); |
outb(CLK_PORT1, 0xff); |
outb(CLK_PORT1, 0xff); |
do { |
/* will read both status and count */ |
outb(CLK_PORT4, 0xc2); |
not_ok = (uint8_t) ((inb(CLK_PORT1) >> 6) & 1); |
t1 = inb(CLK_PORT1); |
t1 |= inb(CLK_PORT1) << 8; |
} while (not_ok); |
asm_delay_loop(LOOPS); |
outb(CLK_PORT4, 0xd2); |
t2 = inb(CLK_PORT1); |
t2 |= inb(CLK_PORT1) << 8; |
/* |
* We want to determine the overhead of the calibrating mechanism. |
*/ |
outb(CLK_PORT4, 0xd2); |
o1 = inb(CLK_PORT1); |
o1 |= inb(CLK_PORT1) << 8; |
asm_fake_loop(LOOPS); |
outb(CLK_PORT4, 0xd2); |
o2 = inb(CLK_PORT1); |
o2 |= inb(CLK_PORT1) << 8; |
CPU->delay_loop_const = |
((MAGIC_NUMBER * LOOPS) / 1000) / ((t1 - t2) - (o1 - o2)) + |
(((MAGIC_NUMBER * LOOPS) / 1000) % ((t1 - t2) - (o1 - o2)) ? 1 : 0); |
clk1 = get_cycle(); |
delay(1 << SHIFT); |
clk2 = get_cycle(); |
CPU->frequency_mhz = (clk2 - clk1) >> SHIFT; |
return; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/src/drivers/ega.c |
---|
0,0 → 1,161 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32 |
* @{ |
*/ |
/** |
* @file |
* @brief EGA driver. |
*/ |
#include <arch/drivers/ega.h> |
#include <putchar.h> |
#include <mm/page.h> |
#include <mm/as.h> |
#include <arch/mm/page.h> |
#include <synch/spinlock.h> |
#include <arch/types.h> |
#include <arch/asm.h> |
#include <memstr.h> |
#include <console/chardev.h> |
#include <console/console.h> |
#include <sysinfo/sysinfo.h> |
#include <ddi/ddi.h> |
/* |
* The EGA driver. |
* Simple and short. Function for displaying characters and "scrolling". |
*/ |
static parea_t ega_parea; /**< Physical memory area for EGA video RAM. */ |
SPINLOCK_INITIALIZE(egalock); |
static uint32_t ega_cursor; |
static uint8_t *videoram; |
static void ega_putchar(chardev_t *d, const char ch); |
chardev_t ega_console; |
static chardev_operations_t ega_ops = { |
.write = ega_putchar |
}; |
static void ega_move_cursor(void); |
void ega_init(void) |
{ |
uint8_t hi, lo; |
videoram = (uint8_t *) hw_map(VIDEORAM, SCREEN * 2); |
outb(0x3d4, 0xe); |
hi = inb(0x3d5); |
outb(0x3d4, 0xf); |
lo = inb(0x3d5); |
ega_cursor = (hi << 8) | lo; |
chardev_initialize("ega_out", &ega_console, &ega_ops); |
stdout = &ega_console; |
ega_parea.pbase = VIDEORAM; |
ega_parea.vbase = (uintptr_t) videoram; |
ega_parea.frames = 1; |
ega_parea.cacheable = false; |
ddi_parea_register(&ega_parea); |
sysinfo_set_item_val("fb", NULL, true); |
sysinfo_set_item_val("fb.kind", NULL, 2); |
sysinfo_set_item_val("fb.width", NULL, ROW); |
sysinfo_set_item_val("fb.height", NULL, ROWS); |
sysinfo_set_item_val("fb.address.physical", NULL, VIDEORAM); |
sysinfo_set_item_val("fb.address.color", NULL, PAGE_COLOR((uintptr_t) |
videoram)); |
#ifndef CONFIG_FB |
putchar('\n'); |
#endif |
} |
static void ega_display_char(char ch) |
{ |
videoram[ega_cursor * 2] = ch; |
} |
/* |
* This function takes care of scrolling. |
*/ |
static void ega_check_cursor(void) |
{ |
if (ega_cursor < SCREEN) |
return; |
memcpy((void *) videoram, (void *) (videoram + ROW * 2), (SCREEN - ROW) * 2); |
memsetw((uintptr_t) (videoram + (SCREEN - ROW) * 2), ROW, 0x0720); |
ega_cursor = ega_cursor - ROW; |
} |
void ega_putchar(chardev_t *d __attribute__((unused)), const char ch) |
{ |
ipl_t ipl; |
ipl = interrupts_disable(); |
spinlock_lock(&egalock); |
switch (ch) { |
case '\n': |
ega_cursor = (ega_cursor + ROW) - ega_cursor % ROW; |
break; |
case '\t': |
ega_cursor = (ega_cursor + 8) - ega_cursor % 8; |
break; |
case '\b': |
if (ega_cursor % ROW) |
ega_cursor--; |
break; |
default: |
ega_display_char(ch); |
ega_cursor++; |
break; |
} |
ega_check_cursor(); |
ega_move_cursor(); |
spinlock_unlock(&egalock); |
interrupts_restore(ipl); |
} |
void ega_move_cursor(void) |
{ |
outb(0x3d4, 0xe); |
outb(0x3d5, (uint8_t) ((ega_cursor >> 8) & 0xff)); |
outb(0x3d4, 0xf); |
outb(0x3d5, (uint8_t) (ega_cursor & 0xff)); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/src/drivers/vesa.c |
---|
0,0 → 1,95 |
/* |
* Copyright (c) 2006 Jakub Vana |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32 |
* @{ |
*/ |
/** |
* @file |
* @brief VESA frame buffer driver. |
*/ |
#ifdef CONFIG_FB |
#include <genarch/fb/fb.h> |
#include <genarch/fb/visuals.h> |
#include <arch/drivers/vesa.h> |
#include <putchar.h> |
#include <mm/page.h> |
#include <mm/frame.h> |
#include <mm/as.h> |
#include <arch/mm/page.h> |
#include <synch/spinlock.h> |
#include <arch/asm.h> |
#include <arch/types.h> |
#include <memstr.h> |
#include <bitops.h> |
uint32_t vesa_ph_addr; |
uint16_t vesa_width; |
uint16_t vesa_height; |
uint16_t vesa_bpp; |
uint16_t vesa_scanline; |
int vesa_present(void) |
{ |
if (vesa_width != 0xffff) |
return true; |
if (vesa_height != 0xffff) |
return true; |
return false; |
} |
void vesa_init(void) |
{ |
unsigned int visual; |
switch (vesa_bpp) { |
case 8: |
visual = VISUAL_INDIRECT_8; |
break; |
case 16: |
visual = VISUAL_RGB_5_6_5; |
break; |
case 24: |
visual = VISUAL_RGB_8_8_8; |
break; |
case 32: |
visual = VISUAL_RGB_0_8_8_8; |
break; |
default: |
panic("Unsupported bits per pixel"); |
} |
fb_init(vesa_ph_addr, vesa_width, vesa_height, vesa_scanline, visual); |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/src/cpu/cpu.c |
---|
0,0 → 1,165 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32 |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/cpu.h> |
#include <arch/cpuid.h> |
#include <arch/pm.h> |
#include <arch.h> |
#include <arch/types.h> |
#include <print.h> |
#include <fpu_context.h> |
#include <arch/smp/apic.h> |
/* |
* Identification of CPUs. |
* Contains only non-MP-Specification specific SMP code. |
*/ |
#define AMD_CPUID_EBX 0x68747541 |
#define AMD_CPUID_ECX 0x444d4163 |
#define AMD_CPUID_EDX 0x69746e65 |
#define INTEL_CPUID_EBX 0x756e6547 |
#define INTEL_CPUID_ECX 0x6c65746e |
#define INTEL_CPUID_EDX 0x49656e69 |
enum vendor { |
VendorUnknown=0, |
VendorAMD, |
VendorIntel |
}; |
static char *vendor_str[] = { |
"Unknown Vendor", |
"AuthenticAMD", |
"GenuineIntel" |
}; |
void fpu_disable(void) |
{ |
asm volatile ( |
"mov %%cr0,%%eax;" |
"or $8,%%eax;" |
"mov %%eax,%%cr0;" |
: |
: |
:"%eax" |
); |
} |
void fpu_enable(void) |
{ |
asm volatile ( |
"mov %%cr0,%%eax;" |
"and $0xffFFffF7,%%eax;" |
"mov %%eax,%%cr0;" |
: |
: |
:"%eax" |
); |
} |
void cpu_arch_init(void) |
{ |
cpuid_feature_info fi; |
cpuid_extended_feature_info efi; |
cpu_info_t info; |
uint32_t help = 0; |
CPU->arch.tss = tss_p; |
CPU->arch.tss->iomap_base = &CPU->arch.tss->iomap[0] - ((uint8_t *) CPU->arch.tss); |
CPU->fpu_owner = NULL; |
cpuid(1, &info); |
fi.word = info.cpuid_edx; |
efi.word = info.cpuid_ecx; |
if (fi.bits.fxsr) |
fpu_fxsr(); |
else |
fpu_fsr(); |
if (fi.bits.sse) { |
asm volatile ( |
"mov %%cr4,%0\n" |
"or %1,%0\n" |
"mov %0,%%cr4\n" |
: "+r" (help) |
: "i" (CR4_OSFXSR_MASK|(1<<10)) |
); |
} |
} |
void cpu_identify(void) |
{ |
cpu_info_t info; |
CPU->arch.vendor = VendorUnknown; |
if (has_cpuid()) { |
cpuid(0, &info); |
/* |
* Check for AMD processor. |
*/ |
if (info.cpuid_ebx==AMD_CPUID_EBX && info.cpuid_ecx==AMD_CPUID_ECX && info.cpuid_edx==AMD_CPUID_EDX) { |
CPU->arch.vendor = VendorAMD; |
} |
/* |
* Check for Intel processor. |
*/ |
if (info.cpuid_ebx==INTEL_CPUID_EBX && info.cpuid_ecx==INTEL_CPUID_ECX && info.cpuid_edx==INTEL_CPUID_EDX) { |
CPU->arch.vendor = VendorIntel; |
} |
cpuid(1, &info); |
CPU->arch.family = (info.cpuid_eax>>8)&0xf; |
CPU->arch.model = (info.cpuid_eax>>4)&0xf; |
CPU->arch.stepping = (info.cpuid_eax>>0)&0xf; |
} |
} |
void cpu_print_report(cpu_t* m) |
{ |
printf("cpu%d: (%s family=%d model=%d stepping=%d) %dMHz\n", |
m->id, vendor_str[m->arch.vendor], m->arch.family, m->arch.model, m->arch.stepping, |
m->frequency_mhz); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/src/fpu_context.c |
---|
0,0 → 1,119 |
/* |
* Copyright (c) 2005 Jakub Vana |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32 |
* @{ |
*/ |
/** @file |
* |
*/ |
#include <fpu_context.h> |
#include <arch.h> |
#include <cpu.h> |
typedef void (*fpu_context_function)(fpu_context_t *fctx); |
static fpu_context_function fpu_save, fpu_restore; |
static void fpu_context_f_save(fpu_context_t *fctx) |
{ |
asm volatile ( |
"fnsave %0" |
: "=m"(*fctx) |
); |
} |
static void fpu_context_f_restore(fpu_context_t *fctx) |
{ |
asm volatile ( |
"frstor %0" |
: "=m"(*fctx) |
); |
} |
static void fpu_context_fx_save(fpu_context_t *fctx) |
{ |
asm volatile ( |
"fxsave %0" |
: "=m"(*fctx) |
); |
} |
static void fpu_context_fx_restore(fpu_context_t *fctx) |
{ |
asm volatile ( |
"fxrstor %0" |
: "=m"(*fctx) |
); |
} |
/* |
Setup using fxsr instruction |
*/ |
void fpu_fxsr(void) |
{ |
fpu_save=fpu_context_fx_save; |
fpu_restore=fpu_context_fx_restore; |
} |
/* |
Setup using not fxsr instruction |
*/ |
void fpu_fsr(void) |
{ |
fpu_save = fpu_context_f_save; |
fpu_restore = fpu_context_f_restore; |
} |
void fpu_context_save(fpu_context_t *fctx) |
{ |
fpu_save(fctx); |
} |
void fpu_context_restore(fpu_context_t *fctx) |
{ |
fpu_restore(fctx); |
} |
void fpu_init() |
{ |
uint32_t help0 = 0, help1 = 0; |
asm volatile ( |
"fninit;\n" |
"stmxcsr %0\n" |
"mov %0,%1;\n" |
"or %2,%1;\n" |
"mov %1,%0;\n" |
"ldmxcsr %0;\n" |
: "+m" (help0), "+r" (help1) |
: "i" (0x1f80) |
); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/src/debug/panic.s |
---|
0,0 → 1,34 |
# |
# Copyright (c) 2001-2004 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
.text |
.global panic_printf |
panic_printf: |
movl $halt,(%esp) # fake stack to make printf return to halt |
jmp printf |
/tags/0.3.0/kernel/arch/ia32/src/bios/bios.c |
---|
0,0 → 1,47 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32 |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/bios/bios.h> |
#include <arch/types.h> |
uintptr_t ebda = 0; |
void bios_init(void) |
{ |
/* Copy the EBDA address out from BIOS Data Area */ |
ebda = *((uint16_t *) BIOS_EBDA_PTR) * 0x10; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/src/delay.s |
---|
0,0 → 1,50 |
# |
# Copyright (c) 2001-2004 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
# |
# Micro second delay loop functions. |
# |
.text |
.global asm_delay_loop |
.global asm_fake_loop |
asm_delay_loop: |
movl 4(%esp),%ecx # move argument to %ecx |
0: lahf |
dec %ecx |
jnz 0b |
ret |
asm_fake_loop: |
movl 4(%esp),%ecx # move argument to %ecx |
0: lahf |
dec %ecx |
jz 0b |
ret |
/tags/0.3.0/kernel/arch/ia32/src/atomic.S |
---|
0,0 → 1,60 |
# |
# Copyright (c) 2001-2004 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
.text |
#ifdef CONFIG_SMP |
.global spinlock_arch |
# |
# This is a bus-and-hyperthreading-friendly implementation of spinlock |
# |
spinlock_arch: |
pushl %eax |
pushl %ebx |
movl 12(%esp),%ebx |
0: |
#ifdef CONFIG_HT |
pause # Pentium 4's with HT love this instruction |
#endif |
movl (%ebx),%eax |
testl %eax,%eax |
jnz 0b # lightweight looping while it is locked |
incl %eax |
xchgl %eax,(%ebx) # now use the atomic operation |
testl %eax,%eax |
jnz 0b |
popl %ebx |
popl %eax |
ret |
#endif |
/tags/0.3.0/kernel/arch/ia32/src/debugger.c |
---|
0,0 → 1,0 |
link ../../amd64/src/debugger.c |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/arch/ia32/include/context_offset.h |
---|
0,0 → 1,83 |
/* |
* Copyright (c) 2008 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia32_CONTEXT_OFFSET_H_ |
#define KERN_ia32_CONTEXT_OFFSET_H_ |
#define OFFSET_SP 0x0 |
#define OFFSET_PC 0x4 |
#define OFFSET_EBX 0x8 |
#define OFFSET_ESI 0xC |
#define OFFSET_EDI 0x10 |
#define OFFSET_EBP 0x14 |
#ifdef KERNEL |
# define OFFSET_IPL 0x18 |
#else |
# define OFFSET_TLS 0x18 |
#endif |
#ifdef __ASM__ |
# ctx: address of the structure with saved context |
# pc: return address |
.macro CONTEXT_SAVE_ARCH_CORE ctx:req pc:req |
movl %esp,OFFSET_SP(\ctx) # %esp -> ctx->sp |
movl \pc,OFFSET_PC(\ctx) # %eip -> ctx->pc |
movl %ebx,OFFSET_EBX(\ctx) # %ebx -> ctx->ebx |
movl %esi,OFFSET_ESI(\ctx) # %esi -> ctx->esi |
movl %edi,OFFSET_EDI(\ctx) # %edi -> ctx->edi |
movl %ebp,OFFSET_EBP(\ctx) # %ebp -> ctx->ebp |
.endm |
# ctx: address of the structure with saved context |
.macro CONTEXT_RESTORE_ARCH_CORE ctx:req pc:req |
movl OFFSET_SP(\ctx),%esp # ctx->sp -> %esp |
movl OFFSET_PC(\ctx),\pc # ctx->pc -> \pc |
movl OFFSET_EBX(\ctx),%ebx # ctx->ebx -> %ebx |
movl OFFSET_ESI(\ctx),%esi # ctx->esi -> %esi |
movl OFFSET_EDI(\ctx),%edi # ctx->edi -> %edi |
movl OFFSET_EBP(\ctx),%ebp # ctx->ebp -> %ebp |
.endm |
#endif /* __ASM__ */ |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/include/context.h |
---|
0,0 → 1,70 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia32_CONTEXT_H_ |
#define KERN_ia32_CONTEXT_H_ |
#ifdef KERNEL |
#include <arch/types.h> |
#define STACK_ITEM_SIZE 4 |
/* |
* Both context_save() and context_restore() eat two doublewords from the stack. |
* First for pop of the saved register, second during ret instruction. |
* |
* One item is put onto stack to support get_stack_base(). |
*/ |
#define SP_DELTA (8 + STACK_ITEM_SIZE) |
#endif /* KERNEL */ |
/* |
* Only save registers that must be preserved across |
* function calls. |
*/ |
typedef struct { |
uintptr_t sp; |
uintptr_t pc; |
uint32_t ebx; |
uint32_t esi; |
uint32_t edi; |
uint32_t ebp; |
ipl_t ipl; |
} __attribute__ ((packed)) context_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/include/boot/memmap.h |
---|
0,0 → 1,74 |
/* |
* Copyright (c) 2005 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia32_MEMMAP_H_ |
#define KERN_ia32_MEMMAP_H_ |
/* E820h memory range types - other values*/ |
/* Free memory */ |
#define MEMMAP_MEMORY_AVAILABLE 1 |
/* Not available for OS */ |
#define MEMMAP_MEMORY_RESERVED 2 |
/* OS may use it after reading ACPI table */ |
#define MEMMAP_MEMORY_ACPI 3 |
/* Unusable, required to be saved and restored across an NVS sleep */ |
#define MEMMAP_MEMORY_NVS 4 |
/* Corrupted memory */ |
#define MEMMAP_MEMORY_UNUSABLE 5 |
/* size of one entry */ |
#define MEMMAP_E820_RECORD_SIZE 20 |
/* maximum entries */ |
#define MEMMAP_E820_MAX_RECORDS 32 |
#ifndef __ASM__ |
#include <arch/types.h> |
typedef struct { |
uint64_t base_address; |
uint64_t size; |
uint32_t type; |
} __attribute__ ((packed)) e820memmap_t; |
extern e820memmap_t e820table[MEMMAP_E820_MAX_RECORDS]; |
extern uint8_t e820counter; |
#endif |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/include/boot/boot.h |
---|
0,0 → 1,50 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia32_BOOT_H_ |
#define KERN_ia32_BOOT_H_ |
#define BOOT_OFFSET 0x108000 |
#define AP_BOOT_OFFSET 0x8000 |
#define BOOT_STACK_SIZE 0x400 |
#define MULTIBOOT_HEADER_MAGIC 0x1BADB002 |
#define MULTIBOOT_HEADER_FLAGS 0x00010003 |
#define MULTIBOOT_LOADER_MAGIC 0x2BADB002 |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/include/mm/frame.h |
---|
0,0 → 1,57 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32mm |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia32_FRAME_H_ |
#define KERN_ia32_FRAME_H_ |
#define FRAME_WIDTH 12 /* 4K */ |
#define FRAME_SIZE (1 << FRAME_WIDTH) |
#ifdef KERNEL |
#ifndef __ASM__ |
#include <arch/types.h> |
extern uintptr_t last_frame; |
extern void frame_arch_init(void); |
extern void physmem_print(void); |
#endif /* __ASM__ */ |
#endif /* KERNEL */ |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/include/mm/page.h |
---|
0,0 → 1,188 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32mm |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia32_PAGE_H_ |
#define KERN_ia32_PAGE_H_ |
#include <arch/mm/frame.h> |
#define PAGE_WIDTH FRAME_WIDTH |
#define PAGE_SIZE FRAME_SIZE |
#define PAGE_COLOR_BITS 0 /* dummy */ |
#ifdef KERNEL |
#ifndef __ASM__ |
# define KA2PA(x) (((uintptr_t) (x)) - 0x80000000) |
# define PA2KA(x) (((uintptr_t) (x)) + 0x80000000) |
#else |
# define KA2PA(x) ((x) - 0x80000000) |
# define PA2KA(x) ((x) + 0x80000000) |
#endif |
/* |
* Implementation of generic 4-level page table interface. |
* IA-32 has 2-level page tables, so PTL1 and PTL2 are left out. |
*/ |
/* Number of entries in each level. */ |
#define PTL0_ENTRIES_ARCH 1024 |
#define PTL1_ENTRIES_ARCH 0 |
#define PTL2_ENTRIES_ARCH 0 |
#define PTL3_ENTRIES_ARCH 1024 |
/* Page table sizes for each level. */ |
#define PTL0_SIZE_ARCH ONE_FRAME |
#define PTL1_SIZE_ARCH 0 |
#define PTL2_SIZE_ARCH 0 |
#define PTL3_SIZE_ARCH ONE_FRAME |
/* Macros calculating indices for each level. */ |
#define PTL0_INDEX_ARCH(vaddr) (((vaddr) >> 22) & 0x3ff) |
#define PTL1_INDEX_ARCH(vaddr) 0 |
#define PTL2_INDEX_ARCH(vaddr) 0 |
#define PTL3_INDEX_ARCH(vaddr) (((vaddr) >> 12) & 0x3ff) |
/* Get PTE address accessors for each level. */ |
#define GET_PTL1_ADDRESS_ARCH(ptl0, i) \ |
((pte_t *) ((((pte_t *) (ptl0))[(i)].frame_address) << 12)) |
#define GET_PTL2_ADDRESS_ARCH(ptl1, i) \ |
(ptl1) |
#define GET_PTL3_ADDRESS_ARCH(ptl2, i) \ |
(ptl2) |
#define GET_FRAME_ADDRESS_ARCH(ptl3, i) \ |
((uintptr_t) ((((pte_t *) (ptl3))[(i)].frame_address) << 12)) |
/* Set PTE address accessors for each level. */ |
#define SET_PTL0_ADDRESS_ARCH(ptl0) \ |
(write_cr3((uintptr_t) (ptl0))) |
#define SET_PTL1_ADDRESS_ARCH(ptl0, i, a) \ |
(((pte_t *) (ptl0))[(i)].frame_address = (a) >> 12) |
#define SET_PTL2_ADDRESS_ARCH(ptl1, i, a) |
#define SET_PTL3_ADDRESS_ARCH(ptl2, i, a) |
#define SET_FRAME_ADDRESS_ARCH(ptl3, i, a) \ |
(((pte_t *) (ptl3))[(i)].frame_address = (a) >> 12) |
/* Get PTE flags accessors for each level. */ |
#define GET_PTL1_FLAGS_ARCH(ptl0, i) \ |
get_pt_flags((pte_t *) (ptl0), (index_t) (i)) |
#define GET_PTL2_FLAGS_ARCH(ptl1, i) \ |
PAGE_PRESENT |
#define GET_PTL3_FLAGS_ARCH(ptl2, i) \ |
PAGE_PRESENT |
#define GET_FRAME_FLAGS_ARCH(ptl3, i) \ |
get_pt_flags((pte_t *) (ptl3), (index_t) (i)) |
/* Set PTE flags accessors for each level. */ |
#define SET_PTL1_FLAGS_ARCH(ptl0, i, x) \ |
set_pt_flags((pte_t *) (ptl0), (index_t) (i), (x)) |
#define SET_PTL2_FLAGS_ARCH(ptl1, i, x) |
#define SET_PTL3_FLAGS_ARCH(ptl2, i, x) |
#define SET_FRAME_FLAGS_ARCH(ptl3, i, x) \ |
set_pt_flags((pte_t *) (ptl3), (index_t) (i), (x)) |
/* Macros for querying the last level entries. */ |
#define PTE_VALID_ARCH(p) \ |
(*((uint32_t *) (p)) != 0) |
#define PTE_PRESENT_ARCH(p) \ |
((p)->present != 0) |
#define PTE_GET_FRAME_ARCH(p) \ |
((p)->frame_address << FRAME_WIDTH) |
#define PTE_WRITABLE_ARCH(p) \ |
((p)->writeable != 0) |
#define PTE_EXECUTABLE_ARCH(p) 1 |
#ifndef __ASM__ |
#include <mm/mm.h> |
#include <arch/interrupt.h> |
/* Page fault error codes. */ |
/** When bit on this position is 0, the page fault was caused by a not-present |
* page. |
*/ |
#define PFERR_CODE_P (1 << 0) |
/** When bit on this position is 1, the page fault was caused by a write. */ |
#define PFERR_CODE_RW (1 << 1) |
/** When bit on this position is 1, the page fault was caused in user mode. */ |
#define PFERR_CODE_US (1 << 2) |
/** When bit on this position is 1, a reserved bit was set in page directory. */ |
#define PFERR_CODE_RSVD (1 << 3) |
static inline int get_pt_flags(pte_t *pt, index_t i) |
{ |
pte_t *p = &pt[i]; |
return ((!p->page_cache_disable) << PAGE_CACHEABLE_SHIFT | |
(!p->present) << PAGE_PRESENT_SHIFT | |
p->uaccessible << PAGE_USER_SHIFT | |
1 << PAGE_READ_SHIFT | |
p->writeable << PAGE_WRITE_SHIFT | |
1 << PAGE_EXEC_SHIFT | |
p->global << PAGE_GLOBAL_SHIFT); |
} |
static inline void set_pt_flags(pte_t *pt, index_t i, int flags) |
{ |
pte_t *p = &pt[i]; |
p->page_cache_disable = !(flags & PAGE_CACHEABLE); |
p->present = !(flags & PAGE_NOT_PRESENT); |
p->uaccessible = (flags & PAGE_USER) != 0; |
p->writeable = (flags & PAGE_WRITE) != 0; |
p->global = (flags & PAGE_GLOBAL) != 0; |
/* |
* Ensure that there is at least one bit set even if the present bit is |
* cleared. |
*/ |
p->soft_valid = true; |
} |
extern void page_arch_init(void); |
extern void page_fault(int n, istate_t *istate); |
#endif /* __ASM__ */ |
#endif /* KERNEL */ |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/include/mm/asid.h |
---|
0,0 → 1,57 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32mm |
* @{ |
*/ |
/** @file |
* @ingroup ia32mm, amd64mm |
*/ |
/* |
* ia32 has no hardware support for address space identifiers. |
* This file is provided to do nop-implementation of mm/asid.h |
* interface. |
*/ |
#ifndef KERN_ia32_ASID_H_ |
#define KERN_ia32_ASID_H_ |
#include <arch/types.h> |
typedef int32_t asid_t; |
#define ASID_MAX_ARCH 3 |
#define asid_get() (ASID_START + 1) |
#define asid_put(asid) |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/include/mm/as.h |
---|
0,0 → 1,64 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32mm |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia32_AS_H_ |
#define KERN_ia32_AS_H_ |
#define KERNEL_ADDRESS_SPACE_SHADOWED_ARCH 0 |
#define KERNEL_ADDRESS_SPACE_START_ARCH ((unsigned long) 0x80000000) |
#define KERNEL_ADDRESS_SPACE_END_ARCH ((unsigned long) 0xffffffff) |
#define USER_ADDRESS_SPACE_START_ARCH ((unsigned long) 0x00000000) |
#define USER_ADDRESS_SPACE_END_ARCH ((unsigned long) 0x7fffffff) |
#define USTACK_ADDRESS_ARCH (USER_ADDRESS_SPACE_END_ARCH-(PAGE_SIZE-1)) |
typedef struct { |
} as_arch_t; |
#include <genarch/mm/as_pt.h> |
#define as_constructor_arch(as, flags) (as != as) |
#define as_destructor_arch(as) (as != as) |
#define as_create_arch(as, flags) (as != as) |
#define as_install_arch(as) |
#define as_deinstall_arch(as) |
#define as_invalidate_translation_cache(as, page, cnt) |
extern void as_arch_init(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/include/mm/tlb.h |
---|
0,0 → 1,44 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32mm |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia32_TLB_H_ |
#define KERN_ia32_TLB_H_ |
#define tlb_arch_init() |
#define tlb_print() |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/include/proc/task.h |
---|
0,0 → 1,51 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32proc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia32_TASK_H_ |
#define KERN_ia32_TASK_H_ |
#include <arch/types.h> |
#include <adt/bitmap.h> |
typedef struct { |
/** I/O Permission bitmap Generation counter. */ |
count_t iomapver; |
/** I/O Permission bitmap. */ |
bitmap_t iomap; |
} task_arch_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/include/proc/thread.h |
---|
0,0 → 1,50 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32proc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia32_THREAD_H_ |
#define KERN_ia32_THREAD_H_ |
#include <arch/types.h> |
typedef struct { |
unative_t tls; |
} thread_arch_t; |
#define thr_constructor_arch(t) |
#define thr_destructor_arch(t) |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/include/interrupt.h |
---|
0,0 → 1,120 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32interrupt |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia32_INTERRUPT_H_ |
#define KERN_ia32_INTERRUPT_H_ |
#include <arch/types.h> |
#include <arch/pm.h> |
#define IVT_ITEMS IDT_ITEMS |
#define IVT_FIRST 0 |
#define EXC_COUNT 32 |
#define IRQ_COUNT 16 |
#define IVT_EXCBASE 0 |
#define IVT_IRQBASE (IVT_EXCBASE + EXC_COUNT) |
#define IVT_FREEBASE (IVT_IRQBASE + IRQ_COUNT) |
#define IRQ_CLK 0 |
#define IRQ_KBD 1 |
#define IRQ_PIC1 2 |
#define IRQ_PIC_SPUR 7 |
#define IRQ_MOUSE 12 |
/* this one must have four least significant bits set to ones */ |
#define VECTOR_APIC_SPUR (IVT_ITEMS - 1) |
#if (((VECTOR_APIC_SPUR + 1) % 16) || VECTOR_APIC_SPUR >= IVT_ITEMS) |
#error Wrong definition of VECTOR_APIC_SPUR |
#endif |
#define VECTOR_DEBUG 1 |
#define VECTOR_CLK (IVT_IRQBASE + IRQ_CLK) |
#define VECTOR_PIC_SPUR (IVT_IRQBASE + IRQ_PIC_SPUR) |
#define VECTOR_SYSCALL IVT_FREEBASE |
#define VECTOR_TLB_SHOOTDOWN_IPI (IVT_FREEBASE + 1) |
#define VECTOR_DEBUG_IPI (IVT_FREEBASE + 2) |
typedef struct { |
uint32_t eax; |
uint32_t ecx; |
uint32_t edx; |
uint32_t esi; |
uint32_t edi; |
uint32_t ebp; |
uint32_t ebx; |
uint32_t gs; |
uint32_t fs; |
uint32_t es; |
uint32_t ds; |
uint32_t error_word; |
uint32_t eip; |
uint32_t cs; |
uint32_t eflags; |
uint32_t stack[]; |
} istate_t; |
/** Return true if exception happened while in userspace */ |
static inline int istate_from_uspace(istate_t *istate) |
{ |
return !(istate->eip & 0x80000000); |
} |
static inline void istate_set_retaddr(istate_t *istate, uintptr_t retaddr) |
{ |
istate->eip = retaddr; |
} |
static inline unative_t istate_get_pc(istate_t *istate) |
{ |
return istate->eip; |
} |
extern void (* disable_irqs_function)(uint16_t irqmask); |
extern void (* enable_irqs_function)(uint16_t irqmask); |
extern void (* eoi_function)(void); |
extern void decode_istate(istate_t *istate); |
extern void interrupt_init(void); |
extern void trap_virtual_enable_irqs(uint16_t irqmask); |
extern void trap_virtual_disable_irqs(uint16_t irqmask); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/include/pm.h |
---|
0,0 → 1,181 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia32_PM_H_ |
#define KERN_ia32_PM_H_ |
#define IDT_ITEMS 64 |
#define GDT_ITEMS 7 |
#define VESA_INIT_SEGMENT 0x8000 |
#define NULL_DES 0 |
#define KTEXT_DES 1 |
#define KDATA_DES 2 |
#define UTEXT_DES 3 |
#define UDATA_DES 4 |
#define TSS_DES 5 |
#define TLS_DES 6 /* Pointer to Thread-Local-Storage data */ |
#ifdef CONFIG_FB |
#define VESA_INIT_SEGMENT 0x8000 |
#define VESA_INIT_DES 7 |
#undef GDT_ITEMS |
#define GDT_ITEMS 8 |
#endif /* CONFIG_FB */ |
#define selector(des) ((des) << 3) |
#define PL_KERNEL 0 |
#define PL_USER 3 |
#define AR_PRESENT (1 << 7) |
#define AR_DATA (2 << 3) |
#define AR_CODE (3 << 3) |
#define AR_WRITABLE (1 << 1) |
#define AR_INTERRUPT (0xe) |
#define AR_TSS (0x9) |
#define DPL_KERNEL (PL_KERNEL << 5) |
#define DPL_USER (PL_USER << 5) |
#define TSS_BASIC_SIZE 104 |
#define TSS_IOMAP_SIZE (16 * 1024 + 1) /* 16K for bitmap + 1 terminating byte for convenience */ |
#define IO_PORTS (64 * 1024) |
#ifndef __ASM__ |
#include <arch/types.h> |
#include <arch/context.h> |
struct ptr_16_32 { |
uint16_t limit; |
uint32_t base; |
} __attribute__ ((packed)); |
typedef struct ptr_16_32 ptr_16_32_t; |
struct descriptor { |
unsigned limit_0_15: 16; |
unsigned base_0_15: 16; |
unsigned base_16_23: 8; |
unsigned access: 8; |
unsigned limit_16_19: 4; |
unsigned available: 1; |
unsigned unused: 1; |
unsigned special: 1; |
unsigned granularity : 1; |
unsigned base_24_31: 8; |
} __attribute__ ((packed)); |
typedef struct descriptor descriptor_t; |
struct idescriptor { |
unsigned offset_0_15: 16; |
unsigned selector: 16; |
unsigned unused: 8; |
unsigned access: 8; |
unsigned offset_16_31: 16; |
} __attribute__ ((packed)); |
typedef struct idescriptor idescriptor_t; |
struct tss { |
uint16_t link; |
unsigned : 16; |
uint32_t esp0; |
uint16_t ss0; |
unsigned : 16; |
uint32_t esp1; |
uint16_t ss1; |
unsigned : 16; |
uint32_t esp2; |
uint16_t ss2; |
unsigned : 16; |
uint32_t cr3; |
uint32_t eip; |
uint32_t eflags; |
uint32_t eax; |
uint32_t ecx; |
uint32_t edx; |
uint32_t ebx; |
uint32_t esp; |
uint32_t ebp; |
uint32_t esi; |
uint32_t edi; |
uint16_t es; |
unsigned : 16; |
uint16_t cs; |
unsigned : 16; |
uint16_t ss; |
unsigned : 16; |
uint16_t ds; |
unsigned : 16; |
uint16_t fs; |
unsigned : 16; |
uint16_t gs; |
unsigned : 16; |
uint16_t ldtr; |
unsigned : 16; |
unsigned : 16; |
uint16_t iomap_base; |
uint8_t iomap[TSS_IOMAP_SIZE]; |
} __attribute__ ((packed)); |
typedef struct tss tss_t; |
extern ptr_16_32_t gdtr; |
extern ptr_16_32_t bootstrap_gdtr; |
extern ptr_16_32_t protected_ap_gdtr; |
extern struct tss *tss_p; |
extern descriptor_t gdt[]; |
extern void pm_init(void); |
extern void gdt_setbase(descriptor_t *d, uintptr_t base); |
extern void gdt_setlimit(descriptor_t *d, uint32_t limit); |
extern void idt_init(void); |
extern void idt_setoffset(idescriptor_t *d, uintptr_t offset); |
extern void tss_initialize(tss_t *t); |
extern void set_tls_desc(uintptr_t tls); |
#endif /* __ASM__ */ |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/include/asm.h |
---|
0,0 → 1,329 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* Copyright (c) 2005 Sergey Bondari |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia32_ASM_H_ |
#define KERN_ia32_ASM_H_ |
#include <arch/pm.h> |
#include <arch/types.h> |
#include <config.h> |
extern uint32_t interrupt_handler_size; |
extern void paging_on(void); |
extern void interrupt_handlers(void); |
extern void enable_l_apic_in_msr(void); |
extern void asm_delay_loop(uint32_t t); |
extern void asm_fake_loop(uint32_t t); |
/** Halt CPU |
* |
* Halt the current CPU until interrupt event. |
*/ |
static inline void cpu_halt(void) |
{ |
asm volatile ("hlt\n"); |
} |
static inline void cpu_sleep(void) |
{ |
asm volatile ("hlt\n"); |
} |
#define GEN_READ_REG(reg) static inline unative_t read_ ##reg (void) \ |
{ \ |
unative_t res; \ |
asm volatile ("movl %%" #reg ", %0" : "=r" (res) ); \ |
return res; \ |
} |
#define GEN_WRITE_REG(reg) static inline void write_ ##reg (unative_t regn) \ |
{ \ |
asm volatile ("movl %0, %%" #reg : : "r" (regn)); \ |
} |
GEN_READ_REG(cr0) |
GEN_READ_REG(cr2) |
GEN_READ_REG(cr3) |
GEN_WRITE_REG(cr3) |
GEN_READ_REG(dr0) |
GEN_READ_REG(dr1) |
GEN_READ_REG(dr2) |
GEN_READ_REG(dr3) |
GEN_READ_REG(dr6) |
GEN_READ_REG(dr7) |
GEN_WRITE_REG(dr0) |
GEN_WRITE_REG(dr1) |
GEN_WRITE_REG(dr2) |
GEN_WRITE_REG(dr3) |
GEN_WRITE_REG(dr6) |
GEN_WRITE_REG(dr7) |
/** Byte to port |
* |
* Output byte to port |
* |
* @param port Port to write to |
* @param val Value to write |
*/ |
static inline void outb(uint16_t port, uint8_t val) |
{ |
asm volatile ("outb %b0, %w1\n" : : "a" (val), "d" (port) ); |
} |
/** Word to port |
* |
* Output word to port |
* |
* @param port Port to write to |
* @param val Value to write |
*/ |
static inline void outw(uint16_t port, uint16_t val) |
{ |
asm volatile ("outw %w0, %w1\n" : : "a" (val), "d" (port) ); |
} |
/** Double word to port |
* |
* Output double word to port |
* |
* @param port Port to write to |
* @param val Value to write |
*/ |
static inline void outl(uint16_t port, uint32_t val) |
{ |
asm volatile ("outl %l0, %w1\n" : : "a" (val), "d" (port) ); |
} |
/** Byte from port |
* |
* Get byte from port |
* |
* @param port Port to read from |
* @return Value read |
*/ |
static inline uint8_t inb(uint16_t port) |
{ |
uint8_t val; |
asm volatile ("inb %w1, %b0 \n" : "=a" (val) : "d" (port) ); |
return val; |
} |
/** Word from port |
* |
* Get word from port |
* |
* @param port Port to read from |
* @return Value read |
*/ |
static inline uint16_t inw(uint16_t port) |
{ |
uint16_t val; |
asm volatile ("inw %w1, %w0 \n" : "=a" (val) : "d" (port) ); |
return val; |
} |
/** Double word from port |
* |
* Get double word from port |
* |
* @param port Port to read from |
* @return Value read |
*/ |
static inline uint32_t inl(uint16_t port) |
{ |
uint32_t val; |
asm volatile ("inl %w1, %l0 \n" : "=a" (val) : "d" (port) ); |
return val; |
} |
/** Enable interrupts. |
* |
* Enable interrupts and return previous |
* value of EFLAGS. |
* |
* @return Old interrupt priority level. |
*/ |
static inline ipl_t interrupts_enable(void) |
{ |
ipl_t v; |
asm volatile ( |
"pushf\n\t" |
"popl %0\n\t" |
"sti\n" |
: "=r" (v) |
); |
return v; |
} |
/** Disable interrupts. |
* |
* Disable interrupts and return previous |
* value of EFLAGS. |
* |
* @return Old interrupt priority level. |
*/ |
static inline ipl_t interrupts_disable(void) |
{ |
ipl_t v; |
asm volatile ( |
"pushf\n\t" |
"popl %0\n\t" |
"cli\n" |
: "=r" (v) |
); |
return v; |
} |
/** Restore interrupt priority level. |
* |
* Restore EFLAGS. |
* |
* @param ipl Saved interrupt priority level. |
*/ |
static inline void interrupts_restore(ipl_t ipl) |
{ |
asm volatile ( |
"pushl %0\n\t" |
"popf\n" |
: : "r" (ipl) |
); |
} |
/** Return interrupt priority level. |
* |
* @return EFLAFS. |
*/ |
static inline ipl_t interrupts_read(void) |
{ |
ipl_t v; |
asm volatile ( |
"pushf\n\t" |
"popl %0\n" |
: "=r" (v) |
); |
return v; |
} |
/** Return base address of current stack |
* |
* Return the base address of the current stack. |
* The stack is assumed to be STACK_SIZE bytes long. |
* The stack must start on page boundary. |
*/ |
static inline uintptr_t get_stack_base(void) |
{ |
uintptr_t v; |
asm volatile ( |
"andl %%esp, %0\n" |
: "=r" (v) |
: "0" (~(STACK_SIZE - 1)) |
); |
return v; |
} |
/** Return current IP address */ |
static inline uintptr_t * get_ip() |
{ |
uintptr_t *ip; |
asm volatile ( |
"mov %%eip, %0" |
: "=r" (ip) |
); |
return ip; |
} |
/** Invalidate TLB Entry. |
* |
* @param addr Address on a page whose TLB entry is to be invalidated. |
*/ |
static inline void invlpg(uintptr_t addr) |
{ |
asm volatile ("invlpg %0\n" :: "m" (*(unative_t *)addr)); |
} |
/** Load GDTR register from memory. |
* |
* @param gdtr_reg Address of memory from where to load GDTR. |
*/ |
static inline void gdtr_load(ptr_16_32_t *gdtr_reg) |
{ |
asm volatile ("lgdtl %0\n" : : "m" (*gdtr_reg)); |
} |
/** Store GDTR register to memory. |
* |
* @param gdtr_reg Address of memory to where to load GDTR. |
*/ |
static inline void gdtr_store(ptr_16_32_t *gdtr_reg) |
{ |
asm volatile ("sgdtl %0\n" : : "m" (*gdtr_reg)); |
} |
/** Load IDTR register from memory. |
* |
* @param idtr_reg Address of memory from where to load IDTR. |
*/ |
static inline void idtr_load(ptr_16_32_t *idtr_reg) |
{ |
asm volatile ("lidtl %0\n" : : "m" (*idtr_reg)); |
} |
/** Load TR from descriptor table. |
* |
* @param sel Selector specifying descriptor of TSS segment. |
*/ |
static inline void tr_load(uint16_t sel) |
{ |
asm volatile ("ltr %0" : : "r" (sel)); |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/include/smp/apic.h |
---|
0,0 → 1,356 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia32_APIC_H_ |
#define KERN_ia32_APIC_H_ |
#include <arch/types.h> |
#include <cpu.h> |
#define FIXED (0<<0) |
#define LOPRI (1<<0) |
#define APIC_ID_COUNT 16 |
/* local APIC macros */ |
#define IPI_INIT 0 |
#define IPI_STARTUP 0 |
/** Delivery modes. */ |
#define DELMOD_FIXED 0x0 |
#define DELMOD_LOWPRI 0x1 |
#define DELMOD_SMI 0x2 |
/* 0x3 reserved */ |
#define DELMOD_NMI 0x4 |
#define DELMOD_INIT 0x5 |
#define DELMOD_STARTUP 0x6 |
#define DELMOD_EXTINT 0x7 |
/** Destination modes. */ |
#define DESTMOD_PHYS 0x0 |
#define DESTMOD_LOGIC 0x1 |
/** Trigger Modes. */ |
#define TRIGMOD_EDGE 0x0 |
#define TRIGMOD_LEVEL 0x1 |
/** Levels. */ |
#define LEVEL_DEASSERT 0x0 |
#define LEVEL_ASSERT 0x1 |
/** Destination Shorthands. */ |
#define SHORTHAND_NONE 0x0 |
#define SHORTHAND_SELF 0x1 |
#define SHORTHAND_ALL_INCL 0x2 |
#define SHORTHAND_ALL_EXCL 0x3 |
/** Interrupt Input Pin Polarities. */ |
#define POLARITY_HIGH 0x0 |
#define POLARITY_LOW 0x1 |
/** Divide Values. (Bit 2 is always 0) */ |
#define DIVIDE_2 0x0 |
#define DIVIDE_4 0x1 |
#define DIVIDE_8 0x2 |
#define DIVIDE_16 0x3 |
#define DIVIDE_32 0x8 |
#define DIVIDE_64 0x9 |
#define DIVIDE_128 0xa |
#define DIVIDE_1 0xb |
/** Timer Modes. */ |
#define TIMER_ONESHOT 0x0 |
#define TIMER_PERIODIC 0x1 |
/** Delivery status. */ |
#define DELIVS_IDLE 0x0 |
#define DELIVS_PENDING 0x1 |
/** Destination masks. */ |
#define DEST_ALL 0xff |
/** Dest format models. */ |
#define MODEL_FLAT 0xf |
#define MODEL_CLUSTER 0x0 |
/** Interrupt Command Register. */ |
#define ICRlo (0x300/sizeof(uint32_t)) |
#define ICRhi (0x310/sizeof(uint32_t)) |
typedef struct { |
union { |
uint32_t lo; |
struct { |
uint8_t vector; /**< Interrupt Vector. */ |
unsigned delmod : 3; /**< Delivery Mode. */ |
unsigned destmod : 1; /**< Destination Mode. */ |
unsigned delivs : 1; /**< Delivery status (RO). */ |
unsigned : 1; /**< Reserved. */ |
unsigned level : 1; /**< Level. */ |
unsigned trigger_mode : 1; /**< Trigger Mode. */ |
unsigned : 2; /**< Reserved. */ |
unsigned shorthand : 2; /**< Destination Shorthand. */ |
unsigned : 12; /**< Reserved. */ |
} __attribute__ ((packed)); |
}; |
union { |
uint32_t hi; |
struct { |
unsigned : 24; /**< Reserved. */ |
uint8_t dest; /**< Destination field. */ |
} __attribute__ ((packed)); |
}; |
} __attribute__ ((packed)) icr_t; |
/* End Of Interrupt. */ |
#define EOI (0x0b0/sizeof(uint32_t)) |
/** Error Status Register. */ |
#define ESR (0x280/sizeof(uint32_t)) |
typedef union { |
uint32_t value; |
uint8_t err_bitmap; |
struct { |
unsigned send_checksum_error : 1; |
unsigned receive_checksum_error : 1; |
unsigned send_accept_error : 1; |
unsigned receive_accept_error : 1; |
unsigned : 1; |
unsigned send_illegal_vector : 1; |
unsigned received_illegal_vector : 1; |
unsigned illegal_register_address : 1; |
unsigned : 24; |
} __attribute__ ((packed)); |
} esr_t; |
/* Task Priority Register */ |
#define TPR (0x080/sizeof(uint32_t)) |
typedef union { |
uint32_t value; |
struct { |
unsigned pri_sc : 4; /**< Task Priority Sub-Class. */ |
unsigned pri : 4; /**< Task Priority. */ |
} __attribute__ ((packed)); |
} tpr_t; |
/** Spurious-Interrupt Vector Register. */ |
#define SVR (0x0f0/sizeof(uint32_t)) |
typedef union { |
uint32_t value; |
struct { |
uint8_t vector; /**< Spurious Vector. */ |
unsigned lapic_enabled : 1; /**< APIC Software Enable/Disable. */ |
unsigned focus_checking : 1; /**< Focus Processor Checking. */ |
unsigned : 22; /**< Reserved. */ |
} __attribute__ ((packed)); |
} svr_t; |
/** Time Divide Configuration Register. */ |
#define TDCR (0x3e0/sizeof(uint32_t)) |
typedef union { |
uint32_t value; |
struct { |
unsigned div_value : 4; /**< Divide Value, bit 2 is always 0. */ |
unsigned : 28; /**< Reserved. */ |
} __attribute__ ((packed)); |
} tdcr_t; |
/* Initial Count Register for Timer */ |
#define ICRT (0x380/sizeof(uint32_t)) |
/* Current Count Register for Timer */ |
#define CCRT (0x390/sizeof(uint32_t)) |
/** LVT Timer register. */ |
#define LVT_Tm (0x320/sizeof(uint32_t)) |
typedef union { |
uint32_t value; |
struct { |
uint8_t vector; /**< Local Timer Interrupt vector. */ |
unsigned : 4; /**< Reserved. */ |
unsigned delivs : 1; /**< Delivery status (RO). */ |
unsigned : 3; /**< Reserved. */ |
unsigned masked : 1; /**< Interrupt Mask. */ |
unsigned mode : 1; /**< Timer Mode. */ |
unsigned : 14; /**< Reserved. */ |
} __attribute__ ((packed)); |
} lvt_tm_t; |
/** LVT LINT registers. */ |
#define LVT_LINT0 (0x350/sizeof(uint32_t)) |
#define LVT_LINT1 (0x360/sizeof(uint32_t)) |
typedef union { |
uint32_t value; |
struct { |
uint8_t vector; /**< LINT Interrupt vector. */ |
unsigned delmod : 3; /**< Delivery Mode. */ |
unsigned : 1; /**< Reserved. */ |
unsigned delivs : 1; /**< Delivery status (RO). */ |
unsigned intpol : 1; /**< Interrupt Input Pin Polarity. */ |
unsigned irr : 1; /**< Remote IRR (RO). */ |
unsigned trigger_mode : 1; /**< Trigger Mode. */ |
unsigned masked : 1; /**< Interrupt Mask. */ |
unsigned : 15; /**< Reserved. */ |
} __attribute__ ((packed)); |
} lvt_lint_t; |
/** LVT Error register. */ |
#define LVT_Err (0x370/sizeof(uint32_t)) |
typedef union { |
uint32_t value; |
struct { |
uint8_t vector; /**< Local Timer Interrupt vector. */ |
unsigned : 4; /**< Reserved. */ |
unsigned delivs : 1; /**< Delivery status (RO). */ |
unsigned : 3; /**< Reserved. */ |
unsigned masked : 1; /**< Interrupt Mask. */ |
unsigned : 15; /**< Reserved. */ |
} __attribute__ ((packed)); |
} lvt_error_t; |
/** Local APIC ID Register. */ |
#define L_APIC_ID (0x020/sizeof(uint32_t)) |
typedef union { |
uint32_t value; |
struct { |
unsigned : 24; /**< Reserved. */ |
uint8_t apic_id; /**< Local APIC ID. */ |
} __attribute__ ((packed)); |
} l_apic_id_t; |
/** Local APIC Version Register */ |
#define LAVR (0x030/sizeof(uint32_t)) |
#define LAVR_Mask 0xff |
#define is_local_apic(x) (((x)&LAVR_Mask&0xf0)==0x1) |
#define is_82489DX_apic(x) ((((x)&LAVR_Mask&0xf0)==0x0)) |
#define is_local_xapic(x) (((x)&LAVR_Mask)==0x14) |
/** Logical Destination Register. */ |
#define LDR (0x0d0/sizeof(uint32_t)) |
typedef union { |
uint32_t value; |
struct { |
unsigned : 24; /**< Reserved. */ |
uint8_t id; /**< Logical APIC ID. */ |
} __attribute__ ((packed)); |
} ldr_t; |
/** Destination Format Register. */ |
#define DFR (0x0e0/sizeof(uint32_t)) |
typedef union { |
uint32_t value; |
struct { |
unsigned : 28; /**< Reserved, all ones. */ |
unsigned model : 4; /**< Model. */ |
} __attribute__ ((packed)); |
} dfr_t; |
/* IO APIC */ |
#define IOREGSEL (0x00/sizeof(uint32_t)) |
#define IOWIN (0x10/sizeof(uint32_t)) |
#define IOAPICID 0x00 |
#define IOAPICVER 0x01 |
#define IOAPICARB 0x02 |
#define IOREDTBL 0x10 |
/** I/O Register Select Register. */ |
typedef union { |
uint32_t value; |
struct { |
uint8_t reg_addr; /**< APIC Register Address. */ |
unsigned : 24; /**< Reserved. */ |
} __attribute__ ((packed)); |
} io_regsel_t; |
/** I/O Redirection Register. */ |
typedef struct io_redirection_reg { |
union { |
uint32_t lo; |
struct { |
uint8_t intvec; /**< Interrupt Vector. */ |
unsigned delmod : 3; /**< Delivery Mode. */ |
unsigned destmod : 1; /**< Destination mode. */ |
unsigned delivs : 1; /**< Delivery status (RO). */ |
unsigned intpol : 1; /**< Interrupt Input Pin Polarity. */ |
unsigned irr : 1; /**< Remote IRR (RO). */ |
unsigned trigger_mode : 1; /**< Trigger Mode. */ |
unsigned masked : 1; /**< Interrupt Mask. */ |
unsigned : 15; /**< Reserved. */ |
} __attribute__ ((packed)); |
}; |
union { |
uint32_t hi; |
struct { |
unsigned : 24; /**< Reserved. */ |
uint8_t dest : 8; /**< Destination Field. */ |
} __attribute__ ((packed)); |
}; |
} __attribute__ ((packed)) io_redirection_reg_t; |
/** IO APIC Identification Register. */ |
typedef union { |
uint32_t value; |
struct { |
unsigned : 24; /**< Reserved. */ |
unsigned apic_id : 4; /**< IO APIC ID. */ |
unsigned : 4; /**< Reserved. */ |
} __attribute__ ((packed)); |
} io_apic_id_t; |
extern volatile uint32_t *l_apic; |
extern volatile uint32_t *io_apic; |
extern uint32_t apic_id_mask; |
extern void apic_init(void); |
extern void l_apic_init(void); |
extern void l_apic_eoi(void); |
extern int l_apic_broadcast_custom_ipi(uint8_t vector); |
extern int l_apic_send_init_ipi(uint8_t apicid); |
extern void l_apic_debug(void); |
extern uint8_t l_apic_id(void); |
extern uint32_t io_apic_read(uint8_t address); |
extern void io_apic_write(uint8_t address , uint32_t x); |
extern void io_apic_change_ioredtbl(uint8_t pin, uint8_t dest, uint8_t v, int flags); |
extern void io_apic_disable_irqs(uint16_t irqmask); |
extern void io_apic_enable_irqs(uint16_t irqmask); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/include/smp/smp.h |
---|
0,0 → 1,54 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia32_SMP_H_ |
#define KERN_ia32_SMP_H_ |
#include <arch/types.h> |
/** SMP config opertaions interface. */ |
struct smp_config_operations { |
count_t (* cpu_count)(void); /**< Return number of detected processors. */ |
bool (* cpu_enabled)(index_t i); /**< Check whether the processor of index i is enabled. */ |
bool (*cpu_bootstrap)(index_t i); /**< Check whether the processor of index i is BSP. */ |
uint8_t (*cpu_apic_id)(index_t i); /**< Return APIC ID of the processor of index i. */ |
int (*irq_to_pin)(unsigned int irq); /**< Return mapping between irq and APIC pin. */ |
}; |
extern int smp_irq_to_pin(unsigned int irq); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/include/smp/mps.h |
---|
0,0 → 1,129 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia32_MPS_H_ |
#define KERN_ia32_MPS_H_ |
#include <arch/types.h> |
#include <synch/waitq.h> |
#include <config.h> |
#include <arch/smp/smp.h> |
#define CT_EXT_ENTRY_TYPE 0 |
#define CT_EXT_ENTRY_LEN 1 |
struct mps_fs { |
uint32_t signature; |
uint32_t configuration_table; |
uint8_t length; |
uint8_t revision; |
uint8_t checksum; |
uint8_t config_type; |
uint8_t mpfib2; |
uint8_t mpfib3; |
uint8_t mpfib4; |
uint8_t mpfib5; |
} __attribute__ ((packed)); |
struct mps_ct { |
uint32_t signature; |
uint16_t base_table_length; |
uint8_t revision; |
uint8_t checksum; |
uint8_t oem_id[8]; |
uint8_t product_id[12]; |
uint32_t oem_table; |
uint16_t oem_table_size; |
uint16_t entry_count; |
uint32_t l_apic; |
uint16_t ext_table_length; |
uint8_t ext_table_checksum; |
uint8_t xxx; |
uint8_t base_table[0]; |
} __attribute__ ((packed)); |
struct __processor_entry { |
uint8_t type; |
uint8_t l_apic_id; |
uint8_t l_apic_version; |
uint8_t cpu_flags; |
uint8_t cpu_signature[4]; |
uint32_t feature_flags; |
uint32_t xxx[2]; |
} __attribute__ ((packed)); |
struct __bus_entry { |
uint8_t type; |
uint8_t bus_id; |
uint8_t bus_type[6]; |
} __attribute__ ((packed)); |
struct __io_apic_entry { |
uint8_t type; |
uint8_t io_apic_id; |
uint8_t io_apic_version; |
uint8_t io_apic_flags; |
uint32_t io_apic; |
} __attribute__ ((packed)); |
struct __io_intr_entry { |
uint8_t type; |
uint8_t intr_type; |
uint8_t poel; |
uint8_t xxx; |
uint8_t src_bus_id; |
uint8_t src_bus_irq; |
uint8_t dst_io_apic_id; |
uint8_t dst_io_apic_pin; |
} __attribute__ ((packed)); |
struct __l_intr_entry { |
uint8_t type; |
uint8_t intr_type; |
uint8_t poel; |
uint8_t xxx; |
uint8_t src_bus_id; |
uint8_t src_bus_irq; |
uint8_t dst_l_apic_id; |
uint8_t dst_l_apic_pin; |
} __attribute__ ((packed)); |
extern struct smp_config_operations mps_config_operations; |
extern void mps_init(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/include/smp/ap.h |
---|
0,0 → 1,43 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia32_AP_H_ |
#define KERN_ia32_AP_H_ |
extern void ap_boot(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/include/cpuid.h |
---|
0,0 → 1,109 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia32_CPUID_H_ |
#define KERN_ia32_CPUID_H_ |
#include <arch/types.h> |
typedef struct { |
uint32_t cpuid_eax; |
uint32_t cpuid_ebx; |
uint32_t cpuid_ecx; |
uint32_t cpuid_edx; |
} __attribute__ ((packed)) cpu_info_t; |
struct __cpuid_extended_feature_info { |
unsigned sse3 : 1; |
unsigned : 31; |
} __attribute__ ((packed)); |
typedef union cpuid_extended_feature_info { |
struct __cpuid_extended_feature_info bits; |
uint32_t word; |
} cpuid_extended_feature_info; |
struct __cpuid_feature_info { |
unsigned : 23; |
unsigned mmx : 1; |
unsigned fxsr : 1; |
unsigned sse : 1; |
unsigned sse2 : 1; |
unsigned : 5; |
} __attribute__ ((packed)); |
typedef union cpuid_feature_info { |
struct __cpuid_feature_info bits; |
uint32_t word; |
} cpuid_feature_info; |
static inline uint32_t has_cpuid(void) |
{ |
uint32_t val, ret; |
asm volatile ( |
"pushf\n" /* read flags */ |
"popl %0\n" |
"movl %0, %1\n" |
"btcl $21, %1\n" /* swap the ID bit */ |
"pushl %1\n" /* propagate the change into flags */ |
"popf\n" |
"pushf\n" |
"popl %1\n" |
"andl $(1 << 21), %0\n" /* interrested only in ID bit */ |
"andl $(1 << 21), %1\n" |
"xorl %1, %0\n" |
: "=r" (ret), "=r" (val) |
); |
return ret; |
} |
static inline void cpuid(uint32_t cmd, cpu_info_t *info) |
{ |
asm volatile ( |
"cpuid\n" |
: "=a" (info->cpuid_eax), "=b" (info->cpuid_ebx), "=c" (info->cpuid_ecx), "=d" (info->cpuid_edx) |
: "a" (cmd) |
); |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/include/types.h |
---|
0,0 → 1,91 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia32_TYPES_H_ |
#define KERN_ia32_TYPES_H_ |
#define NULL 0 |
#define false 0 |
#define true 1 |
typedef signed char int8_t; |
typedef signed short int16_t; |
typedef signed long int32_t; |
typedef signed long long int64_t; |
typedef unsigned char uint8_t; |
typedef unsigned short uint16_t; |
typedef unsigned long uint32_t; |
typedef unsigned long long uint64_t; |
typedef uint32_t size_t; |
typedef uint32_t count_t; |
typedef uint32_t index_t; |
typedef uint32_t uintptr_t; |
typedef uint32_t pfn_t; |
typedef uint32_t ipl_t; |
typedef uint32_t unative_t; |
typedef int32_t native_t; |
typedef uint8_t bool; |
typedef uint64_t thread_id_t; |
typedef uint64_t task_id_t; |
typedef uint32_t context_id_t; |
typedef int32_t inr_t; |
typedef int32_t devno_t; |
/** Page Table Entry. */ |
typedef struct { |
unsigned present : 1; |
unsigned writeable : 1; |
unsigned uaccessible : 1; |
unsigned page_write_through : 1; |
unsigned page_cache_disable : 1; |
unsigned accessed : 1; |
unsigned dirty : 1; |
unsigned pat : 1; |
unsigned global : 1; |
unsigned soft_valid : 1; /**< Valid content even if the present bit is not set. */ |
unsigned avl : 2; |
unsigned frame_address : 20; |
} __attribute__ ((packed)) pte_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/include/atomic.h |
---|
0,0 → 1,127 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia32_ATOMIC_H_ |
#define KERN_ia32_ATOMIC_H_ |
#include <arch/types.h> |
#include <arch/barrier.h> |
#include <preemption.h> |
static inline void atomic_inc(atomic_t *val) { |
#ifdef CONFIG_SMP |
asm volatile ("lock incl %0\n" : "=m" (val->count)); |
#else |
asm volatile ("incl %0\n" : "=m" (val->count)); |
#endif /* CONFIG_SMP */ |
} |
static inline void atomic_dec(atomic_t *val) { |
#ifdef CONFIG_SMP |
asm volatile ("lock decl %0\n" : "=m" (val->count)); |
#else |
asm volatile ("decl %0\n" : "=m" (val->count)); |
#endif /* CONFIG_SMP */ |
} |
static inline long atomic_postinc(atomic_t *val) |
{ |
long r = 1; |
asm volatile ( |
"lock xaddl %1, %0\n" |
: "=m" (val->count), "+r" (r) |
); |
return r; |
} |
static inline long atomic_postdec(atomic_t *val) |
{ |
long r = -1; |
asm volatile ( |
"lock xaddl %1, %0\n" |
: "=m" (val->count), "+r"(r) |
); |
return r; |
} |
#define atomic_preinc(val) (atomic_postinc(val)+1) |
#define atomic_predec(val) (atomic_postdec(val)-1) |
static inline uint32_t test_and_set(atomic_t *val) { |
uint32_t v; |
asm volatile ( |
"movl $1, %0\n" |
"xchgl %0, %1\n" |
: "=r" (v),"=m" (val->count) |
); |
return v; |
} |
/** ia32 specific fast spinlock */ |
static inline void atomic_lock_arch(atomic_t *val) |
{ |
uint32_t tmp; |
preemption_disable(); |
asm volatile ( |
"0:;" |
#ifdef CONFIG_HT |
"pause;" /* Pentium 4's HT love this instruction */ |
#endif |
"mov %0, %1;" |
"testl %1, %1;" |
"jnz 0b;" /* Lightweight looping on locked spinlock */ |
"incl %1;" /* now use the atomic operation */ |
"xchgl %0, %1;" |
"testl %1, %1;" |
"jnz 0b;" |
: "=m"(val->count),"=r"(tmp) |
); |
/* |
* Prevent critical section code from bleeding out this way up. |
*/ |
CS_ENTER_BARRIER(); |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/include/cpu.h |
---|
0,0 → 1,60 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia32_CPU_H_ |
#define KERN_ia32_CPU_H_ |
#include <arch/pm.h> |
#include <arch/asm.h> |
#define EFLAGS_IF (1 << 9) |
#define EFLAGS_RF (1 << 16) |
typedef struct { |
int vendor; |
int family; |
int model; |
int stepping; |
struct tss *tss; |
count_t iomapver_copy; /** Copy of TASK's I/O Permission bitmap generation count. */ |
} cpu_arch_t; |
#define CR4_OSFXSR_MASK (1<<9) |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/include/fpu_context.h |
---|
0,0 → 1,54 |
/* |
* Copyright (c) 2005 Jakub Vana |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia32_FPU_CONTEXT_H_ |
#define KERN_ia32_FPU_CONTEXT_H_ |
#include <arch/types.h> |
#define ARCH_HAS_FPU |
#define FPU_CONTEXT_ALIGN 16 |
void fpu_fxsr(void); |
void fpu_fsr(void); |
typedef struct { |
uint8_t fpu[512]; /* FXSAVE & FXRSTOR storage area */ |
} fpu_context_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/include/memstr.h |
---|
0,0 → 1,151 |
/* |
* Copyright (c) 2005 Sergey Bondari |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia32_MEMSTR_H_ |
#define KERN_ia32_MEMSTR_H_ |
/** Copy memory |
* |
* Copy a given number of bytes (3rd argument) |
* from the memory location defined by 2nd argument |
* to the memory location defined by 1st argument. |
* The memory areas cannot overlap. |
* |
* @param dst Destination |
* @param src Source |
* @param cnt Number of bytes |
* @return Destination |
*/ |
static inline void * memcpy(void * dst, const void * src, size_t cnt) |
{ |
unative_t d0, d1, d2; |
asm volatile( |
/* copy all full dwords */ |
"rep movsl\n\t" |
/* load count again */ |
"movl %4, %%ecx\n\t" |
/* ecx = ecx mod 4 */ |
"andl $3, %%ecx\n\t" |
/* are there last <=3 bytes? */ |
"jz 1f\n\t" |
/* copy last <=3 bytes */ |
"rep movsb\n\t" |
/* exit from asm block */ |
"1:\n" |
: "=&c" (d0), "=&D" (d1), "=&S" (d2) |
: "0" ((unative_t) (cnt / 4)), "g" ((unative_t) cnt), "1" ((unative_t) dst), "2" ((unative_t) src) |
: "memory"); |
return dst; |
} |
/** Compare memory regions for equality |
* |
* Compare a given number of bytes (3rd argument) |
* at memory locations defined by 1st and 2nd argument |
* for equality. If bytes are equal function returns 0. |
* |
* @param src Region 1 |
* @param dst Region 2 |
* @param cnt Number of bytes |
* @return Zero if bytes are equal, non-zero otherwise |
*/ |
static inline int memcmp(const void * src, const void * dst, size_t cnt) |
{ |
uint32_t d0, d1, d2; |
int ret; |
asm ( |
"repe cmpsb\n\t" |
"je 1f\n\t" |
"movl %3, %0\n\t" |
"addl $1, %0\n\t" |
"1:\n" |
: "=a" (ret), "=%S" (d0), "=&D" (d1), "=&c" (d2) |
: "0" (0), "1" ((unative_t) src), "2" ((unative_t) dst), "3" ((unative_t) cnt) |
); |
return ret; |
} |
/** Fill memory with words |
* Fill a given number of words (2nd argument) |
* at memory defined by 1st argument with the |
* word value defined by 3rd argument. |
* |
* @param dst Destination |
* @param cnt Number of words |
* @param x Value to fill |
*/ |
static inline void memsetw(uintptr_t dst, size_t cnt, uint16_t x) |
{ |
uint32_t d0, d1; |
asm volatile ( |
"rep stosw\n\t" |
: "=&D" (d0), "=&c" (d1), "=a" (x) |
: "0" (dst), "1" (cnt), "2" (x) |
: "memory" |
); |
} |
/** Fill memory with bytes |
* Fill a given number of bytes (2nd argument) |
* at memory defined by 1st argument with the |
* word value defined by 3rd argument. |
* |
* @param dst Destination |
* @param cnt Number of bytes |
* @param x Value to fill |
*/ |
static inline void memsetb(uintptr_t dst, size_t cnt, uint8_t x) |
{ |
uint32_t d0, d1; |
asm volatile ( |
"rep stosb\n\t" |
: "=&D" (d0), "=&c" (d1), "=a" (x) |
: "0" (dst), "1" (cnt), "2" (x) |
: "memory" |
); |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/include/barrier.h |
---|
0,0 → 1,90 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia32_BARRIER_H_ |
#define KERN_ia32_BARRIER_H_ |
/* |
* NOTE: |
* No barriers for critical section (i.e. spinlock) on IA-32 are needed: |
* - spinlock_lock() and spinlock_trylock() use serializing XCHG instruction |
* - writes cannot pass reads on IA-32 => spinlock_unlock() needs no barriers |
*/ |
/* |
* Provisions are made to prevent compiler from reordering instructions itself. |
*/ |
#define CS_ENTER_BARRIER() asm volatile ("" ::: "memory") |
#define CS_LEAVE_BARRIER() asm volatile ("" ::: "memory") |
static inline void cpuid_serialization(void) |
{ |
asm volatile ( |
"xorl %%eax, %%eax\n" |
"cpuid\n" |
::: "eax", "ebx", "ecx", "edx", "memory" |
); |
} |
#ifdef CONFIG_FENCES_P4 |
# define memory_barrier() asm volatile ("mfence\n" ::: "memory") |
# define read_barrier() asm volatile ("lfence\n" ::: "memory") |
# ifdef CONFIG_WEAK_MEMORY |
# define write_barrier() asm volatile ("sfence\n" ::: "memory") |
# else |
# define write_barrier() asm volatile( "" ::: "memory"); |
# endif |
#elif CONFIG_FENCES_P3 |
# define memory_barrier() cpuid_serialization() |
# define read_barrier() cpuid_serialization() |
# ifdef CONFIG_WEAK_MEMORY |
# define write_barrier() asm volatile ("sfence\n" ::: "memory") |
# else |
# define write_barrier() asm volatile( "" ::: "memory"); |
# endif |
#else |
# define memory_barrier() cpuid_serialization() |
# define read_barrier() cpuid_serialization() |
# ifdef CONFIG_WEAK_MEMORY |
# define write_barrier() cpuid_serialization() |
# else |
# define write_barrier() asm volatile( "" ::: "memory"); |
# endif |
#endif |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/include/cycle.h |
---|
0,0 → 1,53 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia32_CYCLE_H_ |
#define KERN_ia32_CYCLE_H_ |
static inline uint64_t get_cycle(void) |
{ |
uint64_t v; |
asm volatile( |
"rdtsc\n" |
: "=A" (v) |
); |
return v; |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/include/byteorder.h |
---|
0,0 → 1,50 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia32_BYTEORDER_H_ |
#define KERN_ia32_BYTEORDER_H_ |
#include <byteorder.h> |
/* IA-32 is little-endian */ |
#define uint32_t_le2host(n) (n) |
#define uint64_t_le2host(n) (n) |
#define uint32_t_be2host(n) uint32_t_byteorder_swap(n) |
#define uint64_t_be2host(n) uint64_t_byteorder_swap(n) |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/include/bios/bios.h |
---|
0,0 → 1,49 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia32_BIOS_H_ |
#define KERN_ia32_BIOS_H_ |
#include <arch/types.h> |
#define BIOS_EBDA_PTR 0x40e |
extern uintptr_t ebda; |
extern void bios_init(void); |
#endif /* KERN_ia32_BIOS_H_ */ |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/include/elf.h |
---|
0,0 → 1,45 |
/* |
* Copyright (c) 2006 Sergey Bondari |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia32_ELF_H_ |
#define KERN_ia32_ELF_H_ |
#define ELF_MACHINE EM_386 |
#define ELF_DATA_ENCODING ELFDATA2LSB |
#define ELF_CLASS ELFCLASS32 |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/include/arg.h |
---|
0,0 → 1,43 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia32_ARG_H_ |
#define KERN_ia32_ARG_H_ |
#include <stackarg.h> |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/include/ddi/ddi.h |
---|
0,0 → 1,45 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32ddi |
* @{ |
*/ |
/** |
* @file |
* @brief ia32 specific DDI declarations and macros. |
*/ |
#ifndef KERN_ia32_DDI_H_ |
#define KERN_ia32_DDI_H_ |
extern void io_perm_bitmap_install(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/include/arch.h |
---|
0,0 → 1,41 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia32_ARCH_H_ |
#define KERN_ia32_ARCH_H_ |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/include/faddr.h |
---|
0,0 → 1,45 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia32_FADDR_H_ |
#define KERN_ia32_FADDR_H_ |
#include <arch/types.h> |
#define FADDR(fptr) ((uintptr_t) (fptr)) |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/include/debug.h |
---|
0,0 → 1,45 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup amd64debug |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia32_DEBUG_H_ |
#define KERN_ia32_DEBUG_H_ |
#include <arch/asm.h> |
#define HERE get_ip() |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/include/drivers/i8254.h |
---|
0,0 → 1,47 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia32_I8254_H_ |
#define KERN_ia32_I8254_H_ |
#include <arch/types.h> |
extern void i8254_init(void); |
extern void i8254_calibrate_delay_loop(void); |
extern void i8254_normal_operation(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/include/drivers/ega.h |
---|
0,0 → 1,48 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia32_EGA_H_ |
#define KERN_ia32_EGA_H_ |
#define VIDEORAM 0xb8000 |
#define ROW 80 |
#define ROWS 25 |
#define SCREEN (ROW * ROWS) |
extern void ega_init(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/include/drivers/vesa.h |
---|
0,0 → 1,44 |
/* |
* Copyright (c) 2006 Jakub Vana |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia32_VESA_H_ |
#define KERN_ia32_VESA_H_ |
extern int vesa_present(void); |
extern void vesa_init(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/include/drivers/i8259.h |
---|
0,0 → 1,57 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia32_I8259_H_ |
#define KERN_ia32_I8259_H_ |
#include <arch/types.h> |
#include <arch/interrupt.h> |
#define PIC_PIC0PORT1 0x20 |
#define PIC_PIC0PORT2 0x21 |
#define PIC_PIC1PORT1 0xa0 |
#define PIC_PIC1PORT2 0xa1 |
#define PIC_NEEDICW4 (1<<0) |
#define PIC_ICW1 (1<<4) |
extern void i8259_init(void); |
extern void pic_enable_irqs(uint16_t irqmask); |
extern void pic_disable_irqs(uint16_t irqmask); |
extern void pic_eoi(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/include/drivers/i8042.h |
---|
0,0 → 1,71 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32 |
* @{ |
*/ |
/** @file |
*/ |
/** |
* This file implements ia32 specific access to i8042 registers. |
*/ |
#ifndef KERN_ia32_I8042_H_ |
#define KERN_ia32_I8042_H_ |
#include <arch/asm.h> |
#include <arch/types.h> |
#define i8042_DATA 0x60 |
#define i8042_STATUS 0x64 |
static inline void i8042_data_write(uint8_t data) |
{ |
outb(i8042_DATA, data); |
} |
static inline uint8_t i8042_data_read(void) |
{ |
return inb(i8042_DATA); |
} |
static inline uint8_t i8042_status_read(void) |
{ |
return inb(i8042_STATUS); |
} |
static inline void i8042_command_write(uint8_t command) |
{ |
outb(i8042_STATUS, command); |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia32/include/debugger.h |
---|
0,0 → 1,0 |
link ../../amd64/include/debugger.h |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/arch/ia32/Makefile.inc |
---|
0,0 → 1,154 |
# |
# Copyright (c) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
## Toolchain configuration |
# |
BFD_NAME = elf32-i386 |
BFD_ARCH = i386 |
BFD = binary |
TARGET = i686-pc-linux-gnu |
TOOLCHAIN_DIR = /usr/local/i686 |
DEFS += -DMACHINE=$(MACHINE) -D__32_BITS__ |
CMN1 = -m32 |
GCC_CFLAGS += $(CMN1) |
ICC_CFLAGS += $(CMN1) |
SUNCC_CFLAGS += $(CMN1) |
## Accepted CPUs |
# |
ifeq ($(MACHINE),athlon-xp) |
CMN2 = -march=athlon-xp -mmmx -msse -m3dnow |
GCC_CFLAGS += $(CMN2) |
ICC_CFLAGS += $(CMN2) |
SUNCC_CFLAGS += -xarch=ssea |
DEFS += -DCONFIG_FENCES_P3 |
CONFIG_SMP = n |
CONFIG_HT = n |
endif |
ifeq ($(MACHINE),athlon-mp) |
CMN2 = -march=athlon-mp -mmmx -msse -m3dnow |
GCC_CFLAGS += $(CMN2) |
ICC_CFLAGS += $(CMN2) |
SUNCC_CFLAGS += xarch=ssea |
DEFS += -DCONFIG_FENCES_P3 |
CONFIG_HT = n |
endif |
ifeq ($(MACHINE),pentium3) |
CMN2 = -march=pentium3 -mmmx -msse |
GCC_CFLAGS += $(CMN2) |
ICC_CFLAGS += $(CMN2) |
SUNCC_CFLAGS += -xarch=sse |
DEFS += -DCONFIG_FENCES_P3 |
CONFIG_HT = n |
endif |
ifeq ($(MACHINE),core) |
CMN2 = -march=prescott -mfpmath=sse -mmmx -msse -msse2 -msse3 |
GCC_CFLAGS += $(CMN2) |
ICC_CFLAGS += $(CMN2) |
SUNCC_CFLAGS += -xarch=sse3 |
DEFS += -DCONFIG_FENCES_P4 |
endif |
ifeq ($(MACHINE),pentium4) |
GCC_CFLAGS += -march=pentium4 -mfpmath=sse -mmmx -msse -msse2 |
ICC_CFLAGS += -march=pentium4 |
SUNCC_CFLAGS += -xarch=sse2 |
DEFS += -DCONFIG_FENCES_P4 |
endif |
## Own configuration directives |
# |
CONFIG_ACPI = y |
## Compile with hierarchical page tables support. |
# |
CONFIG_PAGE_PT = y |
DEFS += -DCONFIG_PAGE_PT |
## Compile with i8042 controller support |
# |
CONFIG_I8042 = y |
DEFS += -DCONFIG_I8042 |
## Accepted configuration directives |
# |
ifeq ($(CONFIG_SMP),y) |
DEFS += -DCONFIG_SMP |
endif |
ifeq ($(CONFIG_HT),y) |
DEFS += -DCONFIG_HT |
endif |
ifeq ($(CONFIG_SIMICS_FIX),y) |
DEFS += -DCONFIG_SIMICS_FIX |
endif |
## Compile with support for software integer division. |
# |
CONFIG_SOFTINT = y |
ARCH_SOURCES = \ |
arch/$(ARCH)/src/context.S \ |
arch/$(ARCH)/src/debug/panic.s \ |
arch/$(ARCH)/src/delay.s \ |
arch/$(ARCH)/src/asm.S \ |
arch/$(ARCH)/src/proc/scheduler.c \ |
arch/$(ARCH)/src/proc/task.c \ |
arch/$(ARCH)/src/proc/thread.c \ |
arch/$(ARCH)/src/bios/bios.c \ |
arch/$(ARCH)/src/smp/ap.S \ |
arch/$(ARCH)/src/smp/apic.c \ |
arch/$(ARCH)/src/smp/mps.c \ |
arch/$(ARCH)/src/smp/smp.c \ |
arch/$(ARCH)/src/atomic.S \ |
arch/$(ARCH)/src/smp/ipi.c \ |
arch/$(ARCH)/src/ia32.c \ |
arch/$(ARCH)/src/interrupt.c \ |
arch/$(ARCH)/src/pm.c \ |
arch/$(ARCH)/src/userspace.c \ |
arch/$(ARCH)/src/cpu/cpu.c \ |
arch/$(ARCH)/src/mm/as.c \ |
arch/$(ARCH)/src/mm/frame.c \ |
arch/$(ARCH)/src/mm/page.c \ |
arch/$(ARCH)/src/mm/tlb.c \ |
arch/$(ARCH)/src/ddi/ddi.c \ |
arch/$(ARCH)/src/drivers/i8254.c \ |
arch/$(ARCH)/src/drivers/i8259.c \ |
arch/$(ARCH)/src/drivers/ega.c \ |
arch/$(ARCH)/src/drivers/vesa.c \ |
arch/$(ARCH)/src/boot/boot.S \ |
arch/$(ARCH)/src/boot/memmap.c \ |
arch/$(ARCH)/src/fpu_context.c \ |
arch/$(ARCH)/src/debugger.c |
/tags/0.3.0/kernel/arch/ia32/_link.ld.in |
---|
0,0 → 1,64 |
/** IA-32 linker script |
* |
* umapped section: |
* kernel text |
* kernel data |
* mapped section: |
* kernel text |
* kernel data |
*/ |
#include <arch/boot/boot.h> |
#include <arch/mm/page.h> |
SECTIONS { |
.unmapped BOOT_OFFSET: AT (0) { |
unmapped_ktext_start = .; |
*(K_TEXT_START); |
unmapped_ktext_end = .; |
unmapped_kdata_start = .; |
*(K_DATA_START); |
unmapped_kdata_end = .; |
} |
.mapped (PA2KA(BOOT_OFFSET)+SIZEOF(.unmapped)): AT (SIZEOF(.unmapped)) { |
ktext_start = .; |
*(.text); |
ktext_end = .; |
kdata_start = .; |
*(.data); /* initialized data */ |
*(.rodata*); /* string literals */ |
*(COMMON); /* global variables */ |
hardcoded_load_address = .; |
LONG(PA2KA(BOOT_OFFSET)); |
hardcoded_ktext_size = .; |
LONG((ktext_end - ktext_start) + (unmapped_ktext_end - unmapped_ktext_start)); |
hardcoded_kdata_size = .; |
LONG((kdata_end - kdata_start) + (unmapped_kdata_end - unmapped_kdata_start)); |
hardcoded_unmapped_ktext_size = .; |
LONG(unmapped_ktext_end - unmapped_ktext_start); |
hardcoded_unmapped_kdata_size = .; |
LONG(unmapped_kdata_end - unmapped_kdata_start); |
symbol_table = .; |
*(symtab.*); /* Symbol table, must be LAST symbol! */ |
*(.bss); /* uninitialized static variables */ |
kdata_end = .; |
} |
/DISCARD/ : { |
*(.note.GNU-stack); |
*(.comment); |
} |
#ifdef CONFIG_SMP |
_hardcoded_unmapped_size = (unmapped_ktext_end - unmapped_ktext_start) + (unmapped_kdata_end - unmapped_kdata_start); |
ap_boot = unmapped_ap_boot - BOOT_OFFSET + AP_BOOT_OFFSET; |
ap_gdtr = unmapped_ap_gdtr - BOOT_OFFSET + AP_BOOT_OFFSET; |
protected_ap_gdtr = PA2KA(ap_gdtr); |
#endif /* CONFIG_SMP */ |
} |
/tags/0.3.0/kernel/arch/arm32/src/mm/page_fault.c |
---|
0,0 → 1,213 |
/* |
* Copyright (c) 2007 Pavel Jancik, Michal Kebrt |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup arm32mm |
* @{ |
*/ |
/** @file |
* @brief Page fault related functions. |
*/ |
#include <panic.h> |
#include <arch/exception.h> |
#include <arch/debug/print.h> |
#include <arch/mm/page_fault.h> |
#include <mm/as.h> |
#include <genarch/mm/page_pt.h> |
#include <arch.h> |
#include <interrupt.h> |
/** Returns value stored in fault status register. |
* |
* @return Value stored in CP15 fault status register (FSR). |
*/ |
static inline fault_status_t read_fault_status_register(void) |
{ |
fault_status_union_t fsu; |
/* fault status is stored in CP15 register 5 */ |
asm volatile ( |
"mrc p15, 0, %0, c5, c0, 0" |
: "=r"(fsu.dummy) |
); |
return fsu.fs; |
} |
/** Returns FAR (fault address register) content. |
* |
* @return FAR (fault address register) content (address that caused a page |
* fault) |
*/ |
static inline uintptr_t read_fault_address_register(void) |
{ |
uintptr_t ret; |
/* fault adress is stored in CP15 register 6 */ |
asm volatile ( |
"mrc p15, 0, %0, c6, c0, 0" |
: "=r"(ret) |
); |
return ret; |
} |
/** Decides whether the instruction is load/store or not. |
* |
* @param instr Instruction |
* |
* @return true when instruction is load/store, false otherwise |
*/ |
static inline bool is_load_store_instruction(instruction_t instr) |
{ |
/* load store immediate offset */ |
if (instr.type == 0x2) { |
return true; |
} |
/* load store register offset */ |
if (instr.type == 0x3 && instr.bit4 == 0) { |
return true; |
} |
/* load store multiple */ |
if (instr.type == 0x4) { |
return true; |
} |
/* oprocessor load/store */ |
if (instr.type == 0x6) { |
return true; |
} |
return false; |
} |
/** Decides whether the instruction is swap or not. |
* |
* @param instr Instruction |
* |
* @return true when instruction is swap, false otherwise |
*/ |
static inline bool is_swap_instruction(instruction_t instr) |
{ |
/* swap, swapb instruction */ |
if (instr.type == 0x0 && |
(instr.opcode == 0x8 || instr.opcode == 0xa) && |
instr.access == 0x0 && instr.bits567 == 0x4 && instr.bit4 == 1) { |
return true; |
} |
return false; |
} |
/** Decides whether read or write into memory is requested. |
* |
* @param instr_addr Address of instruction which tries to access memory. |
* @param badvaddr Virtual address the instruction tries to access. |
* |
* @return Type of access into memory, PF_ACCESS_EXEC if no memory access is |
* requested. |
*/ |
static pf_access_t get_memory_access_type(uint32_t instr_addr, |
uintptr_t badvaddr) |
{ |
instruction_union_t instr_union; |
instr_union.pc = instr_addr; |
instruction_t instr = *(instr_union.instr); |
/* undefined instructions */ |
if (instr.condition == 0xf) { |
panic("page_fault - instruction doesn't access memory " |
"(instr_code: %x, badvaddr:%x)", instr, badvaddr); |
return PF_ACCESS_EXEC; |
} |
/* load store instructions */ |
if (is_load_store_instruction(instr)) { |
if (instr.access == 1) { |
return PF_ACCESS_READ; |
} else { |
return PF_ACCESS_WRITE; |
} |
} |
/* swap, swpb instruction */ |
if (is_swap_instruction(instr)) { |
return PF_ACCESS_WRITE; |
} |
panic("page_fault - instruction doesn't access memory " |
"(instr_code: %x, badvaddr:%x)", instr, badvaddr); |
return PF_ACCESS_EXEC; |
} |
/** Handles "data abort" exception (load or store at invalid address). |
* |
* @param exc_no Exception number. |
* @param istate CPU state when exception occured. |
*/ |
void data_abort(int exc_no, istate_t *istate) |
{ |
fault_status_t fsr __attribute__ ((unused)) = |
read_fault_status_register(); |
uintptr_t badvaddr = read_fault_address_register(); |
pf_access_t access = get_memory_access_type(istate->pc, badvaddr); |
int ret = as_page_fault(badvaddr, access, istate); |
if (ret == AS_PF_FAULT) { |
print_istate(istate); |
dprintf("page fault - pc: %x, va: %x, status: %x(%x), " |
"access:%d\n", istate->pc, badvaddr, fsr.status, fsr, |
access); |
fault_if_from_uspace(istate, "Page fault: %#x", badvaddr); |
panic("page fault\n"); |
} |
} |
/** Handles "prefetch abort" exception (instruction couldn't be executed). |
* |
* @param exc_no Exception number. |
* @param istate CPU state when exception occured. |
*/ |
void prefetch_abort(int exc_no, istate_t *istate) |
{ |
int ret = as_page_fault(istate->pc, PF_ACCESS_EXEC, istate); |
if (ret == AS_PF_FAULT) { |
dprintf("prefetch_abort\n"); |
print_istate(istate); |
panic("page fault - prefetch_abort at address: %x\n", |
istate->pc); |
} |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/arm32/src/mm/frame.c |
---|
0,0 → 1,68 |
/* |
* Copyright (c) 2007 Pavel Jancik, Michal Kebrt |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup arm32mm |
* @{ |
*/ |
/** @file |
* @brief Frame related functions. |
*/ |
#include <mm/frame.h> |
#include <arch/mm/frame.h> |
#include <arch/machine.h> |
#include <config.h> |
#include <arch/debug/print.h> |
/** Address of the last frame in the memory. */ |
uintptr_t last_frame = 0; |
/** Creates memory zones. */ |
void frame_arch_init(void) |
{ |
/* all memory as one zone */ |
zone_create(0, ADDR2PFN(machine_get_memory_size()), |
BOOT_PAGE_TABLE_START_FRAME + BOOT_PAGE_TABLE_SIZE_IN_FRAMES, 0); |
last_frame = machine_get_memory_size(); |
/* blacklist boot page table */ |
frame_mark_unavailable(BOOT_PAGE_TABLE_START_FRAME, |
BOOT_PAGE_TABLE_SIZE_IN_FRAMES); |
} |
/** Frees the boot page table. */ |
void boot_page_table_free(void) |
{ |
int i; |
for (i = 0; i < BOOT_PAGE_TABLE_SIZE_IN_FRAMES; i++) { |
frame_free(i * FRAME_SIZE + BOOT_PAGE_TABLE_ADDRESS); |
} |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/arm32/src/mm/tlb.c |
---|
0,0 → 1,93 |
/* |
* Copyright (c) 2007 Michal Kebrt |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup arm32mm |
* @{ |
*/ |
/** @file |
* @brief TLB related functions. |
*/ |
#include <mm/tlb.h> |
#include <arch/mm/asid.h> |
#include <arch/asm.h> |
#include <arch/types.h> |
#include <arch/mm/page.h> |
/** Invalidate all entries in TLB. |
* |
* @note See ARM Architecture reference section 3.7.7 for details. |
*/ |
void tlb_invalidate_all(void) |
{ |
asm volatile ( |
"eor r1, r1\n" |
"mcr p15, 0, r1, c8, c7, 0\n" |
: : : "r1" |
); |
} |
/** Invalidate all entries in TLB that belong to specified address space. |
* |
* @param asid Ignored as the ARM architecture doesn't support ASIDs. |
*/ |
void tlb_invalidate_asid(asid_t asid) |
{ |
tlb_invalidate_all(); |
} |
/** Invalidate single entry in TLB |
* |
* @param page Virtual adress of the page |
*/ |
static inline void invalidate_page(uintptr_t page) |
{ |
asm volatile ( |
"mcr p15, 0, %0, c8, c7, 1" |
: |
: "r" (page) |
); |
} |
/** Invalidate TLB entries for specified page range belonging to specified |
* address space. |
* |
* @param asid Ignored as the ARM architecture doesn't support it. |
* @param page Address of the first page whose entry is to be invalidated. |
* @param cnt Number of entries to invalidate. |
*/ |
void tlb_invalidate_pages(asid_t asid, uintptr_t page, count_t cnt) |
{ |
unsigned int i; |
for (i = 0; i < cnt; i++) |
invalidate_page(page + i * PAGE_SIZE); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/arm32/src/mm/as.c |
---|
0,0 → 1,52 |
/* |
* Copyright (c) 2007 Pavel Jancik, Michal Kebrt |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup arm32mm |
* @{ |
*/ |
/** @file |
* @brief Address space functions. |
*/ |
#include <arch/mm/as.h> |
#include <genarch/mm/as_pt.h> |
#include <genarch/mm/asid_fifo.h> |
#include <mm/as.h> |
#include <arch.h> |
/** Architecture dependent address space init. |
* |
* Since ARM supports page tables, #as_pt_operations are used. |
*/ |
void as_arch_init(void) |
{ |
as_operations = &as_pt_operations; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/arm32/src/mm/page.c |
---|
0,0 → 1,110 |
/* |
* Copyright (c) 2007 Pavel Jancik, Michal Kebrt |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup arm32mm |
* @{ |
*/ |
/** @file |
* @brief Paging related functions. |
*/ |
#include <arch/mm/page.h> |
#include <genarch/mm/page_pt.h> |
#include <mm/page.h> |
#include <align.h> |
#include <config.h> |
#include <arch/exception.h> |
#include <typedefs.h> |
#include <arch/types.h> |
#include <interrupt.h> |
#include <arch/mm/frame.h> |
/** Initializes page tables. |
* |
* 1:1 virtual-physical mapping is created in kernel address space. Mapping |
* for table with exception vectors is also created. |
*/ |
void page_arch_init(void) |
{ |
uintptr_t cur; |
int flags; |
page_mapping_operations = &pt_mapping_operations; |
flags = PAGE_CACHEABLE; |
/* PA2KA(identity) mapping for all frames until last_frame */ |
for (cur = 0; cur < last_frame; cur += FRAME_SIZE) { |
page_mapping_insert(AS_KERNEL, PA2KA(cur), cur, flags); |
} |
/* create mapping for exception table at high offset */ |
#ifdef HIGH_EXCEPTION_VECTORS |
void *virtaddr = frame_alloc(ONE_FRAME, FRAME_KA); |
page_mapping_insert(AS_KERNEL, EXC_BASE_ADDRESS, KA2PA(virtaddr), flags); |
#else |
#error "Only high exception vector supported now" |
#endif |
as_switch(NULL, AS_KERNEL); |
boot_page_table_free(); |
} |
/** Maps device into the kernel space. |
* |
* Maps physical address of device into kernel virtual address space (so it can |
* be accessed only by kernel through virtual address). |
* |
* @param physaddr Physical address where device is connected. |
* @param size Length of area where device is present. |
* |
* @return Virtual address where device will be accessible. |
*/ |
uintptr_t hw_map(uintptr_t physaddr, size_t size) |
{ |
if (last_frame + ALIGN_UP(size, PAGE_SIZE) > |
KA2PA(KERNEL_ADDRESS_SPACE_END_ARCH)) { |
panic("Unable to map physical memory %p (%d bytes)", |
physaddr, size) |
} |
uintptr_t virtaddr = PA2KA(last_frame); |
pfn_t i; |
for (i = 0; i < ADDR2PFN(ALIGN_UP(size, PAGE_SIZE)); i++) { |
page_mapping_insert(AS_KERNEL, virtaddr + PFN2ADDR(i), |
physaddr + PFN2ADDR(i), |
PAGE_NOT_CACHEABLE | PAGE_READ | PAGE_WRITE | PAGE_KERNEL); |
} |
last_frame = ALIGN_UP(last_frame + size, FRAME_SIZE); |
return virtaddr; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/arm32/src/arm32.c |
---|
0,0 → 1,164 |
/* |
* Copyright (c) 2007 Michal Kebrt |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup arm32 |
* @{ |
*/ |
/** @file |
* @brief ARM32 architecture specific functions. |
*/ |
#include <arch.h> |
#include <arch/boot.h> |
#include <config.h> |
#include <arch/console.h> |
#include <ddi/device.h> |
#include <genarch/fb/fb.h> |
#include <genarch/fb/visuals.h> |
#include <ddi/irq.h> |
#include <arch/debug/print.h> |
#include <print.h> |
#include <config.h> |
#include <interrupt.h> |
#include <arch/regutils.h> |
#include <arch/machine.h> |
#include <userspace.h> |
/** Information about loaded tasks. */ |
bootinfo_t bootinfo; |
/** Performs arm32 specific initialization before main_bsp() is called. */ |
void arch_pre_main(void) |
{ |
unsigned int i; |
init.cnt = bootinfo.cnt; |
for (i = 0; i < bootinfo.cnt; ++i) { |
init.tasks[i].addr = bootinfo.tasks[i].addr; |
init.tasks[i].size = bootinfo.tasks[i].size; |
} |
} |
/** Performs arm32 specific initialization before mm is initialized. */ |
void arch_pre_mm_init(void) |
{ |
/* It is not assumed by default */ |
interrupts_disable(); |
} |
/** Performs arm32 specific initialization afterr mm is initialized. */ |
void arch_post_mm_init(void) |
{ |
machine_hw_map_init(); |
/* Initialize exception dispatch table */ |
exception_init(); |
interrupt_init(); |
console_init(device_assign_devno()); |
#ifdef CONFIG_FB |
fb_init(machine_get_fb_address(), 640, 480, 1920, VISUAL_RGB_8_8_8); |
#endif |
} |
/** Performs arm32 specific tasks needed after cpu is initialized. |
* |
* Currently the function is empty. |
*/ |
void arch_post_cpu_init(void) |
{ |
} |
/** Performs arm32 specific tasks needed before the multiprocessing is |
* initialized. |
* |
* Currently the function is empty because SMP is not supported. |
*/ |
void arch_pre_smp_init(void) |
{ |
} |
/** Performs arm32 specific tasks needed after the multiprocessing is |
* initialized. |
* |
* Currently the function is empty because SMP is not supported. |
*/ |
void arch_post_smp_init(void) |
{ |
} |
/** Performs arm32 specific tasks needed before the new task is run. */ |
void before_task_runs_arch(void) |
{ |
tlb_invalidate_all(); |
} |
/** Performs arm32 specific tasks needed before the new thread is scheduled. |
* |
* It sets supervisor_sp. |
*/ |
void before_thread_runs_arch(void) |
{ |
uint8_t *stck; |
stck = &THREAD->kstack[THREAD_STACK_SIZE - SP_DELTA]; |
supervisor_sp = (uintptr_t) stck; |
} |
/** Performs arm32 specific tasks before a thread stops running. |
* |
* Currently the function is empty. |
*/ |
void after_thread_ran_arch(void) |
{ |
} |
/** Halts CPU. */ |
void cpu_halt(void) |
{ |
machine_cpu_halt(); |
} |
/** Reboot. */ |
void arch_reboot() |
{ |
/* not implemented */ |
for (;;) |
; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/arm32/src/debug/print.c |
---|
0,0 → 1,97 |
/* |
* Copyright (c) 2007 Michal Kebrt |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup arm32 |
* @{ |
*/ |
/** @file |
* @brief Debug print functions. |
*/ |
#include <printf/printf_core.h> |
#include <arch/debug/print.h> |
#include <arch/machine.h> |
/** Prints a character to the console. |
* |
* @param ch Character to be printed. |
*/ |
static void putc(char ch) |
{ |
machine_debug_putc(ch); |
} |
/** Prints a string to the console. |
* |
* @param str String to be printed. |
* @param count Number of characters to be printed. |
* @param unused Unused parameter. |
* |
* @return Number of printed characters. |
*/ |
static int debug_write(const char *str, size_t count, void *unused) |
{ |
unsigned int i; |
for (i = 0; i < count; ++i) |
putc(str[i]); |
return i; |
} |
/** Prints a formated string. |
* |
* @param fmt "Printf-like" format. |
*/ |
void debug_printf(const char *fmt, ...) |
{ |
va_list args; |
va_start (args, fmt); |
struct printf_spec ps = { |
(int (*)(void *, size_t, void *)) debug_write, |
NULL |
}; |
printf_core(fmt, &ps, args); |
va_end(args); |
} |
/** Prints a string. |
* |
* @param str String to print. |
*/ |
void debug_puts(const char *str) |
{ |
while (*str) { |
putc(*str); |
str++; |
} |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/arm32/src/cpu/cpu.c |
---|
0,0 → 1,131 |
/* |
* Copyright (c) 2007 Michal Kebrt |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup arm32 |
* @{ |
*/ |
/** @file |
* @brief CPU identification. |
*/ |
#include <arch/cpu.h> |
#include <cpu.h> |
#include <arch.h> |
#include <print.h> |
/** Number of indexes left out in the #imp_data array */ |
#define IMP_DATA_START_OFFSET 0x40 |
/** Implementators (vendor) names */ |
static char *imp_data[] = { |
"?", /* IMP_DATA_START_OFFSET */ |
"ARM Ltd", /* 0x41 */ |
"", /* 0x42 */ |
"", /* 0x43 */ |
"Digital Equipment Corporation", /* 0x44 */ |
"", "", "", "", "", "", "", "", "", "", /* 0x45 - 0x4e */ |
"", "", "", "", "", "", "", "", "", "", /* 0x4f - 0x58 */ |
"", "", "", "", "", "", "", "", "", "", /* 0x59 - 0x62 */ |
"", "", "", "", "", "", /* 0x63 - 0x68 */ |
"Intel Corporation" /* 0x69 */ |
}; |
/** Length of the #imp_data array */ |
static unsigned int imp_data_length = sizeof(imp_data) / sizeof(char *); |
/** Architecture names */ |
static char *arch_data[] = { |
"?", /* 0x0 */ |
"4", /* 0x1 */ |
"4T", /* 0x2 */ |
"5", /* 0x3 */ |
"5T", /* 0x4 */ |
"5TE", /* 0x5 */ |
"5TEJ", /* 0x6 */ |
"6" /* 0x7 */ |
}; |
/** Length of the #arch_data array */ |
static unsigned int arch_data_length = sizeof(arch_data) / sizeof(char *); |
/** Retrieves processor identification from CP15 register 0. |
* |
* @param cpu Structure for storing CPU identification. |
*/ |
static void arch_cpu_identify(cpu_arch_t *cpu) |
{ |
uint32_t ident; |
asm volatile ( |
"mrc p15, 0, %0, c0, c0, 0\n" |
: "=r" (ident) |
); |
cpu->imp_num = ident >> 24; |
cpu->variant_num = (ident << 8) >> 28; |
cpu->arch_num = (ident << 12) >> 28; |
cpu->prim_part_num = (ident << 16) >> 20; |
cpu->rev_num = (ident << 28) >> 28; |
} |
/** Does nothing on ARM. */ |
void cpu_arch_init(void) |
{ |
} |
/** Retrieves processor identification and stores it to #CPU.arch */ |
void cpu_identify(void) |
{ |
arch_cpu_identify(&CPU->arch); |
} |
/** Prints CPU identification. */ |
void cpu_print_report(cpu_t *m) |
{ |
char * vendor = imp_data[0]; |
char * architecture = arch_data[0]; |
cpu_arch_t * cpu_arch = &m->arch; |
if ((cpu_arch->imp_num) > 0 && |
(cpu_arch->imp_num < (imp_data_length + IMP_DATA_START_OFFSET))) { |
vendor = imp_data[cpu_arch->imp_num - IMP_DATA_START_OFFSET]; |
} |
if ((cpu_arch->arch_num) > 0 && |
(cpu_arch->arch_num < arch_data_length)) { |
architecture = arch_data[cpu_arch->arch_num]; |
} |
printf("cpu%d: vendor=%s, architecture=ARM%s, part number=%x, " |
"variant=%x, revision=%x\n", |
m->id, vendor, architecture, cpu_arch->prim_part_num, |
cpu_arch->variant_num, cpu_arch->rev_num); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/arm32/src/exception.c |
---|
0,0 → 1,383 |
/* |
* Copyright (c) 2007 Petr Stepan |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup arm32 |
* @{ |
*/ |
/** @file |
* @brief Exception handlers and exception initialization routines. |
*/ |
#include <arch/exception.h> |
#include <arch/debug/print.h> |
#include <arch/memstr.h> |
#include <arch/regutils.h> |
#include <interrupt.h> |
#include <arch/machine.h> |
#include <arch/mm/page_fault.h> |
#include <print.h> |
#include <syscall/syscall.h> |
/** Offset used in calculation of exception handler's relative address. |
* |
* @see install_handler() |
*/ |
#define PREFETCH_OFFSET 0x8 |
/** LDR instruction's code */ |
#define LDR_OPCODE 0xe59ff000 |
/** Number of exception vectors. */ |
#define EXC_VECTORS 8 |
/** Size of memory block occupied by exception vectors. */ |
#define EXC_VECTORS_SIZE (EXC_VECTORS * 4) |
/** Switches to kernel stack and saves all registers there. |
* |
* Temporary exception stack is used to save a few registers |
* before stack switch takes place. |
*/ |
inline static void setup_stack_and_save_regs() |
{ |
asm volatile( |
"ldr r13, =exc_stack \n" |
"stmfd r13!, {r0} \n" |
"mrs r0, spsr \n" |
"and r0, r0, #0x1f \n" |
"cmp r0, #0x10 \n" |
"bne 1f \n" |
/* prev mode was usermode */ |
"ldmfd r13!, {r0} \n" |
"ldr r13, =supervisor_sp \n" |
"ldr r13, [r13] \n" |
"stmfd r13!, {lr} \n" |
"stmfd r13!, {r0-r12} \n" |
"stmfd r13!, {r13, lr}^ \n" |
"mrs r0, spsr \n" |
"stmfd r13!, {r0} \n" |
"b 2f \n" |
/* mode was not usermode */ |
"1:\n" |
"stmfd r13!, {r1, r2, r3} \n" |
"mrs r1, cpsr \n" |
"mov r2, lr \n" |
"bic r1, r1, #0x1f \n" |
"orr r1, r1, r0 \n" |
"mrs r0, cpsr \n" |
"msr cpsr_c, r1 \n" |
"mov r3, r13 \n" |
"stmfd r13!, {r2} \n" |
"mov r2, lr \n" |
"stmfd r13!, {r4-r12} \n" |
"mov r1, r13 \n" |
/* the following two lines are for debugging */ |
"mov sp, #0 \n" |
"mov lr, #0 \n" |
"msr cpsr_c, r0 \n" |
"ldmfd r13!, {r4, r5, r6, r7} \n" |
"stmfd r1!, {r4, r5, r6} \n" |
"stmfd r1!, {r7} \n" |
"stmfd r1!, {r2} \n" |
"stmfd r1!, {r3} \n" |
"mrs r0, spsr \n" |
"stmfd r1!, {r0} \n" |
"mov r13, r1 \n" |
"2:\n" |
); |
} |
/** Returns from exception mode. |
* |
* Previously saved state of registers (including control register) |
* is restored from the stack. |
*/ |
inline static void load_regs() |
{ |
asm volatile( |
"ldmfd r13!, {r0} \n" |
"msr spsr, r0 \n" |
"and r0, r0, #0x1f \n" |
"cmp r0, #0x10 \n" |
"bne 1f \n" |
/* return to user mode */ |
"ldmfd r13!, {r13, lr}^ \n" |
"b 2f \n" |
/* return to non-user mode */ |
"1:\n" |
"ldmfd r13!, {r1, r2} \n" |
"mrs r3, cpsr \n" |
"bic r3, r3, #0x1f \n" |
"orr r3, r3, r0 \n" |
"mrs r0, cpsr \n" |
"msr cpsr_c, r3 \n" |
"mov r13, r1 \n" |
"mov lr, r2 \n" |
"msr cpsr_c, r0 \n" |
/* actual return */ |
"2:\n" |
"ldmfd r13, {r0-r12, pc}^\n" |
); |
} |
/** Switch CPU to mode in which interrupts are serviced (currently it |
* is Undefined mode). |
* |
* The default mode for interrupt servicing (Interrupt Mode) |
* can not be used because of nested interrupts (which can occur |
* because interrupts are enabled in higher levels of interrupt handler). |
*/ |
inline static void switch_to_irq_servicing_mode() |
{ |
/* switch to Undefined mode */ |
asm volatile( |
/* save regs used during switching */ |
"stmfd sp!, {r0-r3} \n" |
/* save stack pointer and link register to r1, r2 */ |
"mov r1, sp \n" |
"mov r2, lr \n" |
/* mode switch */ |
"mrs r0, cpsr \n" |
"bic r0, r0, #0x1f \n" |
"orr r0, r0, #0x1b \n" |
"msr cpsr_c, r0 \n" |
/* restore saved sp and lr */ |
"mov sp, r1 \n" |
"mov lr, r2 \n" |
/* restore original regs */ |
"ldmfd sp!, {r0-r3} \n" |
); |
} |
/** Calls exception dispatch routine. */ |
#define CALL_EXC_DISPATCH(exception) \ |
asm("mov r0, %0" : : "i" (exception)); \ |
asm("mov r1, r13"); \ |
asm("bl exc_dispatch"); |
/** General exception handler. |
* |
* Stores registers, dispatches the exception, |
* and finally restores registers and returns from exception processing. |
* |
* @param exception Exception number. |
*/ |
#define PROCESS_EXCEPTION(exception) \ |
setup_stack_and_save_regs(); \ |
CALL_EXC_DISPATCH(exception) \ |
load_regs(); |
/** Updates specified exception vector to jump to given handler. |
* |
* Addresses of handlers are stored in memory following exception vectors. |
*/ |
static void install_handler (unsigned handler_addr, unsigned* vector) |
{ |
/* relative address (related to exc. vector) of the word |
* where handler's address is stored |
*/ |
volatile uint32_t handler_address_ptr = EXC_VECTORS_SIZE - |
PREFETCH_OFFSET; |
/* make it LDR instruction and store at exception vector */ |
*vector = handler_address_ptr | LDR_OPCODE; |
/* store handler's address */ |
*(vector + EXC_VECTORS) = handler_addr; |
} |
/** Low-level Reset Exception handler. */ |
static void reset_exception_entry() |
{ |
PROCESS_EXCEPTION(EXC_RESET); |
} |
/** Low-level Software Interrupt Exception handler. */ |
static void swi_exception_entry() |
{ |
PROCESS_EXCEPTION(EXC_SWI); |
} |
/** Low-level Undefined Instruction Exception handler. */ |
static void undef_instr_exception_entry() |
{ |
PROCESS_EXCEPTION(EXC_UNDEF_INSTR); |
} |
/** Low-level Fast Interrupt Exception handler. */ |
static void fiq_exception_entry() |
{ |
PROCESS_EXCEPTION(EXC_FIQ); |
} |
/** Low-level Prefetch Abort Exception handler. */ |
static void prefetch_abort_exception_entry() |
{ |
asm("sub lr, lr, #4"); |
PROCESS_EXCEPTION(EXC_PREFETCH_ABORT); |
} |
/** Low-level Data Abort Exception handler. */ |
static void data_abort_exception_entry() |
{ |
asm("sub lr, lr, #8"); |
PROCESS_EXCEPTION(EXC_DATA_ABORT); |
} |
/** Low-level Interrupt Exception handler. |
* |
* CPU is switched to Undefined mode before further interrupt processing |
* because of possible occurence of nested interrupt exception, which |
* would overwrite (and thus spoil) stack pointer. |
*/ |
static void irq_exception_entry() |
{ |
asm("sub lr, lr, #4"); |
setup_stack_and_save_regs(); |
switch_to_irq_servicing_mode(); |
CALL_EXC_DISPATCH(EXC_IRQ) |
load_regs(); |
} |
/** Software Interrupt handler. |
* |
* Dispatches the syscall. |
*/ |
static void swi_exception(int exc_no, istate_t *istate) |
{ |
istate->r0 = syscall_handler(istate->r0, istate->r1, istate->r2, |
istate->r3, istate->r4, istate->r5, istate->r6); |
} |
/** Interrupt Exception handler. |
* |
* Determines the sources of interrupt and calls their handlers. |
*/ |
static void irq_exception(int exc_no, istate_t *istate) |
{ |
machine_irq_exception(exc_no, istate); |
} |
/** Fills exception vectors with appropriate exception handlers. */ |
void install_exception_handlers(void) |
{ |
install_handler((unsigned) reset_exception_entry, |
(unsigned *) EXC_RESET_VEC); |
install_handler((unsigned) undef_instr_exception_entry, |
(unsigned *) EXC_UNDEF_INSTR_VEC); |
install_handler((unsigned) swi_exception_entry, |
(unsigned *) EXC_SWI_VEC); |
install_handler((unsigned) prefetch_abort_exception_entry, |
(unsigned *) EXC_PREFETCH_ABORT_VEC); |
install_handler((unsigned) data_abort_exception_entry, |
(unsigned *) EXC_DATA_ABORT_VEC); |
install_handler((unsigned) irq_exception_entry, |
(unsigned *) EXC_IRQ_VEC); |
install_handler((unsigned)fiq_exception_entry, |
(unsigned *) EXC_FIQ_VEC); |
} |
#ifdef HIGH_EXCEPTION_VECTORS |
/** Activates use of high exception vectors addresses. */ |
static void high_vectors(void) |
{ |
uint32_t control_reg; |
asm volatile("mrc p15, 0, %0, c1, c1" : "=r" (control_reg)); |
/* switch on the high vectors bit */ |
control_reg |= CP15_R1_HIGH_VECTORS_BIT; |
asm volatile("mcr p15, 0, %0, c1, c1" : : "r" (control_reg)); |
} |
#endif |
/** Initializes exception handling. |
* |
* Installs low-level exception handlers and then registers |
* exceptions and their handlers to kernel exception dispatcher. |
*/ |
void exception_init(void) |
{ |
#ifdef HIGH_EXCEPTION_VECTORS |
high_vectors(); |
#endif |
install_exception_handlers(); |
exc_register(EXC_IRQ, "interrupt", (iroutine) irq_exception); |
exc_register(EXC_PREFETCH_ABORT, "prefetch abort", |
(iroutine) prefetch_abort); |
exc_register(EXC_DATA_ABORT, "data abort", (iroutine) data_abort); |
exc_register(EXC_SWI, "software interrupt", (iroutine) swi_exception); |
} |
/** Prints #istate_t structure content. |
* |
* @param istate Structure to be printed. |
*/ |
void print_istate(istate_t *istate) |
{ |
dprintf("istate dump:\n"); |
dprintf(" r0: %x r1: %x r2: %x r3: %x\n", |
istate->r0, istate->r1, istate->r2, istate->r3); |
dprintf(" r4: %x r5: %x r6: %x r7: %x\n", |
istate->r4, istate->r5, istate->r6, istate->r7); |
dprintf(" r8: %x r8: %x r10: %x r11: %x\n", |
istate->r8, istate->r9, istate->r10, istate->r11); |
dprintf(" r12: %x sp: %x lr: %x spsr: %x\n", |
istate->r12, istate->sp, istate->lr, istate->spsr); |
dprintf(" pc: %x\n", istate->pc); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/arm32/src/userspace.c |
---|
0,0 → 1,104 |
/* |
* Copyright (c) 2007 Petr Stepan, Pavel Jancik |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup arm32 |
* @{ |
*/ |
/** @file |
* @brief Userspace switch. |
*/ |
#include <userspace.h> |
/** Struct for holding all general purpose registers. |
* |
* Used to set registers when going to userspace. |
*/ |
typedef struct { |
uint32_t r0; |
uint32_t r1; |
uint32_t r2; |
uint32_t r3; |
uint32_t r4; |
uint32_t r5; |
uint32_t r6; |
uint32_t r7; |
uint32_t r8; |
uint32_t r9; |
uint32_t r10; |
uint32_t r11; |
uint32_t r12; |
uint32_t sp; |
uint32_t lr; |
uint32_t pc; |
} ustate_t; |
/** Changes processor mode and jumps to the address specified in the first |
* parameter. |
* |
* @param kernel_uarg Userspace settings (entry point, stack, ...). |
*/ |
void userspace(uspace_arg_t *kernel_uarg) |
{ |
volatile ustate_t ustate; |
/* set first parameter */ |
ustate.r0 = (uintptr_t) kernel_uarg->uspace_uarg; |
/* clear other registers */ |
ustate.r1 = ustate.r2 = ustate.r3 = ustate.r4 = ustate.r5 = |
ustate.r6 = ustate.r7 = ustate.r8 = ustate.r9 = ustate.r10 = |
ustate.r11 = ustate.r12 = ustate.lr = 0; |
/* set user stack */ |
ustate.sp = ((uint32_t)kernel_uarg->uspace_stack) + PAGE_SIZE; |
/* set where uspace execution starts */ |
ustate.pc = (uintptr_t) kernel_uarg->uspace_entry; |
/* status register in user mode */ |
ipl_t user_mode = current_status_reg_read() & |
(~STATUS_REG_MODE_MASK | USER_MODE); |
/* set user mode, set registers, jump */ |
asm volatile ( |
"mov sp, %0 \n" |
"msr spsr_c, %1 \n" |
"ldmfd sp!, {r0-r12, sp, lr}^ \n" |
"ldmfd sp!, {pc}^\n" |
: |
: "r" (&ustate), "r" (user_mode) |
); |
/* unreachable */ |
while(1) |
; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/arm32/src/ddi/ddi.c |
---|
0,0 → 1,56 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup arm32ddi |
* @{ |
*/ |
/** @file |
* @brief DDI. |
*/ |
#include <ddi/ddi.h> |
#include <proc/task.h> |
#include <arch/types.h> |
/** Enable I/O space range for task. |
* |
* Interrupts are disabled and task is locked. |
* |
* @param task Task. |
* @param ioaddr Startign I/O space address. |
* @param size Size of the enabled I/O range. |
* |
* @return 0 on success or an error code from errno.h. |
*/ |
int ddi_iospace_enable_arch(task_t *task, uintptr_t ioaddr, size_t size) |
{ |
return 0; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/arm32/src/asm.S |
---|
0,0 → 1,98 |
# |
# Copyright (c) 2007 Michal Kebrt |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
.text |
.global memsetb |
.global memcpy |
.global memcpy_from_uspace |
.global memcpy_to_uspace |
.global memcpy_from_uspace_failover_address |
.global memcpy_to_uspace_failover_address |
memsetb: |
b _memsetb |
memcpy: |
memcpy_from_uspace: |
memcpy_to_uspace: |
add r3, r1, #3 |
bic r3, r3, #3 |
cmp r1, r3 |
stmdb sp!, {r4, lr} |
beq 4f |
1: |
cmp r2, #0 |
movne ip, #0 |
beq 3f |
2: |
ldrb r3, [ip, r1] |
strb r3, [ip, r0] |
add ip, ip, #1 |
cmp ip, r2 |
bne 2b |
3: |
mov r0, r1 |
ldmia sp!, {r4, pc} |
4: |
add r3, r0, #3 |
bic r3, r3, #3 |
cmp r0, r3 |
bne 1b |
movs r4, r2, lsr #2 |
moveq lr, r4 |
beq 6f |
mov lr, #0 |
mov ip, lr |
5: |
ldr r3, [ip, r1] |
add lr, lr, #1 |
cmp lr, r4 |
str r3, [ip, r0] |
add ip, ip, #4 |
bne 5b |
6: |
ands r4, r2, #3 |
beq 3b |
mov r3, lr, lsl #2 |
add r0, r3, r0 |
add ip, r3, r1 |
mov r2, #0 |
7: |
ldrb r3, [r2, ip] |
strb r3, [r2, r0] |
add r2, r2, #1 |
cmp r2, r4 |
bne 7b |
b 3b |
memcpy_from_uspace_failover_address: |
memcpy_to_uspace_failover_address: |
mov r0, #0 |
ldmia sp!, {r4, pc} |
/tags/0.3.0/kernel/arch/arm32/src/console.c |
---|
0,0 → 1,58 |
/* |
* Copyright (c) 2007 Michal Kebrt |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup arm32 |
* @{ |
*/ |
/** @file |
* @brief Console. |
*/ |
#include <console/console.h> |
#include <arch/console.h> |
#include <arch/machine.h> |
void console_init(devno_t devno) |
{ |
machine_console_init(devno); |
} |
/** Acquire console back for kernel. */ |
void arch_grab_console(void) |
{ |
machine_grab_console(); |
} |
/** Return console to userspace. */ |
void arch_release_console(void) |
{ |
machine_release_console(); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/arm32/src/context.S |
---|
0,0 → 1,59 |
# |
# Copyright (c) 2007 Petr Stepan |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
.text |
.global context_save_arch |
.global context_restore_arch |
context_save_arch: |
stmfd sp!, {r1} |
mrs r1, cpsr |
and r1, r1, #0x1f |
stmia r0!, {r1} |
ldmfd sp!, {r1} |
stmia r0!, {sp, lr} |
stmia r0!, {r4-r11} |
mov r0, #1 |
mov pc, lr |
context_restore_arch: |
ldmia r0!, {r4} |
mrs r5, cpsr |
bic r5, r5, #0x1f |
orr r5, r5, r4 |
msr cpsr_c, r5 |
ldmia r0!, {sp, lr} |
ldmia r0!, {r4-r11} |
mov r0, #0 |
mov pc, lr |
/tags/0.3.0/kernel/arch/arm32/src/panic.S |
---|
0,0 → 1,35 |
# |
# Copyright (c) 2007 Michal Kebrt |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
.text |
.global panic_printf |
panic_printf: |
bl debug_printf |
bl cpu_halt |
/tags/0.3.0/kernel/arch/arm32/src/dummy.S |
---|
0,0 → 1,64 |
# |
# Copyright (c) 2007 Michal Kebry, Pavel Jancik, Petr Stepan |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
.text |
.global calibrate_delay_loop |
.global asm_delay_loop |
.global fpu_context_restore |
.global fpu_context_save |
.global fpu_enable |
.global fpu_init |
.global sys_tls_set |
.global dummy |
calibrate_delay_loop: |
mov pc, lr |
asm_delay_loop: |
mov pc, lr |
fpu_context_restore: |
mov pc, lr |
fpu_context_save: |
mov pc, lr |
fpu_enable: |
mov pc, lr |
fpu_init: |
mov pc, lr |
# not used on ARM |
sys_tls_set: |
dummy: |
mov pc, lr |
/tags/0.3.0/kernel/arch/arm32/src/interrupt.c |
---|
0,0 → 1,101 |
/* |
* Copyright (c) 2007 Petr Stepan |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup arm32 |
* @{ |
*/ |
/** @file |
* @brief Interrupts controlling routines. |
*/ |
#include <arch/asm.h> |
#include <arch/regutils.h> |
#include <ddi/irq.h> |
#include <arch/machine.h> |
#include <interrupt.h> |
/** Initial size of a table holding interrupt handlers. */ |
#define IRQ_COUNT 8 |
/** Disable interrupts. |
* |
* @return Old interrupt priority level. |
*/ |
ipl_t interrupts_disable(void) |
{ |
ipl_t ipl = current_status_reg_read(); |
current_status_reg_control_write(STATUS_REG_IRQ_DISABLED_BIT | ipl); |
return ipl; |
} |
/** Enable interrupts. |
* |
* @return Old interrupt priority level. |
*/ |
ipl_t interrupts_enable(void) |
{ |
ipl_t ipl = current_status_reg_read(); |
current_status_reg_control_write(ipl & ~STATUS_REG_IRQ_DISABLED_BIT); |
return ipl; |
} |
/** Restore interrupt priority level. |
* |
* @param ipl Saved interrupt priority level. |
*/ |
void interrupts_restore(ipl_t ipl) |
{ |
current_status_reg_control_write( |
(current_status_reg_read() & ~STATUS_REG_IRQ_DISABLED_BIT) | |
(ipl & STATUS_REG_IRQ_DISABLED_BIT)); |
} |
/** Read interrupt priority level. |
* |
* @return Current interrupt priority level. |
*/ |
ipl_t interrupts_read(void) |
{ |
return current_status_reg_read(); |
} |
/** Initialize basic tables for exception dispatching |
* and starts the timer. |
*/ |
void interrupt_init(void) |
{ |
irq_init(IRQ_COUNT, IRQ_COUNT); |
machine_timer_irq_start(); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/arm32/src/start.S |
---|
0,0 → 1,77 |
# |
# Copyright (c) 2007 Michal Kebrt |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
#include <arch/asm/boot.h> |
.text |
.global kernel_image_start |
.global exc_stack |
.global supervisor_sp |
kernel_image_start: |
# switch to supervisor mode |
mrs r3, cpsr |
bic r3, r3, #0x1f |
orr r3, r3, #0x13 |
msr cpsr_c, r3 |
ldr sp, =temp_stack |
cmp r2, #0 |
beq bootinfo_end |
ldr r3, =bootinfo |
bootinfo_loop: |
ldr r4, [r1] |
str r4, [r3] |
add r1, r1, #4 |
add r3, r3, #4 |
add r2, r2, #-4 |
cmp r2, #0 |
bne bootinfo_loop |
bootinfo_end: |
bl arch_pre_main |
bl main_bsp |
.space TEMP_STACK_SIZE |
temp_stack: |
.space 1024 |
exc_stack: |
supervisor_sp: |
.space 4 |
/tags/0.3.0/kernel/arch/arm32/src/drivers/gxemul.c |
---|
0,0 → 1,393 |
/* |
* Copyright (c) 2007 Michal Kebrt, Petr Stepan |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup arm32gxemul |
* @{ |
*/ |
/** @file |
* @brief GXemul drivers. |
*/ |
#include <interrupt.h> |
#include <ipc/irq.h> |
#include <console/chardev.h> |
#include <arch/drivers/gxemul.h> |
#include <console/console.h> |
#include <sysinfo/sysinfo.h> |
#include <print.h> |
#include <ddi/device.h> |
#include <mm/page.h> |
#include <arch/machine.h> |
#include <arch/debug/print.h> |
/* Addresses of devices. */ |
#define GXEMUL_VIDEORAM 0x10000000 |
#define GXEMUL_KBD 0x10000000 |
#define GXEMUL_HALT_OFFSET 0x10 |
#define GXEMUL_RTC 0x15000000 |
#define GXEMUL_RTC_FREQ_OFFSET 0x100 |
#define GXEMUL_RTC_ACK_OFFSET 0x110 |
#define GXEMUL_IRQC 0x16000000 |
#define GXEMUL_IRQC_MASK_OFFSET 0x4 |
#define GXEMUL_IRQC_UNMASK_OFFSET 0x8 |
#define GXEMUL_MP 0x11000000 |
#define GXEMUL_MP_MEMSIZE_OFFSET 0x0090 |
#define GXEMUL_FB 0x12000000 |
/* IRQs */ |
#define GXEMUL_KBD_IRQ 2 |
#define GXEMUL_TIMER_IRQ 4 |
static gxemul_hw_map_t gxemul_hw_map; |
static chardev_t console; |
static irq_t gxemul_console_irq; |
static irq_t gxemul_timer_irq; |
static bool hw_map_init_called = false; |
static void gxemul_kbd_enable(chardev_t *dev); |
static void gxemul_kbd_disable(chardev_t *dev); |
static void gxemul_write(chardev_t *dev, const char ch); |
static char gxemul_do_read(chardev_t *dev); |
static chardev_operations_t gxemul_ops = { |
.resume = gxemul_kbd_enable, |
.suspend = gxemul_kbd_disable, |
.write = gxemul_write, |
.read = gxemul_do_read, |
}; |
/** Returns the mask of active interrupts. */ |
static inline uint32_t gxemul_irqc_get_sources(void) |
{ |
return *((uint32_t *) gxemul_hw_map.irqc); |
} |
/** Masks interrupt. |
* |
* @param irq interrupt number |
*/ |
static inline void gxemul_irqc_mask(uint32_t irq) |
{ |
*((uint32_t *) gxemul_hw_map.irqc_mask) = irq; |
} |
/** Unmasks interrupt. |
* |
* @param irq interrupt number |
*/ |
static inline void gxemul_irqc_unmask(uint32_t irq) |
{ |
*((uint32_t *) gxemul_hw_map.irqc_unmask) = irq; |
} |
/** Initializes #gxemul_hw_map. */ |
void gxemul_hw_map_init(void) |
{ |
gxemul_hw_map.videoram = hw_map(GXEMUL_VIDEORAM, PAGE_SIZE); |
gxemul_hw_map.kbd = hw_map(GXEMUL_KBD, PAGE_SIZE); |
gxemul_hw_map.rtc = hw_map(GXEMUL_RTC, PAGE_SIZE); |
gxemul_hw_map.irqc = hw_map(GXEMUL_IRQC, PAGE_SIZE); |
gxemul_hw_map.rtc_freq = gxemul_hw_map.rtc + GXEMUL_RTC_FREQ_OFFSET; |
gxemul_hw_map.rtc_ack = gxemul_hw_map.rtc + GXEMUL_RTC_ACK_OFFSET; |
gxemul_hw_map.irqc_mask = gxemul_hw_map.irqc + GXEMUL_IRQC_MASK_OFFSET; |
gxemul_hw_map.irqc_unmask = gxemul_hw_map.irqc + |
GXEMUL_IRQC_UNMASK_OFFSET; |
hw_map_init_called = true; |
} |
/** Putchar that works with gxemul. |
* |
* @param dev Not used. |
* @param ch Characted to be printed. |
*/ |
static void gxemul_write(chardev_t *dev, const char ch) |
{ |
*((char *) gxemul_hw_map.videoram) = ch; |
} |
/** Enables gxemul keyboard (interrupt unmasked). |
* |
* @param dev Not used. |
* |
* Called from getc(). |
*/ |
static void gxemul_kbd_enable(chardev_t *dev) |
{ |
gxemul_irqc_unmask(GXEMUL_KBD_IRQ); |
} |
/** Disables gxemul keyboard (interrupt masked). |
* |
* @param dev not used |
* |
* Called from getc(). |
*/ |
static void gxemul_kbd_disable(chardev_t *dev) |
{ |
gxemul_irqc_mask(GXEMUL_KBD_IRQ); |
} |
/** Read character using polling, assume interrupts disabled. |
* |
* @param dev Not used. |
*/ |
static char gxemul_do_read(chardev_t *dev) |
{ |
char ch; |
while (1) { |
ch = *((volatile char *) gxemul_hw_map.kbd); |
if (ch) { |
if (ch == '\r') |
return '\n'; |
if (ch == 0x7f) |
return '\b'; |
return ch; |
} |
} |
} |
/** Process keyboard interrupt. |
* |
* @param irq IRQ information. |
* @param arg Not used. |
*/ |
static void gxemul_irq_handler(irq_t *irq, void *arg, ...) |
{ |
if ((irq->notif_cfg.notify) && (irq->notif_cfg.answerbox)) { |
ipc_irq_send_notif(irq); |
} else { |
char ch = 0; |
ch = *((char *) gxemul_hw_map.kbd); |
if (ch == '\r') { |
ch = '\n'; |
} |
if (ch == 0x7f) { |
ch = '\b'; |
} |
chardev_push_character(&console, ch); |
} |
} |
static irq_ownership_t gxemul_claim(void) |
{ |
return IRQ_ACCEPT; |
} |
/** Acquire console back for kernel. */ |
void gxemul_grab_console(void) |
{ |
ipl_t ipl = interrupts_disable(); |
spinlock_lock(&gxemul_console_irq.lock); |
gxemul_console_irq.notif_cfg.notify = false; |
spinlock_unlock(&gxemul_console_irq.lock); |
interrupts_restore(ipl); |
} |
/** Return console to userspace. */ |
void gxemul_release_console(void) |
{ |
ipl_t ipl = interrupts_disable(); |
spinlock_lock(&gxemul_console_irq.lock); |
if (gxemul_console_irq.notif_cfg.answerbox) { |
gxemul_console_irq.notif_cfg.notify = true; |
} |
spinlock_unlock(&gxemul_console_irq.lock); |
interrupts_restore(ipl); |
} |
/** Initializes console object representing gxemul console. |
* |
* @param devno device number. |
*/ |
void gxemul_console_init(devno_t devno) |
{ |
chardev_initialize("gxemul_console", &console, &gxemul_ops); |
stdin = &console; |
stdout = &console; |
irq_initialize(&gxemul_console_irq); |
gxemul_console_irq.devno = devno; |
gxemul_console_irq.inr = GXEMUL_KBD_IRQ; |
gxemul_console_irq.claim = gxemul_claim; |
gxemul_console_irq.handler = gxemul_irq_handler; |
irq_register(&gxemul_console_irq); |
gxemul_irqc_unmask(GXEMUL_KBD_IRQ); |
sysinfo_set_item_val("kbd", NULL, true); |
sysinfo_set_item_val("kbd.devno", NULL, devno); |
sysinfo_set_item_val("kbd.inr", NULL, GXEMUL_KBD_IRQ); |
sysinfo_set_item_val("kbd.address.virtual", NULL, gxemul_hw_map.kbd); |
} |
/** Starts gxemul Real Time Clock device, which asserts regular interrupts. |
* |
* @param frequency Interrupts frequency (0 disables RTC). |
*/ |
static void gxemul_timer_start(uint32_t frequency) |
{ |
*((uint32_t*) gxemul_hw_map.rtc_freq) = frequency; |
} |
static irq_ownership_t gxemul_timer_claim(void) |
{ |
return IRQ_ACCEPT; |
} |
/** Timer interrupt handler. |
* |
* @param irq Interrupt information. |
* @param arg Not used. |
*/ |
static void gxemul_timer_irq_handler(irq_t *irq, void *arg, ...) |
{ |
/* |
* We are holding a lock which prevents preemption. |
* Release the lock, call clock() and reacquire the lock again. |
*/ |
spinlock_unlock(&irq->lock); |
clock(); |
spinlock_lock(&irq->lock); |
/* acknowledge tick */ |
*((uint32_t*) gxemul_hw_map.rtc_ack) = 0; |
} |
/** Initializes and registers timer interrupt handler. */ |
static void gxemul_timer_irq_init(void) |
{ |
irq_initialize(&gxemul_timer_irq); |
gxemul_timer_irq.devno = device_assign_devno(); |
gxemul_timer_irq.inr = GXEMUL_TIMER_IRQ; |
gxemul_timer_irq.claim = gxemul_timer_claim; |
gxemul_timer_irq.handler = gxemul_timer_irq_handler; |
irq_register(&gxemul_timer_irq); |
} |
/** Starts timer. |
* |
* Initiates regular timer interrupts after initializing |
* corresponding interrupt handler. |
*/ |
void gxemul_timer_irq_start(void) |
{ |
gxemul_timer_irq_init(); |
gxemul_timer_start(GXEMUL_TIMER_FREQ); |
} |
/** Returns the size of emulated memory. |
* |
* @return Size in bytes. |
*/ |
size_t gxemul_get_memory_size(void) |
{ |
return *((int *) (GXEMUL_MP + GXEMUL_MP_MEMSIZE_OFFSET)); |
} |
/** Prints a character. |
* |
* @param ch Character to be printed. |
*/ |
void gxemul_debug_putc(char ch) |
{ |
char *addr = 0; |
if (!hw_map_init_called) { |
addr = (char *) GXEMUL_KBD; |
} else { |
addr = (char *) gxemul_hw_map.videoram; |
} |
*(addr) = ch; |
} |
/** Stops gxemul. */ |
void gxemul_cpu_halt(void) |
{ |
char * addr = 0; |
if (!hw_map_init_called) { |
addr = (char *) GXEMUL_KBD; |
} else { |
addr = (char *) gxemul_hw_map.videoram; |
} |
*(addr + GXEMUL_HALT_OFFSET) = '\0'; |
} |
/** Gxemul specific interrupt exception handler. |
* |
* Determines sources of the interrupt from interrupt controller and |
* calls high-level handlers for them. |
* |
* @param exc_no Interrupt exception number. |
* @param istate Saved processor state. |
*/ |
void gxemul_irq_exception(int exc_no, istate_t *istate) |
{ |
uint32_t sources = gxemul_irqc_get_sources(); |
int i; |
for (i = 0; i < GXEMUL_IRQC_MAX_IRQ; i++) { |
if (sources & (1 << i)) { |
irq_t *irq = irq_dispatch_and_lock(i); |
if (irq) { |
/* The IRQ handler was found. */ |
irq->handler(irq, irq->arg); |
spinlock_unlock(&irq->lock); |
} else { |
/* Spurious interrupt.*/ |
dprintf("cpu%d: spurious interrupt (inum=%d)\n", |
CPU->id, i); |
} |
} |
} |
} |
/** Returns address of framebuffer device. |
* |
* @return Address of framebuffer device. |
*/ |
uintptr_t gxemul_get_fb_address(void) |
{ |
return (uintptr_t) GXEMUL_FB; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/arm32/include/mm/frame.h |
---|
0,0 → 1,65 |
/* |
* Copyright (c) 2007 Pavel Jancik, Michal Kebrt |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup arm32mm |
* @{ |
*/ |
/** @file |
* @brief Frame related declarations. |
*/ |
#ifndef KERN_arm32_FRAME_H_ |
#define KERN_arm32_FRAME_H_ |
#define FRAME_WIDTH 12 /* 4KB frames */ |
#define FRAME_SIZE (1 << FRAME_WIDTH) |
#ifdef KERNEL |
#ifndef __ASM__ |
#include <arch/types.h> |
#define BOOT_PAGE_TABLE_SIZE 0x4000 |
#define BOOT_PAGE_TABLE_ADDRESS 0x4000 |
#define BOOT_PAGE_TABLE_START_FRAME (BOOT_PAGE_TABLE_ADDRESS >> FRAME_WIDTH) |
#define BOOT_PAGE_TABLE_SIZE_IN_FRAMES (BOOT_PAGE_TABLE_SIZE >> FRAME_WIDTH) |
extern uintptr_t last_frame; |
extern void frame_arch_init(void); |
extern void boot_page_table_free(void); |
#define physmem_print() |
#endif /* __ASM__ */ |
#endif /* KERNEL */ |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/arm32/include/mm/page.h |
---|
0,0 → 1,322 |
/* |
* Copyright (c) 2007 Pavel Jancik, Michal Kebrt |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup arm32mm |
* @{ |
*/ |
/** @file |
* @brief Paging related declarations. |
*/ |
#ifndef KERN_arm32_PAGE_H_ |
#define KERN_arm32_PAGE_H_ |
#include <arch/mm/frame.h> |
#include <mm/mm.h> |
#include <arch/exception.h> |
#define PAGE_WIDTH FRAME_WIDTH |
#define PAGE_SIZE FRAME_SIZE |
#define PAGE_COLOR_BITS 0 /* dummy */ |
#ifndef __ASM__ |
# define KA2PA(x) (((uintptr_t) (x)) - 0x80000000) |
# define PA2KA(x) (((uintptr_t) (x)) + 0x80000000) |
#else |
# define KA2PA(x) ((x) - 0x80000000) |
# define PA2KA(x) ((x) + 0x80000000) |
#endif |
#ifdef KERNEL |
/* Number of entries in each level. */ |
#define PTL0_ENTRIES_ARCH (2 << 12) /* 4096 */ |
#define PTL1_ENTRIES_ARCH 0 |
#define PTL2_ENTRIES_ARCH 0 |
/* coarse page tables used (256 * 4 = 1KB per page) */ |
#define PTL3_ENTRIES_ARCH (2 << 8) /* 256 */ |
/* Page table sizes for each level. */ |
#define PTL0_SIZE_ARCH FOUR_FRAMES |
#define PTL1_SIZE_ARCH 0 |
#define PTL2_SIZE_ARCH 0 |
#define PTL3_SIZE_ARCH ONE_FRAME |
/* Macros calculating indices into page tables for each level. */ |
#define PTL0_INDEX_ARCH(vaddr) (((vaddr) >> 20) & 0xfff) |
#define PTL1_INDEX_ARCH(vaddr) 0 |
#define PTL2_INDEX_ARCH(vaddr) 0 |
#define PTL3_INDEX_ARCH(vaddr) (((vaddr) >> 12) & 0x0ff) |
/* Get PTE address accessors for each level. */ |
#define GET_PTL1_ADDRESS_ARCH(ptl0, i) \ |
((pte_t *) ((((pte_level0_t *)(ptl0))[(i)]).coarse_table_addr << 10)) |
#define GET_PTL2_ADDRESS_ARCH(ptl1, i) \ |
(ptl1) |
#define GET_PTL3_ADDRESS_ARCH(ptl2, i) \ |
(ptl2) |
#define GET_FRAME_ADDRESS_ARCH(ptl3, i) \ |
((uintptr_t) ((((pte_level1_t *)(ptl3))[(i)]).frame_base_addr << 12)) |
/* Set PTE address accessors for each level. */ |
#define SET_PTL0_ADDRESS_ARCH(ptl0) \ |
(set_ptl0_addr((pte_level0_t *) (ptl0))) |
#define SET_PTL1_ADDRESS_ARCH(ptl0, i, a) \ |
(((pte_level0_t *) (ptl0))[(i)].coarse_table_addr = (a) >> 10) |
#define SET_PTL2_ADDRESS_ARCH(ptl1, i, a) |
#define SET_PTL3_ADDRESS_ARCH(ptl2, i, a) |
#define SET_FRAME_ADDRESS_ARCH(ptl3, i, a) \ |
(((pte_level1_t *) (ptl3))[(i)].frame_base_addr = (a) >> 12) |
/* Get PTE flags accessors for each level. */ |
#define GET_PTL1_FLAGS_ARCH(ptl0, i) \ |
get_pt_level0_flags((pte_level0_t *) (ptl0), (index_t) (i)) |
#define GET_PTL2_FLAGS_ARCH(ptl1, i) \ |
PAGE_PRESENT |
#define GET_PTL3_FLAGS_ARCH(ptl2, i) \ |
PAGE_PRESENT |
#define GET_FRAME_FLAGS_ARCH(ptl3, i) \ |
get_pt_level1_flags((pte_level1_t *) (ptl3), (index_t) (i)) |
/* Set PTE flags accessors for each level. */ |
#define SET_PTL1_FLAGS_ARCH(ptl0, i, x) \ |
set_pt_level0_flags((pte_level0_t *) (ptl0), (index_t) (i), (x)) |
#define SET_PTL2_FLAGS_ARCH(ptl1, i, x) |
#define SET_PTL3_FLAGS_ARCH(ptl2, i, x) |
#define SET_FRAME_FLAGS_ARCH(ptl3, i, x) \ |
set_pt_level1_flags((pte_level1_t *) (ptl3), (index_t) (i), (x)) |
/* Macros for querying the last-level PTE entries. */ |
#define PTE_VALID_ARCH(pte) \ |
(*((uint32_t *) (pte)) != 0) |
#define PTE_PRESENT_ARCH(pte) \ |
(((pte_level0_t *) (pte))->descriptor_type != 0) |
#define PTE_GET_FRAME_ARCH(pte) \ |
(((pte_level1_t *) (pte))->frame_base_addr << FRAME_WIDTH) |
#define PTE_WRITABLE_ARCH(pte) \ |
(((pte_level1_t *) (pte))->access_permission_0 == \ |
PTE_AP_USER_RW_KERNEL_RW) |
#define PTE_EXECUTABLE_ARCH(pte) \ |
1 |
#ifndef __ASM__ |
/** Level 0 page table entry. */ |
typedef struct { |
/* 0b01 for coarse tables, see below for details */ |
unsigned descriptor_type : 2; |
unsigned impl_specific : 3; |
unsigned domain : 4; |
unsigned should_be_zero : 1; |
/* Pointer to the coarse 2nd level page table (holding entries for small |
* (4KB) or large (64KB) pages. ARM also supports fine 2nd level page |
* tables that may hold even tiny pages (1KB) but they are bigger (4KB |
* per table in comparison with 1KB per the coarse table) |
*/ |
unsigned coarse_table_addr : 22; |
} ATTRIBUTE_PACKED pte_level0_t; |
/** Level 1 page table entry (small (4KB) pages used). */ |
typedef struct { |
/* 0b10 for small pages */ |
unsigned descriptor_type : 2; |
unsigned bufferable : 1; |
unsigned cacheable : 1; |
/* access permissions for each of 4 subparts of a page |
* (for each 1KB when small pages used */ |
unsigned access_permission_0 : 2; |
unsigned access_permission_1 : 2; |
unsigned access_permission_2 : 2; |
unsigned access_permission_3 : 2; |
unsigned frame_base_addr : 20; |
} ATTRIBUTE_PACKED pte_level1_t; |
/* Level 1 page tables access permissions */ |
/** User mode: no access, privileged mode: no access. */ |
#define PTE_AP_USER_NO_KERNEL_NO 0 |
/** User mode: no access, privileged mode: read/write. */ |
#define PTE_AP_USER_NO_KERNEL_RW 1 |
/** User mode: read only, privileged mode: read/write. */ |
#define PTE_AP_USER_RO_KERNEL_RW 2 |
/** User mode: read/write, privileged mode: read/write. */ |
#define PTE_AP_USER_RW_KERNEL_RW 3 |
/* pte_level0_t and pte_level1_t descriptor_type flags */ |
/** pte_level0_t and pte_level1_t "not present" flag (used in descriptor_type). */ |
#define PTE_DESCRIPTOR_NOT_PRESENT 0 |
/** pte_level0_t coarse page table flag (used in descriptor_type). */ |
#define PTE_DESCRIPTOR_COARSE_TABLE 1 |
/** pte_level1_t small page table flag (used in descriptor type). */ |
#define PTE_DESCRIPTOR_SMALL_PAGE 2 |
/** Sets the address of level 0 page table. |
* |
* @param pt Pointer to the page table to set. |
*/ |
static inline void set_ptl0_addr(pte_level0_t *pt) |
{ |
asm volatile ( |
"mcr p15, 0, %0, c2, c0, 0 \n" |
: |
: "r"(pt) |
); |
} |
/** Returns level 0 page table entry flags. |
* |
* @param pt Level 0 page table. |
* @param i Index of the entry to return. |
*/ |
static inline int get_pt_level0_flags(pte_level0_t *pt, index_t i) |
{ |
pte_level0_t *p = &pt[i]; |
int np = (p->descriptor_type == PTE_DESCRIPTOR_NOT_PRESENT); |
return (np << PAGE_PRESENT_SHIFT) | (1 << PAGE_USER_SHIFT) | |
(1 << PAGE_READ_SHIFT) | (1 << PAGE_WRITE_SHIFT) | |
(1 << PAGE_EXEC_SHIFT) | (1 << PAGE_CACHEABLE_SHIFT); |
} |
/** Returns level 1 page table entry flags. |
* |
* @param pt Level 1 page table. |
* @param i Index of the entry to return. |
*/ |
static inline int get_pt_level1_flags(pte_level1_t *pt, index_t i) |
{ |
pte_level1_t *p = &pt[i]; |
int dt = p->descriptor_type; |
int ap = p->access_permission_0; |
return ((dt == PTE_DESCRIPTOR_NOT_PRESENT) << PAGE_PRESENT_SHIFT) | |
((ap == PTE_AP_USER_RO_KERNEL_RW) << PAGE_READ_SHIFT) | |
((ap == PTE_AP_USER_RW_KERNEL_RW) << PAGE_READ_SHIFT) | |
((ap == PTE_AP_USER_RW_KERNEL_RW) << PAGE_WRITE_SHIFT) | |
((ap != PTE_AP_USER_NO_KERNEL_RW) << PAGE_USER_SHIFT) | |
((ap == PTE_AP_USER_NO_KERNEL_RW) << PAGE_READ_SHIFT) | |
((ap == PTE_AP_USER_NO_KERNEL_RW) << PAGE_WRITE_SHIFT) | |
(1 << PAGE_EXEC_SHIFT) | |
(p->bufferable << PAGE_CACHEABLE); |
} |
/** Sets flags of level 0 page table entry. |
* |
* @param pt level 0 page table |
* @param i index of the entry to be changed |
* @param flags new flags |
*/ |
static inline void set_pt_level0_flags(pte_level0_t *pt, index_t i, int flags) |
{ |
pte_level0_t *p = &pt[i]; |
if (flags & PAGE_NOT_PRESENT) { |
p->descriptor_type = PTE_DESCRIPTOR_NOT_PRESENT; |
/* |
* Ensures that the entry will be recognized as valid when |
* PTE_VALID_ARCH applied. |
*/ |
p->should_be_zero = 1; |
} else { |
p->descriptor_type = PTE_DESCRIPTOR_COARSE_TABLE; |
p->should_be_zero = 0; |
} |
} |
/** Sets flags of level 1 page table entry. |
* |
* We use same access rights for the whole page. When page is not preset we |
* store 1 in acess_rigts_3 so that at least one bit is 1 (to mark correct |
* page entry, see #PAGE_VALID_ARCH). |
* |
* @param pt Level 1 page table. |
* @param i Index of the entry to be changed. |
* @param flags New flags. |
*/ |
static inline void set_pt_level1_flags(pte_level1_t *pt, index_t i, int flags) |
{ |
pte_level1_t *p = &pt[i]; |
if (flags & PAGE_NOT_PRESENT) { |
p->descriptor_type = PTE_DESCRIPTOR_NOT_PRESENT; |
p->access_permission_3 = 1; |
} else { |
p->descriptor_type = PTE_DESCRIPTOR_SMALL_PAGE; |
p->access_permission_3 = p->access_permission_0; |
} |
p->cacheable = p->bufferable = (flags & PAGE_CACHEABLE) != 0; |
/* default access permission */ |
p->access_permission_0 = p->access_permission_1 = |
p->access_permission_2 = p->access_permission_3 = |
PTE_AP_USER_NO_KERNEL_RW; |
if (flags & PAGE_USER) { |
if (flags & PAGE_READ) { |
p->access_permission_0 = p->access_permission_1 = |
p->access_permission_2 = p->access_permission_3 = |
PTE_AP_USER_RO_KERNEL_RW; |
} |
if (flags & PAGE_WRITE) { |
p->access_permission_0 = p->access_permission_1 = |
p->access_permission_2 = p->access_permission_3 = |
PTE_AP_USER_RW_KERNEL_RW; |
} |
} |
} |
extern void page_arch_init(void); |
#endif /* __ASM__ */ |
#endif /* KERNEL */ |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/arm32/include/mm/page_fault.h |
---|
0,0 → 1,89 |
/* |
* Copyright (c) 2007 Pavel Jancik, Michal Kebrt |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup arm32mm |
* @{ |
*/ |
/** @file |
* @brief Page fault related declarations. |
*/ |
#ifndef KERN_arm32_PAGE_FAULT_H_ |
#define KERN_arm32_PAGE_FAULT_H_ |
#include <arch/types.h> |
/** Decribes CP15 "fault status register" (FSR). */ |
typedef struct { |
unsigned status : 3; |
unsigned domain : 4; |
unsigned zero : 1; |
unsigned should_be_zero : 24; |
} ATTRIBUTE_PACKED fault_status_t; |
/** Help union used for casting integer value into #fault_status_t. */ |
typedef union { |
fault_status_t fs; |
uint32_t dummy; |
} fault_status_union_t; |
/** Simplified description of instruction code. |
* |
* @note Used for recognizing memory access instructions. |
* @see ARM architecture reference (chapter 3.1) |
*/ |
typedef struct { |
unsigned dummy1 : 4; |
unsigned bit4 : 1; |
unsigned bits567 : 3; |
unsigned dummy : 12; |
unsigned access : 1; |
unsigned opcode : 4; |
unsigned type : 3; |
unsigned condition : 4; |
} ATTRIBUTE_PACKED instruction_t; |
/** Help union used for casting pc register (uint_32_t) value into |
* #instruction_t pointer. |
*/ |
typedef union { |
instruction_t *instr; |
uint32_t pc; |
} instruction_union_t; |
extern void prefetch_abort(int n, istate_t *istate); |
extern void data_abort(int n, istate_t *istate); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/arm32/include/mm/asid.h |
---|
0,0 → 1,58 |
/* |
* Copyright (c) 2007 Pavel Jancik, Michal Kebrt |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup arm32mm |
* @{ |
*/ |
/** @file |
* @brief ASIDs related declarations. |
* |
* ARM CPUs doesn't support ASIDs. |
*/ |
#ifndef KERN_arm32_ASID_H_ |
#define KERN_arm32_ASID_H_ |
#include <arch/types.h> |
#define ASID_MAX_ARCH 3 /* minimal required number */ |
typedef uint8_t asid_t; |
/* |
* This works due to fact that this file is never included alone but only |
* through "generic/include/mm/asid.h" where ASID_START is defined. |
*/ |
#define asid_get() (ASID_START + 1) |
#define asid_put(asid) |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/arm32/include/mm/tlb.h |
---|
0,0 → 1,45 |
/* |
* Copyright (c) 2007 Pavel Jancik |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup arm32mm |
* @{ |
*/ |
/** @file |
* @brief TLB related declarations. |
*/ |
#ifndef KERN_arm32_TLB_H_ |
#define KERN_arm32_TLB_H_ |
#define tlb_arch_init() |
#define tlb_print() |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/arm32/include/mm/as.h |
---|
0,0 → 1,65 |
/* |
* Copyright (c) 2007 Pavel Jancik, Michal Kebrt |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup arm32mm |
* @{ |
*/ |
/** @file |
* @brief Address space manipulating functions declarations. |
*/ |
#ifndef KERN_arm32_AS_H_ |
#define KERN_arm32_AS_H_ |
#define KERNEL_ADDRESS_SPACE_SHADOWED_ARCH 0 |
#define KERNEL_ADDRESS_SPACE_START_ARCH (unsigned long) 0x80000000 |
#define KERNEL_ADDRESS_SPACE_END_ARCH (unsigned long) 0xffffffff |
#define USER_ADDRESS_SPACE_START_ARCH (unsigned long) 0x00000000 |
#define USER_ADDRESS_SPACE_END_ARCH (unsigned long) 0x7fffffff |
#define USTACK_ADDRESS_ARCH (0x80000000 - PAGE_SIZE) |
typedef struct { |
} as_arch_t; |
#include <genarch/mm/as_pt.h> |
#define as_constructor_arch(as, flags) (as != as) |
#define as_destructor_arch(as) (as != as) |
#define as_create_arch(as, flags) (as != as) |
#define as_install_arch(as) |
#define as_deinstall_arch(as) |
#define as_invalidate_translation_cache(as, page, cnt) |
extern void as_arch_init(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/arm32/include/asm/boot.h |
---|
0,0 → 1,62 |
/* |
* Copyright (c) 2007 Michal Kebrt |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup arm32 |
* @{ |
*/ |
/** @file |
* @brief Initial kernel start. |
*/ |
#ifndef KERN_arm32_ASM_BOOT_H_ |
#define KERN_arm32_ASM_BOOT_H_ |
/** Size of a temporary stack used for initial kernel start. */ |
#define TEMP_STACK_SIZE 0x100 |
#ifndef __ASM__ |
/** Kernel entry point. |
* |
* Implemented in assembly. Copies boot_bootinfo (declared as bootinfo in |
* boot/arch/arm32/loader/main.c) to #bootinfo struct. Then jumps to |
* #arch_pre_main and #main_bsp. |
* |
* @param entry Entry point address (not used). |
* @param boot_bootinfo Struct holding information about loaded tasks. |
* @param bootinfo_size Size of the bootinfo structure. |
*/ |
extern void kernel_image_start(void *entry, void *boot_bootinfo, |
unsigned int bootinfo_size); |
#endif |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/arm32/include/interrupt.h |
---|
0,0 → 1,58 |
/* |
* Copyright (c) 2007 Michal Kebrt |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup arm32interrupt |
* @{ |
*/ |
/** @file |
* @brief Declarations of interrupt controlling routines. |
*/ |
#ifndef KERN_arm32_INTERRUPT_H_ |
#define KERN_arm32_INTERRUPT_H_ |
#include <arch/types.h> |
/** Initial size of exception dispatch table. */ |
#define IVT_ITEMS 6 |
/** Index of the first item in exception dispatch table. */ |
#define IVT_FIRST 0 |
extern void interrupt_init(void); |
extern ipl_t interrupts_disable(void); |
extern ipl_t interrupts_enable(void); |
extern void interrupts_restore(ipl_t ipl); |
extern ipl_t interrupts_read(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/arm32/include/fpu_context.h |
---|
0,0 → 1,51 |
/* |
* Copyright (c) 2007 Michal Kebrt |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup arm32 |
* @{ |
*/ |
/** @file |
* @brief FPU context (not implemented). |
* |
* GXemul doesn't support FPU on its ARM CPU. |
*/ |
#ifndef KERN_arm32_FPU_CONTEXT_H_ |
#define KERN_arm32_FPU_CONTEXT_H_ |
#include <arch/types.h> |
#define FPU_CONTEXT_ALIGN 0 |
typedef struct { |
} fpu_context_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/arm32/include/exception.h |
---|
0,0 → 1,144 |
/* |
* Copyright (c) 2007 Michal Kebrt, Petr Stepan |
* |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup arm32 |
* @{ |
*/ |
/** @file |
* @brief Exception declarations. |
*/ |
#ifndef KERN_arm32_EXCEPTION_H_ |
#define KERN_arm32_EXCEPTION_H_ |
#include <arch/types.h> |
#include <arch/regutils.h> |
/** If defined, forces using of high exception vectors. */ |
#define HIGH_EXCEPTION_VECTORS |
#ifdef HIGH_EXCEPTION_VECTORS |
#define EXC_BASE_ADDRESS 0xffff0000 |
#else |
#define EXC_BASE_ADDRESS 0x0 |
#endif |
/* Exception Vectors */ |
#define EXC_RESET_VEC (EXC_BASE_ADDRESS + 0x0) |
#define EXC_UNDEF_INSTR_VEC (EXC_BASE_ADDRESS + 0x4) |
#define EXC_SWI_VEC (EXC_BASE_ADDRESS + 0x8) |
#define EXC_PREFETCH_ABORT_VEC (EXC_BASE_ADDRESS + 0xc) |
#define EXC_DATA_ABORT_VEC (EXC_BASE_ADDRESS + 0x10) |
#define EXC_IRQ_VEC (EXC_BASE_ADDRESS + 0x18) |
#define EXC_FIQ_VEC (EXC_BASE_ADDRESS + 0x1c) |
/* Exception numbers */ |
#define EXC_RESET 0 |
#define EXC_UNDEF_INSTR 1 |
#define EXC_SWI 2 |
#define EXC_PREFETCH_ABORT 3 |
#define EXC_DATA_ABORT 4 |
#define EXC_IRQ 5 |
#define EXC_FIQ 6 |
/** Kernel stack pointer. |
* |
* It is set when thread switches to user mode, |
* and then used for exception handling. |
*/ |
extern uintptr_t supervisor_sp; |
/** Temporary exception stack pointer. |
* |
* Temporary stack is used in exceptions handling routines |
* before switching to thread's kernel stack. |
*/ |
extern uintptr_t exc_stack; |
/** Struct representing CPU state saved when an exception occurs. */ |
typedef struct { |
uint32_t spsr; |
uint32_t sp; |
uint32_t lr; |
uint32_t r0; |
uint32_t r1; |
uint32_t r2; |
uint32_t r3; |
uint32_t r4; |
uint32_t r5; |
uint32_t r6; |
uint32_t r7; |
uint32_t r8; |
uint32_t r9; |
uint32_t r10; |
uint32_t r11; |
uint32_t r12; |
uint32_t pc; |
} istate_t; |
/** Sets Program Counter member of given istate structure. |
* |
* @param istate istate structure |
* @param retaddr new value of istate's PC member |
*/ |
static inline void istate_set_retaddr(istate_t *istate, uintptr_t retaddr) |
{ |
istate->pc = retaddr; |
} |
/** Returns true if exception happened while in userspace. */ |
static inline int istate_from_uspace(istate_t *istate) |
{ |
return (istate->spsr & STATUS_REG_MODE_MASK) == USER_MODE; |
} |
/** Returns Program Counter member of given istate structure. */ |
static inline unative_t istate_get_pc(istate_t *istate) |
{ |
return istate->pc; |
} |
extern void install_exception_handlers(void); |
extern void exception_init(void); |
extern void print_istate(istate_t *istate); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/arm32/include/regutils.h |
---|
0,0 → 1,86 |
/* |
* Copyright (c) 2007 Petr Stepan |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup arm32 |
* @{ |
*/ |
/** |
* @file |
* @brief Utilities for convenient manipulation with ARM registers. |
*/ |
#ifndef KERN_arm32_REGUTILS_H_ |
#define KERN_arm32_REGUTILS_H_ |
#define STATUS_REG_IRQ_DISABLED_BIT (1 << 7) |
#define STATUS_REG_MODE_MASK 0x1f |
#define CP15_R1_HIGH_VECTORS_BIT (1 << 13) |
/* ARM Processor Operation Modes */ |
#define USER_MODE 0x10 |
#define FIQ_MODE 0x11 |
#define IRQ_MODE 0x12 |
#define SUPERVISOR_MODE 0x13 |
#define ABORT_MODE 0x17 |
#define UNDEFINED_MODE 0x1b |
#define SYSTEM_MODE 0x1f |
/* [CS]PRS manipulation macros */ |
#define GEN_STATUS_READ(nm,reg) \ |
static inline uint32_t nm## _status_reg_read(void) \ |
{ \ |
uint32_t retval; \ |
asm volatile("mrs %0, " #reg : "=r" (retval)); \ |
return retval; \ |
} |
#define GEN_STATUS_WRITE(nm,reg,fieldname, field) \ |
static inline void nm## _status_reg_ ##fieldname## _write(uint32_t value) \ |
{ \ |
asm volatile("msr " #reg "_" #field ", %0" : : "r" (value)); \ |
} |
/** Returns the value of CPSR (Current Program Status Register). */ |
GEN_STATUS_READ(current, cpsr) |
/** Sets control bits of CPSR. */ |
GEN_STATUS_WRITE(current, cpsr, control, c); |
/** Returns the value of SPSR (Saved Program Status Register). */ |
GEN_STATUS_READ(saved, spsr) |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/arm32/include/cycle.h |
---|
0,0 → 1,53 |
/* |
* Copyright (c) 2007 Michal Kebrt |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup arm32 |
* @{ |
*/ |
/** @file |
* @brief Count of CPU cycles. |
*/ |
#ifndef KERN_arm32_CYCLE_H_ |
#define KERN_arm32_CYCLE_H_ |
/** Returns count of CPU cycles. |
* |
* No such instruction on ARM to get count of cycles. |
* |
* @return Count of CPU cycles. |
*/ |
static inline uint64_t get_cycle(void) |
{ |
return 0; |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/arm32/include/byteorder.h |
---|
0,0 → 1,62 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup arm32 |
* @{ |
*/ |
/** @file |
* @brief Endianness definitions. |
*/ |
#ifndef KERN_arm32_BYTEORDER_H_ |
#define KERN_arm32_BYTEORDER_H_ |
#include <byteorder.h> |
#ifdef BIG_ENDIAN |
#define uint32_t_le2host(n) uint32_t_byteorder_swap(n) |
#define uint64_t_le2host(n) uint64_t_byteorder_swap(n) |
#define uint32_t_be2host(n) (n) |
#define uint64_t_be2host(n) (n) |
#else |
#define uint32_t_le2host(n) (n) |
#define uint64_t_le2host(n) (n) |
#define uint32_t_be2host(n) uint32_t_byteorder_swap(n) |
#define uint64_t_be2host(n) uint64_t_byteorder_swap(n) |
#endif |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/arm32/include/debug/print.h |
---|
0,0 → 1,56 |
/* |
* Copyright (c) 2007 Michal Kebrt |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup arm32 |
* @{ |
*/ |
/** @file |
* @brief Debug printing functions. |
*/ |
#ifndef KERN_arm32_DEBUG_PRINT_H_ |
#define KERN_arm32_DEBUG_PRINT_H_ |
#include <stdarg.h> |
#include <arch/types.h> |
extern void debug_puts(const char *str); |
extern void debug_printf(const char *fmt, ...); |
#ifdef CONFIG_DEBUG |
# define dprintf(arg1...) debug_printf(arg1) |
# define dputs(arg1) debug_puts(arg1) |
#else |
# define dprintf(arg1...) |
# define dputs(arg1) |
#endif |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/arm32/include/console.h |
---|
0,0 → 1,49 |
/* |
* Copyright (c) 2007 Michal Kebrt |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup arm32 |
* @{ |
*/ |
/** @file |
* @brief Console. |
*/ |
#ifndef KERN_arm32_CONSOLE_H_ |
#define KERN_arm32_CONSOLE_H_ |
/** Initializes console. |
* |
* @param devno Console device number. |
*/ |
extern void console_init(devno_t devno); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/arm32/include/boot.h |
---|
0,0 → 1,76 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup arm32 |
* @{ |
*/ |
/** @file |
* @brief Bootinfo declarations. |
* |
* Reflects boot/arch/arm32/loader/main.h. |
*/ |
#ifndef KERN_arm32_BOOT_H_ |
#define KERN_arm32_BOOT_H_ |
#include <arch/types.h> |
/** Maximum number of tasks in the #bootinfo_t struct. */ |
#define TASKMAP_MAX_RECORDS 32 |
/** Struct holding information about single loaded uspace task. */ |
typedef struct { |
/** Address where the task was placed. */ |
uintptr_t addr; |
/** Size of the task's binary. */ |
uint32_t size; |
} utask_t; |
/** Struct holding information about loaded uspace tasks. */ |
typedef struct { |
/** Number of loaded tasks. */ |
uint32_t cnt; |
/** Array of loaded tasks. */ |
utask_t tasks[TASKMAP_MAX_RECORDS]; |
} bootinfo_t; |
/** Bootinfo that is filled in #kernel_image_start. */ |
extern bootinfo_t bootinfo; |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/arm32/include/types.h |
---|
0,0 → 1,92 |
/* |
* Copyright (c) 2007 Pavel Jancik, Michal Kebrt |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup arm32 |
* @{ |
*/ |
/** @file |
* @brief Type definitions. |
*/ |
#ifndef KERN_arm32_TYPES_H_ |
#define KERN_arm32_TYPES_H_ |
#ifndef DOXYGEN |
# define ATTRIBUTE_PACKED __attribute__ ((packed)) |
#else |
# define ATTRIBUTE_PACKED |
#endif |
#define NULL 0 |
#define false 0 |
#define true 1 |
typedef signed char int8_t; |
typedef signed short int16_t; |
typedef signed long int32_t; |
typedef signed long long int64_t; |
typedef unsigned char uint8_t; |
typedef unsigned short uint16_t; |
typedef unsigned long uint32_t; |
typedef unsigned long long uint64_t; |
typedef uint32_t size_t; |
typedef uint32_t count_t; |
typedef uint32_t index_t; |
typedef uint32_t uintptr_t; |
typedef uint32_t pfn_t; |
typedef uint32_t ipl_t; |
typedef uint32_t unative_t; |
typedef int32_t native_t; |
typedef uint8_t bool; |
typedef uint64_t thread_id_t; |
typedef uint64_t task_id_t; |
typedef uint32_t context_id_t; |
typedef int32_t inr_t; |
typedef int32_t devno_t; |
/** Page table entry. |
* |
* We have different structs for level 0 and level 1 page table entries. |
* See page.h for definition of pte_level*_t. |
*/ |
typedef struct { |
unsigned dummy : 32; |
} pte_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/arm32/include/machine.h |
---|
0,0 → 1,122 |
/* |
* Copyright (c) 2007 Michal Kebrt |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup arm32 |
* @{ |
*/ |
/** @file |
* @brief Declarations of machine specific functions. |
* |
* These functions enable to differentiate more kinds of ARM emulators |
* or CPUs. It's the same concept as "arch" functions on the architecture |
* level. |
*/ |
#ifndef KERN_arm32_MACHINE_H_ |
#define KERN_arm32_MACHINE_H_ |
#include <console/console.h> |
#include <arch/types.h> |
#include <arch/exception.h> |
#include <arch/drivers/gxemul.h> |
/** Initializes console. |
* |
* @param devno Console device number. |
*/ |
extern void machine_console_init(devno_t devno); |
/** Acquire console back for kernel. */ |
extern void machine_grab_console(void); |
/** Return console to userspace. */ |
extern void machine_release_console(void); |
/** Maps HW devices to the kernel address space using #hw_map. */ |
extern void machine_hw_map_init(void); |
/** Starts timer. */ |
extern void machine_timer_irq_start(void); |
/** Halts CPU. */ |
extern void machine_cpu_halt(void); |
/** Returns size of available memory. |
* |
* @return Size of available memory. |
*/ |
extern size_t machine_get_memory_size(void); |
/** Prints a character. |
* |
* @param ch Character to be printed. |
*/ |
extern void machine_debug_putc(char ch); |
/** Interrupt exception handler. |
* |
* @param exc_no Interrupt exception number. |
* @param istate Saved processor state. |
*/ |
extern void machine_irq_exception(int exc_no, istate_t *istate); |
/** Returns address of framebuffer device. |
* |
* @return Address of framebuffer device. |
*/ |
extern uintptr_t machine_get_fb_address(void); |
#ifdef MACHINE_GXEMUL_TESTARM |
#define machine_console_init(devno) gxemul_console_init(devno) |
#define machine_grab_console gxemul_grab_console |
#define machine_release_console gxemul_release_console |
#define machine_hw_map_init gxemul_hw_map_init |
#define machine_timer_irq_start gxemul_timer_irq_start |
#define machine_cpu_halt gxemul_cpu_halt |
#define machine_get_memory_size gxemul_get_memory_size |
#define machine_debug_putc(ch) gxemul_debug_putc(ch) |
#define machine_irq_exception(exc_no, istate) \ |
gxemul_irq_exception(exc_no, istate) |
#define machine_get_fb_address gxemul_get_fb_address |
#endif |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/arm32/include/stack.h |
---|
0,0 → 1,49 |
/* |
* Copyright (c) 2007 Michal Kebrt |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup arm32 |
* @{ |
*/ |
/** @file |
* @brief Stack constants. |
*/ |
#ifndef KERN_arm32_STACK_H_ |
#define KERN_arm32_STACK_H_ |
#define STACK_ITEM_SIZE 4 |
/** See <a href="http://www.arm.com/support/faqdev/14269.html">ABI</a> for |
* details |
*/ |
#define STACK_ALIGNMENT 8 |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/arm32/include/elf.h |
---|
0,0 → 1,52 |
/* |
* Copyright (c) 2006 Sergey Bondari |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup arm32 |
* @{ |
*/ |
/** @file |
* @brief ARM ELF constants. |
*/ |
#ifndef KERN_arm32_ELF_H_ |
#define KERN_arm32_ELF_H_ |
#define ELF_MACHINE EM_ARM |
#ifdef BIG_ENDIAN |
#define ELF_DATA_ENCODING ELFDATA2MSB |
#else |
#define ELF_DATA_ENCODING ELFDATA2LSB |
#endif |
#define ELF_CLASS ELFCLASS32 |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/arm32/include/memstr.h |
---|
0,0 → 1,49 |
/* |
* Copyright (c) 2005 Sergey Bondari |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup arm32 |
* @{ |
*/ |
/** @file |
* @brief Memory manipulating functions declarations. |
*/ |
#ifndef KERN_arm32_MEMSTR_H_ |
#define KERN_arm32_MEMSTR_H_ |
#define memcpy(dst, src, cnt) __builtin_memcpy((dst), (src), (cnt)) |
extern void memsetw(uintptr_t dst, size_t cnt, uint16_t x); |
extern void memsetb(uintptr_t dst, size_t cnt, uint8_t x); |
extern int memcmp(uintptr_t src, uintptr_t dst, int cnt); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/arm32/include/arg.h |
---|
0,0 → 1,44 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup arm32 |
* @{ |
*/ |
/** @file |
* @brief Empty. |
*/ |
#ifndef KERN_arm32_ARG_H_ |
#define KERN_arm32_ARG_H_ |
#include <stdarg.h> |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/arm32/include/atomic.h |
---|
0,0 → 1,128 |
/* |
* Copyright (c) 2007 Michal Kebrt |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup arm32 |
* @{ |
*/ |
/** @file |
* @brief Atomic operations. |
*/ |
#ifndef KERN_arm32_ATOMIC_H_ |
#define KERN_arm32_ATOMIC_H_ |
/** Atomic addition. |
* |
* @param val Where to add. |
* @param i Value to be added. |
* |
* @return Value after addition. |
*/ |
static inline long atomic_add(atomic_t *val, int i) |
{ |
int ret; |
volatile long *mem = &(val->count); |
asm volatile ( |
"1:\n" |
"ldr r2, [%1] \n" |
"add r3, r2, %2 \n" |
"str r3, %0 \n" |
"swp r3, r3, [%1] \n" |
"cmp r3, r2 \n" |
"bne 1b \n" |
: "=m" (ret) |
: "r" (mem), "r" (i) |
: "r3", "r2" |
); |
return ret; |
} |
/** Atomic increment. |
* |
* @param val Variable to be incremented. |
*/ |
static inline void atomic_inc(atomic_t *val) |
{ |
atomic_add(val, 1); |
} |
/** Atomic decrement. |
* |
* @param val Variable to be decremented. |
*/ |
static inline void atomic_dec(atomic_t *val) { |
atomic_add(val, -1); |
} |
/** Atomic pre-increment. |
* |
* @param val Variable to be incremented. |
* @return Value after incrementation. |
*/ |
static inline long atomic_preinc(atomic_t *val) |
{ |
return atomic_add(val, 1); |
} |
/** Atomic pre-decrement. |
* |
* @param val Variable to be decremented. |
* @return Value after decrementation. |
*/ |
static inline long atomic_predec(atomic_t *val) |
{ |
return atomic_add(val, -1); |
} |
/** Atomic post-increment. |
* |
* @param val Variable to be incremented. |
* @return Value before incrementation. |
*/ |
static inline long atomic_postinc(atomic_t *val) |
{ |
return atomic_add(val, 1) - 1; |
} |
/** Atomic post-decrement. |
* |
* @param val Variable to be decremented. |
* @return Value before decrementation. |
*/ |
static inline long atomic_postdec(atomic_t *val) |
{ |
return atomic_add(val, -1) + 1; |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/arm32/include/arch.h |
---|
0,0 → 1,42 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup arm32 |
* @{ |
*/ |
/** @file |
* @brief Empty. |
*/ |
#ifndef KERN_arm32_ARCH_H_ |
#define KERN_arm32_ARCH_H_ |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/arm32/include/proc/task.h |
---|
0,0 → 1,48 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup arm32proc |
* @{ |
*/ |
/** @file |
* @brief Task related declarations. |
*/ |
#ifndef KERN_arm32_TASK_H_ |
#define KERN_arm32_TASK_H_ |
typedef struct { |
} task_arch_t; |
#define task_create_arch(t) |
#define task_destroy_arch(t) |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/arm32/include/proc/thread.h |
---|
0,0 → 1,49 |
/* |
* Copyright (c) 2003-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup arm32proc |
* @{ |
*/ |
/** @file |
* @brief Thread related declarations. |
*/ |
#ifndef KERN_arm32_THREAD_H_ |
#define KERN_arm32_THREAD_H_ |
typedef struct { |
} thread_arch_t; |
#define thr_constructor_arch(t) |
#define thr_destructor_arch(t) |
#define thread_create_arch(t) |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/arm32/include/faddr.h |
---|
0,0 → 1,50 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup arm32 |
* @{ |
*/ |
/** @file |
* @brief Function address conversion. |
*/ |
#ifndef KERN_arm32_FADDR_H_ |
#define KERN_arm32_FADDR_H_ |
#include <arch/types.h> |
/** Calculate absolute address of function referenced by fptr pointer. |
* |
* @param fptr Function pointer. |
*/ |
#define FADDR(fptr) ((uintptr_t) (fptr)) |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/arm32/include/asm.h |
---|
0,0 → 1,74 |
/* |
* Copyright (c) 2007 Michal Kebrt |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup arm32 |
* @{ |
*/ |
/** @file |
* @brief Declarations of functions implemented in assembly. |
*/ |
#ifndef KERN_arm32_ASM_H_ |
#define KERN_arm32_ASM_H_ |
#include <arch/types.h> |
#include <arch/stack.h> |
#include <config.h> |
#include <arch/interrupt.h> |
/** No such instruction on ARM to sleep CPU. */ |
static inline void cpu_sleep(void) |
{ |
} |
/** Return base address of current stack. |
* |
* Return the base address of the current stack. |
* The stack is assumed to be STACK_SIZE bytes long. |
* The stack must start on page boundary. |
*/ |
static inline uintptr_t get_stack_base(void) |
{ |
uintptr_t v; |
asm volatile ( |
"and %0, sp, %1\n" |
: "=r" (v) |
: "r" (~(STACK_SIZE - 1)) |
); |
return v; |
} |
extern void cpu_halt(void); |
extern void asm_delay_loop(uint32_t t); |
extern void userspace_asm(uintptr_t ustack, uintptr_t uspace_uarg, |
uintptr_t entry); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/arm32/include/mainpage.h |
---|
0,0 → 1,49 |
/* |
* Copyright (c) 2005 Michal Kebrt |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @mainpage HelenOS ARM 32-bit port |
* |
* |
* @section sec_arm32 ARM 32-bit port |
* arm32 port is the ninth port of SPARTAN, originally written by Michal Kebrt, |
* Petr Stepan, Pavel Jancik. The goal is to support 32-bit ARM architecture. |
* So far, it runs only in emulator. |
* |
* @subsection sec_arm32_doc Documentation |
* <ul> |
* <li>See 'kernel/doc/arm32_HOWTO' for information about getting an emulator, |
* building sources and running HelenOS. |
* </li> |
* <li>See <a href="http://www.helenos.eu/doc/slides/2007-05-21-Stepan-ARM.pdf">slides</a> |
* for some information about ARM architecture and porting HelenOS to ARM |
* (only in Czech). |
* </li> |
* </ul> |
* |
* |
*/ |
/tags/0.3.0/kernel/arch/arm32/include/context.h |
---|
0,0 → 1,75 |
/* |
* Copyright (c) 2007 Michal Kebrt |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup arm32 |
* @{ |
*/ |
/** @file |
* @brief Thread context. |
*/ |
#ifndef KERN_arm32_CONTEXT_H_ |
#define KERN_arm32_CONTEXT_H_ |
#include <align.h> |
#include <arch/stack.h> |
/* Put one item onto the stack to support get_stack_base() and align it up. */ |
#define SP_DELTA (0 + ALIGN_UP(STACK_ITEM_SIZE, STACK_ALIGNMENT)) |
#ifndef __ASM__ |
#include <arch/types.h> |
/** Thread context containing registers that must be preserved across function |
* calls. |
*/ |
typedef struct { |
uint32_t cpu_mode; |
uintptr_t sp; |
uintptr_t pc; |
uint32_t r4; |
uint32_t r5; |
uint32_t r6; |
uint32_t r7; |
uint32_t r8; |
uint32_t r9; |
uint32_t r10; |
uint32_t r11; |
ipl_t ipl; |
} context_t; |
#endif /* __ASM__ */ |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/arm32/include/barrier.h |
---|
0,0 → 1,52 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup arm32 |
* @{ |
*/ |
/** @file |
* @brief Memory barriers. |
*/ |
#ifndef KERN_arm32_BARRIER_H_ |
#define KERN_arm32_BARRIER_H_ |
/* |
* TODO: implement true ARM memory barriers for macros below. |
*/ |
#define CS_ENTER_BARRIER() asm volatile ("" ::: "memory") |
#define CS_LEAVE_BARRIER() asm volatile ("" ::: "memory") |
#define memory_barrier() asm volatile ("" ::: "memory") |
#define read_barrier() asm volatile ("" ::: "memory") |
#define write_barrier() asm volatile ("" ::: "memory") |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/arm32/include/debug.h |
---|
0,0 → 1,42 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup arm32debug |
* @{ |
*/ |
/** @file |
* @brief Empty. |
*/ |
#ifndef KERN_arm32_DEBUG_H_ |
#define KERN_arm32_DEBUG_H_ |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/arm32/include/cpu.h |
---|
0,0 → 1,64 |
/* |
* Copyright (c) 2007 Michal Kebrt |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup arm32 |
* @{ |
*/ |
/** @file |
* @brief CPU identification. |
*/ |
#ifndef KERN_arm32_CPU_H_ |
#define KERN_arm32_CPU_H_ |
#include <arch/types.h> |
#include <arch/asm.h> |
/** Struct representing ARM CPU identifiaction. */ |
typedef struct { |
/** Implementator (vendor) number. */ |
uint32_t imp_num; |
/** Variant number. */ |
uint32_t variant_num; |
/** Architecture number. */ |
uint32_t arch_num; |
/** Primary part number. */ |
uint32_t prim_part_num; |
/** Revision number. */ |
uint32_t rev_num; |
} cpu_arch_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/arm32/include/drivers/gxemul.h |
---|
0,0 → 1,79 |
/* |
* Copyright (c) 2007 Michal Kebrt |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup arm32gxemul GXemul |
* @brief GXemul machine specific parts. |
* @ingroup arm32 |
* @{ |
*/ |
/** @file |
* @brief GXemul peripheries drivers declarations. |
*/ |
#ifndef KERN_arm32_GXEMUL_H_ |
#define KERN_arm32_GXEMUL_H_ |
#include <console/chardev.h> |
/** Last interrupt number (beginning from 0) whose status is probed |
* from interrupt controller |
*/ |
#define GXEMUL_IRQC_MAX_IRQ 8 |
/** Timer frequency */ |
#define GXEMUL_TIMER_FREQ 100 |
/** Struct containing mappings of gxemul HW devices into kernel part |
* of virtual address space. |
*/ |
typedef struct { |
uintptr_t videoram; |
uintptr_t kbd; |
uintptr_t rtc; |
uintptr_t rtc_freq; |
uintptr_t rtc_ack; |
uintptr_t irqc; |
uintptr_t irqc_mask; |
uintptr_t irqc_unmask; |
} gxemul_hw_map_t; |
extern void gxemul_hw_map_init(void); |
extern void gxemul_console_init(devno_t devno); |
extern void gxemul_release_console(void); |
extern void gxemul_grab_console(void); |
extern void gxemul_timer_irq_start(void); |
extern void gxemul_debug_putc(char ch); |
extern void gxemul_cpu_halt(void); |
extern void gxemul_irq_exception(int exc_no, istate_t *istate); |
extern size_t gxemul_get_memory_size(void); |
extern uintptr_t gxemul_get_fb_address(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/arm32/Makefile.inc |
---|
0,0 → 1,96 |
# |
# Copyright (c) 2007 Jakub Jermar, Michal Kebrt |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
## Toolchain configuration |
# |
BFD_NAME = elf32-littlearm |
BFD_ARCH = arm |
BFD = binary |
TARGET = arm-linux-gnu |
TOOLCHAIN_DIR = /usr/local/arm |
KERNEL_LOAD_ADDRESS = 0x80200000 |
ifeq ($(MACHINE), gxemul_testarm) |
DMACHINE = MACHINE_GXEMUL_TESTARM |
endif |
ATSIGN = % |
GCC_CFLAGS += -fno-zero-initialized-in-bss |
DEFS += -D__32_BITS__ -DKERNEL_LOAD_ADDRESS=$(KERNEL_LOAD_ADDRESS) -D$(DMACHINE) |
# Compile with framebuffer support |
ifeq ($(CONFIG_FB), y) |
DEFS += -DCONFIG_FB -DFB_INVERT_ENDIAN |
endif |
## Compile with hierarchical page tables support. |
# |
CONFIG_PAGE_PT = y |
DEFS += -DCONFIG_PAGE_PT |
## Compile with support for address space identifiers. |
# |
# no HW support for ASIDs |
#CONFIG_ASID = y |
#CONFIG_ASID_FIFO = y |
## Compile with support with software division and multiplication. |
# |
CONFIG_SOFTINT = y |
ARCH_SOURCES = \ |
arch/$(ARCH)/src/start.S \ |
arch/$(ARCH)/src/asm.S \ |
arch/$(ARCH)/src/arm32.c \ |
arch/$(ARCH)/src/context.S \ |
arch/$(ARCH)/src/dummy.S \ |
arch/$(ARCH)/src/panic.S \ |
arch/$(ARCH)/src/cpu/cpu.c \ |
arch/$(ARCH)/src/ddi/ddi.c \ |
arch/$(ARCH)/src/interrupt.c \ |
arch/$(ARCH)/src/debug/print.c \ |
arch/$(ARCH)/src/console.c \ |
arch/$(ARCH)/src/exception.c \ |
arch/$(ARCH)/src/userspace.c \ |
arch/$(ARCH)/src/mm/as.c \ |
arch/$(ARCH)/src/mm/frame.c \ |
arch/$(ARCH)/src/mm/page.c \ |
arch/$(ARCH)/src/mm/tlb.c \ |
arch/$(ARCH)/src/mm/page_fault.c |
ifeq ($(MACHINE), gxemul_testarm) |
ARCH_SOURCES += arch/$(ARCH)/src/drivers/gxemul.c |
endif |
/tags/0.3.0/kernel/arch/arm32/_link.ld.in |
---|
0,0 → 1,52 |
/* |
* ARM linker script |
* |
* kernel text |
* kernel data |
* |
*/ |
OUTPUT_ARCH(arm) |
ENTRY(kernel_image_start) |
SECTIONS { |
. = KERNEL_LOAD_ADDRESS; |
.text : { |
ktext_start = .; |
*(.text); |
ktext_end = .; |
} |
.data : { |
kdata_start = .; |
*(.data); /* initialized data */ |
hardcoded_ktext_size = .; |
LONG(ktext_end - ktext_start); |
hardcoded_kdata_size = .; |
LONG(kdata_end - kdata_start); |
hardcoded_load_address = .; |
LONG(KERNEL_LOAD_ADDRESS); |
*(.bss); /* uninitialized static variables */ |
*(COMMON); /* global variables */ |
*(.rodata*); |
*(.sdata); |
*(.reginfo); |
symbol_table = .; |
*(symtab.*); |
} |
.sbss : { |
*(.sbss); |
*(.scommon); |
} |
kdata_end = .; |
/DISCARD/ : { |
*(.mdebug*); |
*(.pdr); |
*(.comment); |
*(.note); |
} |
} |
/tags/0.3.0/kernel/arch/sparc64/src/smp/ipi.c |
---|
0,0 → 1,148 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64 |
* @{ |
*/ |
/** @file |
*/ |
#include <smp/ipi.h> |
#include <cpu.h> |
#include <arch.h> |
#include <arch/cpu.h> |
#include <arch/asm.h> |
#include <config.h> |
#include <mm/tlb.h> |
#include <arch/interrupt.h> |
#include <arch/trap/interrupt.h> |
#include <arch/barrier.h> |
#include <preemption.h> |
#include <time/delay.h> |
#include <panic.h> |
/** Invoke function on another processor. |
* |
* Currently, only functions without arguments are supported. |
* Supporting more arguments in the future should be no big deal. |
* |
* Interrupts must be disabled prior to this call. |
* |
* @param mid MID of the target processor. |
* @param func Function to be invoked. |
*/ |
static void cross_call(int mid, void (* func)(void)) |
{ |
uint64_t status; |
bool done; |
/* |
* This function might enable interrupts for a while. |
* In order to prevent migration to another processor, |
* we explicitly disable preemption. |
*/ |
preemption_disable(); |
status = asi_u64_read(ASI_INTR_DISPATCH_STATUS, 0); |
if (status & INTR_DISPATCH_STATUS_BUSY) |
panic("Interrupt Dispatch Status busy bit set\n"); |
do { |
asi_u64_write(ASI_UDB_INTR_W, ASI_UDB_INTR_W_DATA_0, |
(uintptr_t) func); |
asi_u64_write(ASI_UDB_INTR_W, ASI_UDB_INTR_W_DATA_1, 0); |
asi_u64_write(ASI_UDB_INTR_W, ASI_UDB_INTR_W_DATA_2, 0); |
asi_u64_write(ASI_UDB_INTR_W, |
(mid << INTR_VEC_DISPATCH_MID_SHIFT) | |
ASI_UDB_INTR_W_DISPATCH, 0); |
membar(); |
do { |
status = asi_u64_read(ASI_INTR_DISPATCH_STATUS, 0); |
} while (status & INTR_DISPATCH_STATUS_BUSY); |
done = !(status & INTR_DISPATCH_STATUS_NACK); |
if (!done) { |
/* |
* Prevent deadlock. |
*/ |
(void) interrupts_enable(); |
delay(20 + (tick_read() & 0xff)); |
(void) interrupts_disable(); |
} |
} while (done); |
preemption_enable(); |
} |
/* |
* Deliver IPI to all processors except the current one. |
* |
* The sparc64 architecture does not support any group addressing |
* which is found, for instance, on ia32 and amd64. Therefore we |
* need to simulate the broadcast by sending the message to |
* all target processors step by step. |
* |
* We assume that interrupts are disabled. |
* |
* @param ipi IPI number. |
*/ |
void ipi_broadcast_arch(int ipi) |
{ |
unsigned int i; |
void (* func)(void); |
switch (ipi) { |
case IPI_TLB_SHOOTDOWN: |
func = tlb_shootdown_ipi_recv; |
break; |
default: |
panic("Unknown IPI (%d).\n", ipi); |
break; |
} |
/* |
* As long as we don't support hot-plugging |
* or hot-unplugging of CPUs, we can walk |
* the cpus array and read processor's MID |
* without locking. |
*/ |
for (i = 0; i < config.cpu_active; i++) { |
if (&cpus[i] == CPU) |
continue; /* skip the current CPU */ |
cross_call(cpus[i].arch.mid, func); |
} |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/src/smp/smp.c |
---|
0,0 → 1,108 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64 |
* @{ |
*/ |
/** @file |
*/ |
#include <smp/smp.h> |
#include <genarch/ofw/ofw_tree.h> |
#include <cpu.h> |
#include <arch/cpu.h> |
#include <arch.h> |
#include <config.h> |
#include <macros.h> |
#include <arch/types.h> |
#include <synch/synch.h> |
#include <synch/waitq.h> |
#include <print.h> |
/** |
* This global variable is used to pick-up application processors |
* from their active loop in start.S. When a processor looping in |
* start.S sees that this variable contains its MID, it can |
* proceed with its initialization. |
* |
* This variable is modified only by the bootstrap processor. |
* Other processors access it read-only. |
*/ |
volatile uint64_t waking_up_mid = (uint64_t) -1; |
/** Determine number of processors. */ |
void smp_init(void) |
{ |
ofw_tree_node_t *node; |
count_t cnt = 0; |
node = ofw_tree_find_child_by_device_type(ofw_tree_lookup("/"), "cpu"); |
while (node) { |
cnt++; |
node = ofw_tree_find_peer_by_device_type(node, "cpu"); |
} |
config.cpu_count = max(1, cnt); |
} |
/** Wake application processors up. */ |
void kmp(void *arg) |
{ |
ofw_tree_node_t *node; |
int i; |
node = ofw_tree_find_child_by_device_type(ofw_tree_lookup("/"), "cpu"); |
for (i = 0; node; node = ofw_tree_find_peer_by_device_type(node, "cpu"), i++) { |
uint32_t mid; |
ofw_tree_property_t *prop; |
prop = ofw_tree_getprop(node, "upa-portid"); |
if (!prop || !prop->value) |
continue; |
mid = *((uint32_t *) prop->value); |
if (CPU->arch.mid == mid) { |
/* |
* Skip the current CPU. |
*/ |
continue; |
} |
/* |
* Processor with ID == mid can proceed with its initialization. |
*/ |
waking_up_mid = mid; |
if (waitq_sleep_timeout(&ap_completion_wq, 1000000, SYNCH_FLAGS_NONE) == ESYNCH_TIMEOUT) |
printf("%s: waiting for processor (mid = %d) timed out\n", |
__func__, mid); |
} |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/src/mm/tlb.c |
---|
0,0 → 1,516 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64mm |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/mm/tlb.h> |
#include <mm/tlb.h> |
#include <mm/as.h> |
#include <mm/asid.h> |
#include <arch/mm/frame.h> |
#include <arch/mm/page.h> |
#include <arch/mm/mmu.h> |
#include <arch/interrupt.h> |
#include <interrupt.h> |
#include <arch.h> |
#include <print.h> |
#include <arch/types.h> |
#include <config.h> |
#include <arch/trap/trap.h> |
#include <arch/trap/exception.h> |
#include <panic.h> |
#include <arch/asm.h> |
#ifdef CONFIG_TSB |
#include <arch/mm/tsb.h> |
#endif |
static void dtlb_pte_copy(pte_t *t, index_t index, bool ro); |
static void itlb_pte_copy(pte_t *t, index_t index); |
static void do_fast_instruction_access_mmu_miss_fault(istate_t *istate, |
const char *str); |
static void do_fast_data_access_mmu_miss_fault(istate_t *istate, |
tlb_tag_access_reg_t tag, const char *str); |
static void do_fast_data_access_protection_fault(istate_t *istate, |
tlb_tag_access_reg_t tag, const char *str); |
char *context_encoding[] = { |
"Primary", |
"Secondary", |
"Nucleus", |
"Reserved" |
}; |
void tlb_arch_init(void) |
{ |
/* |
* Invalidate all non-locked DTLB and ITLB entries. |
*/ |
tlb_invalidate_all(); |
/* |
* Clear both SFSRs. |
*/ |
dtlb_sfsr_write(0); |
itlb_sfsr_write(0); |
} |
/** Insert privileged mapping into DMMU TLB. |
* |
* @param page Virtual page address. |
* @param frame Physical frame address. |
* @param pagesize Page size. |
* @param locked True for permanent mappings, false otherwise. |
* @param cacheable True if the mapping is cacheable, false otherwise. |
*/ |
void dtlb_insert_mapping(uintptr_t page, uintptr_t frame, int pagesize, |
bool locked, bool cacheable) |
{ |
tlb_tag_access_reg_t tag; |
tlb_data_t data; |
page_address_t pg; |
frame_address_t fr; |
pg.address = page; |
fr.address = frame; |
tag.value = ASID_KERNEL; |
tag.vpn = pg.vpn; |
dtlb_tag_access_write(tag.value); |
data.value = 0; |
data.v = true; |
data.size = pagesize; |
data.pfn = fr.pfn; |
data.l = locked; |
data.cp = cacheable; |
#ifdef CONFIG_VIRT_IDX_DCACHE |
data.cv = cacheable; |
#endif /* CONFIG_VIRT_IDX_DCACHE */ |
data.p = true; |
data.w = true; |
data.g = false; |
dtlb_data_in_write(data.value); |
} |
/** Copy PTE to TLB. |
* |
* @param t Page Table Entry to be copied. |
* @param index Zero if lower 8K-subpage, one if higher 8K-subpage. |
* @param ro If true, the entry will be created read-only, regardless of its |
* w field. |
*/ |
void dtlb_pte_copy(pte_t *t, index_t index, bool ro) |
{ |
tlb_tag_access_reg_t tag; |
tlb_data_t data; |
page_address_t pg; |
frame_address_t fr; |
pg.address = t->page + (index << MMU_PAGE_WIDTH); |
fr.address = t->frame + (index << MMU_PAGE_WIDTH); |
tag.value = 0; |
tag.context = t->as->asid; |
tag.vpn = pg.vpn; |
dtlb_tag_access_write(tag.value); |
data.value = 0; |
data.v = true; |
data.size = PAGESIZE_8K; |
data.pfn = fr.pfn; |
data.l = false; |
data.cp = t->c; |
#ifdef CONFIG_VIRT_IDX_DCACHE |
data.cv = t->c; |
#endif /* CONFIG_VIRT_IDX_DCACHE */ |
data.p = t->k; /* p like privileged */ |
data.w = ro ? false : t->w; |
data.g = t->g; |
dtlb_data_in_write(data.value); |
} |
/** Copy PTE to ITLB. |
* |
* @param t Page Table Entry to be copied. |
* @param index Zero if lower 8K-subpage, one if higher 8K-subpage. |
*/ |
void itlb_pte_copy(pte_t *t, index_t index) |
{ |
tlb_tag_access_reg_t tag; |
tlb_data_t data; |
page_address_t pg; |
frame_address_t fr; |
pg.address = t->page + (index << MMU_PAGE_WIDTH); |
fr.address = t->frame + (index << MMU_PAGE_WIDTH); |
tag.value = 0; |
tag.context = t->as->asid; |
tag.vpn = pg.vpn; |
itlb_tag_access_write(tag.value); |
data.value = 0; |
data.v = true; |
data.size = PAGESIZE_8K; |
data.pfn = fr.pfn; |
data.l = false; |
data.cp = t->c; |
data.p = t->k; /* p like privileged */ |
data.w = false; |
data.g = t->g; |
itlb_data_in_write(data.value); |
} |
/** ITLB miss handler. */ |
void fast_instruction_access_mmu_miss(unative_t unused, istate_t *istate) |
{ |
uintptr_t va = ALIGN_DOWN(istate->tpc, PAGE_SIZE); |
index_t index = (istate->tpc >> MMU_PAGE_WIDTH) % MMU_PAGES_PER_PAGE; |
pte_t *t; |
page_table_lock(AS, true); |
t = page_mapping_find(AS, va); |
if (t && PTE_EXECUTABLE(t)) { |
/* |
* The mapping was found in the software page hash table. |
* Insert it into ITLB. |
*/ |
t->a = true; |
itlb_pte_copy(t, index); |
#ifdef CONFIG_TSB |
itsb_pte_copy(t, index); |
#endif |
page_table_unlock(AS, true); |
} else { |
/* |
* Forward the page fault to the address space page fault |
* handler. |
*/ |
page_table_unlock(AS, true); |
if (as_page_fault(va, PF_ACCESS_EXEC, istate) == AS_PF_FAULT) { |
do_fast_instruction_access_mmu_miss_fault(istate, |
__func__); |
} |
} |
} |
/** DTLB miss handler. |
* |
* Note that some faults (e.g. kernel faults) were already resolved by the |
* low-level, assembly language part of the fast_data_access_mmu_miss handler. |
* |
* @param tag Content of the TLB Tag Access register as it existed when the |
* trap happened. This is to prevent confusion created by clobbered |
* Tag Access register during a nested DTLB miss. |
* @param istate Interrupted state saved on the stack. |
*/ |
void fast_data_access_mmu_miss(tlb_tag_access_reg_t tag, istate_t *istate) |
{ |
uintptr_t va; |
index_t index; |
pte_t *t; |
va = ALIGN_DOWN((uint64_t) tag.vpn << MMU_PAGE_WIDTH, PAGE_SIZE); |
index = tag.vpn % MMU_PAGES_PER_PAGE; |
if (tag.context == ASID_KERNEL) { |
if (!tag.vpn) { |
/* NULL access in kernel */ |
do_fast_data_access_mmu_miss_fault(istate, tag, |
__func__); |
} |
do_fast_data_access_mmu_miss_fault(istate, tag, "Unexpected " |
"kernel page fault."); |
} |
page_table_lock(AS, true); |
t = page_mapping_find(AS, va); |
if (t) { |
/* |
* The mapping was found in the software page hash table. |
* Insert it into DTLB. |
*/ |
t->a = true; |
dtlb_pte_copy(t, index, true); |
#ifdef CONFIG_TSB |
dtsb_pte_copy(t, index, true); |
#endif |
page_table_unlock(AS, true); |
} else { |
/* |
* Forward the page fault to the address space page fault |
* handler. |
*/ |
page_table_unlock(AS, true); |
if (as_page_fault(va, PF_ACCESS_READ, istate) == AS_PF_FAULT) { |
do_fast_data_access_mmu_miss_fault(istate, tag, |
__func__); |
} |
} |
} |
/** DTLB protection fault handler. |
* |
* @param tag Content of the TLB Tag Access register as it existed when the |
* trap happened. This is to prevent confusion created by clobbered |
* Tag Access register during a nested DTLB miss. |
* @param istate Interrupted state saved on the stack. |
*/ |
void fast_data_access_protection(tlb_tag_access_reg_t tag, istate_t *istate) |
{ |
uintptr_t va; |
index_t index; |
pte_t *t; |
va = ALIGN_DOWN((uint64_t) tag.vpn << MMU_PAGE_WIDTH, PAGE_SIZE); |
index = tag.vpn % MMU_PAGES_PER_PAGE; /* 16K-page emulation */ |
page_table_lock(AS, true); |
t = page_mapping_find(AS, va); |
if (t && PTE_WRITABLE(t)) { |
/* |
* The mapping was found in the software page hash table and is |
* writable. Demap the old mapping and insert an updated mapping |
* into DTLB. |
*/ |
t->a = true; |
t->d = true; |
dtlb_demap(TLB_DEMAP_PAGE, TLB_DEMAP_SECONDARY, |
va + index * MMU_PAGE_SIZE); |
dtlb_pte_copy(t, index, false); |
#ifdef CONFIG_TSB |
dtsb_pte_copy(t, index, false); |
#endif |
page_table_unlock(AS, true); |
} else { |
/* |
* Forward the page fault to the address space page fault |
* handler. |
*/ |
page_table_unlock(AS, true); |
if (as_page_fault(va, PF_ACCESS_WRITE, istate) == AS_PF_FAULT) { |
do_fast_data_access_protection_fault(istate, tag, |
__func__); |
} |
} |
} |
/** Print contents of both TLBs. */ |
void tlb_print(void) |
{ |
int i; |
tlb_data_t d; |
tlb_tag_read_reg_t t; |
printf("I-TLB contents:\n"); |
for (i = 0; i < ITLB_ENTRY_COUNT; i++) { |
d.value = itlb_data_access_read(i); |
t.value = itlb_tag_read_read(i); |
printf("%d: vpn=%#llx, context=%d, v=%d, size=%d, nfo=%d, " |
"ie=%d, soft2=%#x, diag=%#x, pfn=%#x, soft=%#x, l=%d, " |
"cp=%d, cv=%d, e=%d, p=%d, w=%d, g=%d\n", i, t.vpn, |
t.context, d.v, d.size, d.nfo, d.ie, d.soft2, d.diag, |
d.pfn, d.soft, d.l, d.cp, d.cv, d.e, d.p, d.w, d.g); |
} |
printf("D-TLB contents:\n"); |
for (i = 0; i < DTLB_ENTRY_COUNT; i++) { |
d.value = dtlb_data_access_read(i); |
t.value = dtlb_tag_read_read(i); |
printf("%d: vpn=%#llx, context=%d, v=%d, size=%d, nfo=%d, " |
"ie=%d, soft2=%#x, diag=%#x, pfn=%#x, soft=%#x, l=%d, " |
"cp=%d, cv=%d, e=%d, p=%d, w=%d, g=%d\n", i, t.vpn, |
t.context, d.v, d.size, d.nfo, d.ie, d.soft2, d.diag, |
d.pfn, d.soft, d.l, d.cp, d.cv, d.e, d.p, d.w, d.g); |
} |
} |
void do_fast_instruction_access_mmu_miss_fault(istate_t *istate, |
const char *str) |
{ |
fault_if_from_uspace(istate, "%s\n", str); |
dump_istate(istate); |
panic("%s\n", str); |
} |
void do_fast_data_access_mmu_miss_fault(istate_t *istate, |
tlb_tag_access_reg_t tag, const char *str) |
{ |
uintptr_t va; |
va = tag.vpn << MMU_PAGE_WIDTH; |
if (tag.context) { |
fault_if_from_uspace(istate, "%s, Page=%p (ASID=%d)\n", str, va, |
tag.context); |
} |
dump_istate(istate); |
printf("Faulting page: %p, ASID=%d\n", va, tag.context); |
panic("%s\n", str); |
} |
void do_fast_data_access_protection_fault(istate_t *istate, |
tlb_tag_access_reg_t tag, const char *str) |
{ |
uintptr_t va; |
va = tag.vpn << MMU_PAGE_WIDTH; |
if (tag.context) { |
fault_if_from_uspace(istate, "%s, Page=%p (ASID=%d)\n", str, va, |
tag.context); |
} |
printf("Faulting page: %p, ASID=%d\n", va, tag.context); |
dump_istate(istate); |
panic("%s\n", str); |
} |
void dump_sfsr_and_sfar(void) |
{ |
tlb_sfsr_reg_t sfsr; |
uintptr_t sfar; |
sfsr.value = dtlb_sfsr_read(); |
sfar = dtlb_sfar_read(); |
printf("DTLB SFSR: asi=%#x, ft=%#x, e=%d, ct=%d, pr=%d, w=%d, ow=%d, " |
"fv=%d\n", sfsr.asi, sfsr.ft, sfsr.e, sfsr.ct, sfsr.pr, sfsr.w, |
sfsr.ow, sfsr.fv); |
printf("DTLB SFAR: address=%p\n", sfar); |
dtlb_sfsr_write(0); |
} |
/** Invalidate all unlocked ITLB and DTLB entries. */ |
void tlb_invalidate_all(void) |
{ |
int i; |
tlb_data_t d; |
tlb_tag_read_reg_t t; |
/* |
* Walk all ITLB and DTLB entries and remove all unlocked mappings. |
* |
* The kernel doesn't use global mappings so any locked global mappings |
* found must have been created by someone else. Their only purpose now |
* is to collide with proper mappings. Invalidate immediately. It should |
* be safe to invalidate them as late as now. |
*/ |
for (i = 0; i < ITLB_ENTRY_COUNT; i++) { |
d.value = itlb_data_access_read(i); |
if (!d.l || d.g) { |
t.value = itlb_tag_read_read(i); |
d.v = false; |
itlb_tag_access_write(t.value); |
itlb_data_access_write(i, d.value); |
} |
} |
for (i = 0; i < DTLB_ENTRY_COUNT; i++) { |
d.value = dtlb_data_access_read(i); |
if (!d.l || d.g) { |
t.value = dtlb_tag_read_read(i); |
d.v = false; |
dtlb_tag_access_write(t.value); |
dtlb_data_access_write(i, d.value); |
} |
} |
} |
/** Invalidate all ITLB and DTLB entries that belong to specified ASID |
* (Context). |
* |
* @param asid Address Space ID. |
*/ |
void tlb_invalidate_asid(asid_t asid) |
{ |
tlb_context_reg_t pc_save, ctx; |
/* switch to nucleus because we are mapped by the primary context */ |
nucleus_enter(); |
ctx.v = pc_save.v = mmu_primary_context_read(); |
ctx.context = asid; |
mmu_primary_context_write(ctx.v); |
itlb_demap(TLB_DEMAP_CONTEXT, TLB_DEMAP_PRIMARY, 0); |
dtlb_demap(TLB_DEMAP_CONTEXT, TLB_DEMAP_PRIMARY, 0); |
mmu_primary_context_write(pc_save.v); |
nucleus_leave(); |
} |
/** Invalidate all ITLB and DTLB entries for specified page range in specified |
* address space. |
* |
* @param asid Address Space ID. |
* @param page First page which to sweep out from ITLB and DTLB. |
* @param cnt Number of ITLB and DTLB entries to invalidate. |
*/ |
void tlb_invalidate_pages(asid_t asid, uintptr_t page, count_t cnt) |
{ |
unsigned int i; |
tlb_context_reg_t pc_save, ctx; |
/* switch to nucleus because we are mapped by the primary context */ |
nucleus_enter(); |
ctx.v = pc_save.v = mmu_primary_context_read(); |
ctx.context = asid; |
mmu_primary_context_write(ctx.v); |
for (i = 0; i < cnt * MMU_PAGES_PER_PAGE; i++) { |
itlb_demap(TLB_DEMAP_PAGE, TLB_DEMAP_PRIMARY, |
page + i * MMU_PAGE_SIZE); |
dtlb_demap(TLB_DEMAP_PAGE, TLB_DEMAP_PRIMARY, |
page + i * MMU_PAGE_SIZE); |
} |
mmu_primary_context_write(pc_save.v); |
nucleus_leave(); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/src/mm/frame.c |
---|
0,0 → 1,86 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64mm |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/mm/frame.h> |
#include <mm/frame.h> |
#include <arch/boot/boot.h> |
#include <arch/types.h> |
#include <config.h> |
#include <align.h> |
#include <macros.h> |
uintptr_t last_frame = NULL; |
/** Create memory zones according to information stored in bootinfo. |
* |
* Walk the bootinfo memory map and create frame zones according to it. |
*/ |
void frame_arch_init(void) |
{ |
unsigned int i; |
pfn_t confdata; |
if (config.cpu_active == 1) { |
for (i = 0; i < bootinfo.memmap.count; i++) { |
uintptr_t start = bootinfo.memmap.zones[i].start; |
size_t size = bootinfo.memmap.zones[i].size; |
/* |
* The memmap is created by HelenOS boot loader. |
* It already contains no holes. |
*/ |
confdata = ADDR2PFN(start); |
if (confdata == ADDR2PFN(KA2PA(PFN2ADDR(0)))) |
confdata = ADDR2PFN(KA2PA(PFN2ADDR(2))); |
zone_create(ADDR2PFN(start), |
SIZE2FRAMES(ALIGN_DOWN(size, FRAME_SIZE)), |
confdata, 0); |
last_frame = max(last_frame, start + ALIGN_UP(size, |
FRAME_SIZE)); |
} |
/* |
* On sparc64, physical memory can start on a non-zero address. |
* The generic frame_init() only marks PFN 0 as not free, so we |
* must mark the physically first frame not free explicitly |
* here, no matter what is its address. |
*/ |
frame_mark_unavailable(ADDR2PFN(KA2PA(PFN2ADDR(0))), 1); |
} |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/src/mm/page.c |
---|
0,0 → 1,168 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64mm |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/mm/page.h> |
#include <arch/mm/tlb.h> |
#include <genarch/mm/page_ht.h> |
#include <mm/frame.h> |
#include <arch/mm/frame.h> |
#include <bitops.h> |
#include <debug.h> |
#include <align.h> |
#include <config.h> |
#ifdef CONFIG_SMP |
/** Entries locked in DTLB of BSP. |
* |
* Application processors need to have the same locked entries in their DTLBs as |
* the bootstrap processor. |
*/ |
static struct { |
uintptr_t virt_page; |
uintptr_t phys_page; |
int pagesize_code; |
} bsp_locked_dtlb_entry[DTLB_ENTRY_COUNT]; |
/** Number of entries in bsp_locked_dtlb_entry array. */ |
static count_t bsp_locked_dtlb_entries = 0; |
#endif /* CONFIG_SMP */ |
/** Perform sparc64 specific initialization of paging. */ |
void page_arch_init(void) |
{ |
if (config.cpu_active == 1) { |
page_mapping_operations = &ht_mapping_operations; |
} else { |
#ifdef CONFIG_SMP |
unsigned int i; |
/* |
* Copy locked DTLB entries from the BSP. |
*/ |
for (i = 0; i < bsp_locked_dtlb_entries; i++) { |
dtlb_insert_mapping(bsp_locked_dtlb_entry[i].virt_page, |
bsp_locked_dtlb_entry[i].phys_page, |
bsp_locked_dtlb_entry[i].pagesize_code, true, |
false); |
} |
#endif |
} |
} |
/** Map memory-mapped device into virtual memory. |
* |
* So far, only DTLB is used to map devices into memory. Chances are that there |
* will be only a limited amount of devices that the kernel itself needs to |
* lock in DTLB. |
* |
* @param physaddr Physical address of the page where the device is located. |
* Must be at least page-aligned. |
* @param size Size of the device's registers. Must not exceed 4M and must |
* include extra space caused by the alignment. |
* |
* @return Virtual address of the page where the device is mapped. |
*/ |
uintptr_t hw_map(uintptr_t physaddr, size_t size) |
{ |
unsigned int order; |
unsigned int i; |
ASSERT(config.cpu_active == 1); |
struct { |
int pagesize_code; |
size_t increment; |
count_t count; |
} sizemap[] = { |
{ PAGESIZE_8K, 0, 1 }, /* 8K */ |
{ PAGESIZE_8K, MMU_PAGE_SIZE, 2 }, /* 16K */ |
{ PAGESIZE_8K, MMU_PAGE_SIZE, 4 }, /* 32K */ |
{ PAGESIZE_64K, 0, 1}, /* 64K */ |
{ PAGESIZE_64K, 8 * MMU_PAGE_SIZE, 2 }, /* 128K */ |
{ PAGESIZE_64K, 8 * MMU_PAGE_SIZE, 4 }, /* 256K */ |
{ PAGESIZE_512K, 0, 1 }, /* 512K */ |
{ PAGESIZE_512K, 64 * MMU_PAGE_SIZE, 2 }, /* 1M */ |
{ PAGESIZE_512K, 64 * MMU_PAGE_SIZE, 4 }, /* 2M */ |
{ PAGESIZE_4M, 0, 1 }, /* 4M */ |
{ PAGESIZE_4M, 512 * MMU_PAGE_SIZE, 2 } /* 8M */ |
}; |
ASSERT(ALIGN_UP(physaddr, MMU_PAGE_SIZE) == physaddr); |
ASSERT(size <= 8 * 1024 * 1024); |
if (size <= MMU_FRAME_SIZE) |
order = 0; |
else |
order = (fnzb64(size - 1) + 1) - MMU_FRAME_WIDTH; |
/* |
* Use virtual addresses that are beyond the limit of physical memory. |
* Thus, the physical address space will not be wasted by holes created |
* by frame_alloc(). |
*/ |
ASSERT(PA2KA(last_frame)); |
uintptr_t virtaddr = ALIGN_UP(PA2KA(last_frame), |
1 << (order + FRAME_WIDTH)); |
last_frame = ALIGN_UP(KA2PA(virtaddr) + size, |
1 << (order + FRAME_WIDTH)); |
for (i = 0; i < sizemap[order].count; i++) { |
/* |
* First, insert the mapping into DTLB. |
*/ |
dtlb_insert_mapping(virtaddr + i * sizemap[order].increment, |
physaddr + i * sizemap[order].increment, |
sizemap[order].pagesize_code, true, false); |
#ifdef CONFIG_SMP |
/* |
* Second, save the information about the mapping for APs. |
*/ |
bsp_locked_dtlb_entry[bsp_locked_dtlb_entries].virt_page = |
virtaddr + i * sizemap[order].increment; |
bsp_locked_dtlb_entry[bsp_locked_dtlb_entries].phys_page = |
physaddr + i * sizemap[order].increment; |
bsp_locked_dtlb_entry[bsp_locked_dtlb_entries].pagesize_code = |
sizemap[order].pagesize_code; |
bsp_locked_dtlb_entries++; |
#endif |
} |
return virtaddr; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/src/mm/as.c |
---|
0,0 → 1,206 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64mm |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/mm/as.h> |
#include <arch/mm/tlb.h> |
#include <genarch/mm/page_ht.h> |
#include <genarch/mm/asid_fifo.h> |
#include <debug.h> |
#include <config.h> |
#ifdef CONFIG_TSB |
#include <arch/mm/tsb.h> |
#include <arch/memstr.h> |
#include <arch/asm.h> |
#include <mm/frame.h> |
#include <bitops.h> |
#include <macros.h> |
#endif /* CONFIG_TSB */ |
/** Architecture dependent address space init. */ |
void as_arch_init(void) |
{ |
if (config.cpu_active == 1) { |
as_operations = &as_ht_operations; |
asid_fifo_init(); |
} |
} |
int as_constructor_arch(as_t *as, int flags) |
{ |
#ifdef CONFIG_TSB |
/* |
* The order must be calculated with respect to the emulated |
* 16K page size. |
*/ |
int order = fnzb32(((ITSB_ENTRY_COUNT + DTSB_ENTRY_COUNT) * |
sizeof(tsb_entry_t)) >> FRAME_WIDTH); |
uintptr_t tsb = (uintptr_t) frame_alloc(order, flags | FRAME_KA); |
if (!tsb) |
return -1; |
as->arch.itsb = (tsb_entry_t *) tsb; |
as->arch.dtsb = (tsb_entry_t *) (tsb + ITSB_ENTRY_COUNT * |
sizeof(tsb_entry_t)); |
memsetb((uintptr_t) as->arch.itsb, |
(ITSB_ENTRY_COUNT + DTSB_ENTRY_COUNT) * sizeof(tsb_entry_t), 0); |
#endif |
return 0; |
} |
int as_destructor_arch(as_t *as) |
{ |
#ifdef CONFIG_TSB |
/* |
* The count must be calculated with respect to the emualted 16K page |
* size. |
*/ |
count_t cnt = ((ITSB_ENTRY_COUNT + DTSB_ENTRY_COUNT) * |
sizeof(tsb_entry_t)) >> FRAME_WIDTH; |
frame_free(KA2PA((uintptr_t) as->arch.itsb)); |
return cnt; |
#else |
return 0; |
#endif |
} |
int as_create_arch(as_t *as, int flags) |
{ |
#ifdef CONFIG_TSB |
tsb_invalidate(as, 0, (count_t) -1); |
#endif |
return 0; |
} |
/** Perform sparc64-specific tasks when an address space becomes active on the |
* processor. |
* |
* Install ASID and map TSBs. |
* |
* @param as Address space. |
*/ |
void as_install_arch(as_t *as) |
{ |
tlb_context_reg_t ctx; |
/* |
* Note that we don't and may not lock the address space. That's ok |
* since we only read members that are currently read-only. |
* |
* Moreover, the as->asid is protected by asidlock, which is being held. |
*/ |
/* |
* Write ASID to secondary context register. The primary context |
* register has to be set from TL>0 so it will be filled from the |
* secondary context register from the TL=1 code just before switch to |
* userspace. |
*/ |
ctx.v = 0; |
ctx.context = as->asid; |
mmu_secondary_context_write(ctx.v); |
#ifdef CONFIG_TSB |
uintptr_t base = ALIGN_DOWN(config.base, 1 << KERNEL_PAGE_WIDTH); |
ASSERT(as->arch.itsb && as->arch.dtsb); |
uintptr_t tsb = (uintptr_t) as->arch.itsb; |
if (!overlaps(tsb, 8 * MMU_PAGE_SIZE, base, 1 << KERNEL_PAGE_WIDTH)) { |
/* |
* TSBs were allocated from memory not covered |
* by the locked 4M kernel DTLB entry. We need |
* to map both TSBs explicitly. |
*/ |
dtlb_demap(TLB_DEMAP_PAGE, TLB_DEMAP_NUCLEUS, tsb); |
dtlb_insert_mapping(tsb, KA2PA(tsb), PAGESIZE_64K, true, true); |
} |
/* |
* Setup TSB Base registers. |
*/ |
tsb_base_reg_t tsb_base; |
tsb_base.value = 0; |
tsb_base.size = TSB_SIZE; |
tsb_base.split = 0; |
tsb_base.base = ((uintptr_t) as->arch.itsb) >> MMU_PAGE_WIDTH; |
itsb_base_write(tsb_base.value); |
tsb_base.base = ((uintptr_t) as->arch.dtsb) >> MMU_PAGE_WIDTH; |
dtsb_base_write(tsb_base.value); |
#endif |
} |
/** Perform sparc64-specific tasks when an address space is removed from the |
* processor. |
* |
* Demap TSBs. |
* |
* @param as Address space. |
*/ |
void as_deinstall_arch(as_t *as) |
{ |
/* |
* Note that we don't and may not lock the address space. That's ok |
* since we only read members that are currently read-only. |
* |
* Moreover, the as->asid is protected by asidlock, which is being held. |
*/ |
#ifdef CONFIG_TSB |
uintptr_t base = ALIGN_DOWN(config.base, 1 << KERNEL_PAGE_WIDTH); |
ASSERT(as->arch.itsb && as->arch.dtsb); |
uintptr_t tsb = (uintptr_t) as->arch.itsb; |
if (!overlaps(tsb, 8 * MMU_PAGE_SIZE, base, 1 << KERNEL_PAGE_WIDTH)) { |
/* |
* TSBs were allocated from memory not covered |
* by the locked 4M kernel DTLB entry. We need |
* to demap the entry installed by as_install_arch(). |
*/ |
dtlb_demap(TLB_DEMAP_PAGE, TLB_DEMAP_NUCLEUS, tsb); |
} |
#endif |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/src/mm/tsb.c |
---|
0,0 → 1,175 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64mm |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/mm/tsb.h> |
#include <arch/mm/tlb.h> |
#include <arch/mm/page.h> |
#include <arch/barrier.h> |
#include <mm/as.h> |
#include <arch/types.h> |
#include <macros.h> |
#include <debug.h> |
#define TSB_INDEX_MASK ((1 << (21 + 1 + TSB_SIZE - MMU_PAGE_WIDTH)) - 1) |
/** Invalidate portion of TSB. |
* |
* We assume that the address space is already locked. Note that respective |
* portions of both TSBs are invalidated at a time. |
* |
* @param as Address space. |
* @param page First page to invalidate in TSB. |
* @param pages Number of pages to invalidate. Value of (count_t) -1 means the |
* whole TSB. |
*/ |
void tsb_invalidate(as_t *as, uintptr_t page, count_t pages) |
{ |
index_t i0, i; |
count_t cnt; |
ASSERT(as->arch.itsb && as->arch.dtsb); |
i0 = (page >> MMU_PAGE_WIDTH) & TSB_INDEX_MASK; |
ASSERT(i0 < ITSB_ENTRY_COUNT && i0 < DTSB_ENTRY_COUNT); |
if (pages == (count_t) -1 || (pages * 2) > ITSB_ENTRY_COUNT) |
cnt = ITSB_ENTRY_COUNT; |
else |
cnt = pages * 2; |
for (i = 0; i < cnt; i++) { |
as->arch.itsb[(i0 + i) & (ITSB_ENTRY_COUNT - 1)].tag.invalid = |
true; |
as->arch.dtsb[(i0 + i) & (DTSB_ENTRY_COUNT - 1)].tag.invalid = |
true; |
} |
} |
/** Copy software PTE to ITSB. |
* |
* @param t Software PTE. |
* @param index Zero if lower 8K-subpage, one if higher 8K subpage. |
*/ |
void itsb_pte_copy(pte_t *t, index_t index) |
{ |
as_t *as; |
tsb_entry_t *tsb; |
index_t entry; |
ASSERT(index <= 1); |
as = t->as; |
entry = ((t->page >> MMU_PAGE_WIDTH) + index) & TSB_INDEX_MASK; |
ASSERT(entry < ITSB_ENTRY_COUNT); |
tsb = &as->arch.itsb[entry]; |
/* |
* We use write barriers to make sure that the TSB load |
* won't use inconsistent data or that the fault will |
* be repeated. |
*/ |
tsb->tag.invalid = true; /* invalidate the entry |
* (tag target has this |
* set to 0) */ |
write_barrier(); |
tsb->tag.context = as->asid; |
/* the shift is bigger than PAGE_WIDTH, do not bother with index */ |
tsb->tag.va_tag = t->page >> VA_TAG_PAGE_SHIFT; |
tsb->data.value = 0; |
tsb->data.size = PAGESIZE_8K; |
tsb->data.pfn = (t->frame >> MMU_FRAME_WIDTH) + index; |
tsb->data.cp = t->c; |
tsb->data.p = t->k; /* p as privileged */ |
tsb->data.v = t->p; |
write_barrier(); |
tsb->tag.invalid = false; /* mark the entry as valid */ |
} |
/** Copy software PTE to DTSB. |
* |
* @param t Software PTE. |
* @param index Zero if lower 8K-subpage, one if higher 8K-subpage. |
* @param ro If true, the mapping is copied read-only. |
*/ |
void dtsb_pte_copy(pte_t *t, index_t index, bool ro) |
{ |
as_t *as; |
tsb_entry_t *tsb; |
index_t entry; |
ASSERT(index <= 1); |
as = t->as; |
entry = ((t->page >> MMU_PAGE_WIDTH) + index) & TSB_INDEX_MASK; |
ASSERT(entry < DTSB_ENTRY_COUNT); |
tsb = &as->arch.dtsb[entry]; |
/* |
* We use write barriers to make sure that the TSB load |
* won't use inconsistent data or that the fault will |
* be repeated. |
*/ |
tsb->tag.invalid = true; /* invalidate the entry |
* (tag target has this |
* set to 0) */ |
write_barrier(); |
tsb->tag.context = as->asid; |
/* the shift is bigger than PAGE_WIDTH, do not bother with index */ |
tsb->tag.va_tag = t->page >> VA_TAG_PAGE_SHIFT; |
tsb->data.value = 0; |
tsb->data.size = PAGESIZE_8K; |
tsb->data.pfn = (t->frame >> MMU_FRAME_WIDTH) + index; |
tsb->data.cp = t->c; |
#ifdef CONFIG_VIRT_IDX_DCACHE |
tsb->data.cv = t->c; |
#endif /* CONFIG_VIRT_IDX_DCACHE */ |
tsb->data.p = t->k; /* p as privileged */ |
tsb->data.w = ro ? false : t->w; |
tsb->data.v = t->p; |
write_barrier(); |
tsb->tag.invalid = false; /* mark the entry as valid */ |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/src/mm/cache.S |
---|
0,0 → 1,93 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#include <arch/arch.h> |
#define DCACHE_SIZE (16 * 1024) |
#define DCACHE_LINE_SIZE 32 |
#define DCACHE_TAG_SHIFT 2 |
.register %g2, #scratch |
.register %g3, #scratch |
/** Flush the whole D-cache. */ |
.global dcache_flush |
dcache_flush: |
set (DCACHE_SIZE - DCACHE_LINE_SIZE), %g1 |
stxa %g0, [%g1] ASI_DCACHE_TAG |
0: membar #Sync |
subcc %g1, DCACHE_LINE_SIZE, %g1 |
bnz,pt %xcc, 0b |
stxa %g0, [%g1] ASI_DCACHE_TAG |
membar #Sync |
retl |
! beware SF Erratum #51, do not put the MEMBAR here |
nop |
/** Flush only D-cache lines of one virtual color. |
* |
* @param o0 Virtual color to be flushed. |
*/ |
.global dcache_flush_color |
dcache_flush_color: |
mov (DCACHE_SIZE / DCACHE_LINE_SIZE) / 2, %g1 |
set DCACHE_SIZE / 2, %g2 |
sllx %g2, %o0, %g2 |
sub %g2, DCACHE_LINE_SIZE, %g2 |
0: stxa %g0, [%g2] ASI_DCACHE_TAG |
membar #Sync |
subcc %g1, 1, %g1 |
bnz,pt %xcc, 0b |
sub %g2, DCACHE_LINE_SIZE, %g2 |
retl |
nop |
/** Flush only D-cache lines of one virtual color and one tag. |
* |
* @param o0 Virtual color to lookup the tag. |
* @param o1 Tag of the cachelines to be flushed. |
*/ |
.global dcache_flush_tag |
dcache_flush_tag: |
mov (DCACHE_SIZE / DCACHE_LINE_SIZE) / 2, %g1 |
set DCACHE_SIZE / 2, %g2 |
sllx %g2, %o0, %g2 |
sub %g2, DCACHE_LINE_SIZE, %g2 |
0: ldxa [%g2] ASI_DCACHE_TAG, %g3 |
srlx %g3, DCACHE_TAG_SHIFT, %g3 |
cmp %g3, %o1 |
bnz 1f |
nop |
stxa %g0, [%g2] ASI_DCACHE_TAG |
membar #Sync |
1: subcc %g1, 1, %g1 |
bnz,pt %xcc, 0b |
sub %g2, DCACHE_LINE_SIZE, %g2 |
retl |
nop |
/tags/0.3.0/kernel/arch/sparc64/src/trap/trap_table.S |
---|
0,0 → 1,1028 |
# |
# Copyright (c) 2005 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
/** |
* @file |
* @brief This file contains kernel trap table. |
*/ |
.register %g2, #scratch |
.register %g3, #scratch |
.text |
#include <arch/trap/trap_table.h> |
#include <arch/trap/regwin.h> |
#include <arch/trap/interrupt.h> |
#include <arch/trap/exception.h> |
#include <arch/trap/syscall.h> |
#include <arch/trap/mmu.h> |
#include <arch/mm/mmu.h> |
#include <arch/mm/page.h> |
#include <arch/stack.h> |
#include <arch/regdef.h> |
#define TABLE_SIZE TRAP_TABLE_SIZE |
#define ENTRY_SIZE TRAP_TABLE_ENTRY_SIZE |
/* |
* Kernel trap table. |
*/ |
.align TABLE_SIZE |
.global trap_table |
trap_table: |
/* TT = 0x08, TL = 0, instruction_access_exception */ |
.org trap_table + TT_INSTRUCTION_ACCESS_EXCEPTION*ENTRY_SIZE |
.global instruction_access_exception_tl0 |
instruction_access_exception_tl0: |
wrpr %g0, PSTATE_AG_BIT | PSTATE_PRIV_BIT, %pstate |
PREEMPTIBLE_HANDLER instruction_access_exception |
/* TT = 0x0a, TL = 0, instruction_access_error */ |
.org trap_table + TT_INSTRUCTION_ACCESS_ERROR*ENTRY_SIZE |
.global instruction_access_error_tl0 |
instruction_access_error_tl0: |
PREEMPTIBLE_HANDLER instruction_access_error |
/* TT = 0x10, TL = 0, illegal_instruction */ |
.org trap_table + TT_ILLEGAL_INSTRUCTION*ENTRY_SIZE |
.global illegal_instruction_tl0 |
illegal_instruction_tl0: |
PREEMPTIBLE_HANDLER illegal_instruction |
/* TT = 0x11, TL = 0, privileged_opcode */ |
.org trap_table + TT_PRIVILEGED_OPCODE*ENTRY_SIZE |
.global privileged_opcode_tl0 |
privileged_opcode_tl0: |
PREEMPTIBLE_HANDLER privileged_opcode |
/* TT = 0x12, TL = 0, unimplemented_LDD */ |
.org trap_table + TT_UNIMPLEMENTED_LDD*ENTRY_SIZE |
.global unimplemented_LDD_tl0 |
unimplemented_LDD_tl0: |
PREEMPTIBLE_HANDLER unimplemented_LDD |
/* TT = 0x13, TL = 0, unimplemented_STD */ |
.org trap_table + TT_UNIMPLEMENTED_STD*ENTRY_SIZE |
.global unimplemented_STD_tl0 |
unimplemented_STD_tl0: |
PREEMPTIBLE_HANDLER unimplemented_STD |
/* TT = 0x20, TL = 0, fb_disabled handler */ |
.org trap_table + TT_FP_DISABLED*ENTRY_SIZE |
.global fb_disabled_tl0 |
fp_disabled_tl0: |
PREEMPTIBLE_HANDLER fp_disabled |
/* TT = 0x21, TL = 0, fb_exception_ieee_754 handler */ |
.org trap_table + TT_FP_EXCEPTION_IEEE_754*ENTRY_SIZE |
.global fb_exception_ieee_754_tl0 |
fp_exception_ieee_754_tl0: |
PREEMPTIBLE_HANDLER fp_exception_ieee_754 |
/* TT = 0x22, TL = 0, fb_exception_other handler */ |
.org trap_table + TT_FP_EXCEPTION_OTHER*ENTRY_SIZE |
.global fb_exception_other_tl0 |
fp_exception_other_tl0: |
PREEMPTIBLE_HANDLER fp_exception_other |
/* TT = 0x23, TL = 0, tag_overflow */ |
.org trap_table + TT_TAG_OVERFLOW*ENTRY_SIZE |
.global tag_overflow_tl0 |
tag_overflow_tl0: |
PREEMPTIBLE_HANDLER tag_overflow |
/* TT = 0x24, TL = 0, clean_window handler */ |
.org trap_table + TT_CLEAN_WINDOW*ENTRY_SIZE |
.global clean_window_tl0 |
clean_window_tl0: |
CLEAN_WINDOW_HANDLER |
/* TT = 0x28, TL = 0, division_by_zero */ |
.org trap_table + TT_DIVISION_BY_ZERO*ENTRY_SIZE |
.global division_by_zero_tl0 |
division_by_zero_tl0: |
PREEMPTIBLE_HANDLER division_by_zero |
/* TT = 0x30, TL = 0, data_access_exception */ |
.org trap_table + TT_DATA_ACCESS_EXCEPTION*ENTRY_SIZE |
.global data_access_exception_tl0 |
data_access_exception_tl0: |
wrpr %g0, PSTATE_AG_BIT | PSTATE_PRIV_BIT, %pstate |
PREEMPTIBLE_HANDLER data_access_exception |
/* TT = 0x32, TL = 0, data_access_error */ |
.org trap_table + TT_DATA_ACCESS_ERROR*ENTRY_SIZE |
.global data_access_error_tl0 |
data_access_error_tl0: |
PREEMPTIBLE_HANDLER data_access_error |
/* TT = 0x34, TL = 0, mem_address_not_aligned */ |
.org trap_table + TT_MEM_ADDRESS_NOT_ALIGNED*ENTRY_SIZE |
.global mem_address_not_aligned_tl0 |
mem_address_not_aligned_tl0: |
PREEMPTIBLE_HANDLER mem_address_not_aligned |
/* TT = 0x35, TL = 0, LDDF_mem_address_not_aligned */ |
.org trap_table + TT_LDDF_MEM_ADDRESS_NOT_ALIGNED*ENTRY_SIZE |
.global LDDF_mem_address_not_aligned_tl0 |
LDDF_mem_address_not_aligned_tl0: |
PREEMPTIBLE_HANDLER LDDF_mem_address_not_aligned |
/* TT = 0x36, TL = 0, STDF_mem_address_not_aligned */ |
.org trap_table + TT_STDF_MEM_ADDRESS_NOT_ALIGNED*ENTRY_SIZE |
.global STDF_mem_address_not_aligned_tl0 |
STDF_mem_address_not_aligned_tl0: |
PREEMPTIBLE_HANDLER STDF_mem_address_not_aligned |
/* TT = 0x37, TL = 0, privileged_action */ |
.org trap_table + TT_PRIVILEGED_ACTION*ENTRY_SIZE |
.global privileged_action_tl0 |
privileged_action_tl0: |
PREEMPTIBLE_HANDLER privileged_action |
/* TT = 0x38, TL = 0, LDQF_mem_address_not_aligned */ |
.org trap_table + TT_LDQF_MEM_ADDRESS_NOT_ALIGNED*ENTRY_SIZE |
.global LDQF_mem_address_not_aligned_tl0 |
LDQF_mem_address_not_aligned_tl0: |
PREEMPTIBLE_HANDLER LDQF_mem_address_not_aligned |
/* TT = 0x39, TL = 0, STQF_mem_address_not_aligned */ |
.org trap_table + TT_STQF_MEM_ADDRESS_NOT_ALIGNED*ENTRY_SIZE |
.global STQF_mem_address_not_aligned_tl0 |
STQF_mem_address_not_aligned_tl0: |
PREEMPTIBLE_HANDLER STQF_mem_address_not_aligned |
/* TT = 0x41, TL = 0, interrupt_level_1 handler */ |
.org trap_table + TT_INTERRUPT_LEVEL_1*ENTRY_SIZE |
.global interrupt_level_1_handler_tl0 |
interrupt_level_1_handler_tl0: |
INTERRUPT_LEVEL_N_HANDLER 1 |
/* TT = 0x42, TL = 0, interrupt_level_2 handler */ |
.org trap_table + TT_INTERRUPT_LEVEL_2*ENTRY_SIZE |
.global interrupt_level_2_handler_tl0 |
interrupt_level_2_handler_tl0: |
INTERRUPT_LEVEL_N_HANDLER 2 |
/* TT = 0x43, TL = 0, interrupt_level_3 handler */ |
.org trap_table + TT_INTERRUPT_LEVEL_3*ENTRY_SIZE |
.global interrupt_level_3_handler_tl0 |
interrupt_level_3_handler_tl0: |
INTERRUPT_LEVEL_N_HANDLER 3 |
/* TT = 0x44, TL = 0, interrupt_level_4 handler */ |
.org trap_table + TT_INTERRUPT_LEVEL_4*ENTRY_SIZE |
.global interrupt_level_4_handler_tl0 |
interrupt_level_4_handler_tl0: |
INTERRUPT_LEVEL_N_HANDLER 4 |
/* TT = 0x45, TL = 0, interrupt_level_5 handler */ |
.org trap_table + TT_INTERRUPT_LEVEL_5*ENTRY_SIZE |
.global interrupt_level_5_handler_tl0 |
interrupt_level_5_handler_tl0: |
INTERRUPT_LEVEL_N_HANDLER 5 |
/* TT = 0x46, TL = 0, interrupt_level_6 handler */ |
.org trap_table + TT_INTERRUPT_LEVEL_6*ENTRY_SIZE |
.global interrupt_level_6_handler_tl0 |
interrupt_level_6_handler_tl0: |
INTERRUPT_LEVEL_N_HANDLER 6 |
/* TT = 0x47, TL = 0, interrupt_level_7 handler */ |
.org trap_table + TT_INTERRUPT_LEVEL_7*ENTRY_SIZE |
.global interrupt_level_7_handler_tl0 |
interrupt_level_7_handler_tl0: |
INTERRUPT_LEVEL_N_HANDLER 7 |
/* TT = 0x48, TL = 0, interrupt_level_8 handler */ |
.org trap_table + TT_INTERRUPT_LEVEL_8*ENTRY_SIZE |
.global interrupt_level_8_handler_tl0 |
interrupt_level_8_handler_tl0: |
INTERRUPT_LEVEL_N_HANDLER 8 |
/* TT = 0x49, TL = 0, interrupt_level_9 handler */ |
.org trap_table + TT_INTERRUPT_LEVEL_9*ENTRY_SIZE |
.global interrupt_level_9_handler_tl0 |
interrupt_level_9_handler_tl0: |
INTERRUPT_LEVEL_N_HANDLER 9 |
/* TT = 0x4a, TL = 0, interrupt_level_10 handler */ |
.org trap_table + TT_INTERRUPT_LEVEL_10*ENTRY_SIZE |
.global interrupt_level_10_handler_tl0 |
interrupt_level_10_handler_tl0: |
INTERRUPT_LEVEL_N_HANDLER 10 |
/* TT = 0x4b, TL = 0, interrupt_level_11 handler */ |
.org trap_table + TT_INTERRUPT_LEVEL_11*ENTRY_SIZE |
.global interrupt_level_11_handler_tl0 |
interrupt_level_11_handler_tl0: |
INTERRUPT_LEVEL_N_HANDLER 11 |
/* TT = 0x4c, TL = 0, interrupt_level_12 handler */ |
.org trap_table + TT_INTERRUPT_LEVEL_12*ENTRY_SIZE |
.global interrupt_level_12_handler_tl0 |
interrupt_level_12_handler_tl0: |
INTERRUPT_LEVEL_N_HANDLER 12 |
/* TT = 0x4d, TL = 0, interrupt_level_13 handler */ |
.org trap_table + TT_INTERRUPT_LEVEL_13*ENTRY_SIZE |
.global interrupt_level_13_handler_tl0 |
interrupt_level_13_handler_tl0: |
INTERRUPT_LEVEL_N_HANDLER 13 |
/* TT = 0x4e, TL = 0, interrupt_level_14 handler */ |
.org trap_table + TT_INTERRUPT_LEVEL_14*ENTRY_SIZE |
.global interrupt_level_14_handler_tl0 |
interrupt_level_14_handler_tl0: |
INTERRUPT_LEVEL_N_HANDLER 14 |
/* TT = 0x4f, TL = 0, interrupt_level_15 handler */ |
.org trap_table + TT_INTERRUPT_LEVEL_15*ENTRY_SIZE |
.global interrupt_level_15_handler_tl0 |
interrupt_level_15_handler_tl0: |
INTERRUPT_LEVEL_N_HANDLER 15 |
/* TT = 0x60, TL = 0, interrupt_vector_trap handler */ |
.org trap_table + TT_INTERRUPT_VECTOR_TRAP*ENTRY_SIZE |
.global interrupt_vector_trap_handler_tl0 |
interrupt_vector_trap_handler_tl0: |
INTERRUPT_VECTOR_TRAP_HANDLER |
/* TT = 0x64, TL = 0, fast_instruction_access_MMU_miss */ |
.org trap_table + TT_FAST_INSTRUCTION_ACCESS_MMU_MISS*ENTRY_SIZE |
.global fast_instruction_access_mmu_miss_handler_tl0 |
fast_instruction_access_mmu_miss_handler_tl0: |
FAST_INSTRUCTION_ACCESS_MMU_MISS_HANDLER |
/* TT = 0x68, TL = 0, fast_data_access_MMU_miss */ |
.org trap_table + TT_FAST_DATA_ACCESS_MMU_MISS*ENTRY_SIZE |
.global fast_data_access_mmu_miss_handler_tl0 |
fast_data_access_mmu_miss_handler_tl0: |
FAST_DATA_ACCESS_MMU_MISS_HANDLER 0 |
/* TT = 0x6c, TL = 0, fast_data_access_protection */ |
.org trap_table + TT_FAST_DATA_ACCESS_PROTECTION*ENTRY_SIZE |
.global fast_data_access_protection_handler_tl0 |
fast_data_access_protection_handler_tl0: |
FAST_DATA_ACCESS_PROTECTION_HANDLER 0 |
/* TT = 0x80, TL = 0, spill_0_normal handler */ |
.org trap_table + TT_SPILL_0_NORMAL*ENTRY_SIZE |
.global spill_0_normal_tl0 |
spill_0_normal_tl0: |
SPILL_NORMAL_HANDLER_KERNEL |
/* TT = 0x84, TL = 0, spill_1_normal handler */ |
.org trap_table + TT_SPILL_1_NORMAL*ENTRY_SIZE |
.global spill_1_normal_tl0 |
spill_1_normal_tl0: |
SPILL_NORMAL_HANDLER_USERSPACE |
/* TT = 0x88, TL = 0, spill_2_normal handler */ |
.org trap_table + TT_SPILL_2_NORMAL*ENTRY_SIZE |
.global spill_2_normal_tl0 |
spill_2_normal_tl0: |
SPILL_TO_USPACE_WINDOW_BUFFER |
/* TT = 0xa0, TL = 0, spill_0_other handler */ |
.org trap_table + TT_SPILL_0_OTHER*ENTRY_SIZE |
.global spill_0_other_tl0 |
spill_0_other_tl0: |
SPILL_TO_USPACE_WINDOW_BUFFER |
/* TT = 0xc0, TL = 0, fill_0_normal handler */ |
.org trap_table + TT_FILL_0_NORMAL*ENTRY_SIZE |
.global fill_0_normal_tl0 |
fill_0_normal_tl0: |
FILL_NORMAL_HANDLER_KERNEL |
/* TT = 0xc4, TL = 0, fill_1_normal handler */ |
.org trap_table + TT_FILL_1_NORMAL*ENTRY_SIZE |
.global fill_1_normal_tl0 |
fill_1_normal_tl0: |
FILL_NORMAL_HANDLER_USERSPACE |
/* TT = 0x100, TL = 0, trap_instruction_0 */ |
.org trap_table + TT_TRAP_INSTRUCTION(0)*ENTRY_SIZE |
.global trap_instruction_0_tl0 |
trap_instruction_0_tl0: |
TRAP_INSTRUCTION 0 |
/* TT = 0x101, TL = 0, trap_instruction_1 */ |
.org trap_table + TT_TRAP_INSTRUCTION(1)*ENTRY_SIZE |
.global trap_instruction_1_tl0 |
trap_instruction_1_tl0: |
TRAP_INSTRUCTION 1 |
/* TT = 0x102, TL = 0, trap_instruction_2 */ |
.org trap_table + TT_TRAP_INSTRUCTION(2)*ENTRY_SIZE |
.global trap_instruction_2_tl0 |
trap_instruction_2_tl0: |
TRAP_INSTRUCTION 2 |
/* TT = 0x103, TL = 0, trap_instruction_3 */ |
.org trap_table + TT_TRAP_INSTRUCTION(3)*ENTRY_SIZE |
.global trap_instruction_3_tl0 |
trap_instruction_3_tl0: |
TRAP_INSTRUCTION 3 |
/* TT = 0x104, TL = 0, trap_instruction_4 */ |
.org trap_table + TT_TRAP_INSTRUCTION(4)*ENTRY_SIZE |
.global trap_instruction_4_tl0 |
trap_instruction_4_tl0: |
TRAP_INSTRUCTION 4 |
/* TT = 0x105, TL = 0, trap_instruction_5 */ |
.org trap_table + TT_TRAP_INSTRUCTION(5)*ENTRY_SIZE |
.global trap_instruction_5_tl0 |
trap_instruction_5_tl0: |
TRAP_INSTRUCTION 5 |
/* TT = 0x106, TL = 0, trap_instruction_6 */ |
.org trap_table + TT_TRAP_INSTRUCTION(6)*ENTRY_SIZE |
.global trap_instruction_6_tl0 |
trap_instruction_6_tl0: |
TRAP_INSTRUCTION 6 |
/* TT = 0x107, TL = 0, trap_instruction_7 */ |
.org trap_table + TT_TRAP_INSTRUCTION(7)*ENTRY_SIZE |
.global trap_instruction_7_tl0 |
trap_instruction_7_tl0: |
TRAP_INSTRUCTION 7 |
/* TT = 0x108, TL = 0, trap_instruction_8 */ |
.org trap_table + TT_TRAP_INSTRUCTION(8)*ENTRY_SIZE |
.global trap_instruction_8_tl0 |
trap_instruction_8_tl0: |
TRAP_INSTRUCTION 8 |
/* TT = 0x109, TL = 0, trap_instruction_9 */ |
.org trap_table + TT_TRAP_INSTRUCTION(9)*ENTRY_SIZE |
.global trap_instruction_9_tl0 |
trap_instruction_9_tl0: |
TRAP_INSTRUCTION 9 |
/* TT = 0x10a, TL = 0, trap_instruction_10 */ |
.org trap_table + TT_TRAP_INSTRUCTION(10)*ENTRY_SIZE |
.global trap_instruction_10_tl0 |
trap_instruction_10_tl0: |
TRAP_INSTRUCTION 10 |
/* TT = 0x10b, TL = 0, trap_instruction_11 */ |
.org trap_table + TT_TRAP_INSTRUCTION(11)*ENTRY_SIZE |
.global trap_instruction_11_tl0 |
trap_instruction_11_tl0: |
TRAP_INSTRUCTION 11 |
/* TT = 0x10c, TL = 0, trap_instruction_12 */ |
.org trap_table + TT_TRAP_INSTRUCTION(12)*ENTRY_SIZE |
.global trap_instruction_12_tl0 |
trap_instruction_12_tl0: |
TRAP_INSTRUCTION 12 |
/* TT = 0x10d, TL = 0, trap_instruction_13 */ |
.org trap_table + TT_TRAP_INSTRUCTION(13)*ENTRY_SIZE |
.global trap_instruction_13_tl0 |
trap_instruction_13_tl0: |
TRAP_INSTRUCTION 13 |
/* TT = 0x10e, TL = 0, trap_instruction_14 */ |
.org trap_table + TT_TRAP_INSTRUCTION(14)*ENTRY_SIZE |
.global trap_instruction_14_tl0 |
trap_instruction_14_tl0: |
TRAP_INSTRUCTION 14 |
/* TT = 0x10f, TL = 0, trap_instruction_15 */ |
.org trap_table + TT_TRAP_INSTRUCTION(15)*ENTRY_SIZE |
.global trap_instruction_15_tl0 |
trap_instruction_15_tl0: |
TRAP_INSTRUCTION 15 |
/* TT = 0x110, TL = 0, trap_instruction_16 */ |
.org trap_table + TT_TRAP_INSTRUCTION(16)*ENTRY_SIZE |
.global trap_instruction_16_tl0 |
trap_instruction_16_tl0: |
TRAP_INSTRUCTION 16 |
/* TT = 0x111, TL = 0, trap_instruction_17 */ |
.org trap_table + TT_TRAP_INSTRUCTION(17)*ENTRY_SIZE |
.global trap_instruction_17_tl0 |
trap_instruction_17_tl0: |
TRAP_INSTRUCTION 17 |
/* TT = 0x112, TL = 0, trap_instruction_18 */ |
.org trap_table + TT_TRAP_INSTRUCTION(18)*ENTRY_SIZE |
.global trap_instruction_18_tl0 |
trap_instruction_18_tl0: |
TRAP_INSTRUCTION 18 |
/* TT = 0x113, TL = 0, trap_instruction_19 */ |
.org trap_table + TT_TRAP_INSTRUCTION(19)*ENTRY_SIZE |
.global trap_instruction_19_tl0 |
trap_instruction_19_tl0: |
TRAP_INSTRUCTION 19 |
/* TT = 0x114, TL = 0, trap_instruction_20 */ |
.org trap_table + TT_TRAP_INSTRUCTION(20)*ENTRY_SIZE |
.global trap_instruction_20_tl0 |
trap_instruction_20_tl0: |
TRAP_INSTRUCTION 20 |
/* TT = 0x115, TL = 0, trap_instruction_21 */ |
.org trap_table + TT_TRAP_INSTRUCTION(21)*ENTRY_SIZE |
.global trap_instruction_21_tl0 |
trap_instruction_21_tl0: |
TRAP_INSTRUCTION 21 |
/* TT = 0x116, TL = 0, trap_instruction_22 */ |
.org trap_table + TT_TRAP_INSTRUCTION(22)*ENTRY_SIZE |
.global trap_instruction_22_tl0 |
trap_instruction_22_tl0: |
TRAP_INSTRUCTION 22 |
/* TT = 0x117, TL = 0, trap_instruction_23 */ |
.org trap_table + TT_TRAP_INSTRUCTION(23)*ENTRY_SIZE |
.global trap_instruction_23_tl0 |
trap_instruction_23_tl0: |
TRAP_INSTRUCTION 23 |
/* TT = 0x118, TL = 0, trap_instruction_24 */ |
.org trap_table + TT_TRAP_INSTRUCTION(24)*ENTRY_SIZE |
.global trap_instruction_24_tl0 |
trap_instruction_24_tl0: |
TRAP_INSTRUCTION 24 |
/* TT = 0x119, TL = 0, trap_instruction_25 */ |
.org trap_table + TT_TRAP_INSTRUCTION(25)*ENTRY_SIZE |
.global trap_instruction_25_tl0 |
trap_instruction_25_tl0: |
TRAP_INSTRUCTION 25 |
/* TT = 0x11a, TL = 0, trap_instruction_26 */ |
.org trap_table + TT_TRAP_INSTRUCTION(26)*ENTRY_SIZE |
.global trap_instruction_26_tl0 |
trap_instruction_26_tl0: |
TRAP_INSTRUCTION 26 |
/* TT = 0x11b, TL = 0, trap_instruction_27 */ |
.org trap_table + TT_TRAP_INSTRUCTION(27)*ENTRY_SIZE |
.global trap_instruction_27_tl0 |
trap_instruction_27_tl0: |
TRAP_INSTRUCTION 27 |
/* TT = 0x11c, TL = 0, trap_instruction_28 */ |
.org trap_table + TT_TRAP_INSTRUCTION(28)*ENTRY_SIZE |
.global trap_instruction_28_tl0 |
trap_instruction_28_tl0: |
TRAP_INSTRUCTION 28 |
/* TT = 0x11d, TL = 0, trap_instruction_29 */ |
.org trap_table + TT_TRAP_INSTRUCTION(29)*ENTRY_SIZE |
.global trap_instruction_29_tl0 |
trap_instruction_29_tl0: |
TRAP_INSTRUCTION 29 |
/* TT = 0x11e, TL = 0, trap_instruction_30 */ |
.org trap_table + TT_TRAP_INSTRUCTION(30)*ENTRY_SIZE |
.global trap_instruction_30_tl0 |
trap_instruction_30_tl0: |
TRAP_INSTRUCTION 30 |
/* TT = 0x11f, TL = 0, trap_instruction_31 */ |
.org trap_table + TT_TRAP_INSTRUCTION(31)*ENTRY_SIZE |
.global trap_instruction_31_tl0 |
trap_instruction_31_tl0: |
TRAP_INSTRUCTION 31 |
/* |
* Handlers for TL>0. |
*/ |
/* TT = 0x08, TL > 0, instruction_access_exception */ |
.org trap_table + (TT_INSTRUCTION_ACCESS_EXCEPTION+512)*ENTRY_SIZE |
.global instruction_access_exception_tl1 |
instruction_access_exception_tl1: |
wrpr %g0, 1, %tl |
wrpr %g0, PSTATE_AG_BIT | PSTATE_PRIV_BIT, %pstate |
PREEMPTIBLE_HANDLER instruction_access_exception |
/* TT = 0x0a, TL > 0, instruction_access_error */ |
.org trap_table + (TT_INSTRUCTION_ACCESS_ERROR+512)*ENTRY_SIZE |
.global instruction_access_error_tl1 |
instruction_access_error_tl1: |
wrpr %g0, 1, %tl |
PREEMPTIBLE_HANDLER instruction_access_error |
/* TT = 0x10, TL > 0, illegal_instruction */ |
.org trap_table + (TT_ILLEGAL_INSTRUCTION+512)*ENTRY_SIZE |
.global illegal_instruction_tl1 |
illegal_instruction_tl1: |
wrpr %g0, 1, %tl |
PREEMPTIBLE_HANDLER illegal_instruction |
/* TT = 0x24, TL > 0, clean_window handler */ |
.org trap_table + (TT_CLEAN_WINDOW+512)*ENTRY_SIZE |
.global clean_window_tl1 |
clean_window_tl1: |
CLEAN_WINDOW_HANDLER |
/* TT = 0x28, TL > 0, division_by_zero */ |
.org trap_table + (TT_DIVISION_BY_ZERO+512)*ENTRY_SIZE |
.global division_by_zero_tl1 |
division_by_zero_tl1: |
wrpr %g0, 1, %tl |
PREEMPTIBLE_HANDLER division_by_zero |
/* TT = 0x30, TL > 0, data_access_exception */ |
.org trap_table + (TT_DATA_ACCESS_EXCEPTION+512)*ENTRY_SIZE |
.global data_access_exception_tl1 |
data_access_exception_tl1: |
wrpr %g0, 1, %tl |
wrpr %g0, PSTATE_AG_BIT | PSTATE_PRIV_BIT, %pstate |
PREEMPTIBLE_HANDLER data_access_exception |
/* TT = 0x32, TL > 0, data_access_error */ |
.org trap_table + (TT_DATA_ACCESS_ERROR+512)*ENTRY_SIZE |
.global data_access_error_tl1 |
data_access_error_tl1: |
wrpr %g0, 1, %tl |
PREEMPTIBLE_HANDLER data_access_error |
/* TT = 0x34, TL > 0, mem_address_not_aligned */ |
.org trap_table + (TT_MEM_ADDRESS_NOT_ALIGNED+512)*ENTRY_SIZE |
.global mem_address_not_aligned_tl1 |
mem_address_not_aligned_tl1: |
wrpr %g0, 1, %tl |
PREEMPTIBLE_HANDLER mem_address_not_aligned |
/* TT = 0x68, TL > 0, fast_data_access_MMU_miss */ |
.org trap_table + (TT_FAST_DATA_ACCESS_MMU_MISS+512)*ENTRY_SIZE |
.global fast_data_access_mmu_miss_handler_tl1 |
fast_data_access_mmu_miss_handler_tl1: |
FAST_DATA_ACCESS_MMU_MISS_HANDLER 1 |
/* TT = 0x6c, TL > 0, fast_data_access_protection */ |
.org trap_table + (TT_FAST_DATA_ACCESS_PROTECTION+512)*ENTRY_SIZE |
.global fast_data_access_protection_handler_tl1 |
fast_data_access_protection_handler_tl1: |
FAST_DATA_ACCESS_PROTECTION_HANDLER 1 |
/* TT = 0x80, TL > 0, spill_0_normal handler */ |
.org trap_table + (TT_SPILL_0_NORMAL+512)*ENTRY_SIZE |
.global spill_0_normal_tl1 |
spill_0_normal_tl1: |
SPILL_NORMAL_HANDLER_KERNEL |
/* TT = 0x88, TL > 0, spill_2_normal handler */ |
.org trap_table + (TT_SPILL_2_NORMAL+512)*ENTRY_SIZE |
.global spill_2_normal_tl1 |
spill_2_normal_tl1: |
SPILL_TO_USPACE_WINDOW_BUFFER |
/* TT = 0xa0, TL > 0, spill_0_other handler */ |
.org trap_table + (TT_SPILL_0_OTHER+512)*ENTRY_SIZE |
.global spill_0_other_tl1 |
spill_0_other_tl1: |
SPILL_TO_USPACE_WINDOW_BUFFER |
/* TT = 0xc0, TL > 0, fill_0_normal handler */ |
.org trap_table + (TT_FILL_0_NORMAL+512)*ENTRY_SIZE |
.global fill_0_normal_tl1 |
fill_0_normal_tl1: |
FILL_NORMAL_HANDLER_KERNEL |
.align TABLE_SIZE |
#define NOT(x) ((x) == 0) |
/* Preemptible trap handler for TL=1. |
* |
* This trap handler makes arrangements to make calling of scheduler() from |
* within a trap context possible. It is called from several other trap |
* handlers. |
* |
* This function can be entered either with interrupt globals or alternate |
* globals. Memory management trap handlers are obliged to switch to one of |
* those global sets prior to calling this function. Register window management |
* functions are not allowed to modify the alternate global registers. |
* |
* The kernel is designed to work on trap levels 0 - 4. For instance, the |
* following can happen: |
* TL0: kernel thread runs (CANSAVE=0, kernel stack not in DTLB) |
* TL1: preemptible trap handler started after a tick interrupt |
* TL2: preemptible trap handler did SAVE |
* TL3: spill handler touched the kernel stack |
* TL4: hardware or software failure |
* |
* Input registers: |
* %g1 Address of function to call if this is not a syscall. |
* %g2 First argument for the function. |
* %g6 Pre-set as kernel stack base if trap from userspace. |
* %g7 Pre-set as address of the userspace window buffer. |
*/ |
.macro PREEMPTIBLE_HANDLER_TEMPLATE is_syscall |
/* |
* ASSERT(%tl == 1) |
*/ |
rdpr %tl, %g3 |
cmp %g3, 1 |
be 1f |
nop |
0: ba 0b ! this is for debugging, if we ever get here |
nop ! it will be easy to find |
1: |
.if NOT(\is_syscall) |
rdpr %tstate, %g3 |
/* |
* One of the ways this handler can be invoked is after a nested MMU trap from |
* either spill_1_normal or fill_1_normal traps. Both of these traps manipulate |
* the CWP register. We deal with the situation by simulating the MMU trap |
* on TL=1 and restart the respective SAVE or RESTORE instruction once the MMU |
* trap is resolved. However, because we are in the wrong window from the |
* perspective of the MMU trap, we need to synchronize CWP with CWP from TL=0. |
*/ |
and %g3, TSTATE_CWP_MASK, %g4 |
wrpr %g4, 0, %cwp ! resynchronize CWP |
andcc %g3, TSTATE_PRIV_BIT, %g0 ! if this trap came from the privileged mode... |
bnz 0f ! ...skip setting of kernel stack and primary context |
nop |
.endif |
/* |
* Normal window spills will go to the userspace window buffer. |
*/ |
wrpr %g0, WSTATE_OTHER(0) | WSTATE_NORMAL(2), %wstate |
wrpr %g0, NWINDOWS - 1, %cleanwin ! prevent unnecessary clean_window exceptions |
/* |
* Switch to kernel stack. The old stack is |
* automatically saved in the old window's %sp |
* and the new window's %fp. |
*/ |
save %g6, -PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE, %sp |
.if \is_syscall |
/* |
* Copy arguments for the syscall to the new window. |
*/ |
mov %i0, %o0 |
mov %i1, %o1 |
mov %i2, %o2 |
mov %i3, %o3 |
mov %i4, %o4 |
mov %i5, %o5 |
.endif |
/* |
* Mark the CANRESTORE windows as OTHER windows. |
*/ |
rdpr %canrestore, %l0 |
wrpr %l0, %otherwin |
wrpr %g0, %canrestore |
/* |
* Switch to primary context 0. |
*/ |
mov VA_PRIMARY_CONTEXT_REG, %l0 |
stxa %g0, [%l0] ASI_DMMU |
rd %pc, %l0 |
flush %l0 |
.if NOT(\is_syscall) |
ba 1f |
nop |
0: |
save %sp, -PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE, %sp |
/* |
* At this moment, we are using the kernel stack |
* and have successfully allocated a register window. |
*/ |
1: |
.endif |
/* |
* Other window spills will go to the userspace window buffer |
* and normal spills will go to the kernel stack. |
*/ |
wrpr %g0, WSTATE_OTHER(0) | WSTATE_NORMAL(0), %wstate |
/* |
* Copy arguments. |
*/ |
mov %g1, %l0 |
.if NOT(\is_syscall) |
mov %g2, %o0 |
.else |
! store the syscall number on the stack as 7th argument |
stx %g2, [%sp + STACK_WINDOW_SAVE_AREA_SIZE + STACK_BIAS + STACK_ARG6] |
.endif |
/* |
* Save TSTATE, TPC and TNPC aside. |
*/ |
rdpr %tstate, %g1 |
rdpr %tpc, %g2 |
rdpr %tnpc, %g3 |
rd %y, %g4 |
stx %g1, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_TSTATE] |
stx %g2, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_TPC] |
stx %g3, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_TNPC] |
/* |
* Save the Y register. |
* This register is deprecated according to SPARC V9 specification |
* and is only present for backward compatibility with previous |
* versions of the SPARC architecture. |
* Surprisingly, gcc makes use of this register without a notice. |
*/ |
stx %g4, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_Y] |
wrpr %g0, 0, %tl |
wrpr %g0, PSTATE_PRIV_BIT | PSTATE_PEF_BIT, %pstate |
SAVE_GLOBALS |
.if NOT(\is_syscall) |
/* |
* Call the higher-level handler and pass istate as second parameter. |
*/ |
call %l0 |
add %sp, PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_TNPC, %o1 |
.else |
/* |
* Call the higher-level syscall handler. |
*/ |
call syscall_handler |
nop |
mov %o0, %i0 ! copy the value returned by the syscall |
.endif |
RESTORE_GLOBALS |
rdpr %pstate, %l1 ! we must preserve the PEF bit |
wrpr %g0, PSTATE_AG_BIT | PSTATE_PRIV_BIT, %pstate |
wrpr %g0, 1, %tl |
/* |
* Read TSTATE, TPC and TNPC from saved copy. |
*/ |
ldx [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_TSTATE], %g1 |
ldx [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_TPC], %g2 |
ldx [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_TNPC], %g3 |
/* |
* Copy PSTATE.PEF to the in-register copy of TSTATE. |
*/ |
and %l1, PSTATE_PEF_BIT, %l1 |
sllx %l1, TSTATE_PSTATE_SHIFT, %l1 |
sethi %hi(TSTATE_PEF_BIT), %g4 |
andn %g1, %g4, %g1 |
or %g1, %l1, %g1 |
/* |
* Restore TSTATE, TPC and TNPC from saved copies. |
*/ |
wrpr %g1, 0, %tstate |
wrpr %g2, 0, %tpc |
wrpr %g3, 0, %tnpc |
/* |
* Restore Y. |
*/ |
ldx [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_Y], %g4 |
wr %g4, %y |
/* |
* If OTHERWIN is zero, then all the userspace windows have been |
* spilled to kernel memory (i.e. register window buffer). Moreover, |
* if the scheduler was called in the meantime, all valid windows |
* belonging to other threads were spilled by context_restore(). |
* If OTHERWIN is non-zero, then some userspace windows are still |
* valid. Others might have been spilled. However, the CWP pointer |
* needs no fixing because the scheduler had not been called. |
*/ |
rdpr %otherwin, %l0 |
brnz %l0, 0f |
nop |
/* |
* OTHERWIN == 0 |
*/ |
/* |
* If TSTATE.CWP + 1 == CWP, then we still do not have to fix CWP. |
*/ |
and %g1, TSTATE_CWP_MASK, %l0 |
inc %l0 |
and %l0, NWINDOWS - 1, %l0 ! %l0 mod NWINDOWS |
rdpr %cwp, %l1 |
cmp %l0, %l1 |
bz 0f ! CWP is ok |
nop |
/* |
* Fix CWP. |
* In order to recapitulate, the input registers in the current |
* window are the output registers of the window to which we want |
* to restore. Because the fill trap fills only input and local |
* registers of a window, we need to preserve those output |
* registers manually. |
*/ |
mov %sp, %g2 |
stx %i0, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I0] |
stx %i1, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I1] |
stx %i2, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I2] |
stx %i3, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I3] |
stx %i4, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I4] |
stx %i5, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I5] |
stx %i6, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I6] |
stx %i7, [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I7] |
wrpr %l0, 0, %cwp |
mov %g2, %sp |
ldx [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I0], %i0 |
ldx [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I1], %i1 |
ldx [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I2], %i2 |
ldx [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I3], %i3 |
ldx [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I4], %i4 |
ldx [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I5], %i5 |
ldx [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I6], %i6 |
ldx [%sp + PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE + STACK_BIAS + SAVED_I7], %i7 |
/* |
* OTHERWIN != 0 or fall-through from the OTHERWIN == 0 case. |
* The CWP has already been restored to the value it had after the SAVE |
* at the beginning of this function. |
*/ |
0: |
.if NOT(\is_syscall) |
rdpr %tstate, %g1 |
andcc %g1, TSTATE_PRIV_BIT, %g0 ! if we are not returning to userspace..., |
bnz 1f ! ...skip restoring userspace windows |
nop |
.endif |
/* |
* Spills and fills will be processed by the {spill,fill}_1_normal |
* handlers. |
*/ |
wrpr %g0, WSTATE_OTHER(0) | WSTATE_NORMAL(1), %wstate |
/* |
* Set primary context according to secondary context. |
*/ |
wr %g0, ASI_DMMU, %asi |
ldxa [VA_SECONDARY_CONTEXT_REG] %asi, %g1 |
stxa %g1, [VA_PRIMARY_CONTEXT_REG] %asi |
rd %pc, %g1 |
flush %g1 |
rdpr %cwp, %g1 |
rdpr %otherwin, %g2 |
/* |
* Skip all OTHERWIN windows and descend to the first window |
* in the userspace window buffer. |
*/ |
sub %g1, %g2, %g3 |
dec %g3 |
and %g3, NWINDOWS - 1, %g3 |
wrpr %g3, 0, %cwp |
/* |
* CWP is now in the window last saved in the userspace window buffer. |
* Fill all windows stored in the buffer. |
*/ |
clr %g4 |
set PAGE_SIZE - 1, %g5 |
0: andcc %g7, %g5, %g0 ! PAGE_SIZE alignment check |
bz 0f ! %g7 is page-aligned, no more windows to refill |
nop |
add %g7, -STACK_WINDOW_SAVE_AREA_SIZE, %g7 |
ldx [%g7 + L0_OFFSET], %l0 |
ldx [%g7 + L1_OFFSET], %l1 |
ldx [%g7 + L2_OFFSET], %l2 |
ldx [%g7 + L3_OFFSET], %l3 |
ldx [%g7 + L4_OFFSET], %l4 |
ldx [%g7 + L5_OFFSET], %l5 |
ldx [%g7 + L6_OFFSET], %l6 |
ldx [%g7 + L7_OFFSET], %l7 |
ldx [%g7 + I0_OFFSET], %i0 |
ldx [%g7 + I1_OFFSET], %i1 |
ldx [%g7 + I2_OFFSET], %i2 |
ldx [%g7 + I3_OFFSET], %i3 |
ldx [%g7 + I4_OFFSET], %i4 |
ldx [%g7 + I5_OFFSET], %i5 |
ldx [%g7 + I6_OFFSET], %i6 |
ldx [%g7 + I7_OFFSET], %i7 |
dec %g3 |
and %g3, NWINDOWS - 1, %g3 |
wrpr %g3, 0, %cwp ! switch to the preceeding window |
ba 0b |
inc %g4 |
0: |
/* |
* Switch back to the proper current window and adjust |
* OTHERWIN, CANRESTORE, CANSAVE and CLEANWIN. |
*/ |
wrpr %g1, 0, %cwp |
add %g4, %g2, %g2 |
cmp %g2, NWINDOWS - 2 |
bg 2f ! fix the CANRESTORE=NWINDOWS-1 anomaly |
mov NWINDOWS - 2, %g1 ! use dealy slot for both cases |
sub %g1, %g2, %g1 |
wrpr %g0, 0, %otherwin |
wrpr %g1, 0, %cansave ! NWINDOWS - 2 - CANRESTORE |
wrpr %g2, 0, %canrestore ! OTHERWIN + windows in the buffer |
wrpr %g2, 0, %cleanwin ! avoid information leak |
1: |
restore |
.if \is_syscall |
done |
.else |
retry |
.endif |
/* |
* We got here in order to avoid inconsistency of the window state registers. |
* If the: |
* |
* save %g6, -PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE, %sp |
* |
* instruction trapped and spilled a register window into the userspace |
* window buffer, we have just restored NWINDOWS - 1 register windows. |
* However, CANRESTORE can be only NWINDOW - 2 at most. |
* |
* The solution is to manually switch to (CWP - 1) mod NWINDOWS |
* and set the window state registers so that: |
* |
* CANRESTORE = NWINDOWS - 2 |
* CLEANWIN = NWINDOWS - 2 |
* CANSAVE = 0 |
* OTHERWIN = 0 |
* |
* The RESTORE instruction is therfore to be skipped. |
*/ |
2: |
wrpr %g0, 0, %otherwin |
wrpr %g0, 0, %cansave |
wrpr %g1, 0, %canrestore |
wrpr %g1, 0, %cleanwin |
rdpr %cwp, %g1 |
dec %g1 |
and %g1, NWINDOWS - 1, %g1 |
wrpr %g1, 0, %cwp ! CWP-- |
.if \is_syscall |
done |
.else |
retry |
.endif |
.endm |
.global preemptible_handler |
preemptible_handler: |
PREEMPTIBLE_HANDLER_TEMPLATE 0 |
.global trap_instruction_handler |
trap_instruction_handler: |
PREEMPTIBLE_HANDLER_TEMPLATE 1 |
/tags/0.3.0/kernel/arch/sparc64/src/trap/exception.c |
---|
0,0 → 1,220 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64interrupt |
* @{ |
*/ |
/** @file |
* |
*/ |
#include <arch/trap/exception.h> |
#include <arch/mm/tlb.h> |
#include <arch/interrupt.h> |
#include <interrupt.h> |
#include <arch/asm.h> |
#include <arch/register.h> |
#include <debug.h> |
#include <symtab.h> |
#include <print.h> |
void dump_istate(istate_t *istate) |
{ |
printf("TSTATE=%#llx\n", istate->tstate); |
printf("TPC=%#llx (%s)\n", istate->tpc, get_symtab_entry(istate->tpc)); |
printf("TNPC=%#llx (%s)\n", istate->tnpc, get_symtab_entry(istate->tnpc)); |
} |
/** Handle instruction_access_exception. (0x8) */ |
void instruction_access_exception(int n, istate_t *istate) |
{ |
fault_if_from_uspace(istate, "%s\n", __func__); |
dump_istate(istate); |
panic("%s\n", __func__); |
} |
/** Handle instruction_access_error. (0xa) */ |
void instruction_access_error(int n, istate_t *istate) |
{ |
fault_if_from_uspace(istate, "%s\n", __func__); |
dump_istate(istate); |
panic("%s\n", __func__); |
} |
/** Handle illegal_instruction. (0x10) */ |
void illegal_instruction(int n, istate_t *istate) |
{ |
fault_if_from_uspace(istate, "%s\n", __func__); |
dump_istate(istate); |
panic("%s\n", __func__); |
} |
/** Handle privileged_opcode. (0x11) */ |
void privileged_opcode(int n, istate_t *istate) |
{ |
fault_if_from_uspace(istate, "%s\n", __func__); |
dump_istate(istate); |
panic("%s\n", __func__); |
} |
/** Handle unimplemented_LDD. (0x12) */ |
void unimplemented_LDD(int n, istate_t *istate) |
{ |
fault_if_from_uspace(istate, "%s\n", __func__); |
dump_istate(istate); |
panic("%s\n", __func__); |
} |
/** Handle unimplemented_STD. (0x13) */ |
void unimplemented_STD(int n, istate_t *istate) |
{ |
fault_if_from_uspace(istate, "%s\n", __func__); |
dump_istate(istate); |
panic("%s\n", __func__); |
} |
/** Handle fp_disabled. (0x20) */ |
void fp_disabled(int n, istate_t *istate) |
{ |
fprs_reg_t fprs; |
fprs.value = fprs_read(); |
if (!fprs.fef) { |
fprs.fef = true; |
fprs_write(fprs.value); |
return; |
} |
#ifdef CONFIG_FPU_LAZY |
scheduler_fpu_lazy_request(); |
#else |
fault_if_from_uspace(istate, "%s\n", __func__); |
dump_istate(istate); |
panic("%s\n", __func__); |
#endif |
} |
/** Handle fp_exception_ieee_754. (0x21) */ |
void fp_exception_ieee_754(int n, istate_t *istate) |
{ |
fault_if_from_uspace(istate, "%s\n", __func__); |
dump_istate(istate); |
panic("%s\n", __func__); |
} |
/** Handle fp_exception_other. (0x22) */ |
void fp_exception_other(int n, istate_t *istate) |
{ |
fault_if_from_uspace(istate, "%s\n", __func__); |
dump_istate(istate); |
panic("%s\n", __func__); |
} |
/** Handle tag_overflow. (0x23) */ |
void tag_overflow(int n, istate_t *istate) |
{ |
fault_if_from_uspace(istate, "%s\n", __func__); |
dump_istate(istate); |
panic("%s\n", __func__); |
} |
/** Handle division_by_zero. (0x28) */ |
void division_by_zero(int n, istate_t *istate) |
{ |
fault_if_from_uspace(istate, "%s\n", __func__); |
dump_istate(istate); |
panic("%s\n", __func__); |
} |
/** Handle data_access_exception. (0x30) */ |
void data_access_exception(int n, istate_t *istate) |
{ |
fault_if_from_uspace(istate, "%s\n", __func__); |
dump_istate(istate); |
dump_sfsr_and_sfar(); |
panic("%s\n", __func__); |
} |
/** Handle data_access_error. (0x32) */ |
void data_access_error(int n, istate_t *istate) |
{ |
fault_if_from_uspace(istate, "%s\n", __func__); |
dump_istate(istate); |
panic("%s\n", __func__); |
} |
/** Handle mem_address_not_aligned. (0x34) */ |
void mem_address_not_aligned(int n, istate_t *istate) |
{ |
fault_if_from_uspace(istate, "%s\n", __func__); |
dump_istate(istate); |
panic("%s\n", __func__); |
} |
/** Handle LDDF_mem_address_not_aligned. (0x35) */ |
void LDDF_mem_address_not_aligned(int n, istate_t *istate) |
{ |
fault_if_from_uspace(istate, "%s\n", __func__); |
dump_istate(istate); |
panic("%s\n", __func__); |
} |
/** Handle STDF_mem_address_not_aligned. (0x36) */ |
void STDF_mem_address_not_aligned(int n, istate_t *istate) |
{ |
fault_if_from_uspace(istate, "%s\n", __func__); |
dump_istate(istate); |
panic("%s\n", __func__); |
} |
/** Handle privileged_action. (0x37) */ |
void privileged_action(int n, istate_t *istate) |
{ |
fault_if_from_uspace(istate, "%s\n", __func__); |
dump_istate(istate); |
panic("%s\n", __func__); |
} |
/** Handle LDQF_mem_address_not_aligned. (0x38) */ |
void LDQF_mem_address_not_aligned(int n, istate_t *istate) |
{ |
fault_if_from_uspace(istate, "%s\n", __func__); |
dump_istate(istate); |
panic("%s\n", __func__); |
} |
/** Handle STQF_mem_address_not_aligned. (0x39) */ |
void STQF_mem_address_not_aligned(int n, istate_t *istate) |
{ |
fault_if_from_uspace(istate, "%s\n", __func__); |
dump_istate(istate); |
panic("%s\n", __func__); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/src/trap/interrupt.c |
---|
0,0 → 1,110 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64interrupt |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/interrupt.h> |
#include <arch/sparc64.h> |
#include <arch/trap/interrupt.h> |
#include <interrupt.h> |
#include <ddi/irq.h> |
#include <arch/types.h> |
#include <debug.h> |
#include <arch/asm.h> |
#include <arch/barrier.h> |
#include <print.h> |
#include <arch.h> |
#include <mm/tlb.h> |
#include <config.h> |
#include <synch/spinlock.h> |
/** Register Interrupt Level Handler. |
* |
* @param n Interrupt Level (1 - 15). |
* @param name Short descriptive string. |
* @param f Handler. |
*/ |
void interrupt_register(int n, const char *name, iroutine f) |
{ |
ASSERT(n >= IVT_FIRST && n <= IVT_ITEMS); |
exc_register(n - 1, name, f); |
} |
/** Process hardware interrupt. |
* |
* @param n Ignored. |
* @param istate Ignored. |
*/ |
void interrupt(int n, istate_t *istate) |
{ |
uint64_t intrcv; |
uint64_t data0; |
intrcv = asi_u64_read(ASI_INTR_RECEIVE, 0); |
data0 = asi_u64_read(ASI_UDB_INTR_R, ASI_UDB_INTR_R_DATA_0); |
irq_t *irq = irq_dispatch_and_lock(data0); |
if (irq) { |
/* |
* The IRQ handler was found. |
*/ |
irq->handler(irq, irq->arg); |
spinlock_unlock(&irq->lock); |
} else if (data0 > config.base) { |
/* |
* This is a cross-call. |
* data0 contains address of the kernel function. |
* We call the function only after we verify |
* it is one of the supported ones. |
*/ |
#ifdef CONFIG_SMP |
if (data0 == (uintptr_t) tlb_shootdown_ipi_recv) { |
tlb_shootdown_ipi_recv(); |
} |
#endif |
} else { |
/* |
* Spurious interrupt. |
*/ |
#ifdef CONFIG_DEBUG |
printf("cpu%d: spurious interrupt (intrcv=%#llx, " |
"data0=%#llx)\n", CPU->id, intrcv, data0); |
#endif |
} |
membar(); |
asi_u64_write(ASI_INTR_RECEIVE, 0, 0); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/src/trap/trap.c |
---|
0,0 → 1,54 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64interrupt |
* @{ |
*/ |
/** @file |
* |
*/ |
#include <arch/trap/trap.h> |
#include <arch/trap/trap_table.h> |
#include <arch/trap/regwin.h> |
#include <arch/trap/exception.h> |
#include <arch/trap/interrupt.h> |
#include <arch/trap/mmu.h> |
#include <arch/asm.h> |
#include <memstr.h> |
#include <debug.h> |
#include <arch/types.h> |
#include <arch/drivers/tick.h> |
/** Initialize trap table. */ |
void trap_init(void) |
{ |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/src/trap/mmu.S |
---|
0,0 → 1,42 |
# |
# Copyright (c) 2006 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
/** |
* @file |
* @brief MMU trap handlers that do not fit into the trap table. |
*/ |
.register %g2, #scratch |
.register %g3, #scratch |
.text |
#include <arch/trap/mmu.h> |
#include <arch/trap/trap_table.h> |
#include <arch/regdef.h> |
/tags/0.3.0/kernel/arch/sparc64/src/drivers/scr.c |
---|
0,0 → 1,182 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64 |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/drivers/scr.h> |
#include <genarch/ofw/ofw_tree.h> |
#include <genarch/fb/fb.h> |
#include <genarch/fb/visuals.h> |
#include <arch/types.h> |
#include <func.h> |
#include <align.h> |
#include <print.h> |
#define FFB_REG_24BPP 7 |
scr_type_t scr_type = SCR_UNKNOWN; |
/** Initialize screen. |
* |
* Traverse OpenFirmware device tree in order to find necessary |
* info about the screen device. |
* |
* @param node Screen device node. |
*/ |
void scr_init(ofw_tree_node_t *node) |
{ |
ofw_tree_property_t *prop; |
const char *name; |
name = ofw_tree_node_name(node); |
if (strcmp(name, "SUNW,m64B") == 0) |
scr_type = SCR_ATYFB; |
else if (strcmp(name, "SUNW,ffb") == 0) |
scr_type = SCR_FFB; |
else if (strcmp(name, "cgsix") == 0) |
scr_type = SCR_CGSIX; |
if (scr_type == SCR_UNKNOWN) { |
printf("Unknown keyboard device.\n"); |
return; |
} |
uintptr_t fb_addr; |
uint32_t fb_width = 0; |
uint32_t fb_height = 0; |
uint32_t fb_depth = 0; |
uint32_t fb_linebytes = 0; |
uint32_t fb_scanline = 0; |
unsigned int visual; |
prop = ofw_tree_getprop(node, "width"); |
if (prop && prop->value) |
fb_width = *((uint32_t *) prop->value); |
prop = ofw_tree_getprop(node, "height"); |
if (prop && prop->value) |
fb_height = *((uint32_t *) prop->value); |
prop = ofw_tree_getprop(node, "depth"); |
if (prop && prop->value) |
fb_depth = *((uint32_t *) prop->value); |
prop = ofw_tree_getprop(node, "linebytes"); |
if (prop && prop->value) |
fb_linebytes = *((uint32_t *) prop->value); |
prop = ofw_tree_getprop(node, "reg"); |
if (!prop) |
panic("Can't find \"reg\" property.\n"); |
switch (scr_type) { |
case SCR_ATYFB: |
if (prop->size / sizeof(ofw_pci_reg_t) < 2) { |
printf("Too few screen registers.\n"); |
return; |
} |
ofw_pci_reg_t *fb_reg = &((ofw_pci_reg_t *) prop->value)[1]; |
ofw_pci_reg_t abs_reg; |
if (!ofw_pci_reg_absolutize(node, fb_reg, &abs_reg)) { |
printf("Failed to absolutize fb register.\n"); |
return; |
} |
if (!ofw_pci_apply_ranges(node->parent, &abs_reg , &fb_addr)) { |
printf("Failed to determine screen address.\n"); |
return; |
} |
switch (fb_depth) { |
case 8: |
fb_scanline = fb_linebytes * (fb_depth >> 3); |
visual = VISUAL_INDIRECT_8; |
break; |
case 16: |
fb_scanline = fb_linebytes * (fb_depth >> 3); |
visual = VISUAL_RGB_5_6_5; |
break; |
case 24: |
fb_scanline = fb_linebytes * 4; |
visual = VISUAL_RGB_8_8_8_0; |
break; |
case 32: |
fb_scanline = fb_linebytes * (fb_depth >> 3); |
visual = VISUAL_RGB_0_8_8_8; |
break; |
default: |
printf("Unsupported bits per pixel.\n"); |
return; |
} |
break; |
case SCR_FFB: |
fb_scanline = 8192; |
visual = VISUAL_BGR_0_8_8_8; |
ofw_upa_reg_t *reg = &((ofw_upa_reg_t *) prop->value)[FFB_REG_24BPP]; |
if (!ofw_upa_apply_ranges(node->parent, reg, &fb_addr)) { |
printf("Failed to determine screen address.\n"); |
return; |
} |
break; |
case SCR_CGSIX: |
switch (fb_depth) { |
case 8: |
fb_scanline = fb_linebytes; |
visual = VISUAL_INDIRECT_8; |
break; |
default: |
printf("Not implemented.\n"); |
return; |
} |
ofw_sbus_reg_t *cg6_reg = &((ofw_sbus_reg_t *) prop->value)[0]; |
if (!ofw_sbus_apply_ranges(node->parent, cg6_reg, &fb_addr)) { |
printf("Failed to determine screen address.\n"); |
return; |
} |
break; |
default: |
panic("Unexpected type.\n"); |
} |
fb_init(fb_addr, fb_width, fb_height, fb_scanline, visual); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/src/drivers/tick.c |
---|
0,0 → 1,109 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64 |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/drivers/tick.h> |
#include <arch/interrupt.h> |
#include <arch/sparc64.h> |
#include <arch/asm.h> |
#include <arch/register.h> |
#include <arch/cpu.h> |
#include <arch/boot/boot.h> |
#include <time/clock.h> |
#include <arch.h> |
#include <debug.h> |
#define TICK_RESTART_TIME 50 /* Worst case estimate. */ |
/** Initialize tick interrupt. */ |
void tick_init(void) |
{ |
tick_compare_reg_t compare; |
interrupt_register(14, "tick_int", tick_interrupt); |
compare.int_dis = false; |
compare.tick_cmpr = CPU->arch.clock_frequency / HZ; |
CPU->arch.next_tick_cmpr = compare.tick_cmpr; |
tick_compare_write(compare.value); |
tick_write(0); |
} |
/** Process tick interrupt. |
* |
* @param n Interrupt Level, 14, (can be ignored) |
* @param istate Interrupted state. |
*/ |
void tick_interrupt(int n, istate_t *istate) |
{ |
softint_reg_t softint, clear; |
uint64_t drift; |
softint.value = softint_read(); |
/* |
* Make sure we are servicing interrupt_level_14 |
*/ |
ASSERT(n == 14); |
/* |
* Make sure we are servicing TICK_INT. |
*/ |
ASSERT(softint.tick_int); |
/* |
* Clear tick interrupt. |
*/ |
clear.value = 0; |
clear.tick_int = 1; |
clear_softint_write(clear.value); |
/* |
* Reprogram the compare register. |
* For now, we can ignore the potential of the registers to overflow. |
* On a 360MHz Ultra 60, the 63-bit compare counter will overflow in |
* about 812 years. If there was a 2GHz UltraSPARC computer, it would |
* overflow only in 146 years. |
*/ |
drift = tick_read() - CPU->arch.next_tick_cmpr; |
while (drift > CPU->arch.clock_frequency / HZ) { |
drift -= CPU->arch.clock_frequency / HZ; |
CPU->missed_clock_ticks++; |
} |
CPU->arch.next_tick_cmpr = tick_read() + |
(CPU->arch.clock_frequency / HZ) - drift; |
tick_compare_write(CPU->arch.next_tick_cmpr); |
clock(); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/src/drivers/fhc.c |
---|
0,0 → 1,119 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64 |
* @{ |
*/ |
/** |
* @file |
* @brief FireHose Controller (FHC) driver. |
* |
* Note that this driver is a result of reverse engineering |
* rather than implementation of a specification. This |
* is due to the fact that the FHC documentation is not |
* publicly available. |
*/ |
#include <arch/drivers/fhc.h> |
#include <arch/trap/interrupt.h> |
#include <mm/page.h> |
#include <mm/slab.h> |
#include <arch/types.h> |
#include <genarch/ofw/ofw_tree.h> |
fhc_t *central_fhc = NULL; |
/** |
* I suspect this must be hardcoded in the FHC. |
* If it is not, than we can read all IMAP registers |
* and get the complete mapping. |
*/ |
#define FHC_UART_INR 0x39 |
#define FHC_UART_IMAP 0x0 |
#define FHC_UART_ICLR 0x4 |
#define UART_IMAP_REG 4 |
fhc_t *fhc_init(ofw_tree_node_t *node) |
{ |
fhc_t *fhc; |
ofw_tree_property_t *prop; |
prop = ofw_tree_getprop(node, "reg"); |
if (!prop || !prop->value) |
return NULL; |
count_t regs = prop->size / sizeof(ofw_central_reg_t); |
if (regs + 1 < UART_IMAP_REG) |
return NULL; |
ofw_central_reg_t *reg = &((ofw_central_reg_t *) prop->value)[UART_IMAP_REG]; |
uintptr_t paddr; |
if (!ofw_central_apply_ranges(node->parent, reg, &paddr)) |
return NULL; |
fhc = (fhc_t *) malloc(sizeof(fhc_t), FRAME_ATOMIC); |
if (!fhc) |
return NULL; |
fhc->uart_imap = (uint32_t *) hw_map(paddr, reg->size); |
return fhc; |
} |
void fhc_enable_interrupt(fhc_t *fhc, int inr) |
{ |
switch (inr) { |
case FHC_UART_INR: |
fhc->uart_imap[FHC_UART_IMAP] |= IMAP_V_MASK; |
break; |
default: |
panic("Unexpected INR (%d)\n", inr); |
break; |
} |
} |
void fhc_clear_interrupt(fhc_t *fhc, int inr) |
{ |
ASSERT(fhc->uart_imap); |
switch (inr) { |
case FHC_UART_INR: |
fhc->uart_imap[FHC_UART_ICLR] = 0; |
break; |
default: |
panic("Unexpected INR (%d)\n", inr); |
break; |
} |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/src/drivers/kbd.c |
---|
0,0 → 1,159 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64 |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/drivers/kbd.h> |
#include <genarch/ofw/ofw_tree.h> |
#ifdef CONFIG_Z8530 |
#include <genarch/kbd/z8530.h> |
#endif |
#ifdef CONFIG_NS16550 |
#include <genarch/kbd/ns16550.h> |
#endif |
#include <ddi/device.h> |
#include <ddi/irq.h> |
#include <arch/mm/page.h> |
#include <arch/types.h> |
#include <align.h> |
#include <func.h> |
#include <print.h> |
kbd_type_t kbd_type = KBD_UNKNOWN; |
/** Initialize keyboard. |
* |
* Traverse OpenFirmware device tree in order to find necessary |
* info about the keyboard device. |
* |
* @param node Keyboard device node. |
*/ |
void kbd_init(ofw_tree_node_t *node) |
{ |
size_t offset; |
uintptr_t aligned_addr; |
ofw_tree_property_t *prop; |
const char *name; |
name = ofw_tree_node_name(node); |
/* |
* Determine keyboard serial controller type. |
*/ |
if (strcmp(name, "zs") == 0) |
kbd_type = KBD_Z8530; |
else if (strcmp(name, "su") == 0) |
kbd_type = KBD_NS16550; |
if (kbd_type == KBD_UNKNOWN) { |
printf("Unknown keyboard device.\n"); |
return; |
} |
/* |
* Read 'interrupts' property. |
*/ |
uint32_t interrupts; |
prop = ofw_tree_getprop(node, "interrupts"); |
if (!prop || !prop->value) |
panic("Can't find \"interrupts\" property.\n"); |
interrupts = *((uint32_t *) prop->value); |
/* |
* Read 'reg' property. |
*/ |
prop = ofw_tree_getprop(node, "reg"); |
if (!prop || !prop->value) |
panic("Can't find \"reg\" property.\n"); |
uintptr_t pa; |
size_t size; |
inr_t inr; |
devno_t devno = device_assign_devno(); |
switch (kbd_type) { |
case KBD_Z8530: |
size = ((ofw_fhc_reg_t *) prop->value)->size; |
if (!ofw_fhc_apply_ranges(node->parent, ((ofw_fhc_reg_t *) prop->value) , &pa)) { |
printf("Failed to determine keyboard address.\n"); |
return; |
} |
if (!ofw_fhc_map_interrupt(node->parent, ((ofw_fhc_reg_t *) prop->value), interrupts, &inr)) { |
printf("Failed to determine keyboard interrupt.\n"); |
return; |
} |
break; |
case KBD_NS16550: |
size = ((ofw_ebus_reg_t *) prop->value)->size; |
if (!ofw_ebus_apply_ranges(node->parent, ((ofw_ebus_reg_t *) prop->value) , &pa)) { |
printf("Failed to determine keyboard address.\n"); |
return; |
} |
if (!ofw_ebus_map_interrupt(node->parent, ((ofw_ebus_reg_t *) prop->value), interrupts, &inr)) { |
printf("Failed to determine keyboard interrupt.\n"); |
return; |
}; |
break; |
default: |
panic("Unexpected type.\n"); |
} |
/* |
* We need to pass aligned address to hw_map(). |
* However, the physical keyboard address can |
* be pretty much unaligned, depending on the |
* underlying controller. |
*/ |
aligned_addr = ALIGN_DOWN(pa, PAGE_SIZE); |
offset = pa - aligned_addr; |
uintptr_t vaddr = hw_map(aligned_addr, offset + size) + offset; |
switch (kbd_type) { |
#ifdef CONFIG_Z8530 |
case KBD_Z8530: |
z8530_init(devno, inr, vaddr); |
break; |
#endif |
#ifdef CONFIG_NS16550 |
case KBD_NS16550: |
ns16550_init(devno, inr, vaddr); |
break; |
#endif |
default: |
printf("Kernel is not compiled with the necessary keyboard driver this machine requires.\n"); |
} |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/src/drivers/pci.c |
---|
0,0 → 1,231 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64 |
* @{ |
*/ |
/** |
* @file |
* @brief PCI driver. |
*/ |
#include <arch/drivers/pci.h> |
#include <genarch/ofw/ofw_tree.h> |
#include <arch/trap/interrupt.h> |
#include <mm/page.h> |
#include <mm/slab.h> |
#include <arch/types.h> |
#include <debug.h> |
#include <print.h> |
#include <func.h> |
#include <arch/asm.h> |
#define PCI_SABRE_REGS_REG 0 |
#define PCI_SABRE_IMAP_BASE 0x200 |
#define PCI_SABRE_ICLR_BASE 0x300 |
#define PCI_PSYCHO_REGS_REG 2 |
#define PCI_PSYCHO_IMAP_BASE 0x200 |
#define PCI_PSYCHO_ICLR_BASE 0x300 |
static pci_t *pci_sabre_init(ofw_tree_node_t *node); |
static void pci_sabre_enable_interrupt(pci_t *pci, int inr); |
static void pci_sabre_clear_interrupt(pci_t *pci, int inr); |
static pci_t *pci_psycho_init(ofw_tree_node_t *node); |
static void pci_psycho_enable_interrupt(pci_t *pci, int inr); |
static void pci_psycho_clear_interrupt(pci_t *pci, int inr); |
/** PCI operations for Sabre model. */ |
static pci_operations_t pci_sabre_ops = { |
.enable_interrupt = pci_sabre_enable_interrupt, |
.clear_interrupt = pci_sabre_clear_interrupt |
}; |
/** PCI operations for Psycho model. */ |
static pci_operations_t pci_psycho_ops = { |
.enable_interrupt = pci_psycho_enable_interrupt, |
.clear_interrupt = pci_psycho_clear_interrupt |
}; |
/** Initialize PCI controller (model Sabre). |
* |
* @param node OpenFirmware device tree node of the Sabre. |
* |
* @return Address of the initialized PCI structure. |
*/ |
pci_t *pci_sabre_init(ofw_tree_node_t *node) |
{ |
pci_t *pci; |
ofw_tree_property_t *prop; |
/* |
* Get registers. |
*/ |
prop = ofw_tree_getprop(node, "reg"); |
if (!prop || !prop->value) |
return NULL; |
ofw_upa_reg_t *reg = prop->value; |
count_t regs = prop->size / sizeof(ofw_upa_reg_t); |
if (regs < PCI_SABRE_REGS_REG + 1) |
return NULL; |
uintptr_t paddr; |
if (!ofw_upa_apply_ranges(node->parent, ®[PCI_SABRE_REGS_REG], &paddr)) |
return NULL; |
pci = (pci_t *) malloc(sizeof(pci_t), FRAME_ATOMIC); |
if (!pci) |
return NULL; |
pci->model = PCI_SABRE; |
pci->op = &pci_sabre_ops; |
pci->reg = (uint64_t *) hw_map(paddr, reg[PCI_SABRE_REGS_REG].size); |
return pci; |
} |
/** Initialize the Psycho PCI controller. |
* |
* @param node OpenFirmware device tree node of the Psycho. |
* |
* @return Address of the initialized PCI structure. |
*/ |
pci_t *pci_psycho_init(ofw_tree_node_t *node) |
{ |
pci_t *pci; |
ofw_tree_property_t *prop; |
/* |
* Get registers. |
*/ |
prop = ofw_tree_getprop(node, "reg"); |
if (!prop || !prop->value) |
return NULL; |
ofw_upa_reg_t *reg = prop->value; |
count_t regs = prop->size / sizeof(ofw_upa_reg_t); |
if (regs < PCI_PSYCHO_REGS_REG + 1) |
return NULL; |
uintptr_t paddr; |
if (!ofw_upa_apply_ranges(node->parent, ®[PCI_PSYCHO_REGS_REG], &paddr)) |
return NULL; |
pci = (pci_t *) malloc(sizeof(pci_t), FRAME_ATOMIC); |
if (!pci) |
return NULL; |
pci->model = PCI_PSYCHO; |
pci->op = &pci_psycho_ops; |
pci->reg = (uint64_t *) hw_map(paddr, reg[PCI_PSYCHO_REGS_REG].size); |
return pci; |
} |
void pci_sabre_enable_interrupt(pci_t *pci, int inr) |
{ |
pci->reg[PCI_SABRE_IMAP_BASE + (inr & INO_MASK)] |= IMAP_V_MASK; |
} |
void pci_sabre_clear_interrupt(pci_t *pci, int inr) |
{ |
pci->reg[PCI_SABRE_ICLR_BASE + (inr & INO_MASK)] = 0; |
} |
void pci_psycho_enable_interrupt(pci_t *pci, int inr) |
{ |
pci->reg[PCI_PSYCHO_IMAP_BASE + (inr & INO_MASK)] |= IMAP_V_MASK; |
} |
void pci_psycho_clear_interrupt(pci_t *pci, int inr) |
{ |
pci->reg[PCI_PSYCHO_ICLR_BASE + (inr & INO_MASK)] = 0; |
} |
/** Initialize PCI controller. */ |
pci_t *pci_init(ofw_tree_node_t *node) |
{ |
ofw_tree_property_t *prop; |
/* |
* First, verify this is a PCI node. |
*/ |
ASSERT(strcmp(ofw_tree_node_name(node), "pci") == 0); |
/* |
* Determine PCI controller model. |
*/ |
prop = ofw_tree_getprop(node, "model"); |
if (!prop || !prop->value) |
return NULL; |
if (strcmp(prop->value, "SUNW,sabre") == 0) { |
/* |
* PCI controller Sabre. |
* This model is found on UltraSPARC IIi based machines. |
*/ |
return pci_sabre_init(node); |
} else if (strcmp(prop->value, "SUNW,psycho") == 0) { |
/* |
* PCI controller Psycho. |
* Used on UltraSPARC II based processors, for instance, |
* on Ultra 60. |
*/ |
return pci_psycho_init(node); |
} else { |
/* |
* Unsupported model. |
*/ |
printf("Unsupported PCI controller model (%s).\n", prop->value); |
} |
return NULL; |
} |
void pci_enable_interrupt(pci_t *pci, int inr) |
{ |
ASSERT(pci->model); |
ASSERT(pci->op && pci->op->enable_interrupt); |
pci->op->enable_interrupt(pci, inr); |
} |
void pci_clear_interrupt(pci_t *pci, int inr) |
{ |
ASSERT(pci->model); |
ASSERT(pci->op && pci->op->clear_interrupt); |
pci->op->clear_interrupt(pci, inr); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/src/proc/scheduler.c |
---|
0,0 → 1,83 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64proc |
* @{ |
*/ |
/** @file |
*/ |
#include <proc/scheduler.h> |
#include <proc/thread.h> |
#include <arch.h> |
#include <arch/asm.h> |
#include <arch/stack.h> |
/** Perform sparc64 specific tasks needed before the new task is run. */ |
void before_task_runs_arch(void) |
{ |
} |
/** Perform sparc64 specific steps before scheduling a thread. |
* |
* For userspace threads, initialize reserved global registers in the alternate |
* and interrupt sets. |
*/ |
void before_thread_runs_arch(void) |
{ |
if ((THREAD->flags & THREAD_FLAG_USPACE)) { |
/* |
* Write kernel stack address to %g6 of the alternate and |
* interrupt global sets. |
* |
* Write pointer to the last item in the userspace window buffer |
* to %g7 in the alternate set. Write to the interrupt %g7 is |
* not necessary because: |
* - spill traps operate only in the alternate global set, |
* - preemptible trap handler switches to alternate globals |
* before it explicitly uses %g7. |
*/ |
uint64_t sp = (uintptr_t) THREAD->kstack + STACK_SIZE - |
(STACK_BIAS + ALIGN_UP(STACK_ITEM_SIZE, STACK_ALIGNMENT)); |
write_to_ig_g6(sp); |
write_to_ag_g6(sp); |
write_to_ag_g7((uintptr_t) THREAD->arch.uspace_window_buffer); |
} |
} |
/** Perform sparc64 specific steps before a thread stops running. */ |
void after_thread_ran_arch(void) |
{ |
if ((THREAD->flags & THREAD_FLAG_USPACE)) { |
/* sample the state of the userspace window buffer */ |
THREAD->arch.uspace_window_buffer = (uint8_t *) read_from_ag_g7(); |
} |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/src/proc/thread.c |
---|
0,0 → 1,84 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64proc |
* @{ |
*/ |
/** @file |
*/ |
#include <proc/thread.h> |
#include <arch/proc/thread.h> |
#include <mm/frame.h> |
#include <mm/page.h> |
#include <arch/mm/page.h> |
#include <align.h> |
void thr_constructor_arch(thread_t *t) |
{ |
/* |
* Allocate memory for uspace_window_buffer. |
*/ |
t->arch.uspace_window_buffer = NULL; |
} |
void thr_destructor_arch(thread_t *t) |
{ |
if (t->arch.uspace_window_buffer) { |
/* |
* Mind the possible alignment of the userspace window buffer |
* belonging to a killed thread. |
*/ |
frame_free(KA2PA(ALIGN_DOWN((uintptr_t) |
t->arch.uspace_window_buffer, PAGE_SIZE))); |
} |
} |
void thread_create_arch(thread_t *t) |
{ |
if ((t->flags & THREAD_FLAG_USPACE) && (!t->arch.uspace_window_buffer)) |
{ |
/* |
* The thread needs userspace window buffer and the object |
* returned from the slab allocator doesn't have any. |
*/ |
t->arch.uspace_window_buffer = frame_alloc(ONE_FRAME, FRAME_KA); |
} else { |
uintptr_t uw_buf = (uintptr_t) t->arch.uspace_window_buffer; |
/* |
* Mind the possible alignment of the userspace window buffer |
* belonging to a killed thread. |
*/ |
t->arch.uspace_window_buffer = (uint8_t *) ALIGN_DOWN(uw_buf, |
PAGE_SIZE); |
} |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/src/cpu/cpu.c |
---|
0,0 → 1,143 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64 |
* @{ |
*/ |
/** @file |
*/ |
#include <cpu.h> |
#include <arch.h> |
#include <genarch/ofw/ofw_tree.h> |
#include <arch/drivers/tick.h> |
#include <print.h> |
/** Perform sparc64 specific initialization of the processor structure for the |
* current processor. |
*/ |
void cpu_arch_init(void) |
{ |
ofw_tree_node_t *node; |
uint32_t mid; |
uint32_t clock_frequency = 0; |
upa_config_t upa_config; |
upa_config.value = upa_config_read(); |
CPU->arch.mid = upa_config.mid; |
/* |
* Detect processor frequency. |
*/ |
node = ofw_tree_find_child_by_device_type(ofw_tree_lookup("/"), "cpu"); |
while (node) { |
ofw_tree_property_t *prop; |
prop = ofw_tree_getprop(node, "upa-portid"); |
if (prop && prop->value) { |
mid = *((uint32_t *) prop->value); |
if (mid == CPU->arch.mid) { |
prop = ofw_tree_getprop(node, |
"clock-frequency"); |
if (prop && prop->value) |
clock_frequency = *((uint32_t *) |
prop->value); |
} |
} |
node = ofw_tree_find_peer_by_device_type(node, "cpu"); |
} |
CPU->arch.clock_frequency = clock_frequency; |
tick_init(); |
} |
/** Read version information from the current processor. */ |
void cpu_identify(void) |
{ |
CPU->arch.ver.value = ver_read(); |
} |
/** Print version information for a processor. |
* |
* This function is called by the bootstrap processor. |
* |
* @param m Processor structure of the CPU for which version information is to |
* be printed. |
*/ |
void cpu_print_report(cpu_t *m) |
{ |
char *manuf, *impl; |
switch (m->arch.ver.manuf) { |
case MANUF_FUJITSU: |
manuf = "Fujitsu"; |
break; |
case MANUF_ULTRASPARC: |
manuf = "UltraSPARC"; |
break; |
case MANUF_SUN: |
manuf = "Sun"; |
break; |
default: |
manuf = "Unknown"; |
break; |
} |
switch (CPU->arch.ver.impl) { |
case IMPL_ULTRASPARCI: |
impl = "UltraSPARC I"; |
break; |
case IMPL_ULTRASPARCII: |
impl = "UltraSPARC II"; |
break; |
case IMPL_ULTRASPARCII_I: |
impl = "UltraSPARC IIi"; |
break; |
case IMPL_ULTRASPARCII_E: |
impl = "UltraSPARC IIe"; |
break; |
case IMPL_ULTRASPARCIII: |
impl = "UltraSPARC III"; |
break; |
case IMPL_ULTRASPARCIV_PLUS: |
impl = "UltraSPARC IV+"; |
break; |
case IMPL_SPARC64V: |
impl = "SPARC 64V"; |
break; |
default: |
impl = "Unknown"; |
break; |
} |
printf("cpu%d: manuf=%s, impl=%s, mask=%d (%dMHz)\n", m->id, manuf, |
impl, m->arch.ver.mask, m->arch.clock_frequency / 1000000); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/src/asm.S |
---|
0,0 → 1,306 |
# |
# Copyright (c) 2005 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
#include <arch/arch.h> |
#include <arch/stack.h> |
#include <arch/regdef.h> |
#include <arch/mm/mmu.h> |
.text |
.register %g2, #scratch |
.register %g3, #scratch |
/* |
* This is the assembly language version of our _memcpy() generated by gcc. |
*/ |
.global memcpy |
memcpy: |
add %o1, 7, %g1 |
and %g1, -8, %g1 |
cmp %o1, %g1 |
be,pn %xcc, 3f |
add %o0, 7, %g1 |
mov 0, %g3 |
0: |
brz,pn %o2, 2f |
mov 0, %g2 |
1: |
ldub [%g3 + %o1], %g1 |
add %g2, 1, %g2 |
cmp %o2, %g2 |
stb %g1, [%g3 + %o0] |
bne,pt %xcc, 1b |
mov %g2, %g3 |
2: |
jmp %o7 + 8 ! exit point |
mov %o1, %o0 |
3: |
and %g1, -8, %g1 |
cmp %o0, %g1 |
bne,pt %xcc, 0b |
mov 0, %g3 |
srlx %o2, 3, %g4 |
brz,pn %g4, 5f |
mov 0, %g5 |
4: |
sllx %g3, 3, %g2 |
add %g5, 1, %g3 |
ldx [%o1 + %g2], %g1 |
mov %g3, %g5 |
cmp %g4, %g3 |
bne,pt %xcc, 4b |
stx %g1, [%o0 + %g2] |
5: |
and %o2, 7, %o2 |
brz,pn %o2, 2b |
sllx %g4, 3, %g1 |
mov 0, %g2 |
add %g1, %o0, %o0 |
add %g1, %o1, %g4 |
mov 0, %g3 |
6: |
ldub [%g2 + %g4], %g1 |
stb %g1, [%g2 + %o0] |
add %g3, 1, %g2 |
cmp %o2, %g2 |
bne,pt %xcc, 6b |
mov %g2, %g3 |
jmp %o7 + 8 ! exit point |
mov %o1, %o0 |
/* |
* Almost the same as memcpy() except the loads are from userspace. |
*/ |
.global memcpy_from_uspace |
memcpy_from_uspace: |
add %o1, 7, %g1 |
and %g1, -8, %g1 |
cmp %o1, %g1 |
be,pn %xcc, 3f |
add %o0, 7, %g1 |
mov 0, %g3 |
0: |
brz,pn %o2, 2f |
mov 0, %g2 |
1: |
lduba [%g3 + %o1] ASI_AIUS, %g1 |
add %g2, 1, %g2 |
cmp %o2, %g2 |
stb %g1, [%g3 + %o0] |
bne,pt %xcc, 1b |
mov %g2, %g3 |
2: |
jmp %o7 + 8 ! exit point |
mov %o1, %o0 |
3: |
and %g1, -8, %g1 |
cmp %o0, %g1 |
bne,pt %xcc, 0b |
mov 0, %g3 |
srlx %o2, 3, %g4 |
brz,pn %g4, 5f |
mov 0, %g5 |
4: |
sllx %g3, 3, %g2 |
add %g5, 1, %g3 |
ldxa [%o1 + %g2] ASI_AIUS, %g1 |
mov %g3, %g5 |
cmp %g4, %g3 |
bne,pt %xcc, 4b |
stx %g1, [%o0 + %g2] |
5: |
and %o2, 7, %o2 |
brz,pn %o2, 2b |
sllx %g4, 3, %g1 |
mov 0, %g2 |
add %g1, %o0, %o0 |
add %g1, %o1, %g4 |
mov 0, %g3 |
6: |
lduba [%g2 + %g4] ASI_AIUS, %g1 |
stb %g1, [%g2 + %o0] |
add %g3, 1, %g2 |
cmp %o2, %g2 |
bne,pt %xcc, 6b |
mov %g2, %g3 |
jmp %o7 + 8 ! exit point |
mov %o1, %o0 |
/* |
* Almost the same as memcpy() except the stores are to userspace. |
*/ |
.global memcpy_to_uspace |
memcpy_to_uspace: |
add %o1, 7, %g1 |
and %g1, -8, %g1 |
cmp %o1, %g1 |
be,pn %xcc, 3f |
add %o0, 7, %g1 |
mov 0, %g3 |
0: |
brz,pn %o2, 2f |
mov 0, %g2 |
1: |
ldub [%g3 + %o1], %g1 |
add %g2, 1, %g2 |
cmp %o2, %g2 |
stba %g1, [%g3 + %o0] ASI_AIUS |
bne,pt %xcc, 1b |
mov %g2, %g3 |
2: |
jmp %o7 + 8 ! exit point |
mov %o1, %o0 |
3: |
and %g1, -8, %g1 |
cmp %o0, %g1 |
bne,pt %xcc, 0b |
mov 0, %g3 |
srlx %o2, 3, %g4 |
brz,pn %g4, 5f |
mov 0, %g5 |
4: |
sllx %g3, 3, %g2 |
add %g5, 1, %g3 |
ldx [%o1 + %g2], %g1 |
mov %g3, %g5 |
cmp %g4, %g3 |
bne,pt %xcc, 4b |
stxa %g1, [%o0 + %g2] ASI_AIUS |
5: |
and %o2, 7, %o2 |
brz,pn %o2, 2b |
sllx %g4, 3, %g1 |
mov 0, %g2 |
add %g1, %o0, %o0 |
add %g1, %o1, %g4 |
mov 0, %g3 |
6: |
ldub [%g2 + %g4], %g1 |
stba %g1, [%g2 + %o0] ASI_AIUS |
add %g3, 1, %g2 |
cmp %o2, %g2 |
bne,pt %xcc, 6b |
mov %g2, %g3 |
jmp %o7 + 8 ! exit point |
mov %o1, %o0 |
.global memcpy_from_uspace_failover_address |
.global memcpy_to_uspace_failover_address |
memcpy_from_uspace_failover_address: |
memcpy_to_uspace_failover_address: |
jmp %o7 + 8 ! exit point |
mov %g0, %o0 ! return 0 on failure |
.global memsetb |
memsetb: |
b _memsetb |
nop |
.macro WRITE_ALTERNATE_REGISTER reg, bit |
rdpr %pstate, %g1 ! save PSTATE.PEF |
wrpr %g0, (\bit | PSTATE_PRIV_BIT), %pstate |
mov %o0, \reg |
wrpr %g0, PSTATE_PRIV_BIT, %pstate |
retl |
wrpr %g1, 0, %pstate ! restore PSTATE.PEF |
.endm |
.macro READ_ALTERNATE_REGISTER reg, bit |
rdpr %pstate, %g1 ! save PSTATE.PEF |
wrpr %g0, (\bit | PSTATE_PRIV_BIT), %pstate |
mov \reg, %o0 |
wrpr %g0, PSTATE_PRIV_BIT, %pstate |
retl |
wrpr %g1, 0, %pstate ! restore PSTATE.PEF |
.endm |
.global write_to_ag_g6 |
write_to_ag_g6: |
WRITE_ALTERNATE_REGISTER %g6, PSTATE_AG_BIT |
.global write_to_ag_g7 |
write_to_ag_g7: |
WRITE_ALTERNATE_REGISTER %g7, PSTATE_AG_BIT |
.global write_to_ig_g6 |
write_to_ig_g6: |
WRITE_ALTERNATE_REGISTER %g6, PSTATE_IG_BIT |
.global read_from_ag_g7 |
read_from_ag_g7: |
READ_ALTERNATE_REGISTER %g7, PSTATE_AG_BIT |
/** Switch to userspace. |
* |
* %o0 Userspace entry address. |
* %o1 Userspace stack pointer address. |
* %o2 Userspace address of uarg structure. |
*/ |
.global switch_to_userspace |
switch_to_userspace: |
save %o1, -STACK_WINDOW_SAVE_AREA_SIZE, %sp |
flushw |
wrpr %g0, 0, %cleanwin ! avoid information leak |
mov %i2, %o0 ! uarg |
clr %i2 |
clr %i3 |
clr %i4 |
clr %i5 |
clr %i6 |
wrpr %g0, 1, %tl ! enforce mapping via nucleus |
rdpr %cwp, %g1 |
wrpr %g1, TSTATE_IE_BIT, %tstate |
wrpr %i0, 0, %tnpc |
/* |
* Set primary context according to secondary context. |
* Secondary context has been already installed by |
* higher-level functions. |
*/ |
wr %g0, ASI_DMMU, %asi |
ldxa [VA_SECONDARY_CONTEXT_REG] %asi, %g1 |
stxa %g1, [VA_PRIMARY_CONTEXT_REG] %asi |
flush %i7 |
/* |
* Spills and fills will be handled by the userspace handlers. |
*/ |
wrpr %g0, WSTATE_OTHER(0) | WSTATE_NORMAL(1), %wstate |
done ! jump to userspace |
/tags/0.3.0/kernel/arch/sparc64/src/sparc64.c |
---|
0,0 → 1,165 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64 |
* @{ |
*/ |
/** @file |
*/ |
#include <arch.h> |
#include <debug.h> |
#include <config.h> |
#include <arch/trap/trap.h> |
#include <arch/console.h> |
#include <proc/thread.h> |
#include <console/console.h> |
#include <arch/boot/boot.h> |
#include <arch/arch.h> |
#include <arch/asm.h> |
#include <arch/mm/page.h> |
#include <arch/stack.h> |
#include <genarch/ofw/ofw_tree.h> |
#include <userspace.h> |
#include <ddi/irq.h> |
bootinfo_t bootinfo; |
/** Perform sparc64 specific initialization before main_bsp() is called. */ |
void arch_pre_main(void) |
{ |
/* Copy init task info. */ |
init.cnt = bootinfo.taskmap.count; |
uint32_t i; |
for (i = 0; i < bootinfo.taskmap.count; i++) { |
init.tasks[i].addr = (uintptr_t) bootinfo.taskmap.tasks[i].addr; |
init.tasks[i].size = bootinfo.taskmap.tasks[i].size; |
} |
/* Copy boot allocations info. */ |
ballocs.base = bootinfo.ballocs.base; |
ballocs.size = bootinfo.ballocs.size; |
ofw_tree_init(bootinfo.ofw_root); |
} |
/** Perform sparc64 specific initialization before mm is initialized. */ |
void arch_pre_mm_init(void) |
{ |
if (config.cpu_active == 1) |
trap_init(); |
} |
/** Perform sparc64 specific initialization afterr mm is initialized. */ |
void arch_post_mm_init(void) |
{ |
if (config.cpu_active == 1) { |
/* |
* We have 2^11 different interrupt vectors. |
* But we only create 128 buckets. |
*/ |
irq_init(1 << 11, 128); |
standalone_sparc64_console_init(); |
} |
} |
void arch_post_cpu_init(void) |
{ |
} |
void arch_pre_smp_init(void) |
{ |
} |
void arch_post_smp_init(void) |
{ |
static thread_t *t = NULL; |
if (!t) { |
/* |
* Create thread that polls keyboard. |
*/ |
t = thread_create(kkbdpoll, NULL, TASK, 0, "kkbdpoll", true); |
if (!t) |
panic("cannot create kkbdpoll\n"); |
thread_ready(t); |
} |
} |
/** Calibrate delay loop. |
* |
* On sparc64, we implement delay() by waiting for the TICK register to |
* reach a pre-computed value, as opposed to performing some pre-computed |
* amount of instructions of known duration. We set the delay_loop_const |
* to 1 in order to neutralize the multiplication done by delay(). |
*/ |
void calibrate_delay_loop(void) |
{ |
CPU->delay_loop_const = 1; |
} |
/** Wait several microseconds. |
* |
* We assume that interrupts are already disabled. |
* |
* @param t Microseconds to wait. |
*/ |
void asm_delay_loop(const uint32_t usec) |
{ |
uint64_t stop = tick_read() + (uint64_t) usec * (uint64_t) |
CPU->arch.clock_frequency / 1000000; |
while (tick_read() < stop) |
; |
} |
/** Switch to userspace. */ |
void userspace(uspace_arg_t *kernel_uarg) |
{ |
switch_to_userspace((uintptr_t) kernel_uarg->uspace_entry, |
((uintptr_t) kernel_uarg->uspace_stack) + STACK_SIZE |
- (ALIGN_UP(STACK_ITEM_SIZE, STACK_ALIGNMENT) + STACK_BIAS), |
(uintptr_t) kernel_uarg->uspace_uarg); |
for (;;) |
; |
/* not reached */ |
} |
void arch_reboot(void) |
{ |
// TODO |
while (1); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/src/ddi/ddi.c |
---|
0,0 → 1,55 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64ddi |
* @{ |
*/ |
/** @file |
*/ |
#include <ddi/ddi.h> |
#include <proc/task.h> |
#include <arch/types.h> |
/** Enable I/O space range for task. |
* |
* Interrupts are disabled and task is locked. |
* |
* @param task Task. |
* @param ioaddr Startign I/O space address. |
* @param size Size of the enabled I/O range. |
* |
* @return 0 on success or an error code from errno.h. |
*/ |
int ddi_iospace_enable_arch(task_t *task, uintptr_t ioaddr, size_t size) |
{ |
return 0; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/src/console.c |
---|
0,0 → 1,167 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64 |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/console.h> |
#include <arch/types.h> |
#include <arch/drivers/scr.h> |
#include <arch/drivers/kbd.h> |
#ifdef CONFIG_Z8530 |
#include <genarch/kbd/z8530.h> |
#endif |
#ifdef CONFIG_NS16550 |
#include <genarch/kbd/ns16550.h> |
#endif |
#include <console/chardev.h> |
#include <console/console.h> |
#include <arch/asm.h> |
#include <arch/register.h> |
#include <proc/thread.h> |
#include <arch/mm/tlb.h> |
#include <genarch/ofw/ofw_tree.h> |
#include <arch.h> |
#include <panic.h> |
#include <print.h> |
#define KEYBOARD_POLL_PAUSE 50000 /* 50ms */ |
/** Initialize kernel console to use framebuffer and keyboard directly. */ |
void standalone_sparc64_console_init(void) |
{ |
stdin = NULL; |
ofw_tree_node_t *aliases; |
ofw_tree_property_t *prop; |
ofw_tree_node_t *screen; |
ofw_tree_node_t *keyboard; |
aliases = ofw_tree_lookup("/aliases"); |
if (!aliases) |
panic("Can't find /aliases.\n"); |
prop = ofw_tree_getprop(aliases, "screen"); |
if (!prop) |
panic("Can't find property \"screen\".\n"); |
if (!prop->value) |
panic("Can't find screen alias.\n"); |
screen = ofw_tree_lookup(prop->value); |
if (!screen) |
panic("Can't find %s\n", prop->value); |
scr_init(screen); |
prop = ofw_tree_getprop(aliases, "keyboard"); |
if (!prop) |
panic("Can't find property \"keyboard\".\n"); |
if (!prop->value) |
panic("Can't find keyboard alias.\n"); |
keyboard = ofw_tree_lookup(prop->value); |
if (!keyboard) |
panic("Can't find %s\n", prop->value); |
kbd_init(keyboard); |
} |
/** Kernel thread for polling keyboard. |
* |
* @param arg Ignored. |
*/ |
void kkbdpoll(void *arg) |
{ |
thread_detach(THREAD); |
#ifdef CONFIG_Z8530 |
if (kbd_type == KBD_Z8530) { |
/* |
* The z8530 driver is interrupt-driven. |
*/ |
return; |
} |
#endif |
while (1) { |
#ifdef CONFIG_NS16550 |
if (kbd_type == KBD_NS16550) |
ns16550_poll(); |
#endif |
thread_usleep(KEYBOARD_POLL_PAUSE); |
} |
} |
/** Acquire console back for kernel |
* |
*/ |
void arch_grab_console(void) |
{ |
switch (kbd_type) { |
#ifdef CONFIG_Z8530 |
case KBD_Z8530: |
z8530_grab(); |
break; |
#endif |
#ifdef CONFIG_NS16550 |
case KBD_NS16550: |
ns16550_grab(); |
break; |
#endif |
default: |
break; |
} |
} |
/** Return console to userspace |
* |
*/ |
void arch_release_console(void) |
{ |
switch (kbd_type) { |
#ifdef CONFIG_Z8530 |
case KBD_Z8530: |
z8530_release(); |
break; |
#endif |
#ifdef CONFIG_NS16550 |
case KBD_NS16550: |
ns16550_release(); |
break; |
#endif |
default: |
break; |
} |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/src/fpu_context.c |
---|
0,0 → 1,178 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64 |
* @{ |
*/ |
/** @file |
* |
*/ |
#include <fpu_context.h> |
#include <arch/register.h> |
#include <arch/asm.h> |
void fpu_context_save(fpu_context_t *fctx) |
{ |
asm volatile ( |
"std %%f0, %0\n" |
"std %%f2, %1\n" |
"std %%f4, %2\n" |
"std %%f6, %3\n" |
"std %%f8, %4\n" |
"std %%f10, %5\n" |
"std %%f12, %6\n" |
"std %%f14, %7\n" |
"std %%f16, %8\n" |
"std %%f18, %9\n" |
"std %%f20, %10\n" |
"std %%f22, %11\n" |
"std %%f24, %12\n" |
"std %%f26, %13\n" |
"std %%f28, %14\n" |
"std %%f30, %15\n" |
: "=m" (fctx->d[0]), "=m" (fctx->d[1]), "=m" (fctx->d[2]), "=m" (fctx->d[3]), |
"=m" (fctx->d[4]), "=m" (fctx->d[5]), "=m" (fctx->d[6]), "=m" (fctx->d[7]), |
"=m" (fctx->d[8]), "=m" (fctx->d[9]), "=m" (fctx->d[10]), "=m" (fctx->d[11]), |
"=m" (fctx->d[12]), "=m" (fctx->d[13]), "=m" (fctx->d[14]), "=m" (fctx->d[15]) |
); |
/* |
* We need to split loading of the floating-point registers because |
* GCC (4.1.1) can't handle more than 30 operands in one asm statement. |
*/ |
asm volatile ( |
"std %%f32, %0\n" |
"std %%f34, %1\n" |
"std %%f36, %2\n" |
"std %%f38, %3\n" |
"std %%f40, %4\n" |
"std %%f42, %5\n" |
"std %%f44, %6\n" |
"std %%f46, %7\n" |
"std %%f48, %8\n" |
"std %%f50, %9\n" |
"std %%f52, %10\n" |
"std %%f54, %11\n" |
"std %%f56, %12\n" |
"std %%f58, %13\n" |
"std %%f60, %14\n" |
"std %%f62, %15\n" |
: "=m" (fctx->d[16]), "=m" (fctx->d[17]), "=m" (fctx->d[18]), "=m" (fctx->d[19]), |
"=m" (fctx->d[20]), "=m" (fctx->d[21]), "=m" (fctx->d[22]), "=m" (fctx->d[23]), |
"=m" (fctx->d[24]), "=m" (fctx->d[25]), "=m" (fctx->d[26]), "=m" (fctx->d[27]), |
"=m" (fctx->d[28]), "=m" (fctx->d[29]), "=m" (fctx->d[30]), "=m" (fctx->d[31]) |
); |
asm volatile ("stx %%fsr, %0\n" : "=m" (fctx->fsr)); |
} |
void fpu_context_restore(fpu_context_t *fctx) |
{ |
asm volatile ( |
"ldd %0, %%f0\n" |
"ldd %1, %%f2\n" |
"ldd %2, %%f4\n" |
"ldd %3, %%f6\n" |
"ldd %4, %%f8\n" |
"ldd %5, %%f10\n" |
"ldd %6, %%f12\n" |
"ldd %7, %%f14\n" |
"ldd %8, %%f16\n" |
"ldd %9, %%f18\n" |
"ldd %10, %%f20\n" |
"ldd %11, %%f22\n" |
"ldd %12, %%f24\n" |
"ldd %13, %%f26\n" |
"ldd %14, %%f28\n" |
"ldd %15, %%f30\n" |
: |
: "m" (fctx->d[0]), "m" (fctx->d[1]), "m" (fctx->d[2]), "m" (fctx->d[3]), |
"m" (fctx->d[4]), "m" (fctx->d[5]), "m" (fctx->d[6]), "m" (fctx->d[7]), |
"m" (fctx->d[8]), "m" (fctx->d[9]), "m" (fctx->d[10]), "m" (fctx->d[11]), |
"m" (fctx->d[12]), "m" (fctx->d[13]), "m" (fctx->d[14]), "m" (fctx->d[15]) |
); |
/* |
* We need to split loading of the floating-point registers because |
* GCC (4.1.1) can't handle more than 30 operands in one asm statement. |
*/ |
asm volatile ( |
"ldd %0, %%f32\n" |
"ldd %1, %%f34\n" |
"ldd %2, %%f36\n" |
"ldd %3, %%f38\n" |
"ldd %4, %%f40\n" |
"ldd %5, %%f42\n" |
"ldd %6, %%f44\n" |
"ldd %7, %%f46\n" |
"ldd %8, %%f48\n" |
"ldd %9, %%f50\n" |
"ldd %10, %%f52\n" |
"ldd %11, %%f54\n" |
"ldd %12, %%f56\n" |
"ldd %13, %%f58\n" |
"ldd %14, %%f60\n" |
"ldd %15, %%f62\n" |
: |
: "m" (fctx->d[16]), "m" (fctx->d[17]), "m" (fctx->d[18]), "m" (fctx->d[19]), |
"m" (fctx->d[20]), "m" (fctx->d[21]), "m" (fctx->d[22]), "m" (fctx->d[23]), |
"m" (fctx->d[24]), "m" (fctx->d[25]), "m" (fctx->d[26]), "m" (fctx->d[27]), |
"m" (fctx->d[28]), "m" (fctx->d[29]), "m" (fctx->d[30]), "m" (fctx->d[31]) |
); |
asm volatile ("ldx %0, %%fsr\n" : : "m" (fctx->fsr)); |
} |
void fpu_enable(void) |
{ |
pstate_reg_t pstate; |
pstate.value = pstate_read(); |
pstate.pef = true; |
pstate_write(pstate.value); |
} |
void fpu_disable(void) |
{ |
pstate_reg_t pstate; |
pstate.value = pstate_read(); |
pstate.pef = false; |
pstate_write(pstate.value); |
} |
void fpu_init(void) |
{ |
fpu_enable(); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/src/start.S |
---|
0,0 → 1,363 |
# |
# Copyright (c) 2005 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
#include <arch/arch.h> |
#include <arch/regdef.h> |
#include <arch/boot/boot.h> |
#include <arch/stack.h> |
#include <arch/mm/mmu.h> |
#include <arch/mm/tlb.h> |
#include <arch/mm/tte.h> |
#ifdef CONFIG_SMP |
#include <arch/context_offset.h> |
#endif |
.register %g2, #scratch |
.register %g3, #scratch |
.section K_TEXT_START, "ax" |
#define BSP_FLAG 1 |
/* |
* Here is where the kernel is passed control from the boot loader. |
* |
* The registers are expected to be in this state: |
* - %o0 starting address of physical memory + bootstrap processor flag |
* bits 63...1: physical memory starting address / 2 |
* bit 0: non-zero on BSP processor, zero on AP processors |
* - %o1 bootinfo structure address (BSP only) |
* - %o2 bootinfo structure size (BSP only) |
* |
* Moreover, we depend on boot having established the following environment: |
* - TLBs are on |
* - identity mapping for the kernel image |
*/ |
.global kernel_image_start |
kernel_image_start: |
mov BSP_FLAG, %l0 |
and %o0, %l0, %l7 ! l7 <= bootstrap processor? |
andn %o0, %l0, %l6 ! l6 <= start of physical memory |
! Get bits 40:13 of physmem_base. |
srlx %l6, 13, %l5 |
sllx %l5, 13 + (63 - 40), %l5 |
srlx %l5, 63 - 40, %l5 ! l5 <= physmem_base[40:13] |
/* |
* Setup basic runtime environment. |
*/ |
wrpr %g0, NWINDOWS - 2, %cansave ! set maximum saveable windows |
wrpr %g0, 0, %canrestore ! get rid of windows we will |
! never need again |
wrpr %g0, 0, %otherwin ! make sure the window state is |
! consistent |
wrpr %g0, NWINDOWS - 1, %cleanwin ! prevent needless clean_window |
! traps for kernel |
wrpr %g0, 0, %tl ! TL = 0, primary context |
! register is used |
wrpr %g0, PSTATE_PRIV_BIT, %pstate ! disable interrupts and disable |
! 32-bit address masking |
wrpr %g0, 0, %pil ! intialize %pil |
/* |
* Switch to kernel trap table. |
*/ |
sethi %hi(trap_table), %g1 |
wrpr %g1, %lo(trap_table), %tba |
/* |
* Take over the DMMU by installing locked TTE entry identically |
* mapping the first 4M of memory. |
* |
* In case of DMMU, no FLUSH instructions need to be issued. Because of |
* that, the old DTLB contents can be demapped pretty straightforwardly |
* and without causing any traps. |
*/ |
wr %g0, ASI_DMMU, %asi |
#define SET_TLB_DEMAP_CMD(r1, context_id) \ |
set (TLB_DEMAP_CONTEXT << TLB_DEMAP_TYPE_SHIFT) | (context_id << \ |
TLB_DEMAP_CONTEXT_SHIFT), %r1 |
! demap context 0 |
SET_TLB_DEMAP_CMD(g1, TLB_DEMAP_NUCLEUS) |
stxa %g0, [%g1] ASI_DMMU_DEMAP |
membar #Sync |
#define SET_TLB_TAG(r1, context) \ |
set VMA | (context << TLB_TAG_ACCESS_CONTEXT_SHIFT), %r1 |
! write DTLB tag |
SET_TLB_TAG(g1, MEM_CONTEXT_KERNEL) |
stxa %g1, [VA_DMMU_TAG_ACCESS] %asi |
membar #Sync |
#ifdef CONFIG_VIRT_IDX_DCACHE |
#define TTE_LOW_DATA(imm) (TTE_CP | TTE_CV | TTE_P | LMA | (imm)) |
#else /* CONFIG_VIRT_IDX_DCACHE */ |
#define TTE_LOW_DATA(imm) (TTE_CP | TTE_P | LMA | (imm)) |
#endif /* CONFIG_VIRT_IDX_DCACHE */ |
#define SET_TLB_DATA(r1, r2, imm) \ |
set TTE_LOW_DATA(imm), %r1; \ |
or %r1, %l5, %r1; \ |
mov PAGESIZE_4M, %r2; \ |
sllx %r2, TTE_SIZE_SHIFT, %r2; \ |
or %r1, %r2, %r1; \ |
mov 1, %r2; \ |
sllx %r2, TTE_V_SHIFT, %r2; \ |
or %r1, %r2, %r1; |
! write DTLB data and install the kernel mapping |
SET_TLB_DATA(g1, g2, TTE_L | TTE_W) ! use non-global mapping |
stxa %g1, [%g0] ASI_DTLB_DATA_IN_REG |
membar #Sync |
/* |
* Because we cannot use global mappings (because we want to have |
* separate 64-bit address spaces for both the kernel and the |
* userspace), we prepare the identity mapping also in context 1. This |
* step is required by the code installing the ITLB mapping. |
*/ |
! write DTLB tag of context 1 (i.e. MEM_CONTEXT_TEMP) |
SET_TLB_TAG(g1, MEM_CONTEXT_TEMP) |
stxa %g1, [VA_DMMU_TAG_ACCESS] %asi |
membar #Sync |
! write DTLB data and install the kernel mapping in context 1 |
SET_TLB_DATA(g1, g2, TTE_W) ! use non-global mapping |
stxa %g1, [%g0] ASI_DTLB_DATA_IN_REG |
membar #Sync |
/* |
* Now is time to take over the IMMU. Unfortunatelly, it cannot be done |
* as easily as the DMMU, because the IMMU is mapping the code it |
* executes. |
* |
* [ Note that brave experiments with disabling the IMMU and using the |
* DMMU approach failed after a dozen of desparate days with only little |
* success. ] |
* |
* The approach used here is inspired from OpenBSD. First, the kernel |
* creates IMMU mapping for itself in context 1 (MEM_CONTEXT_TEMP) and |
* switches to it. Context 0 (MEM_CONTEXT_KERNEL) can be demapped |
* afterwards and replaced with the kernel permanent mapping. Finally, |
* the kernel switches back to context 0 and demaps context 1. |
* |
* Moreover, the IMMU requires use of the FLUSH instructions. But that |
* is OK because we always use operands with addresses already mapped by |
* the taken over DTLB. |
*/ |
set kernel_image_start, %g5 |
! write ITLB tag of context 1 |
SET_TLB_TAG(g1, MEM_CONTEXT_TEMP) |
mov VA_DMMU_TAG_ACCESS, %g2 |
stxa %g1, [%g2] ASI_IMMU |
flush %g5 |
! write ITLB data and install the temporary mapping in context 1 |
SET_TLB_DATA(g1, g2, 0) ! use non-global mapping |
stxa %g1, [%g0] ASI_ITLB_DATA_IN_REG |
flush %g5 |
! switch to context 1 |
mov MEM_CONTEXT_TEMP, %g1 |
stxa %g1, [VA_PRIMARY_CONTEXT_REG] %asi ! ASI_DMMU is correct here !!! |
flush %g5 |
! demap context 0 |
SET_TLB_DEMAP_CMD(g1, TLB_DEMAP_NUCLEUS) |
stxa %g0, [%g1] ASI_IMMU_DEMAP |
flush %g5 |
! write ITLB tag of context 0 |
SET_TLB_TAG(g1, MEM_CONTEXT_KERNEL) |
mov VA_DMMU_TAG_ACCESS, %g2 |
stxa %g1, [%g2] ASI_IMMU |
flush %g5 |
! write ITLB data and install the permanent kernel mapping in context 0 |
SET_TLB_DATA(g1, g2, TTE_L) ! use non-global mapping |
stxa %g1, [%g0] ASI_ITLB_DATA_IN_REG |
flush %g5 |
! enter nucleus - using context 0 |
wrpr %g0, 1, %tl |
! demap context 1 |
SET_TLB_DEMAP_CMD(g1, TLB_DEMAP_PRIMARY) |
stxa %g0, [%g1] ASI_IMMU_DEMAP |
flush %g5 |
! set context 0 in the primary context register |
stxa %g0, [VA_PRIMARY_CONTEXT_REG] %asi ! ASI_DMMU is correct here !!! |
flush %g5 |
! leave nucleus - using primary context, i.e. context 0 |
wrpr %g0, 0, %tl |
brz %l7, 1f ! skip if you are not the bootstrap CPU |
nop |
/* |
* Save physmem_base for use by the mm subsystem. |
* %l6 contains starting physical address |
*/ |
sethi %hi(physmem_base), %l4 |
stx %l6, [%l4 + %lo(physmem_base)] |
/* |
* Precompute kernel 8K TLB data template. |
* %l5 contains starting physical address bits [40:13] |
*/ |
sethi %hi(kernel_8k_tlb_data_template), %l4 |
ldx [%l4 + %lo(kernel_8k_tlb_data_template)], %l3 |
or %l3, %l5, %l3 |
stx %l3, [%l4 + %lo(kernel_8k_tlb_data_template)] |
/* |
* Flush D-Cache. |
*/ |
call dcache_flush |
nop |
/* |
* So far, we have not touched the stack. |
* It is a good idea to set the kernel stack to a known state now. |
*/ |
sethi %hi(temporary_boot_stack), %sp |
or %sp, %lo(temporary_boot_stack), %sp |
sub %sp, STACK_BIAS, %sp |
sethi %hi(bootinfo), %o0 |
call memcpy ! copy bootinfo |
or %o0, %lo(bootinfo), %o0 |
call arch_pre_main |
nop |
call main_bsp |
nop |
/* Not reached. */ |
0: |
ba 0b |
nop |
/* |
* Read MID from the processor. |
*/ |
1: |
ldxa [%g0] ASI_UPA_CONFIG, %g1 |
srlx %g1, UPA_CONFIG_MID_SHIFT, %g1 |
and %g1, UPA_CONFIG_MID_MASK, %g1 |
#ifdef CONFIG_SMP |
/* |
* Active loop for APs until the BSP picks them up. A processor cannot |
* leave the loop until the global variable 'waking_up_mid' equals its |
* MID. |
*/ |
set waking_up_mid, %g2 |
2: |
ldx [%g2], %g3 |
cmp %g3, %g1 |
bne 2b |
nop |
/* |
* Configure stack for the AP. |
* The AP is expected to use the stack saved |
* in the ctx global variable. |
*/ |
set ctx, %g1 |
add %g1, OFFSET_SP, %g1 |
ldx [%g1], %o6 |
call main_ap |
nop |
/* Not reached. */ |
#endif |
0: |
ba 0b |
nop |
.section K_DATA_START, "aw", @progbits |
/* |
* Create small stack to be used by the bootstrap processor. It is going to be |
* used only for a very limited period of time, but we switch to it anyway, |
* just to be sure we are properly initialized. |
*/ |
#define INITIAL_STACK_SIZE 1024 |
.align STACK_ALIGNMENT |
.space INITIAL_STACK_SIZE |
.align STACK_ALIGNMENT |
temporary_boot_stack: |
.space STACK_WINDOW_SAVE_AREA_SIZE |
.data |
.align 8 |
.global physmem_base ! copy of the physical memory base address |
physmem_base: |
.quad 0 |
/* |
* This variable is used by the fast_data_MMU_miss trap handler. In runtime, it |
* is further modified to reflect the starting address of physical memory. |
*/ |
.global kernel_8k_tlb_data_template |
kernel_8k_tlb_data_template: |
#ifdef CONFIG_VIRT_IDX_DCACHE |
.quad ((1 << TTE_V_SHIFT) | (PAGESIZE_8K << TTE_SIZE_SHIFT) | TTE_CP | \ |
TTE_CV | TTE_P | TTE_W) |
#else /* CONFIG_VIRT_IDX_DCACHE */ |
.quad ((1 << TTE_V_SHIFT) | (PAGESIZE_8K << TTE_SIZE_SHIFT) | TTE_CP | \ |
TTE_P | TTE_W) |
#endif /* CONFIG_VIRT_IDX_DCACHE */ |
/tags/0.3.0/kernel/arch/sparc64/src/context.S |
---|
0,0 → 1,103 |
# |
# Copyright (c) 2005 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
#include <arch/context_offset.h> |
/** |
* Both context_save_arch() and context_restore_arch() are |
* leaf-optimized procedures. This kind of optimization |
* is very important and prevents any implicit window |
* spill/fill/clean traps in these very core kernel |
* functions. |
*/ |
.text |
.global context_save_arch |
.global context_restore_arch |
.macro CONTEXT_STORE r |
stx %sp, [\r + OFFSET_SP] |
stx %o7, [\r + OFFSET_PC] |
stx %i0, [\r + OFFSET_I0] |
stx %i1, [\r + OFFSET_I1] |
stx %i2, [\r + OFFSET_I2] |
stx %i3, [\r + OFFSET_I3] |
stx %i4, [\r + OFFSET_I4] |
stx %i5, [\r + OFFSET_I5] |
stx %fp, [\r + OFFSET_FP] |
stx %i7, [\r + OFFSET_I7] |
stx %l0, [\r + OFFSET_L0] |
stx %l1, [\r + OFFSET_L1] |
stx %l2, [\r + OFFSET_L2] |
stx %l3, [\r + OFFSET_L3] |
stx %l4, [\r + OFFSET_L4] |
stx %l5, [\r + OFFSET_L5] |
stx %l6, [\r + OFFSET_L6] |
stx %l7, [\r + OFFSET_L7] |
.endm |
.macro CONTEXT_LOAD r |
ldx [\r + OFFSET_SP], %sp |
ldx [\r + OFFSET_PC], %o7 |
ldx [\r + OFFSET_I0], %i0 |
ldx [\r + OFFSET_I1], %i1 |
ldx [\r + OFFSET_I2], %i2 |
ldx [\r + OFFSET_I3], %i3 |
ldx [\r + OFFSET_I4], %i4 |
ldx [\r + OFFSET_I5], %i5 |
ldx [\r + OFFSET_FP], %fp |
ldx [\r + OFFSET_I7], %i7 |
ldx [\r + OFFSET_L0], %l0 |
ldx [\r + OFFSET_L1], %l1 |
ldx [\r + OFFSET_L2], %l2 |
ldx [\r + OFFSET_L3], %l3 |
ldx [\r + OFFSET_L4], %l4 |
ldx [\r + OFFSET_L5], %l5 |
ldx [\r + OFFSET_L6], %l6 |
ldx [\r + OFFSET_L7], %l7 |
.endm |
context_save_arch: |
CONTEXT_STORE %o0 |
retl |
mov 1, %o0 ! context_save_arch returns 1 |
context_restore_arch: |
# |
# Flush all active windows. |
# This is essential, because CONTEXT_LOAD overwrites |
# %sp of CWP - 1 with the value written to %fp of CWP. |
# Flushing all active windows mitigates this problem |
# as CWP - 1 becomes the overlap window. |
# |
flushw |
CONTEXT_LOAD %o0 |
retl |
xor %o0, %o0, %o0 ! context_restore_arch returns 0 |
/tags/0.3.0/kernel/arch/sparc64/src/panic.S |
---|
0,0 → 1,40 |
# |
# Copyright (c) 2005 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
.text |
#include <arch/stack.h> |
.global panic_printf |
panic_printf: |
call printf |
nop |
call halt |
nop |
/* Not reached. */ |
/tags/0.3.0/kernel/arch/sparc64/src/dummy.s |
---|
0,0 → 1,46 |
# |
# Copyright (c) 2005 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
.text |
.global cpu_sleep |
.global sys_tls_set |
.global dummy |
cpu_sleep: ! not supported by architecture |
sys_tls_set: ! not needed on architecture |
dummy: |
retl |
nop |
.global cpu_halt |
cpu_halt: |
b cpu_halt |
nop |
/tags/0.3.0/kernel/arch/sparc64/include/mm/frame.h |
---|
0,0 → 1,80 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64mm |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_sparc64_FRAME_H_ |
#define KERN_sparc64_FRAME_H_ |
/* |
* Page size supported by the MMU. |
* For 8K there is the nasty illegal virtual aliasing problem. |
* Therefore, the kernel uses 8K only internally on the TLB and TSB levels. |
*/ |
#define MMU_FRAME_WIDTH 13 /* 8K */ |
#define MMU_FRAME_SIZE (1 << MMU_FRAME_WIDTH) |
/* |
* Page size exported to the generic memory management subsystems. |
* This page size is not directly supported by the MMU, but we can emulate |
* each 16K page with a pair of adjacent 8K pages. |
*/ |
#define FRAME_WIDTH 14 /* 16K */ |
#define FRAME_SIZE (1 << FRAME_WIDTH) |
#ifdef KERNEL |
#ifndef __ASM__ |
#include <arch/types.h> |
union frame_address { |
uintptr_t address; |
struct { |
unsigned : 23; |
uint64_t pfn : 28; /**< Physical Frame Number. */ |
unsigned offset : 13; /**< Offset. */ |
} __attribute__ ((packed)); |
}; |
typedef union frame_address frame_address_t; |
extern uintptr_t last_frame; |
extern void frame_arch_init(void); |
#define physmem_print() |
#endif |
#endif |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/include/mm/tlb.h |
---|
0,0 → 1,444 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64mm |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_sparc64_TLB_H_ |
#define KERN_sparc64_TLB_H_ |
#define ITLB_ENTRY_COUNT 64 |
#define DTLB_ENTRY_COUNT 64 |
#define MEM_CONTEXT_KERNEL 0 |
#define MEM_CONTEXT_TEMP 1 |
/** Page sizes. */ |
#define PAGESIZE_8K 0 |
#define PAGESIZE_64K 1 |
#define PAGESIZE_512K 2 |
#define PAGESIZE_4M 3 |
/** Bit width of the TLB-locked portion of kernel address space. */ |
#define KERNEL_PAGE_WIDTH 22 /* 4M */ |
/* TLB Demap Operation types. */ |
#define TLB_DEMAP_PAGE 0 |
#define TLB_DEMAP_CONTEXT 1 |
#define TLB_DEMAP_TYPE_SHIFT 6 |
/* TLB Demap Operation Context register encodings. */ |
#define TLB_DEMAP_PRIMARY 0 |
#define TLB_DEMAP_SECONDARY 1 |
#define TLB_DEMAP_NUCLEUS 2 |
#define TLB_DEMAP_CONTEXT_SHIFT 4 |
/* TLB Tag Access shifts */ |
#define TLB_TAG_ACCESS_CONTEXT_SHIFT 0 |
#define TLB_TAG_ACCESS_CONTEXT_MASK ((1 << 13) - 1) |
#define TLB_TAG_ACCESS_VPN_SHIFT 13 |
#ifndef __ASM__ |
#include <arch/mm/tte.h> |
#include <arch/mm/mmu.h> |
#include <arch/mm/page.h> |
#include <arch/asm.h> |
#include <arch/barrier.h> |
#include <arch/types.h> |
union tlb_context_reg { |
uint64_t v; |
struct { |
unsigned long : 51; |
unsigned context : 13; /**< Context/ASID. */ |
} __attribute__ ((packed)); |
}; |
typedef union tlb_context_reg tlb_context_reg_t; |
/** I-/D-TLB Data In/Access Register type. */ |
typedef tte_data_t tlb_data_t; |
/** I-/D-TLB Data Access Address in Alternate Space. */ |
union tlb_data_access_addr { |
uint64_t value; |
struct { |
uint64_t : 55; |
unsigned tlb_entry : 6; |
unsigned : 3; |
} __attribute__ ((packed)); |
}; |
typedef union tlb_data_access_addr tlb_data_access_addr_t; |
typedef union tlb_data_access_addr tlb_tag_read_addr_t; |
/** I-/D-TLB Tag Read Register. */ |
union tlb_tag_read_reg { |
uint64_t value; |
struct { |
uint64_t vpn : 51; /**< Virtual Address bits 63:13. */ |
unsigned context : 13; /**< Context identifier. */ |
} __attribute__ ((packed)); |
}; |
typedef union tlb_tag_read_reg tlb_tag_read_reg_t; |
typedef union tlb_tag_read_reg tlb_tag_access_reg_t; |
/** TLB Demap Operation Address. */ |
union tlb_demap_addr { |
uint64_t value; |
struct { |
uint64_t vpn: 51; /**< Virtual Address bits 63:13. */ |
unsigned : 6; /**< Ignored. */ |
unsigned type : 1; /**< The type of demap operation. */ |
unsigned context : 2; /**< Context register selection. */ |
unsigned : 4; /**< Zero. */ |
} __attribute__ ((packed)); |
}; |
typedef union tlb_demap_addr tlb_demap_addr_t; |
/** TLB Synchronous Fault Status Register. */ |
union tlb_sfsr_reg { |
uint64_t value; |
struct { |
unsigned long : 40; /**< Implementation dependent. */ |
unsigned asi : 8; /**< ASI. */ |
unsigned : 2; |
unsigned ft : 7; /**< Fault type. */ |
unsigned e : 1; /**< Side-effect bit. */ |
unsigned ct : 2; /**< Context Register selection. */ |
unsigned pr : 1; /**< Privilege bit. */ |
unsigned w : 1; /**< Write bit. */ |
unsigned ow : 1; /**< Overwrite bit. */ |
unsigned fv : 1; /**< Fault Valid bit. */ |
} __attribute__ ((packed)); |
}; |
typedef union tlb_sfsr_reg tlb_sfsr_reg_t; |
/** Read MMU Primary Context Register. |
* |
* @return Current value of Primary Context Register. |
*/ |
static inline uint64_t mmu_primary_context_read(void) |
{ |
return asi_u64_read(ASI_DMMU, VA_PRIMARY_CONTEXT_REG); |
} |
/** Write MMU Primary Context Register. |
* |
* @param v New value of Primary Context Register. |
*/ |
static inline void mmu_primary_context_write(uint64_t v) |
{ |
asi_u64_write(ASI_DMMU, VA_PRIMARY_CONTEXT_REG, v); |
flush(); |
} |
/** Read MMU Secondary Context Register. |
* |
* @return Current value of Secondary Context Register. |
*/ |
static inline uint64_t mmu_secondary_context_read(void) |
{ |
return asi_u64_read(ASI_DMMU, VA_SECONDARY_CONTEXT_REG); |
} |
/** Write MMU Primary Context Register. |
* |
* @param v New value of Primary Context Register. |
*/ |
static inline void mmu_secondary_context_write(uint64_t v) |
{ |
asi_u64_write(ASI_DMMU, VA_SECONDARY_CONTEXT_REG, v); |
flush(); |
} |
/** Read IMMU TLB Data Access Register. |
* |
* @param entry TLB Entry index. |
* |
* @return Current value of specified IMMU TLB Data Access Register. |
*/ |
static inline uint64_t itlb_data_access_read(index_t entry) |
{ |
tlb_data_access_addr_t reg; |
reg.value = 0; |
reg.tlb_entry = entry; |
return asi_u64_read(ASI_ITLB_DATA_ACCESS_REG, reg.value); |
} |
/** Write IMMU TLB Data Access Register. |
* |
* @param entry TLB Entry index. |
* @param value Value to be written. |
*/ |
static inline void itlb_data_access_write(index_t entry, uint64_t value) |
{ |
tlb_data_access_addr_t reg; |
reg.value = 0; |
reg.tlb_entry = entry; |
asi_u64_write(ASI_ITLB_DATA_ACCESS_REG, reg.value, value); |
flush(); |
} |
/** Read DMMU TLB Data Access Register. |
* |
* @param entry TLB Entry index. |
* |
* @return Current value of specified DMMU TLB Data Access Register. |
*/ |
static inline uint64_t dtlb_data_access_read(index_t entry) |
{ |
tlb_data_access_addr_t reg; |
reg.value = 0; |
reg.tlb_entry = entry; |
return asi_u64_read(ASI_DTLB_DATA_ACCESS_REG, reg.value); |
} |
/** Write DMMU TLB Data Access Register. |
* |
* @param entry TLB Entry index. |
* @param value Value to be written. |
*/ |
static inline void dtlb_data_access_write(index_t entry, uint64_t value) |
{ |
tlb_data_access_addr_t reg; |
reg.value = 0; |
reg.tlb_entry = entry; |
asi_u64_write(ASI_DTLB_DATA_ACCESS_REG, reg.value, value); |
membar(); |
} |
/** Read IMMU TLB Tag Read Register. |
* |
* @param entry TLB Entry index. |
* |
* @return Current value of specified IMMU TLB Tag Read Register. |
*/ |
static inline uint64_t itlb_tag_read_read(index_t entry) |
{ |
tlb_tag_read_addr_t tag; |
tag.value = 0; |
tag.tlb_entry = entry; |
return asi_u64_read(ASI_ITLB_TAG_READ_REG, tag.value); |
} |
/** Read DMMU TLB Tag Read Register. |
* |
* @param entry TLB Entry index. |
* |
* @return Current value of specified DMMU TLB Tag Read Register. |
*/ |
static inline uint64_t dtlb_tag_read_read(index_t entry) |
{ |
tlb_tag_read_addr_t tag; |
tag.value = 0; |
tag.tlb_entry = entry; |
return asi_u64_read(ASI_DTLB_TAG_READ_REG, tag.value); |
} |
/** Write IMMU TLB Tag Access Register. |
* |
* @param v Value to be written. |
*/ |
static inline void itlb_tag_access_write(uint64_t v) |
{ |
asi_u64_write(ASI_IMMU, VA_IMMU_TAG_ACCESS, v); |
flush(); |
} |
/** Read IMMU TLB Tag Access Register. |
* |
* @return Current value of IMMU TLB Tag Access Register. |
*/ |
static inline uint64_t itlb_tag_access_read(void) |
{ |
return asi_u64_read(ASI_IMMU, VA_IMMU_TAG_ACCESS); |
} |
/** Write DMMU TLB Tag Access Register. |
* |
* @param v Value to be written. |
*/ |
static inline void dtlb_tag_access_write(uint64_t v) |
{ |
asi_u64_write(ASI_DMMU, VA_DMMU_TAG_ACCESS, v); |
membar(); |
} |
/** Read DMMU TLB Tag Access Register. |
* |
* @return Current value of DMMU TLB Tag Access Register. |
*/ |
static inline uint64_t dtlb_tag_access_read(void) |
{ |
return asi_u64_read(ASI_DMMU, VA_DMMU_TAG_ACCESS); |
} |
/** Write IMMU TLB Data in Register. |
* |
* @param v Value to be written. |
*/ |
static inline void itlb_data_in_write(uint64_t v) |
{ |
asi_u64_write(ASI_ITLB_DATA_IN_REG, 0, v); |
flush(); |
} |
/** Write DMMU TLB Data in Register. |
* |
* @param v Value to be written. |
*/ |
static inline void dtlb_data_in_write(uint64_t v) |
{ |
asi_u64_write(ASI_DTLB_DATA_IN_REG, 0, v); |
membar(); |
} |
/** Read ITLB Synchronous Fault Status Register. |
* |
* @return Current content of I-SFSR register. |
*/ |
static inline uint64_t itlb_sfsr_read(void) |
{ |
return asi_u64_read(ASI_IMMU, VA_IMMU_SFSR); |
} |
/** Write ITLB Synchronous Fault Status Register. |
* |
* @param v New value of I-SFSR register. |
*/ |
static inline void itlb_sfsr_write(uint64_t v) |
{ |
asi_u64_write(ASI_IMMU, VA_IMMU_SFSR, v); |
flush(); |
} |
/** Read DTLB Synchronous Fault Status Register. |
* |
* @return Current content of D-SFSR register. |
*/ |
static inline uint64_t dtlb_sfsr_read(void) |
{ |
return asi_u64_read(ASI_DMMU, VA_DMMU_SFSR); |
} |
/** Write DTLB Synchronous Fault Status Register. |
* |
* @param v New value of D-SFSR register. |
*/ |
static inline void dtlb_sfsr_write(uint64_t v) |
{ |
asi_u64_write(ASI_DMMU, VA_DMMU_SFSR, v); |
membar(); |
} |
/** Read DTLB Synchronous Fault Address Register. |
* |
* @return Current content of D-SFAR register. |
*/ |
static inline uint64_t dtlb_sfar_read(void) |
{ |
return asi_u64_read(ASI_DMMU, VA_DMMU_SFAR); |
} |
/** Perform IMMU TLB Demap Operation. |
* |
* @param type Selects between context and page demap. |
* @param context_encoding Specifies which Context register has Context ID for |
* demap. |
* @param page Address which is on the page to be demapped. |
*/ |
static inline void itlb_demap(int type, int context_encoding, uintptr_t page) |
{ |
tlb_demap_addr_t da; |
page_address_t pg; |
da.value = 0; |
pg.address = page; |
da.type = type; |
da.context = context_encoding; |
da.vpn = pg.vpn; |
asi_u64_write(ASI_IMMU_DEMAP, da.value, 0); /* da.value is the |
* address within the |
* ASI */ |
flush(); |
} |
/** Perform DMMU TLB Demap Operation. |
* |
* @param type Selects between context and page demap. |
* @param context_encoding Specifies which Context register has Context ID for |
* demap. |
* @param page Address which is on the page to be demapped. |
*/ |
static inline void dtlb_demap(int type, int context_encoding, uintptr_t page) |
{ |
tlb_demap_addr_t da; |
page_address_t pg; |
da.value = 0; |
pg.address = page; |
da.type = type; |
da.context = context_encoding; |
da.vpn = pg.vpn; |
asi_u64_write(ASI_DMMU_DEMAP, da.value, 0); /* da.value is the |
* address within the |
* ASI */ |
membar(); |
} |
extern void fast_instruction_access_mmu_miss(unative_t unused, istate_t *istate); |
extern void fast_data_access_mmu_miss(tlb_tag_access_reg_t tag, istate_t *istate); |
extern void fast_data_access_protection(tlb_tag_access_reg_t tag , istate_t *istate); |
extern void dtlb_insert_mapping(uintptr_t page, uintptr_t frame, int pagesize, bool locked, bool cacheable); |
extern void dump_sfsr_and_sfar(void); |
#endif /* !def __ASM__ */ |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/include/mm/page.h |
---|
0,0 → 1,89 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64mm |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_sparc64_PAGE_H_ |
#define KERN_sparc64_PAGE_H_ |
#include <arch/mm/frame.h> |
/* |
* On the TLB and TSB level, we still use 8K pages, which are supported by the |
* MMU. |
*/ |
#define MMU_PAGE_WIDTH MMU_FRAME_WIDTH |
#define MMU_PAGE_SIZE MMU_FRAME_SIZE |
/* |
* On the page table level, we use 16K pages. 16K pages are not supported by |
* the MMU but we emulate them with pairs of 8K pages. |
*/ |
#define PAGE_WIDTH FRAME_WIDTH |
#define PAGE_SIZE FRAME_SIZE |
#define MMU_PAGES_PER_PAGE (1 << (PAGE_WIDTH - MMU_PAGE_WIDTH)) |
/* |
* With 16K pages, there is only one page color. |
*/ |
#define PAGE_COLOR_BITS 0 /**< 14 - 14; 2^14 == 16K == alias boundary. */ |
#ifdef KERNEL |
#ifndef __ASM__ |
#include <arch/interrupt.h> |
extern uintptr_t physmem_base; |
#define KA2PA(x) (((uintptr_t) (x)) + physmem_base) |
#define PA2KA(x) (((uintptr_t) (x)) - physmem_base) |
typedef union { |
uintptr_t address; |
struct { |
uint64_t vpn : 51; /**< Virtual Page Number. */ |
unsigned offset : 13; /**< Offset. */ |
} __attribute__ ((packed)); |
} page_address_t; |
extern void page_arch_init(void); |
#endif /* !def __ASM__ */ |
#endif /* KERNEL */ |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/include/mm/as.h |
---|
0,0 → 1,96 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64mm |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_sparc64_AS_H_ |
#define KERN_sparc64_AS_H_ |
#include <arch/mm/tte.h> |
#define KERNEL_ADDRESS_SPACE_SHADOWED_ARCH 1 |
#define KERNEL_ADDRESS_SPACE_START_ARCH (unsigned long) 0x0000000000000000 |
#define KERNEL_ADDRESS_SPACE_END_ARCH (unsigned long) 0xffffffffffffffff |
#define USER_ADDRESS_SPACE_START_ARCH (unsigned long) 0x0000000000000000 |
#define USER_ADDRESS_SPACE_END_ARCH (unsigned long) 0xffffffffffffffff |
#define USTACK_ADDRESS_ARCH (0xffffffffffffffffULL - (PAGE_SIZE - 1)) |
#ifdef CONFIG_TSB |
/** TSB Tag Target register. */ |
typedef union tsb_tag_target { |
uint64_t value; |
struct { |
unsigned invalid : 1; /**< Invalidated by software. */ |
unsigned : 2; |
unsigned context : 13; /**< Software ASID. */ |
unsigned : 6; |
uint64_t va_tag : 42; /**< Virtual address bits <63:22>. */ |
} __attribute__ ((packed)); |
} tsb_tag_target_t; |
/** TSB entry. */ |
typedef struct tsb_entry { |
tsb_tag_target_t tag; |
tte_data_t data; |
} __attribute__ ((packed)) tsb_entry_t; |
typedef struct { |
tsb_entry_t *itsb; |
tsb_entry_t *dtsb; |
} as_arch_t; |
#else |
typedef struct { |
} as_arch_t; |
#endif /* CONFIG_TSB */ |
#include <genarch/mm/as_ht.h> |
#ifdef CONFIG_TSB |
#include <arch/mm/tsb.h> |
#define as_invalidate_translation_cache(as, page, cnt) \ |
tsb_invalidate((as), (page), (cnt)) |
#else |
#define as_invalidate_translation_cache(as, page, cnt) |
#endif |
extern void as_arch_init(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/include/mm/cache.h |
---|
0,0 → 1,53 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64mm |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_sparc64_CACHE_H_ |
#define KERN_sparc64_CACHE_H_ |
#include <mm/page.h> |
#include <mm/frame.h> |
#define dcache_flush_page(p) \ |
dcache_flush_color(PAGE_COLOR((p))) |
#define dcache_flush_frame(p, f) \ |
dcache_flush_tag(PAGE_COLOR((p)), ADDR2PFN((f))); |
extern void dcache_flush(void); |
extern void dcache_flush_color(int c); |
extern void dcache_flush_tag(int c, pfn_t tag); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/include/mm/tsb.h |
---|
0,0 → 1,123 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64mm |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_sparc64_TSB_H_ |
#define KERN_sparc64_TSB_H_ |
/* |
* ITSB abd DTSB will claim 64K of memory, which |
* is a nice number considered that it is one of |
* the page sizes supported by hardware, which, |
* again, is nice because TSBs need to be locked |
* in TLBs - only one TLB entry will do. |
*/ |
#define TSB_SIZE 2 /* when changing this, change |
* as.c as well */ |
#define ITSB_ENTRY_COUNT (512 * (1 << TSB_SIZE)) |
#define DTSB_ENTRY_COUNT (512 * (1 << TSB_SIZE)) |
#define TSB_TAG_TARGET_CONTEXT_SHIFT 48 |
#ifndef __ASM__ |
#include <arch/mm/tte.h> |
#include <arch/mm/mmu.h> |
#include <arch/types.h> |
/** TSB Base register. */ |
typedef union tsb_base_reg { |
uint64_t value; |
struct { |
uint64_t base : 51; /**< TSB base address, bits 63:13. */ |
unsigned split : 1; /**< Split vs. common TSB for 8K and 64K |
* pages. HelenOS uses only 8K pages |
* for user mappings, so we always set |
* this to 0. |
*/ |
unsigned : 9; |
unsigned size : 3; /**< TSB size. Number of entries is |
* 512 * 2^size. */ |
} __attribute__ ((packed)); |
} tsb_base_reg_t; |
/** Read ITSB Base register. |
* |
* @return Content of the ITSB Base register. |
*/ |
static inline uint64_t itsb_base_read(void) |
{ |
return asi_u64_read(ASI_IMMU, VA_IMMU_TSB_BASE); |
} |
/** Read DTSB Base register. |
* |
* @return Content of the DTSB Base register. |
*/ |
static inline uint64_t dtsb_base_read(void) |
{ |
return asi_u64_read(ASI_DMMU, VA_DMMU_TSB_BASE); |
} |
/** Write ITSB Base register. |
* |
* @param v New content of the ITSB Base register. |
*/ |
static inline void itsb_base_write(uint64_t v) |
{ |
asi_u64_write(ASI_IMMU, VA_IMMU_TSB_BASE, v); |
} |
/** Write DTSB Base register. |
* |
* @param v New content of the DTSB Base register. |
*/ |
static inline void dtsb_base_write(uint64_t v) |
{ |
asi_u64_write(ASI_DMMU, VA_DMMU_TSB_BASE, v); |
} |
/* Forward declarations. */ |
struct as; |
struct pte; |
extern void tsb_invalidate(struct as *as, uintptr_t page, count_t pages); |
extern void itsb_pte_copy(struct pte *t, index_t index); |
extern void dtsb_pte_copy(struct pte *t, index_t index, bool ro); |
#endif /* !def __ASM__ */ |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/include/mm/mmu.h |
---|
0,0 → 1,109 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64mm |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_sparc64_MMU_H_ |
#define KERN_sparc64_MMU_H_ |
/* LSU Control Register ASI. */ |
#define ASI_LSU_CONTROL_REG 0x45 /**< Load/Store Unit Control Register. */ |
/* I-MMU ASIs. */ |
#define ASI_IMMU 0x50 |
#define ASI_IMMU_TSB_8KB_PTR_REG 0x51 |
#define ASI_IMMU_TSB_64KB_PTR_REG 0x52 |
#define ASI_ITLB_DATA_IN_REG 0x54 |
#define ASI_ITLB_DATA_ACCESS_REG 0x55 |
#define ASI_ITLB_TAG_READ_REG 0x56 |
#define ASI_IMMU_DEMAP 0x57 |
/* Virtual Addresses within ASI_IMMU. */ |
#define VA_IMMU_TSB_TAG_TARGET 0x0 /**< IMMU TSB tag target register. */ |
#define VA_IMMU_SFSR 0x18 /**< IMMU sync fault status register. */ |
#define VA_IMMU_TSB_BASE 0x28 /**< IMMU TSB base register. */ |
#define VA_IMMU_TAG_ACCESS 0x30 /**< IMMU TLB tag access register. */ |
/* D-MMU ASIs. */ |
#define ASI_DMMU 0x58 |
#define ASI_DMMU_TSB_8KB_PTR_REG 0x59 |
#define ASI_DMMU_TSB_64KB_PTR_REG 0x5a |
#define ASI_DMMU_TSB_DIRECT_PTR_REG 0x5b |
#define ASI_DTLB_DATA_IN_REG 0x5c |
#define ASI_DTLB_DATA_ACCESS_REG 0x5d |
#define ASI_DTLB_TAG_READ_REG 0x5e |
#define ASI_DMMU_DEMAP 0x5f |
/* Virtual Addresses within ASI_DMMU. */ |
#define VA_DMMU_TSB_TAG_TARGET 0x0 /**< DMMU TSB tag target register. */ |
#define VA_PRIMARY_CONTEXT_REG 0x8 /**< DMMU primary context register. */ |
#define VA_SECONDARY_CONTEXT_REG 0x10 /**< DMMU secondary context register. */ |
#define VA_DMMU_SFSR 0x18 /**< DMMU sync fault status register. */ |
#define VA_DMMU_SFAR 0x20 /**< DMMU sync fault address register. */ |
#define VA_DMMU_TSB_BASE 0x28 /**< DMMU TSB base register. */ |
#define VA_DMMU_TAG_ACCESS 0x30 /**< DMMU TLB tag access register. */ |
#define VA_DMMU_VA_WATCHPOINT_REG 0x38 /**< DMMU VA data watchpoint register. */ |
#define VA_DMMU_PA_WATCHPOINT_REG 0x40 /**< DMMU PA data watchpoint register. */ |
#ifndef __ASM__ |
#include <arch/asm.h> |
#include <arch/barrier.h> |
#include <arch/types.h> |
/** LSU Control Register. */ |
typedef union { |
uint64_t value; |
struct { |
unsigned : 23; |
unsigned pm : 8; |
unsigned vm : 8; |
unsigned pr : 1; |
unsigned pw : 1; |
unsigned vr : 1; |
unsigned vw : 1; |
unsigned : 1; |
unsigned fm : 16; |
unsigned dm : 1; /**< D-MMU enable. */ |
unsigned im : 1; /**< I-MMU enable. */ |
unsigned dc : 1; /**< D-Cache enable. */ |
unsigned ic : 1; /**< I-Cache enable. */ |
} __attribute__ ((packed)); |
} lsu_cr_reg_t; |
#endif /* !def __ASM__ */ |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/include/mm/tte.h |
---|
0,0 → 1,98 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64mm |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_sparc64_TTE_H_ |
#define KERN_sparc64_TTE_H_ |
#define TTE_G (1 << 0) |
#define TTE_W (1 << 1) |
#define TTE_P (1 << 2) |
#define TTE_E (1 << 3) |
#define TTE_CV (1 << 4) |
#define TTE_CP (1 << 5) |
#define TTE_L (1 << 6) |
#define TTE_V_SHIFT 63 |
#define TTE_SIZE_SHIFT 61 |
#ifndef __ASM__ |
#include <arch/types.h> |
#define VA_TAG_PAGE_SHIFT 22 |
/** Translation Table Entry - Tag. */ |
union tte_tag { |
uint64_t value; |
struct { |
unsigned g : 1; /**< Global. */ |
unsigned : 2; /**< Reserved. */ |
unsigned context : 13; /**< Context identifier. */ |
unsigned : 6; /**< Reserved. */ |
uint64_t va_tag : 42; /**< Virtual Address Tag, bits 63:22. */ |
} __attribute__ ((packed)); |
}; |
typedef union tte_tag tte_tag_t; |
/** Translation Table Entry - Data. */ |
union tte_data { |
uint64_t value; |
struct { |
unsigned v : 1; /**< Valid. */ |
unsigned size : 2; /**< Page size of this entry. */ |
unsigned nfo : 1; /**< No-Fault-Only. */ |
unsigned ie : 1; /**< Invert Endianness. */ |
unsigned soft2 : 9; /**< Software defined field. */ |
unsigned diag : 9; /**< Diagnostic data. */ |
unsigned pfn : 28; /**< Physical Address bits, bits 40:13. */ |
unsigned soft : 6; /**< Software defined field. */ |
unsigned l : 1; /**< Lock. */ |
unsigned cp : 1; /**< Cacheable in physically indexed cache. */ |
unsigned cv : 1; /**< Cacheable in virtually indexed cache. */ |
unsigned e : 1; /**< Side-effect. */ |
unsigned p : 1; /**< Privileged. */ |
unsigned w : 1; /**< Writable. */ |
unsigned g : 1; /**< Global. */ |
} __attribute__ ((packed)); |
}; |
typedef union tte_data tte_data_t; |
#endif /* !def __ASM__ */ |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/include/mm/asid.h |
---|
0,0 → 1,50 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64mm |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_sparc64_ASID_H_ |
#define KERN_sparc64_ASID_H_ |
#include <arch/types.h> |
/* |
* On SPARC, Context means the same thing as ASID trough out the kernel. |
*/ |
typedef uint16_t asid_t; |
#define ASID_MAX_ARCH 8191 /* 2^13 - 1 */ |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/include/stack.h |
---|
0,0 → 1,72 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_sparc64_STACK_H_ |
#define KERN_sparc64_STACK_H_ |
#define STACK_ITEM_SIZE 8 |
/** According to SPARC Compliance Definition, every stack frame is 16-byte aligned. */ |
#define STACK_ALIGNMENT 16 |
/** |
* 16-extended-word save area for %i[0-7] and %l[0-7] registers. |
*/ |
#define STACK_WINDOW_SAVE_AREA_SIZE (16 * STACK_ITEM_SIZE) |
/** |
* Six extended words for first six arguments. |
*/ |
#define STACK_ARG_SAVE_AREA_SIZE (6 * STACK_ITEM_SIZE) |
/** |
* By convention, the actual top of the stack is %sp + STACK_BIAS. |
*/ |
#define STACK_BIAS 2047 |
/* |
* Offsets of arguments on stack. |
*/ |
#define STACK_ARG0 0 |
#define STACK_ARG1 8 |
#define STACK_ARG2 16 |
#define STACK_ARG3 24 |
#define STACK_ARG4 32 |
#define STACK_ARG5 40 |
#define STACK_ARG6 48 |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/include/trap/syscall.h |
---|
0,0 → 1,57 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64interrupt |
* @{ |
*/ |
/** |
* @file |
* @brief This file contains the trap_instruction handler. |
* |
* The trap_instruction trap is used to implement syscalls. |
*/ |
#ifndef KERN_sparc64_SYSCALL_TRAP_H_ |
#define KERN_sparc64_SYSCALL_TRAP_H_ |
#define TT_TRAP_INSTRUCTION(n) (0x100 + (n)) |
#define TT_TRAP_INSTRUCTION_LAST TT_TRAP_INSTRUCTION(127) |
#ifdef __ASM__ |
.macro TRAP_INSTRUCTION n |
ba trap_instruction_handler |
mov TT_TRAP_INSTRUCTION(\n) - TT_TRAP_INSTRUCTION(0), %g2 |
.endm |
#endif /* __ASM__ */ |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/include/trap/trap_table.h |
---|
0,0 → 1,112 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64interrupt |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_sparc64_TRAP_TABLE_H_ |
#define KERN_sparc64_TRAP_TABLE_H_ |
#include <arch/stack.h> |
#define TRAP_TABLE_ENTRY_COUNT 1024 |
#define TRAP_TABLE_ENTRY_SIZE 32 |
#define TRAP_TABLE_SIZE (TRAP_TABLE_ENTRY_COUNT * TRAP_TABLE_ENTRY_SIZE) |
#ifndef __ASM__ |
#include <arch/types.h> |
struct trap_table_entry { |
uint8_t octets[TRAP_TABLE_ENTRY_SIZE]; |
} __attribute__ ((packed)); |
typedef struct trap_table_entry trap_table_entry_t; |
extern trap_table_entry_t trap_table[TRAP_TABLE_ENTRY_COUNT]; |
extern trap_table_entry_t trap_table_save[TRAP_TABLE_ENTRY_COUNT]; |
#endif /* !__ASM__ */ |
#ifdef __ASM__ |
.macro SAVE_GLOBALS |
mov %g1, %l1 |
mov %g2, %l2 |
mov %g3, %l3 |
mov %g4, %l4 |
mov %g5, %l5 |
mov %g6, %l6 |
mov %g7, %l7 |
.endm |
.macro RESTORE_GLOBALS |
mov %l1, %g1 |
mov %l2, %g2 |
mov %l3, %g3 |
mov %l4, %g4 |
mov %l5, %g5 |
mov %l6, %g6 |
mov %l7, %g7 |
.endm |
/* |
* The following needs to be in sync with the definition of the istate |
* structure. The one STACK_ITEM_SIZE is counted for space holding the 7th |
* argument to syscall_handler (i.e. syscall number) and the other |
* STACK_ITEM_SIZE is counted because of the required alignment. |
*/ |
#define PREEMPTIBLE_HANDLER_STACK_FRAME_SIZE \ |
(STACK_WINDOW_SAVE_AREA_SIZE + STACK_ARG_SAVE_AREA_SIZE + \ |
(2 * STACK_ITEM_SIZE) + (12 * 8)) |
#define SAVED_TSTATE -(1 * 8) |
#define SAVED_TPC -(2 * 8) |
#define SAVED_TNPC -(3 * 8) /* <-- istate_t begins here */ |
#define SAVED_Y -(4 * 8) |
#define SAVED_I0 -(5 * 8) |
#define SAVED_I1 -(6 * 8) |
#define SAVED_I2 -(7 * 8) |
#define SAVED_I3 -(8 * 8) |
#define SAVED_I4 -(9 * 8) |
#define SAVED_I5 -(10 * 8) |
#define SAVED_I6 -(11 * 8) |
#define SAVED_I7 -(12 * 8) |
.macro PREEMPTIBLE_HANDLER f |
sethi %hi(\f), %g1 |
b preemptible_handler |
or %g1, %lo(\f), %g1 |
.endm |
#endif /* __ASM__ */ |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/include/trap/mmu.h |
---|
0,0 → 1,182 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64interrupt |
* @{ |
*/ |
/** |
* @file |
* @brief This file contains fast MMU trap handlers. |
*/ |
#ifndef KERN_sparc64_MMU_TRAP_H_ |
#define KERN_sparc64_MMU_TRAP_H_ |
#include <arch/stack.h> |
#include <arch/regdef.h> |
#include <arch/mm/tlb.h> |
#include <arch/mm/mmu.h> |
#include <arch/mm/tte.h> |
#include <arch/trap/regwin.h> |
#ifdef CONFIG_TSB |
#include <arch/mm/tsb.h> |
#endif |
#define TT_FAST_INSTRUCTION_ACCESS_MMU_MISS 0x64 |
#define TT_FAST_DATA_ACCESS_MMU_MISS 0x68 |
#define TT_FAST_DATA_ACCESS_PROTECTION 0x6c |
#define FAST_MMU_HANDLER_SIZE 128 |
#ifdef __ASM__ |
.macro FAST_INSTRUCTION_ACCESS_MMU_MISS_HANDLER |
/* |
* First, try to refill TLB from TSB. |
*/ |
#ifdef CONFIG_TSB |
ldxa [%g0] ASI_IMMU, %g1 ! read TSB Tag Target Register |
ldxa [%g0] ASI_IMMU_TSB_8KB_PTR_REG, %g2 ! read TSB 8K Pointer |
ldda [%g2] ASI_NUCLEUS_QUAD_LDD, %g4 ! 16-byte atomic load into %g4 and %g5 |
cmp %g1, %g4 ! is this the entry we are looking for? |
bne,pn %xcc, 0f |
nop |
stxa %g5, [%g0] ASI_ITLB_DATA_IN_REG ! copy mapping from ITSB to ITLB |
retry |
#endif |
0: |
wrpr %g0, PSTATE_PRIV_BIT | PSTATE_AG_BIT, %pstate |
PREEMPTIBLE_HANDLER fast_instruction_access_mmu_miss |
.endm |
.macro FAST_DATA_ACCESS_MMU_MISS_HANDLER tl |
/* |
* First, try to refill TLB from TSB. |
*/ |
#ifdef CONFIG_TSB |
ldxa [%g0] ASI_DMMU, %g1 ! read TSB Tag Target Register |
srlx %g1, TSB_TAG_TARGET_CONTEXT_SHIFT, %g2 ! is this a kernel miss? |
brz,pn %g2, 0f |
ldxa [%g0] ASI_DMMU_TSB_8KB_PTR_REG, %g3 ! read TSB 8K Pointer |
ldda [%g3] ASI_NUCLEUS_QUAD_LDD, %g4 ! 16-byte atomic load into %g4 and %g5 |
cmp %g1, %g4 ! is this the entry we are looking for? |
bne,pn %xcc, 0f |
nop |
stxa %g5, [%g0] ASI_DTLB_DATA_IN_REG ! copy mapping from DTSB to DTLB |
retry |
#endif |
/* |
* Second, test if it is the portion of the kernel address space |
* which is faulting. If that is the case, immediately create |
* identity mapping for that page in DTLB. VPN 0 is excluded from |
* this treatment. |
* |
* Note that branch-delay slots are used in order to save space. |
*/ |
0: |
mov VA_DMMU_TAG_ACCESS, %g1 |
ldxa [%g1] ASI_DMMU, %g1 ! read the faulting Context and VPN |
set TLB_TAG_ACCESS_CONTEXT_MASK, %g2 |
andcc %g1, %g2, %g3 ! get Context |
bnz 0f ! Context is non-zero |
andncc %g1, %g2, %g3 ! get page address into %g3 |
bz 0f ! page address is zero |
sethi %hi(kernel_8k_tlb_data_template), %g2 |
ldx [%g2 + %lo(kernel_8k_tlb_data_template)], %g2 |
or %g3, %g2, %g2 |
stxa %g2, [%g0] ASI_DTLB_DATA_IN_REG ! identity map the kernel page |
retry |
/* |
* Third, catch and handle special cases when the trap is caused by |
* the userspace register window spill or fill handler. In case |
* one of these two traps caused this trap, we just lower the trap |
* level and service the DTLB miss. In the end, we restart |
* the offending SAVE or RESTORE. |
*/ |
0: |
.if (\tl > 0) |
wrpr %g0, 1, %tl |
.endif |
/* |
* Switch from the MM globals. |
*/ |
wrpr %g0, PSTATE_PRIV_BIT | PSTATE_AG_BIT, %pstate |
/* |
* Read the Tag Access register for the higher-level handler. |
* This is necessary to survive nested DTLB misses. |
*/ |
mov VA_DMMU_TAG_ACCESS, %g2 |
ldxa [%g2] ASI_DMMU, %g2 |
/* |
* g2 will be passed as an argument to fast_data_access_mmu_miss(). |
*/ |
PREEMPTIBLE_HANDLER fast_data_access_mmu_miss |
.endm |
.macro FAST_DATA_ACCESS_PROTECTION_HANDLER tl |
/* |
* The same special case as in FAST_DATA_ACCESS_MMU_MISS_HANDLER. |
*/ |
.if (\tl > 0) |
wrpr %g0, 1, %tl |
.endif |
/* |
* Switch from the MM globals. |
*/ |
wrpr %g0, PSTATE_PRIV_BIT | PSTATE_AG_BIT, %pstate |
/* |
* Read the Tag Access register for the higher-level handler. |
* This is necessary to survive nested DTLB misses. |
*/ |
mov VA_DMMU_TAG_ACCESS, %g2 |
ldxa [%g2] ASI_DMMU, %g2 |
/* |
* g2 will be passed as an argument to fast_data_access_mmu_miss(). |
*/ |
PREEMPTIBLE_HANDLER fast_data_access_protection |
.endm |
#endif /* __ASM__ */ |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/include/trap/interrupt.h |
---|
0,0 → 1,117 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64interrupt |
* @{ |
*/ |
/** |
* @file |
* @brief This file contains interrupt vector trap handler. |
*/ |
#ifndef KERN_sparc64_TRAP_INTERRUPT_H_ |
#define KERN_sparc64_TRAP_INTERRUPT_H_ |
#include <arch/trap/trap_table.h> |
#include <arch/stack.h> |
/* IMAP register bits */ |
#define IGN_MASK 0x7c0 |
#define INO_MASK 0x1f |
#define IMAP_V_MASK (1ULL << 31) |
#define IGN_SHIFT 6 |
/* Interrupt ASI registers. */ |
#define ASI_UDB_INTR_W 0x77 |
#define ASI_INTR_DISPATCH_STATUS 0x48 |
#define ASI_UDB_INTR_R 0x7f |
#define ASI_INTR_RECEIVE 0x49 |
/* VA's used with ASI_UDB_INTR_W register. */ |
#define ASI_UDB_INTR_W_DATA_0 0x40 |
#define ASI_UDB_INTR_W_DATA_1 0x50 |
#define ASI_UDB_INTR_W_DATA_2 0x60 |
#define ASI_UDB_INTR_W_DISPATCH 0x70 |
/* VA's used with ASI_UDB_INTR_R register. */ |
#define ASI_UDB_INTR_R_DATA_0 0x40 |
#define ASI_UDB_INTR_R_DATA_1 0x50 |
#define ASI_UDB_INTR_R_DATA_2 0x60 |
/* Shifts in the Interrupt Vector Dispatch virtual address. */ |
#define INTR_VEC_DISPATCH_MID_SHIFT 14 |
/* Bits in the Interrupt Dispatch Status register. */ |
#define INTR_DISPATCH_STATUS_NACK 0x2 |
#define INTR_DISPATCH_STATUS_BUSY 0x1 |
#define TT_INTERRUPT_LEVEL_1 0x41 |
#define TT_INTERRUPT_LEVEL_2 0x42 |
#define TT_INTERRUPT_LEVEL_3 0x43 |
#define TT_INTERRUPT_LEVEL_4 0x44 |
#define TT_INTERRUPT_LEVEL_5 0x45 |
#define TT_INTERRUPT_LEVEL_6 0x46 |
#define TT_INTERRUPT_LEVEL_7 0x47 |
#define TT_INTERRUPT_LEVEL_8 0x48 |
#define TT_INTERRUPT_LEVEL_9 0x49 |
#define TT_INTERRUPT_LEVEL_10 0x4a |
#define TT_INTERRUPT_LEVEL_11 0x4b |
#define TT_INTERRUPT_LEVEL_12 0x4c |
#define TT_INTERRUPT_LEVEL_13 0x4d |
#define TT_INTERRUPT_LEVEL_14 0x4e |
#define TT_INTERRUPT_LEVEL_15 0x4f |
#define TT_INTERRUPT_VECTOR_TRAP 0x60 |
#define INTERRUPT_LEVEL_N_HANDLER_SIZE TRAP_TABLE_ENTRY_SIZE |
#define INTERRUPT_VECTOR_TRAP_HANDLER_SIZE TRAP_TABLE_ENTRY_SIZE |
#ifdef __ASM__ |
.macro INTERRUPT_LEVEL_N_HANDLER n |
mov \n - 1, %g2 |
PREEMPTIBLE_HANDLER exc_dispatch |
.endm |
.macro INTERRUPT_VECTOR_TRAP_HANDLER |
PREEMPTIBLE_HANDLER interrupt |
.endm |
#endif /* __ASM__ */ |
#ifndef __ASM__ |
#include <arch/interrupt.h> |
extern void interrupt(int n, istate_t *istate); |
#endif /* !def __ASM__ */ |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/include/trap/exception.h |
---|
0,0 → 1,90 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64interrupt |
* @{ |
*/ |
/** |
* @file |
*/ |
#ifndef KERN_sparc64_EXCEPTION_H_ |
#define KERN_sparc64_EXCEPTION_H_ |
#define TT_INSTRUCTION_ACCESS_EXCEPTION 0x08 |
#define TT_INSTRUCTION_ACCESS_ERROR 0x0a |
#define TT_ILLEGAL_INSTRUCTION 0x10 |
#define TT_PRIVILEGED_OPCODE 0x11 |
#define TT_UNIMPLEMENTED_LDD 0x12 |
#define TT_UNIMPLEMENTED_STD 0x13 |
#define TT_FP_DISABLED 0x20 |
#define TT_FP_EXCEPTION_IEEE_754 0x21 |
#define TT_FP_EXCEPTION_OTHER 0x22 |
#define TT_TAG_OVERFLOW 0x23 |
#define TT_DIVISION_BY_ZERO 0x28 |
#define TT_DATA_ACCESS_EXCEPTION 0x30 |
#define TT_DATA_ACCESS_ERROR 0x32 |
#define TT_MEM_ADDRESS_NOT_ALIGNED 0x34 |
#define TT_LDDF_MEM_ADDRESS_NOT_ALIGNED 0x35 |
#define TT_STDF_MEM_ADDRESS_NOT_ALIGNED 0x36 |
#define TT_PRIVILEGED_ACTION 0x37 |
#define TT_LDQF_MEM_ADDRESS_NOT_ALIGNED 0x38 |
#define TT_STQF_MEM_ADDRESS_NOT_ALIGNED 0x39 |
#ifndef __ASM__ |
#include <arch/interrupt.h> |
extern void dump_istate(istate_t *istate); |
extern void instruction_access_exception(int n, istate_t *istate); |
extern void instruction_access_error(int n, istate_t *istate); |
extern void illegal_instruction(int n, istate_t *istate); |
extern void privileged_opcode(int n, istate_t *istate); |
extern void unimplemented_LDD(int n, istate_t *istate); |
extern void unimplemented_STD(int n, istate_t *istate); |
extern void fp_disabled(int n, istate_t *istate); |
extern void fp_exception_ieee_754(int n, istate_t *istate); |
extern void fp_exception_other(int n, istate_t *istate); |
extern void tag_overflow(int n, istate_t *istate); |
extern void division_by_zero(int n, istate_t *istate); |
extern void data_access_exception(int n, istate_t *istate); |
extern void data_access_error(int n, istate_t *istate); |
extern void mem_address_not_aligned(int n, istate_t *istate); |
extern void LDDF_mem_address_not_aligned(int n, istate_t *istate); |
extern void STDF_mem_address_not_aligned(int n, istate_t *istate); |
extern void privileged_action(int n, istate_t *istate); |
extern void LDQF_mem_address_not_aligned(int n, istate_t *istate); |
extern void STQF_mem_address_not_aligned(int n, istate_t *istate); |
#endif /* !__ASM__ */ |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/include/trap/regwin.h |
---|
0,0 → 1,231 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64interrupt |
* @{ |
*/ |
/** |
* @file |
* @brief This file contains register window trap handlers. |
*/ |
#ifndef KERN_sparc64_REGWIN_H_ |
#define KERN_sparc64_REGWIN_H_ |
#include <arch/stack.h> |
#include <arch/arch.h> |
#define TT_CLEAN_WINDOW 0x24 |
#define TT_SPILL_0_NORMAL 0x80 /* kernel spills */ |
#define TT_SPILL_1_NORMAL 0x84 /* userspace spills */ |
#define TT_SPILL_2_NORMAL 0x88 /* spills to userspace window buffer */ |
#define TT_SPILL_0_OTHER 0xa0 /* spills to userspace window buffer */ |
#define TT_FILL_0_NORMAL 0xc0 /* kernel fills */ |
#define TT_FILL_1_NORMAL 0xc4 /* userspace fills */ |
#define REGWIN_HANDLER_SIZE 128 |
#define CLEAN_WINDOW_HANDLER_SIZE REGWIN_HANDLER_SIZE |
#define SPILL_HANDLER_SIZE REGWIN_HANDLER_SIZE |
#define FILL_HANDLER_SIZE REGWIN_HANDLER_SIZE |
/* Window Save Area offsets. */ |
#define L0_OFFSET 0 |
#define L1_OFFSET 8 |
#define L2_OFFSET 16 |
#define L3_OFFSET 24 |
#define L4_OFFSET 32 |
#define L5_OFFSET 40 |
#define L6_OFFSET 48 |
#define L7_OFFSET 56 |
#define I0_OFFSET 64 |
#define I1_OFFSET 72 |
#define I2_OFFSET 80 |
#define I3_OFFSET 88 |
#define I4_OFFSET 96 |
#define I5_OFFSET 104 |
#define I6_OFFSET 112 |
#define I7_OFFSET 120 |
#ifdef __ASM__ |
/* |
* Macro used by the nucleus and the primary context 0 during normal and other spills. |
*/ |
.macro SPILL_NORMAL_HANDLER_KERNEL |
stx %l0, [%sp + STACK_BIAS + L0_OFFSET] |
stx %l1, [%sp + STACK_BIAS + L1_OFFSET] |
stx %l2, [%sp + STACK_BIAS + L2_OFFSET] |
stx %l3, [%sp + STACK_BIAS + L3_OFFSET] |
stx %l4, [%sp + STACK_BIAS + L4_OFFSET] |
stx %l5, [%sp + STACK_BIAS + L5_OFFSET] |
stx %l6, [%sp + STACK_BIAS + L6_OFFSET] |
stx %l7, [%sp + STACK_BIAS + L7_OFFSET] |
stx %i0, [%sp + STACK_BIAS + I0_OFFSET] |
stx %i1, [%sp + STACK_BIAS + I1_OFFSET] |
stx %i2, [%sp + STACK_BIAS + I2_OFFSET] |
stx %i3, [%sp + STACK_BIAS + I3_OFFSET] |
stx %i4, [%sp + STACK_BIAS + I4_OFFSET] |
stx %i5, [%sp + STACK_BIAS + I5_OFFSET] |
stx %i6, [%sp + STACK_BIAS + I6_OFFSET] |
stx %i7, [%sp + STACK_BIAS + I7_OFFSET] |
saved |
retry |
.endm |
/* |
* Macro used by the userspace during normal spills. |
*/ |
.macro SPILL_NORMAL_HANDLER_USERSPACE |
wr %g0, ASI_AIUP, %asi |
stxa %l0, [%sp + STACK_BIAS + L0_OFFSET] %asi |
stxa %l1, [%sp + STACK_BIAS + L1_OFFSET] %asi |
stxa %l2, [%sp + STACK_BIAS + L2_OFFSET] %asi |
stxa %l3, [%sp + STACK_BIAS + L3_OFFSET] %asi |
stxa %l4, [%sp + STACK_BIAS + L4_OFFSET] %asi |
stxa %l5, [%sp + STACK_BIAS + L5_OFFSET] %asi |
stxa %l6, [%sp + STACK_BIAS + L6_OFFSET] %asi |
stxa %l7, [%sp + STACK_BIAS + L7_OFFSET] %asi |
stxa %i0, [%sp + STACK_BIAS + I0_OFFSET] %asi |
stxa %i1, [%sp + STACK_BIAS + I1_OFFSET] %asi |
stxa %i2, [%sp + STACK_BIAS + I2_OFFSET] %asi |
stxa %i3, [%sp + STACK_BIAS + I3_OFFSET] %asi |
stxa %i4, [%sp + STACK_BIAS + I4_OFFSET] %asi |
stxa %i5, [%sp + STACK_BIAS + I5_OFFSET] %asi |
stxa %i6, [%sp + STACK_BIAS + I6_OFFSET] %asi |
stxa %i7, [%sp + STACK_BIAS + I7_OFFSET] %asi |
saved |
retry |
.endm |
/* |
* Macro used to spill userspace window to userspace window buffer. |
* It can be either triggered from preemptible_handler doing SAVE |
* at (TL=1) or from normal kernel code doing SAVE when OTHERWIN>0 |
* at (TL=0). |
*/ |
.macro SPILL_TO_USPACE_WINDOW_BUFFER |
stx %l0, [%g7 + L0_OFFSET] |
stx %l1, [%g7 + L1_OFFSET] |
stx %l2, [%g7 + L2_OFFSET] |
stx %l3, [%g7 + L3_OFFSET] |
stx %l4, [%g7 + L4_OFFSET] |
stx %l5, [%g7 + L5_OFFSET] |
stx %l6, [%g7 + L6_OFFSET] |
stx %l7, [%g7 + L7_OFFSET] |
stx %i0, [%g7 + I0_OFFSET] |
stx %i1, [%g7 + I1_OFFSET] |
stx %i2, [%g7 + I2_OFFSET] |
stx %i3, [%g7 + I3_OFFSET] |
stx %i4, [%g7 + I4_OFFSET] |
stx %i5, [%g7 + I5_OFFSET] |
stx %i6, [%g7 + I6_OFFSET] |
stx %i7, [%g7 + I7_OFFSET] |
add %g7, STACK_WINDOW_SAVE_AREA_SIZE, %g7 |
saved |
retry |
.endm |
/* |
* Macro used by the nucleus and the primary context 0 during normal fills. |
*/ |
.macro FILL_NORMAL_HANDLER_KERNEL |
ldx [%sp + STACK_BIAS + L0_OFFSET], %l0 |
ldx [%sp + STACK_BIAS + L1_OFFSET], %l1 |
ldx [%sp + STACK_BIAS + L2_OFFSET], %l2 |
ldx [%sp + STACK_BIAS + L3_OFFSET], %l3 |
ldx [%sp + STACK_BIAS + L4_OFFSET], %l4 |
ldx [%sp + STACK_BIAS + L5_OFFSET], %l5 |
ldx [%sp + STACK_BIAS + L6_OFFSET], %l6 |
ldx [%sp + STACK_BIAS + L7_OFFSET], %l7 |
ldx [%sp + STACK_BIAS + I0_OFFSET], %i0 |
ldx [%sp + STACK_BIAS + I1_OFFSET], %i1 |
ldx [%sp + STACK_BIAS + I2_OFFSET], %i2 |
ldx [%sp + STACK_BIAS + I3_OFFSET], %i3 |
ldx [%sp + STACK_BIAS + I4_OFFSET], %i4 |
ldx [%sp + STACK_BIAS + I5_OFFSET], %i5 |
ldx [%sp + STACK_BIAS + I6_OFFSET], %i6 |
ldx [%sp + STACK_BIAS + I7_OFFSET], %i7 |
restored |
retry |
.endm |
/* |
* Macro used by the userspace during normal fills. |
*/ |
.macro FILL_NORMAL_HANDLER_USERSPACE |
wr %g0, ASI_AIUP, %asi |
ldxa [%sp + STACK_BIAS + L0_OFFSET] %asi, %l0 |
ldxa [%sp + STACK_BIAS + L1_OFFSET] %asi, %l1 |
ldxa [%sp + STACK_BIAS + L2_OFFSET] %asi, %l2 |
ldxa [%sp + STACK_BIAS + L3_OFFSET] %asi, %l3 |
ldxa [%sp + STACK_BIAS + L4_OFFSET] %asi, %l4 |
ldxa [%sp + STACK_BIAS + L5_OFFSET] %asi, %l5 |
ldxa [%sp + STACK_BIAS + L6_OFFSET] %asi, %l6 |
ldxa [%sp + STACK_BIAS + L7_OFFSET] %asi, %l7 |
ldxa [%sp + STACK_BIAS + I0_OFFSET] %asi, %i0 |
ldxa [%sp + STACK_BIAS + I1_OFFSET] %asi, %i1 |
ldxa [%sp + STACK_BIAS + I2_OFFSET] %asi, %i2 |
ldxa [%sp + STACK_BIAS + I3_OFFSET] %asi, %i3 |
ldxa [%sp + STACK_BIAS + I4_OFFSET] %asi, %i4 |
ldxa [%sp + STACK_BIAS + I5_OFFSET] %asi, %i5 |
ldxa [%sp + STACK_BIAS + I6_OFFSET] %asi, %i6 |
ldxa [%sp + STACK_BIAS + I7_OFFSET] %asi, %i7 |
restored |
retry |
.endm |
.macro CLEAN_WINDOW_HANDLER |
rdpr %cleanwin, %l0 |
add %l0, 1, %l0 |
wrpr %l0, 0, %cleanwin |
mov %r0, %l0 |
mov %r0, %l1 |
mov %r0, %l2 |
mov %r0, %l3 |
mov %r0, %l4 |
mov %r0, %l5 |
mov %r0, %l6 |
mov %r0, %l7 |
mov %r0, %o0 |
mov %r0, %o1 |
mov %r0, %o2 |
mov %r0, %o3 |
mov %r0, %o4 |
mov %r0, %o5 |
mov %r0, %o6 |
mov %r0, %o7 |
retry |
.endm |
#endif /* __ASM__ */ |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/include/trap/trap.h |
---|
0,0 → 1,44 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64interrupt |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_sparc64_TRAP_H_ |
#define KERN_sparc64_TRAP_H_ |
extern void trap_init(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/include/drivers/scr.h |
---|
0,0 → 1,55 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_sparc64_SCR_H_ |
#define KERN_sparc64_SCR_H_ |
#include <arch/types.h> |
#include <genarch/ofw/ofw_tree.h> |
typedef enum { |
SCR_UNKNOWN, |
SCR_ATYFB, |
SCR_FFB, |
SCR_CGSIX |
} scr_type_t; |
extern scr_type_t scr_type; |
extern void scr_init(ofw_tree_node_t *node); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/include/drivers/z8530.h |
---|
0,0 → 1,140 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_sparc64_Z8530_H_ |
#define KERN_sparc64_Z8530_H_ |
#include <arch/types.h> |
#include <arch/drivers/kbd.h> |
#define Z8530_CHAN_A 4 |
#define Z8530_CHAN_B 0 |
#define WR0 0 |
#define WR1 1 |
#define WR2 2 |
#define WR3 3 |
#define WR4 4 |
#define WR5 5 |
#define WR6 6 |
#define WR7 7 |
#define WR8 8 |
#define WR9 9 |
#define WR10 10 |
#define WR11 11 |
#define WR12 12 |
#define WR13 13 |
#define WR14 14 |
#define WR15 15 |
#define RR0 0 |
#define RR1 1 |
#define RR2 2 |
#define RR3 3 |
#define RR8 8 |
#define RR10 10 |
#define RR12 12 |
#define RR13 13 |
#define RR14 14 |
#define RR15 15 |
/* Write Register 0 */ |
#define WR0_TX_IP_RST (0x5<<3) /** Reset pending TX interrupt. */ |
#define WR0_ERR_RST (0x6<<3) |
/* Write Register 1 */ |
#define WR1_RID (0x0<<3) /** Receive Interrupts Disabled. */ |
#define WR1_RIFCSC (0x1<<3) /** Receive Interrupt on First Character or Special Condition. */ |
#define WR1_IARCSC (0x2<<3) /** Interrupt on All Receive Characters or Special Conditions. */ |
#define WR1_RISC (0x3<<3) /** Receive Interrupt on Special Condition. */ |
#define WR1_PISC (0x1<<2) /** Parity Is Special Condition. */ |
/* Write Register 3 */ |
#define WR3_RX_ENABLE (0x1<<0) /** Rx Enable. */ |
#define WR3_RX8BITSCH (0x3<<6) /** 8-bits per character. */ |
/* Write Register 9 */ |
#define WR9_MIE (0x1<<3) /** Master Interrupt Enable. */ |
/* Read Register 0 */ |
#define RR0_RCA (0x1<<0) /** Receive Character Available. */ |
/** Structure representing the z8530 device. */ |
typedef struct { |
devno_t devno; |
volatile uint8_t *reg; /** Memory mapped registers of the z8530. */ |
} z8530_t; |
static inline void z8530_write(z8530_t *dev, index_t chan, uint8_t reg, uint8_t val) |
{ |
/* |
* Registers 8-15 will automatically issue the Point High |
* command as their bit 3 is 1. |
*/ |
dev->reg[WR0+chan] = reg; /* select register */ |
dev->reg[WR0+chan] = val; /* write value */ |
} |
static inline void z8530_write_a(z8530_t *dev, uint8_t reg, uint8_t val) |
{ |
z8530_write(dev, Z8530_CHAN_A, reg, val); |
} |
static inline void z8530_write_b(z8530_t *dev, uint8_t reg, uint8_t val) |
{ |
z8530_write(dev, Z8530_CHAN_B, reg, val); |
} |
static inline uint8_t z8530_read(z8530_t *dev, index_t chan, uint8_t reg) |
{ |
/* |
* Registers 8-15 will automatically issue the Point High |
* command as their bit 3 is 1. |
*/ |
dev->reg[WR0+chan] = reg; /* select register */ |
return dev->reg[WR0+chan]; |
} |
static inline uint8_t z8530_read_a(z8530_t *dev, uint8_t reg) |
{ |
return z8530_read(dev, Z8530_CHAN_A, reg); |
} |
static inline uint8_t z8530_read_b(z8530_t *dev, uint8_t reg) |
{ |
return z8530_read(dev, Z8530_CHAN_B, reg); |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/include/drivers/tick.h |
---|
0,0 → 1,46 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_sparc64_TICK_H_ |
#define KERN_sparc64_TICK_H_ |
#include <arch/interrupt.h> |
extern void tick_init(void); |
extern void tick_interrupt(int n, istate_t *istate); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/include/drivers/pci.h |
---|
0,0 → 1,71 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_sparc64_PCI_H_ |
#define KERN_sparc64_PCI_H_ |
#include <arch/types.h> |
#include <genarch/ofw/ofw_tree.h> |
#include <arch/arch.h> |
#include <arch/asm.h> |
typedef enum pci_model pci_model_t; |
typedef struct pci pci_t; |
typedef struct pci_operations pci_operations_t; |
enum pci_model { |
PCI_UNKNOWN, |
PCI_SABRE, |
PCI_PSYCHO |
}; |
struct pci_operations { |
void (* enable_interrupt)(pci_t *pci, int inr); |
void (* clear_interrupt)(pci_t *pci, int inr); |
}; |
struct pci { |
pci_model_t model; |
pci_operations_t *op; |
volatile uint64_t *reg; /**< Registers including interrupt registers. */ |
}; |
extern pci_t *pci_init(ofw_tree_node_t *node); |
extern void pci_enable_interrupt(pci_t *pci, int inr); |
extern void pci_clear_interrupt(pci_t *pci, int inr); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/include/drivers/fhc.h |
---|
0,0 → 1,54 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_sparc64_FHC_H_ |
#define KERN_sparc64_FHC_H_ |
#include <arch/types.h> |
#include <genarch/ofw/ofw_tree.h> |
typedef struct { |
volatile uint32_t *uart_imap; |
} fhc_t; |
extern fhc_t *central_fhc; |
extern fhc_t *fhc_init(ofw_tree_node_t *node); |
extern void fhc_enable_interrupt(fhc_t *fhc, int inr); |
extern void fhc_clear_interrupt(fhc_t *fhc, int inr); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/include/drivers/kbd.h |
---|
0,0 → 1,54 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_sparc64_KBD_H_ |
#define KERN_sparc64_KBD_H_ |
#include <arch/types.h> |
#include <genarch/ofw/ofw_tree.h> |
typedef enum { |
KBD_UNKNOWN, |
KBD_Z8530, |
KBD_NS16550 |
} kbd_type_t; |
extern kbd_type_t kbd_type; |
extern void kbd_init(ofw_tree_node_t *node); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/include/drivers/ns16550.h |
---|
0,0 → 1,102 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_sparc64_NS16550_H_ |
#define KERN_sparc64_NS16550_H_ |
#include <arch/types.h> |
#include <arch/drivers/kbd.h> |
/* NS16550 registers */ |
#define RBR_REG 0 /** Receiver Buffer Register. */ |
#define IER_REG 1 /** Interrupt Enable Register. */ |
#define IIR_REG 2 /** Interrupt Ident Register (read). */ |
#define FCR_REG 2 /** FIFO control register (write). */ |
#define LCR_REG 3 /** Line Control register. */ |
#define LSR_REG 5 /** Line Status Register. */ |
#define IER_ERBFI 0x01 /** Enable Receive Buffer Full Interrupt. */ |
#define LCR_DLAB 0x80 /** Divisor Latch Access bit. */ |
/** Structure representing the ns16550 device. */ |
typedef struct { |
devno_t devno; |
volatile uint8_t *reg; /** Memory mapped registers of the ns16550. */ |
} ns16550_t; |
static inline uint8_t ns16550_rbr_read(ns16550_t *dev) |
{ |
return dev->reg[RBR_REG]; |
} |
static inline uint8_t ns16550_ier_read(ns16550_t *dev) |
{ |
return dev->reg[IER_REG]; |
} |
static inline void ns16550_ier_write(ns16550_t *dev, uint8_t v) |
{ |
dev->reg[IER_REG] = v; |
} |
static inline uint8_t ns16550_iir_read(ns16550_t *dev) |
{ |
return dev->reg[IIR_REG]; |
} |
static inline void ns16550_fcr_write(ns16550_t *dev, uint8_t v) |
{ |
dev->reg[FCR_REG] = v; |
} |
static inline uint8_t ns16550_lcr_read(ns16550_t *dev) |
{ |
return dev->reg[LCR_REG]; |
} |
static inline void ns16550_lcr_write(ns16550_t *dev, uint8_t v) |
{ |
dev->reg[LCR_REG] = v; |
} |
static inline uint8_t ns16550_lsr_read(ns16550_t *dev) |
{ |
return dev->reg[LSR_REG]; |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/include/drivers/fb.h |
---|
0,0 → 1,41 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_sparc64_FB_H_ |
#define KERN_sparc64_FB_H_ |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/include/barrier.h |
---|
0,0 → 1,85 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_sparc64_BARRIER_H_ |
#define KERN_sparc64_BARRIER_H_ |
/* |
* Our critical section barriers are prepared for the weakest RMO memory model. |
*/ |
#define CS_ENTER_BARRIER() \ |
asm volatile ( \ |
"membar #LoadLoad | #LoadStore\n" \ |
::: "memory" \ |
) |
#define CS_LEAVE_BARRIER() \ |
asm volatile ( \ |
"membar #StoreStore\n" \ |
"membar #LoadStore\n" \ |
::: "memory" \ |
) |
#define memory_barrier() \ |
asm volatile ("membar #LoadLoad | #StoreStore\n" ::: "memory") |
#define read_barrier() \ |
asm volatile ("membar #LoadLoad\n" ::: "memory") |
#define write_barrier() \ |
asm volatile ("membar #StoreStore\n" ::: "memory") |
/** Flush Instruction Memory instruction. */ |
static inline void flush(void) |
{ |
/* |
* The FLUSH instruction takes address parameter. |
* As such, it may trap if the address is not found in DTLB. |
* |
* The entire kernel text is mapped by a locked ITLB and |
* DTLB entries. Therefore, when this function is called, |
* the %o7 register will always be in the range mapped by |
* DTLB. |
*/ |
asm volatile ("flush %o7\n"); |
} |
/** Memory Barrier instruction. */ |
static inline void membar(void) |
{ |
asm volatile ("membar #Sync\n"); |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/include/types.h |
---|
0,0 → 1,76 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_sparc64_TYPES_H_ |
#define KERN_sparc64_TYPES_H_ |
#define NULL 0 |
#define false 0 |
#define true 1 |
typedef signed char int8_t; |
typedef signed short int16_t; |
typedef signed int int32_t; |
typedef signed long int64_t; |
typedef unsigned char uint8_t; |
typedef unsigned short uint16_t; |
typedef unsigned int uint32_t; |
typedef unsigned long uint64_t; |
typedef uint64_t size_t; |
typedef uint64_t count_t; |
typedef uint64_t index_t; |
typedef uint64_t uintptr_t; |
typedef uint64_t pfn_t; |
typedef uint64_t ipl_t; |
typedef uint64_t unative_t; |
typedef int64_t native_t; |
typedef uint8_t bool; |
typedef uint64_t thread_id_t; |
typedef uint64_t task_id_t; |
typedef uint32_t context_id_t; |
typedef int32_t inr_t; |
typedef int32_t devno_t; |
typedef uint8_t asi_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/include/interrupt.h |
---|
0,0 → 1,76 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64interrupt sparc64 |
* @ingroup interrupt |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_sparc64_INTERRUPT_H_ |
#define KERN_sparc64_INTERRUPT_H_ |
#include <arch/types.h> |
#include <arch/regdef.h> |
#define IVT_ITEMS 15 |
#define IVT_FIRST 1 |
/* This needs to be defined for inter-architecture API portability. */ |
#define VECTOR_TLB_SHOOTDOWN_IPI 0 |
enum { |
IPI_TLB_SHOOTDOWN = VECTOR_TLB_SHOOTDOWN_IPI |
}; |
typedef struct { |
uint64_t tnpc; |
uint64_t tpc; |
uint64_t tstate; |
} istate_t; |
static inline void istate_set_retaddr(istate_t *istate, uintptr_t retaddr) |
{ |
istate->tpc = retaddr; |
} |
static inline int istate_from_uspace(istate_t *istate) |
{ |
return !(istate->tstate & TSTATE_PRIV_BIT); |
} |
static inline unative_t istate_get_pc(istate_t *istate) |
{ |
return istate->tpc; |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/include/cpu.h |
---|
0,0 → 1,72 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_sparc64_CPU_H_ |
#define KERN_sparc64_CPU_H_ |
#include <arch/types.h> |
#include <arch/register.h> |
#include <arch/asm.h> |
#ifdef CONFIG_SMP |
#include <arch/mm/cache.h> |
#endif |
#define MANUF_FUJITSU 0x04 |
#define MANUF_ULTRASPARC 0x17 /**< UltraSPARC I, UltraSPARC II */ |
#define MANUF_SUN 0x3e |
#define IMPL_ULTRASPARCI 0x10 |
#define IMPL_ULTRASPARCII 0x11 |
#define IMPL_ULTRASPARCII_I 0x12 |
#define IMPL_ULTRASPARCII_E 0x13 |
#define IMPL_ULTRASPARCIII 0x15 |
#define IMPL_ULTRASPARCIV_PLUS 0x19 |
#define IMPL_SPARC64V 0x5 |
typedef struct { |
uint32_t mid; /**< Processor ID as read from |
UPA_CONFIG. */ |
ver_reg_t ver; |
uint32_t clock_frequency; /**< Processor frequency in Hz. */ |
uint64_t next_tick_cmpr; /**< Next clock interrupt should be |
generated when the TICK register |
matches this value. */ |
} cpu_arch_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/include/atomic.h |
---|
0,0 → 1,136 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_sparc64_ATOMIC_H_ |
#define KERN_sparc64_ATOMIC_H_ |
#include <arch/barrier.h> |
#include <arch/types.h> |
/** Atomic add operation. |
* |
* Use atomic compare and swap operation to atomically add signed value. |
* |
* @param val Atomic variable. |
* @param i Signed value to be added. |
* |
* @return Value of the atomic variable as it existed before addition. |
*/ |
static inline long atomic_add(atomic_t *val, int i) |
{ |
uint64_t a, b; |
do { |
volatile uintptr_t x = (uint64_t) &val->count; |
a = *((uint64_t *) x); |
b = a + i; |
asm volatile ("casx %0, %2, %1\n" : "+m" (*((uint64_t *)x)), "+r" (b) : "r" (a)); |
} while (a != b); |
return a; |
} |
static inline long atomic_preinc(atomic_t *val) |
{ |
return atomic_add(val, 1) + 1; |
} |
static inline long atomic_postinc(atomic_t *val) |
{ |
return atomic_add(val, 1); |
} |
static inline long atomic_predec(atomic_t *val) |
{ |
return atomic_add(val, -1) - 1; |
} |
static inline long atomic_postdec(atomic_t *val) |
{ |
return atomic_add(val, -1); |
} |
static inline void atomic_inc(atomic_t *val) |
{ |
(void) atomic_add(val, 1); |
} |
static inline void atomic_dec(atomic_t *val) |
{ |
(void) atomic_add(val, -1); |
} |
static inline long test_and_set(atomic_t *val) |
{ |
uint64_t v = 1; |
volatile uintptr_t x = (uint64_t) &val->count; |
asm volatile ("casx %0, %2, %1\n" : "+m" (*((uint64_t *) x)), "+r" (v) : "r" (0)); |
return v; |
} |
static inline void atomic_lock_arch(atomic_t *val) |
{ |
uint64_t tmp1 = 1; |
uint64_t tmp2 = 0; |
volatile uintptr_t x = (uint64_t) &val->count; |
asm volatile ( |
"0:\n" |
"casx %0, %3, %1\n" |
"brz %1, 2f\n" |
"nop\n" |
"1:\n" |
"ldx %0, %2\n" |
"brz %2, 0b\n" |
"nop\n" |
"ba 1b\n" |
"nop\n" |
"2:\n" |
: "+m" (*((uint64_t *) x)), "+r" (tmp1), "+r" (tmp2) : "r" (0) |
); |
/* |
* Prevent critical section code from bleeding out this way up. |
*/ |
CS_ENTER_BARRIER(); |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/include/boot/boot.h |
---|
0,0 → 1,92 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_sparc64_BOOT_H_ |
#define KERN_sparc64_BOOT_H_ |
#define VMA 0x400000 |
#define LMA VMA |
#ifndef __ASM__ |
#ifndef __LINKER__ |
#include <config.h> |
#include <arch/types.h> |
#include <genarch/ofw/ofw_tree.h> |
#define TASKMAP_MAX_RECORDS 32 |
#define MEMMAP_MAX_RECORDS 32 |
typedef struct { |
void * addr; |
uint32_t size; |
} utask_t; |
typedef struct { |
uint32_t count; |
utask_t tasks[TASKMAP_MAX_RECORDS]; |
} taskmap_t; |
typedef struct { |
uintptr_t start; |
uint32_t size; |
} memzone_t; |
typedef struct { |
uint32_t total; |
uint32_t count; |
memzone_t zones[MEMMAP_MAX_RECORDS]; |
} memmap_t; |
/** Bootinfo structure. |
* |
* Must be in sync with bootinfo structure used by the boot loader. |
*/ |
typedef struct { |
uintptr_t physmem_start; |
taskmap_t taskmap; |
memmap_t memmap; |
ballocs_t ballocs; |
ofw_tree_node_t *ofw_root; |
} bootinfo_t; |
extern bootinfo_t bootinfo; |
#endif |
#endif |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/include/asm.h |
---|
0,0 → 1,383 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_sparc64_ASM_H_ |
#define KERN_sparc64_ASM_H_ |
#include <arch/arch.h> |
#include <arch/types.h> |
#include <align.h> |
#include <arch/register.h> |
#include <config.h> |
#include <arch/stack.h> |
/** Read Processor State register. |
* |
* @return Value of PSTATE register. |
*/ |
static inline uint64_t pstate_read(void) |
{ |
uint64_t v; |
asm volatile ("rdpr %%pstate, %0\n" : "=r" (v)); |
return v; |
} |
/** Write Processor State register. |
* |
* @param v New value of PSTATE register. |
*/ |
static inline void pstate_write(uint64_t v) |
{ |
asm volatile ("wrpr %0, %1, %%pstate\n" : : "r" (v), "i" (0)); |
} |
/** Read TICK_compare Register. |
* |
* @return Value of TICK_comapre register. |
*/ |
static inline uint64_t tick_compare_read(void) |
{ |
uint64_t v; |
asm volatile ("rd %%tick_cmpr, %0\n" : "=r" (v)); |
return v; |
} |
/** Write TICK_compare Register. |
* |
* @param v New value of TICK_comapre register. |
*/ |
static inline void tick_compare_write(uint64_t v) |
{ |
asm volatile ("wr %0, %1, %%tick_cmpr\n" : : "r" (v), "i" (0)); |
} |
/** Read TICK Register. |
* |
* @return Value of TICK register. |
*/ |
static inline uint64_t tick_read(void) |
{ |
uint64_t v; |
asm volatile ("rdpr %%tick, %0\n" : "=r" (v)); |
return v; |
} |
/** Write TICK Register. |
* |
* @param v New value of TICK register. |
*/ |
static inline void tick_write(uint64_t v) |
{ |
asm volatile ("wrpr %0, %1, %%tick\n" : : "r" (v), "i" (0)); |
} |
/** Read FPRS Register. |
* |
* @return Value of FPRS register. |
*/ |
static inline uint64_t fprs_read(void) |
{ |
uint64_t v; |
asm volatile ("rd %%fprs, %0\n" : "=r" (v)); |
return v; |
} |
/** Write FPRS Register. |
* |
* @param v New value of FPRS register. |
*/ |
static inline void fprs_write(uint64_t v) |
{ |
asm volatile ("wr %0, %1, %%fprs\n" : : "r" (v), "i" (0)); |
} |
/** Read SOFTINT Register. |
* |
* @return Value of SOFTINT register. |
*/ |
static inline uint64_t softint_read(void) |
{ |
uint64_t v; |
asm volatile ("rd %%softint, %0\n" : "=r" (v)); |
return v; |
} |
/** Write SOFTINT Register. |
* |
* @param v New value of SOFTINT register. |
*/ |
static inline void softint_write(uint64_t v) |
{ |
asm volatile ("wr %0, %1, %%softint\n" : : "r" (v), "i" (0)); |
} |
/** Write CLEAR_SOFTINT Register. |
* |
* Bits set in CLEAR_SOFTINT register will be cleared in SOFTINT register. |
* |
* @param v New value of CLEAR_SOFTINT register. |
*/ |
static inline void clear_softint_write(uint64_t v) |
{ |
asm volatile ("wr %0, %1, %%clear_softint\n" : : "r" (v), "i" (0)); |
} |
/** Write SET_SOFTINT Register. |
* |
* Bits set in SET_SOFTINT register will be set in SOFTINT register. |
* |
* @param v New value of SET_SOFTINT register. |
*/ |
static inline void set_softint_write(uint64_t v) |
{ |
asm volatile ("wr %0, %1, %%set_softint\n" : : "r" (v), "i" (0)); |
} |
/** Enable interrupts. |
* |
* Enable interrupts and return previous |
* value of IPL. |
* |
* @return Old interrupt priority level. |
*/ |
static inline ipl_t interrupts_enable(void) { |
pstate_reg_t pstate; |
uint64_t value; |
value = pstate_read(); |
pstate.value = value; |
pstate.ie = true; |
pstate_write(pstate.value); |
return (ipl_t) value; |
} |
/** Disable interrupts. |
* |
* Disable interrupts and return previous |
* value of IPL. |
* |
* @return Old interrupt priority level. |
*/ |
static inline ipl_t interrupts_disable(void) { |
pstate_reg_t pstate; |
uint64_t value; |
value = pstate_read(); |
pstate.value = value; |
pstate.ie = false; |
pstate_write(pstate.value); |
return (ipl_t) value; |
} |
/** Restore interrupt priority level. |
* |
* Restore IPL. |
* |
* @param ipl Saved interrupt priority level. |
*/ |
static inline void interrupts_restore(ipl_t ipl) { |
pstate_reg_t pstate; |
pstate.value = pstate_read(); |
pstate.ie = ((pstate_reg_t) ipl).ie; |
pstate_write(pstate.value); |
} |
/** Return interrupt priority level. |
* |
* Return IPL. |
* |
* @return Current interrupt priority level. |
*/ |
static inline ipl_t interrupts_read(void) { |
return (ipl_t) pstate_read(); |
} |
/** Return base address of current stack. |
* |
* Return the base address of the current stack. |
* The stack is assumed to be STACK_SIZE bytes long. |
* The stack must start on page boundary. |
*/ |
static inline uintptr_t get_stack_base(void) |
{ |
uintptr_t unbiased_sp; |
asm volatile ("add %%sp, %1, %0\n" : "=r" (unbiased_sp) : "i" (STACK_BIAS)); |
return ALIGN_DOWN(unbiased_sp, STACK_SIZE); |
} |
/** Read Version Register. |
* |
* @return Value of VER register. |
*/ |
static inline uint64_t ver_read(void) |
{ |
uint64_t v; |
asm volatile ("rdpr %%ver, %0\n" : "=r" (v)); |
return v; |
} |
/** Read Trap Program Counter register. |
* |
* @return Current value in TPC. |
*/ |
static inline uint64_t tpc_read(void) |
{ |
uint64_t v; |
asm volatile ("rdpr %%tpc, %0\n" : "=r" (v)); |
return v; |
} |
/** Read Trap Level register. |
* |
* @return Current value in TL. |
*/ |
static inline uint64_t tl_read(void) |
{ |
uint64_t v; |
asm volatile ("rdpr %%tl, %0\n" : "=r" (v)); |
return v; |
} |
/** Read Trap Base Address register. |
* |
* @return Current value in TBA. |
*/ |
static inline uint64_t tba_read(void) |
{ |
uint64_t v; |
asm volatile ("rdpr %%tba, %0\n" : "=r" (v)); |
return v; |
} |
/** Write Trap Base Address register. |
* |
* @param v New value of TBA. |
*/ |
static inline void tba_write(uint64_t v) |
{ |
asm volatile ("wrpr %0, %1, %%tba\n" : : "r" (v), "i" (0)); |
} |
/** Load uint64_t from alternate space. |
* |
* @param asi ASI determining the alternate space. |
* @param va Virtual address within the ASI. |
* |
* @return Value read from the virtual address in the specified address space. |
*/ |
static inline uint64_t asi_u64_read(asi_t asi, uintptr_t va) |
{ |
uint64_t v; |
asm volatile ("ldxa [%1] %2, %0\n" : "=r" (v) : "r" (va), "i" ((unsigned) asi)); |
return v; |
} |
/** Store uint64_t to alternate space. |
* |
* @param asi ASI determining the alternate space. |
* @param va Virtual address within the ASI. |
* @param v Value to be written. |
*/ |
static inline void asi_u64_write(asi_t asi, uintptr_t va, uint64_t v) |
{ |
asm volatile ("stxa %0, [%1] %2\n" : : "r" (v), "r" (va), "i" ((unsigned) asi) : "memory"); |
} |
/** Flush all valid register windows to memory. */ |
static inline void flushw(void) |
{ |
asm volatile ("flushw\n"); |
} |
/** Switch to nucleus by setting TL to 1. */ |
static inline void nucleus_enter(void) |
{ |
asm volatile ("wrpr %g0, 1, %tl\n"); |
} |
/** Switch from nucleus by setting TL to 0. */ |
static inline void nucleus_leave(void) |
{ |
asm volatile ("wrpr %g0, %g0, %tl\n"); |
} |
/** Read UPA_CONFIG register. |
* |
* @return Value of the UPA_CONFIG register. |
*/ |
static inline uint64_t upa_config_read(void) |
{ |
return asi_u64_read(ASI_UPA_CONFIG, 0); |
} |
extern void cpu_halt(void); |
extern void cpu_sleep(void); |
extern void asm_delay_loop(const uint32_t usec); |
extern uint64_t read_from_ag_g7(void); |
extern void write_to_ag_g6(uint64_t val); |
extern void write_to_ag_g7(uint64_t val); |
extern void write_to_ig_g6(uint64_t val); |
extern void switch_to_userspace(uint64_t pc, uint64_t sp, uint64_t uarg); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/include/sparc64.h |
---|
0,0 → 1,45 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_sparc64_SPARC64_H_ |
#define KERN_sparc64_SPARC64_H_ |
#include <interrupt.h> |
extern void interrupt_register(int n, const char *name, iroutine f); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/include/fpu_context.h |
---|
0,0 → 1,51 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_sparc64_FPU_CONTEXT_H_ |
#define KERN_sparc64_FPU_CONTEXT_H_ |
#include <arch/types.h> |
#define ARCH_HAS_FPU |
#define FPU_CONTEXT_ALIGN 8 |
typedef struct { |
uint64_t d[32]; |
uint64_t fsr; |
} fpu_context_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/include/context.h |
---|
0,0 → 1,84 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_sparc64_CONTEXT_H_ |
#define KERN_sparc64_CONTEXT_H_ |
#include <arch/stack.h> |
#include <arch/types.h> |
#include <align.h> |
#define SP_DELTA STACK_WINDOW_SAVE_AREA_SIZE |
#ifdef context_set |
#undef context_set |
#endif |
#define context_set(c, _pc, stack, size) \ |
(c)->pc = ((uintptr_t) _pc) - 8; \ |
(c)->sp = ((uintptr_t) stack) + ALIGN_UP((size), \ |
STACK_ALIGNMENT) - (STACK_BIAS + SP_DELTA); \ |
(c)->fp = -STACK_BIAS |
/* |
* Save only registers that must be preserved across |
* function calls. |
*/ |
typedef struct { |
uintptr_t sp; /* %o6 */ |
uintptr_t pc; /* %o7 */ |
uint64_t i0; |
uint64_t i1; |
uint64_t i2; |
uint64_t i3; |
uint64_t i4; |
uint64_t i5; |
uintptr_t fp; /* %i6 */ |
uintptr_t i7; |
uint64_t l0; |
uint64_t l1; |
uint64_t l2; |
uint64_t l3; |
uint64_t l4; |
uint64_t l5; |
uint64_t l6; |
uint64_t l7; |
ipl_t ipl; |
} context_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/include/context_offset.h |
---|
0,0 → 1,51 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#ifndef KERN_sparc64_CONTEXT_OFFSET_H_ |
#define KERN_sparc64_CONTEXT_OFFSET_H_ |
#define OFFSET_SP 0x0 |
#define OFFSET_PC 0x8 |
#define OFFSET_I0 0x10 |
#define OFFSET_I1 0x18 |
#define OFFSET_I2 0x20 |
#define OFFSET_I3 0x28 |
#define OFFSET_I4 0x30 |
#define OFFSET_I5 0x38 |
#define OFFSET_FP 0x40 |
#define OFFSET_I7 0x48 |
#define OFFSET_L0 0x50 |
#define OFFSET_L1 0x58 |
#define OFFSET_L2 0x60 |
#define OFFSET_L3 0x68 |
#define OFFSET_L4 0x70 |
#define OFFSET_L5 0x78 |
#define OFFSET_L6 0x80 |
#define OFFSET_L7 0x88 |
#endif |
/tags/0.3.0/kernel/arch/sparc64/include/regdef.h |
---|
0,0 → 1,64 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_sparc64_REGDEF_H_ |
#define KERN_sparc64_REGDEF_H_ |
#define PSTATE_IE_BIT (1 << 1) |
#define PSTATE_AM_BIT (1 << 3) |
#define PSTATE_AG_BIT (1 << 0) |
#define PSTATE_IG_BIT (1 << 11) |
#define PSTATE_MG_BIT (1 << 10) |
#define PSTATE_PRIV_BIT (1 << 2) |
#define PSTATE_PEF_BIT (1 << 4) |
#define TSTATE_PSTATE_SHIFT 8 |
#define TSTATE_PRIV_BIT (PSTATE_PRIV_BIT << TSTATE_PSTATE_SHIFT) |
#define TSTATE_IE_BIT (PSTATE_IE_BIT << TSTATE_PSTATE_SHIFT) |
#define TSTATE_PEF_BIT (PSTATE_PEF_BIT << TSTATE_PSTATE_SHIFT) |
#define TSTATE_CWP_MASK 0x1f |
#define WSTATE_NORMAL(n) (n) |
#define WSTATE_OTHER(n) ((n) << 3) |
#define UPA_CONFIG_MID_SHIFT 17 |
#define UPA_CONFIG_MID_MASK 0x1f |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/include/cycle.h |
---|
0,0 → 1,48 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_sparc64_CYCLE_H_ |
#define KERN_sparc64_CYCLE_H_ |
#include <arch/asm.h> |
static inline uint64_t get_cycle(void) |
{ |
return tick_read(); |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/include/byteorder.h |
---|
0,0 → 1,49 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_sparc64_BYTEORDER_H_ |
#define KERN_sparc64_BYTEORDER_H_ |
#include <byteorder.h> |
#define uint32_t_le2host(n) uint32_t_byteorder_swap(n) |
#define uint64_t_le2host(n) uint64_t_byteorder_swap(n) |
#define uint32_t_be2host(n) (n) |
#define uint64_t_be2host(n) (n) |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/include/console.h |
---|
0,0 → 1,44 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_sparc64_CONSOLE_H_ |
#define KERN_sparc64_CONSOLE_H_ |
extern void kkbdpoll(void *arg); |
extern void standalone_sparc64_console_init(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/include/elf.h |
---|
0,0 → 1,45 |
/* |
* Copyright (c) 2006 Sergey Bondari |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_sparc64_ELF_H_ |
#define KERN_sparc64_ELF_H_ |
#define ELF_MACHINE EM_SPARCV9 |
#define ELF_DATA_ENCODING ELFDATA2MSB |
#define ELF_CLASS ELFCLASS64 |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/include/memstr.h |
---|
0,0 → 1,48 |
/* |
* Copyright (c) 2005 Sergey Bondari |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_sparc64_MEMSTR_H_ |
#define KERN_sparc64_MEMSTR_H_ |
#define memcpy(dst, src, cnt) __builtin_memcpy((dst), (src), (cnt)) |
extern void memsetw(uintptr_t dst, size_t cnt, uint16_t x); |
extern void memsetb(uintptr_t dst, size_t cnt, uint8_t x); |
extern int memcmp(uintptr_t src, uintptr_t dst, int cnt); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/include/arg.h |
---|
0,0 → 1,43 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_sparc64_ARG_H_ |
#define KERN_sparc64_ARG_H_ |
#include <stdarg.h> |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/include/arch.h |
---|
0,0 → 1,51 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64 |
* @{ |
*/ |
/** |
* @file |
* @brief Various sparc64-specific macros. |
*/ |
#ifndef KERN_sparc64_ARCH_H_ |
#define KERN_sparc64_ARCH_H_ |
#define ASI_AIUP 0x10 /** Access to primary context with user privileges. */ |
#define ASI_AIUS 0x11 /** Access to secondary context with user privileges. */ |
#define ASI_NUCLEUS_QUAD_LDD 0x24 /** ASI for 16-byte atomic loads. */ |
#define ASI_DCACHE_TAG 0x47 /** ASI D-Cache Tag. */ |
#define ASI_UPA_CONFIG 0x4a /** ASI of the UPA_CONFIG register. */ |
#define NWINDOWS 8 /** Number of register window sets. */ |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/include/proc/task.h |
---|
0,0 → 1,47 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64proc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_sparc64_TASK_H_ |
#define KERN_sparc64_TASK_H_ |
typedef struct { |
} task_arch_t; |
#define task_create_arch(t) |
#define task_destroy_arch(t) |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/include/proc/thread.h |
---|
0,0 → 1,49 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64proc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_sparc64_THREAD_H_ |
#define KERN_sparc64_THREAD_H_ |
#include <arch/types.h> |
#include <arch/arch.h> |
typedef struct { |
/** Buffer for register windows with userspace content. */ |
uint8_t *uspace_window_buffer; |
} thread_arch_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/include/faddr.h |
---|
0,0 → 1,45 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_sparc64_FADDR_H_ |
#define KERN_sparc64_FADDR_H_ |
#include <arch/types.h> |
#define FADDR(fptr) ((uintptr_t) (fptr)) |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/include/register.h |
---|
0,0 → 1,140 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_sparc64_REGISTER_H_ |
#define KERN_sparc64_REGISTER_H_ |
#include <arch/regdef.h> |
#include <arch/types.h> |
/** Version Register. */ |
union ver_reg { |
uint64_t value; |
struct { |
uint16_t manuf; /**< Manufacturer code. */ |
uint16_t impl; /**< Implementation code. */ |
uint8_t mask; /**< Mask set revision. */ |
unsigned : 8; |
uint8_t maxtl; |
unsigned : 3; |
unsigned maxwin : 5; |
} __attribute__ ((packed)); |
}; |
typedef union ver_reg ver_reg_t; |
/** Processor State Register. */ |
union pstate_reg { |
uint64_t value; |
struct { |
uint64_t : 52; |
unsigned ig : 1; /**< Interrupt Globals. */ |
unsigned mg : 1; /**< MMU Globals. */ |
unsigned cle : 1; /**< Current Little Endian. */ |
unsigned tle : 1; /**< Trap Little Endian. */ |
unsigned mm : 2; /**< Memory Model. */ |
unsigned red : 1; /**< RED state. */ |
unsigned pef : 1; /**< Enable floating-point. */ |
unsigned am : 1; /**< 32-bit Address Mask. */ |
unsigned priv : 1; /**< Privileged Mode. */ |
unsigned ie : 1; /**< Interrupt Enable. */ |
unsigned ag : 1; /**< Alternate Globals*/ |
} __attribute__ ((packed)); |
}; |
typedef union pstate_reg pstate_reg_t; |
/** TICK Register. */ |
union tick_reg { |
uint64_t value; |
struct { |
unsigned npt : 1; /**< Non-privileged Trap enable. */ |
uint64_t counter : 63; /**< Elapsed CPU clck cycle counter. */ |
} __attribute__ ((packed)); |
}; |
typedef union tick_reg tick_reg_t; |
/** TICK_compare Register. */ |
union tick_compare_reg { |
uint64_t value; |
struct { |
unsigned int_dis : 1; /**< TICK_INT interrupt disabled flag. */ |
uint64_t tick_cmpr : 63; /**< Compare value for TICK interrupts. */ |
} __attribute__ ((packed)); |
}; |
typedef union tick_compare_reg tick_compare_reg_t; |
/** SOFTINT Register. */ |
union softint_reg { |
uint64_t value; |
struct { |
uint64_t : 47; |
unsigned stick_int : 1; |
unsigned int_level : 15; |
unsigned tick_int : 1; |
} __attribute__ ((packed)); |
}; |
typedef union softint_reg softint_reg_t; |
/** Floating-point Registers State Register. */ |
union fprs_reg { |
uint64_t value; |
struct { |
uint64_t : 61; |
unsigned fef : 1; |
unsigned du : 1; |
unsigned dl : 1; |
} __attribute__ ((packed)); |
}; |
typedef union fprs_reg fprs_reg_t; |
/** UPA_CONFIG register. |
* |
* Note that format of this register differs significantly from |
* processor version to version. The format defined here |
* is the common subset for all supported processor versions. |
*/ |
union upa_config { |
uint64_t value; |
struct { |
uint64_t : 34; |
unsigned pcon : 8; /**< Processor configuration. */ |
unsigned mid : 5; /**< Module (processor) ID register. */ |
unsigned pcap : 17; /**< Processor capabilities. */ |
} __attribute__ ((packed)); |
}; |
typedef union upa_config upa_config_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/include/debug.h |
---|
0,0 → 1,41 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sparc64debug |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_sparc64_DEBUG_H_ |
#define KERN_sparc64_DEBUG_H_ |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/sparc64/Makefile.inc |
---|
0,0 → 1,121 |
# |
# Copyright (c) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
## Toolchain configuration |
# |
BFD_NAME = elf64-sparc |
BFD_ARCH = sparc |
BFD = binary |
TARGET = sparc64-linux-gnu |
TOOLCHAIN_DIR = /usr/local/sparc64 |
GCC_CFLAGS += -m64 -mcpu=ultrasparc |
SUNCC_CFLAGS += -m64 -xarch=sparc -xregs=appl,no%float |
LFLAGS += -no-check-sections -N |
DEFS += -D__64_BITS__ |
## Own configuration directives |
# |
## Compile with page hash table support. |
# |
CONFIG_PAGE_HT = y |
DEFS += -DCONFIG_PAGE_HT |
## Compile with support for address space identifiers. |
# |
CONFIG_ASID = y |
CONFIG_ASID_FIFO = y |
## Compile with support for framebuffer. |
# |
CONFIG_FB = y |
## Compile with support for Sun keyboard. |
# |
CONFIG_SUN_KBD = y |
## Compile with support for OpenFirmware device tree. |
# |
CONFIG_OFW_TREE = y |
ifeq ($(CONFIG_SMP),y) |
DEFS += -DCONFIG_SMP |
endif |
ARCH_SOURCES = \ |
arch/$(ARCH)/src/cpu/cpu.c \ |
arch/$(ARCH)/src/asm.S \ |
arch/$(ARCH)/src/panic.S \ |
arch/$(ARCH)/src/console.c \ |
arch/$(ARCH)/src/context.S \ |
arch/$(ARCH)/src/fpu_context.c \ |
arch/$(ARCH)/src/dummy.s \ |
arch/$(ARCH)/src/mm/as.c \ |
arch/$(ARCH)/src/mm/cache.S \ |
arch/$(ARCH)/src/mm/frame.c \ |
arch/$(ARCH)/src/mm/page.c \ |
arch/$(ARCH)/src/mm/tlb.c \ |
arch/$(ARCH)/src/sparc64.c \ |
arch/$(ARCH)/src/start.S \ |
arch/$(ARCH)/src/proc/scheduler.c \ |
arch/$(ARCH)/src/proc/thread.c \ |
arch/$(ARCH)/src/trap/mmu.S \ |
arch/$(ARCH)/src/trap/trap_table.S \ |
arch/$(ARCH)/src/trap/trap.c \ |
arch/$(ARCH)/src/trap/exception.c \ |
arch/$(ARCH)/src/trap/interrupt.c \ |
arch/$(ARCH)/src/ddi/ddi.c \ |
arch/$(ARCH)/src/drivers/tick.c \ |
arch/$(ARCH)/src/drivers/kbd.c \ |
arch/$(ARCH)/src/drivers/scr.c \ |
arch/$(ARCH)/src/drivers/pci.c |
ifeq ($(CONFIG_SMP),y) |
ARCH_SOURCES += \ |
arch/$(ARCH)/src/smp/ipi.c \ |
arch/$(ARCH)/src/smp/smp.c |
endif |
ifeq ($(CONFIG_TSB),y) |
ARCH_SOURCES += \ |
arch/$(ARCH)/src/mm/tsb.c |
endif |
ifdef CONFIG_Z8530 |
ARCH_SOURCES += \ |
arch/$(ARCH)/src/drivers/fhc.c |
endif |
/tags/0.3.0/kernel/arch/sparc64/_link.ld.in |
---|
0,0 → 1,48 |
/** SPARC64 linker script |
* |
* It is ELF format, but its only section looks like this: |
* kernel text |
* kernel data |
* |
*/ |
#include <arch/boot/boot.h> |
ENTRY(kernel_image_start) |
SECTIONS { |
.image VMA: AT (LMA) { |
ktext_start = .; |
*(K_TEXT_START) |
*(.text); |
ktext_end = .; |
kdata_start = .; |
*(K_DATA_START) |
*(.rodata); |
*(.rodata.*); |
*(.data); /* initialized data */ |
*(.sdata); |
*(.sdata2); |
*(.sbss); |
. = ALIGN(8); |
hardcoded_ktext_size = .; |
QUAD(ktext_end - ktext_start); |
hardcoded_kdata_size = .; |
QUAD(kdata_end - kdata_start); |
hardcoded_load_address = .; |
QUAD(VMA); |
*(.bss); /* uninitialized static variables */ |
*(COMMON); /* global variables */ |
symbol_table = .; |
*(symtab.*); /* Symbol table, must be LAST symbol!*/ |
kdata_end = .; |
} |
/DISCARD/ : { |
*(*); |
} |
} |
/tags/0.3.0/kernel/arch/ia64/src/ia64.c |
---|
0,0 → 1,232 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia64 |
* @{ |
*/ |
/** @file |
*/ |
#include <arch.h> |
#include <arch/ski/ski.h> |
#include <arch/drivers/it.h> |
#include <arch/interrupt.h> |
#include <arch/barrier.h> |
#include <arch/asm.h> |
#include <arch/register.h> |
#include <arch/types.h> |
#include <arch/context.h> |
#include <arch/stack.h> |
#include <arch/mm/page.h> |
#include <mm/as.h> |
#include <config.h> |
#include <userspace.h> |
#include <console/console.h> |
#include <proc/uarg.h> |
#include <syscall/syscall.h> |
#include <ddi/irq.h> |
#include <ddi/device.h> |
#include <arch/drivers/ega.h> |
#include <arch/bootinfo.h> |
#include <genarch/kbd/i8042.h> |
bootinfo_t *bootinfo; |
void arch_pre_main(void) |
{ |
/* Setup usermode init tasks. */ |
//#ifdef I460GX |
unsigned int i; |
init.cnt = bootinfo->taskmap.count; |
for (i = 0; i < init.cnt; i++) { |
init.tasks[i].addr = ((unsigned long) bootinfo->taskmap.tasks[i].addr) | VRN_MASK; |
init.tasks[i].size = bootinfo->taskmap.tasks[i].size; |
} |
/* |
#else |
init.cnt = 8; |
init.tasks[0].addr = INIT0_ADDRESS; |
init.tasks[0].size = INIT0_SIZE; |
init.tasks[1].addr = INIT0_ADDRESS + 0x400000; |
init.tasks[1].size = INIT0_SIZE; |
init.tasks[2].addr = INIT0_ADDRESS + 0x800000; |
init.tasks[2].size = INIT0_SIZE; |
init.tasks[3].addr = INIT0_ADDRESS + 0xc00000; |
init.tasks[3].size = INIT0_SIZE; |
init.tasks[4].addr = INIT0_ADDRESS + 0x1000000; |
init.tasks[4].size = INIT0_SIZE; |
init.tasks[5].addr = INIT0_ADDRESS + 0x1400000; |
init.tasks[5].size = INIT0_SIZE; |
init.tasks[6].addr = INIT0_ADDRESS + 0x1800000; |
init.tasks[6].size = INIT0_SIZE; |
init.tasks[7].addr = INIT0_ADDRESS + 0x1c00000; |
init.tasks[7].size = INIT0_SIZE; |
#endif*/ |
} |
void arch_pre_mm_init(void) |
{ |
/* Set Interruption Vector Address (i.e. location of interruption vector table). */ |
iva_write((uintptr_t) &ivt); |
srlz_d(); |
} |
void arch_post_mm_init(void) |
{ |
irq_init(INR_COUNT, INR_COUNT); |
#ifdef SKI |
ski_init_console(); |
#else |
ega_init(); |
#endif |
it_init(); |
} |
void arch_post_cpu_init(void) |
{ |
} |
void arch_pre_smp_init(void) |
{ |
} |
#ifdef I460GX |
#define POLL_INTERVAL 50000 /* 50 ms */ |
/** Kernel thread for polling keyboard. */ |
static void i8042_kkbdpoll(void *arg) |
{ |
while (1) { |
i8042_poll(); |
thread_usleep(POLL_INTERVAL); |
} |
} |
#endif |
void arch_post_smp_init(void) |
{ |
if (config.cpu_active == 1) { |
/* |
* Create thread that polls keyboard. |
*/ |
#ifdef SKI |
thread_t *t; |
t = thread_create(kkbdpoll, NULL, TASK, 0, "kkbdpoll", true); |
if (!t) |
panic("cannot create kkbdpoll\n"); |
thread_ready(t); |
#endif |
#ifdef I460GX |
devno_t kbd = device_assign_devno(); |
devno_t mouse = device_assign_devno(); |
/* keyboard controller */ |
i8042_init(kbd, IRQ_KBD, mouse, IRQ_MOUSE); |
thread_t *t; |
t = thread_create(i8042_kkbdpoll, NULL, TASK, 0, "kkbdpoll", true); |
if (!t) |
panic("cannot create kkbdpoll\n"); |
thread_ready(t); |
#endif |
} |
} |
/** Enter userspace and never return. */ |
void userspace(uspace_arg_t *kernel_uarg) |
{ |
psr_t psr; |
rsc_t rsc; |
psr.value = psr_read(); |
psr.cpl = PL_USER; |
psr.i = true; /* start with interrupts enabled */ |
psr.ic = true; |
psr.ri = 0; /* start with instruction #0 */ |
psr.bn = 1; /* start in bank 0 */ |
asm volatile ("mov %0 = ar.rsc\n" : "=r" (rsc.value)); |
rsc.loadrs = 0; |
rsc.be = false; |
rsc.pl = PL_USER; |
rsc.mode = 3; /* eager mode */ |
switch_to_userspace((uintptr_t) kernel_uarg->uspace_entry, |
((uintptr_t) kernel_uarg->uspace_stack)+PAGE_SIZE-ALIGN_UP(STACK_ITEM_SIZE, STACK_ALIGNMENT), |
((uintptr_t) kernel_uarg->uspace_stack)+PAGE_SIZE, |
(uintptr_t) kernel_uarg->uspace_uarg, |
psr.value, rsc.value); |
while (1) { |
; |
} |
} |
/** Set thread-local-storage pointer. |
* |
* We use r13 (a.k.a. tp) for this purpose. |
*/ |
unative_t sys_tls_set(unative_t addr) |
{ |
return 0; |
} |
/** Acquire console back for kernel |
* |
*/ |
void arch_grab_console(void) |
{ |
#ifdef SKI |
ski_kbd_grab(); |
#endif |
} |
/** Return console to userspace |
* |
*/ |
void arch_release_console(void) |
{ |
#ifdef SKI |
ski_kbd_release(); |
#endif |
} |
void arch_reboot(void) |
{ |
// TODO |
while (1); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia64/src/mm/tlb.c |
---|
0,0 → 1,688 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia64mm |
* @{ |
*/ |
/** @file |
*/ |
/* |
* TLB management. |
*/ |
#include <mm/tlb.h> |
#include <mm/asid.h> |
#include <mm/page.h> |
#include <mm/as.h> |
#include <arch/mm/tlb.h> |
#include <arch/mm/page.h> |
#include <arch/mm/vhpt.h> |
#include <arch/barrier.h> |
#include <arch/interrupt.h> |
#include <arch/pal/pal.h> |
#include <arch/asm.h> |
#include <panic.h> |
#include <print.h> |
#include <arch.h> |
#include <interrupt.h> |
/** Invalidate all TLB entries. */ |
void tlb_invalidate_all(void) |
{ |
ipl_t ipl; |
uintptr_t adr; |
uint32_t count1, count2, stride1, stride2; |
unsigned int i, j; |
adr = PAL_PTCE_INFO_BASE(); |
count1 = PAL_PTCE_INFO_COUNT1(); |
count2 = PAL_PTCE_INFO_COUNT2(); |
stride1 = PAL_PTCE_INFO_STRIDE1(); |
stride2 = PAL_PTCE_INFO_STRIDE2(); |
ipl = interrupts_disable(); |
for (i = 0; i < count1; i++) { |
for (j = 0; j < count2; j++) { |
asm volatile ( |
"ptc.e %0 ;;" |
: |
: "r" (adr) |
); |
adr += stride2; |
} |
adr += stride1; |
} |
interrupts_restore(ipl); |
srlz_d(); |
srlz_i(); |
#ifdef CONFIG_VHPT |
vhpt_invalidate_all(); |
#endif |
} |
/** Invalidate entries belonging to an address space. |
* |
* @param asid Address space identifier. |
*/ |
void tlb_invalidate_asid(asid_t asid) |
{ |
tlb_invalidate_all(); |
} |
void tlb_invalidate_pages(asid_t asid, uintptr_t page, count_t cnt) |
{ |
region_register rr; |
bool restore_rr = false; |
int b = 0; |
int c = cnt; |
uintptr_t va; |
va = page; |
rr.word = rr_read(VA2VRN(va)); |
if ((restore_rr = (rr.map.rid != ASID2RID(asid, VA2VRN(va))))) { |
/* |
* The selected region register does not contain required RID. |
* Save the old content of the register and replace the RID. |
*/ |
region_register rr0; |
rr0 = rr; |
rr0.map.rid = ASID2RID(asid, VA2VRN(va)); |
rr_write(VA2VRN(va), rr0.word); |
srlz_d(); |
srlz_i(); |
} |
while(c >>= 1) |
b++; |
b >>= 1; |
uint64_t ps; |
switch (b) { |
case 0: /*cnt 1-3*/ |
ps = PAGE_WIDTH; |
break; |
case 1: /*cnt 4-15*/ |
/*cnt=((cnt-1)/4)+1;*/ |
ps = PAGE_WIDTH+2; |
va &= ~((1<<ps)-1); |
break; |
case 2: /*cnt 16-63*/ |
/*cnt=((cnt-1)/16)+1;*/ |
ps = PAGE_WIDTH+4; |
va &= ~((1<<ps)-1); |
break; |
case 3: /*cnt 64-255*/ |
/*cnt=((cnt-1)/64)+1;*/ |
ps = PAGE_WIDTH+6; |
va &= ~((1<<ps)-1); |
break; |
case 4: /*cnt 256-1023*/ |
/*cnt=((cnt-1)/256)+1;*/ |
ps = PAGE_WIDTH+8; |
va &= ~((1<<ps)-1); |
break; |
case 5: /*cnt 1024-4095*/ |
/*cnt=((cnt-1)/1024)+1;*/ |
ps = PAGE_WIDTH+10; |
va &= ~((1<<ps)-1); |
break; |
case 6: /*cnt 4096-16383*/ |
/*cnt=((cnt-1)/4096)+1;*/ |
ps = PAGE_WIDTH+12; |
va &= ~((1<<ps)-1); |
break; |
case 7: /*cnt 16384-65535*/ |
case 8: /*cnt 65536-(256K-1)*/ |
/*cnt=((cnt-1)/16384)+1;*/ |
ps = PAGE_WIDTH+14; |
va &= ~((1<<ps)-1); |
break; |
default: |
/*cnt=((cnt-1)/(16384*16))+1;*/ |
ps=PAGE_WIDTH+18; |
va&=~((1<<ps)-1); |
break; |
} |
/*cnt+=(page!=va);*/ |
for(; va<(page+cnt*(PAGE_SIZE)); va += (1<<ps)) { |
asm volatile ( |
"ptc.l %0,%1;;" |
: |
: "r" (va), "r" (ps<<2) |
); |
} |
srlz_d(); |
srlz_i(); |
if (restore_rr) { |
rr_write(VA2VRN(va), rr.word); |
srlz_d(); |
srlz_i(); |
} |
} |
/** Insert data into data translation cache. |
* |
* @param va Virtual page address. |
* @param asid Address space identifier. |
* @param entry The rest of TLB entry as required by TLB insertion format. |
*/ |
void dtc_mapping_insert(uintptr_t va, asid_t asid, tlb_entry_t entry) |
{ |
tc_mapping_insert(va, asid, entry, true); |
} |
/** Insert data into instruction translation cache. |
* |
* @param va Virtual page address. |
* @param asid Address space identifier. |
* @param entry The rest of TLB entry as required by TLB insertion format. |
*/ |
void itc_mapping_insert(uintptr_t va, asid_t asid, tlb_entry_t entry) |
{ |
tc_mapping_insert(va, asid, entry, false); |
} |
/** Insert data into instruction or data translation cache. |
* |
* @param va Virtual page address. |
* @param asid Address space identifier. |
* @param entry The rest of TLB entry as required by TLB insertion format. |
* @param dtc If true, insert into data translation cache, use instruction translation cache otherwise. |
*/ |
void tc_mapping_insert(uintptr_t va, asid_t asid, tlb_entry_t entry, bool dtc) |
{ |
region_register rr; |
bool restore_rr = false; |
rr.word = rr_read(VA2VRN(va)); |
if ((restore_rr = (rr.map.rid != ASID2RID(asid, VA2VRN(va))))) { |
/* |
* The selected region register does not contain required RID. |
* Save the old content of the register and replace the RID. |
*/ |
region_register rr0; |
rr0 = rr; |
rr0.map.rid = ASID2RID(asid, VA2VRN(va)); |
rr_write(VA2VRN(va), rr0.word); |
srlz_d(); |
srlz_i(); |
} |
asm volatile ( |
"mov r8=psr;;\n" |
"rsm %0;;\n" /* PSR_IC_MASK */ |
"srlz.d;;\n" |
"srlz.i;;\n" |
"mov cr.ifa=%1\n" /* va */ |
"mov cr.itir=%2;;\n" /* entry.word[1] */ |
"cmp.eq p6,p7 = %4,r0;;\n" /* decide between itc and dtc */ |
"(p6) itc.i %3;;\n" |
"(p7) itc.d %3;;\n" |
"mov psr.l=r8;;\n" |
"srlz.d;;\n" |
: |
: "i" (PSR_IC_MASK), "r" (va), "r" (entry.word[1]), "r" (entry.word[0]), "r" (dtc) |
: "p6", "p7", "r8" |
); |
if (restore_rr) { |
rr_write(VA2VRN(va), rr.word); |
srlz_d(); |
srlz_i(); |
} |
} |
/** Insert data into instruction translation register. |
* |
* @param va Virtual page address. |
* @param asid Address space identifier. |
* @param entry The rest of TLB entry as required by TLB insertion format. |
* @param tr Translation register. |
*/ |
void itr_mapping_insert(uintptr_t va, asid_t asid, tlb_entry_t entry, index_t tr) |
{ |
tr_mapping_insert(va, asid, entry, false, tr); |
} |
/** Insert data into data translation register. |
* |
* @param va Virtual page address. |
* @param asid Address space identifier. |
* @param entry The rest of TLB entry as required by TLB insertion format. |
* @param tr Translation register. |
*/ |
void dtr_mapping_insert(uintptr_t va, asid_t asid, tlb_entry_t entry, index_t tr) |
{ |
tr_mapping_insert(va, asid, entry, true, tr); |
} |
/** Insert data into instruction or data translation register. |
* |
* @param va Virtual page address. |
* @param asid Address space identifier. |
* @param entry The rest of TLB entry as required by TLB insertion format. |
* @param dtr If true, insert into data translation register, use instruction translation register otherwise. |
* @param tr Translation register. |
*/ |
void tr_mapping_insert(uintptr_t va, asid_t asid, tlb_entry_t entry, bool dtr, index_t tr) |
{ |
region_register rr; |
bool restore_rr = false; |
rr.word = rr_read(VA2VRN(va)); |
if ((restore_rr = (rr.map.rid != ASID2RID(asid, VA2VRN(va))))) { |
/* |
* The selected region register does not contain required RID. |
* Save the old content of the register and replace the RID. |
*/ |
region_register rr0; |
rr0 = rr; |
rr0.map.rid = ASID2RID(asid, VA2VRN(va)); |
rr_write(VA2VRN(va), rr0.word); |
srlz_d(); |
srlz_i(); |
} |
asm volatile ( |
"mov r8=psr;;\n" |
"rsm %0;;\n" /* PSR_IC_MASK */ |
"srlz.d;;\n" |
"srlz.i;;\n" |
"mov cr.ifa=%1\n" /* va */ |
"mov cr.itir=%2;;\n" /* entry.word[1] */ |
"cmp.eq p6,p7=%5,r0;;\n" /* decide between itr and dtr */ |
"(p6) itr.i itr[%4]=%3;;\n" |
"(p7) itr.d dtr[%4]=%3;;\n" |
"mov psr.l=r8;;\n" |
"srlz.d;;\n" |
: |
: "i" (PSR_IC_MASK), "r" (va), "r" (entry.word[1]), "r" (entry.word[0]), "r" (tr), "r" (dtr) |
: "p6", "p7", "r8" |
); |
if (restore_rr) { |
rr_write(VA2VRN(va), rr.word); |
srlz_d(); |
srlz_i(); |
} |
} |
/** Insert data into DTLB. |
* |
* @param page Virtual page address including VRN bits. |
* @param frame Physical frame address. |
* @param dtr If true, insert into data translation register, use data translation cache otherwise. |
* @param tr Translation register if dtr is true, ignored otherwise. |
*/ |
void dtlb_kernel_mapping_insert(uintptr_t page, uintptr_t frame, bool dtr, index_t tr) |
{ |
tlb_entry_t entry; |
entry.word[0] = 0; |
entry.word[1] = 0; |
entry.p = true; /* present */ |
entry.ma = MA_WRITEBACK; |
entry.a = true; /* already accessed */ |
entry.d = true; /* already dirty */ |
entry.pl = PL_KERNEL; |
entry.ar = AR_READ | AR_WRITE; |
entry.ppn = frame >> PPN_SHIFT; |
entry.ps = PAGE_WIDTH; |
if (dtr) |
dtr_mapping_insert(page, ASID_KERNEL, entry, tr); |
else |
dtc_mapping_insert(page, ASID_KERNEL, entry); |
} |
/** Purge kernel entries from DTR. |
* |
* Purge DTR entries used by the kernel. |
* |
* @param page Virtual page address including VRN bits. |
* @param width Width of the purge in bits. |
*/ |
void dtr_purge(uintptr_t page, count_t width) |
{ |
asm volatile ("ptr.d %0, %1\n" : : "r" (page), "r" (width<<2)); |
} |
/** Copy content of PTE into data translation cache. |
* |
* @param t PTE. |
*/ |
void dtc_pte_copy(pte_t *t) |
{ |
tlb_entry_t entry; |
entry.word[0] = 0; |
entry.word[1] = 0; |
entry.p = t->p; |
entry.ma = t->c ? MA_WRITEBACK : MA_UNCACHEABLE; |
entry.a = t->a; |
entry.d = t->d; |
entry.pl = t->k ? PL_KERNEL : PL_USER; |
entry.ar = t->w ? AR_WRITE : AR_READ; |
entry.ppn = t->frame >> PPN_SHIFT; |
entry.ps = PAGE_WIDTH; |
dtc_mapping_insert(t->page, t->as->asid, entry); |
#ifdef CONFIG_VHPT |
vhpt_mapping_insert(t->page, t->as->asid, entry); |
#endif |
} |
/** Copy content of PTE into instruction translation cache. |
* |
* @param t PTE. |
*/ |
void itc_pte_copy(pte_t *t) |
{ |
tlb_entry_t entry; |
entry.word[0] = 0; |
entry.word[1] = 0; |
ASSERT(t->x); |
entry.p = t->p; |
entry.ma = t->c ? MA_WRITEBACK : MA_UNCACHEABLE; |
entry.a = t->a; |
entry.pl = t->k ? PL_KERNEL : PL_USER; |
entry.ar = t->x ? (AR_EXECUTE | AR_READ) : AR_READ; |
entry.ppn = t->frame >> PPN_SHIFT; |
entry.ps = PAGE_WIDTH; |
itc_mapping_insert(t->page, t->as->asid, entry); |
#ifdef CONFIG_VHPT |
vhpt_mapping_insert(t->page, t->as->asid, entry); |
#endif |
} |
/** Instruction TLB fault handler for faults with VHPT turned off. |
* |
* @param vector Interruption vector. |
* @param istate Structure with saved interruption state. |
*/ |
void alternate_instruction_tlb_fault(uint64_t vector, istate_t *istate) |
{ |
region_register rr; |
rid_t rid; |
uintptr_t va; |
pte_t *t; |
va = istate->cr_ifa; /* faulting address */ |
rr.word = rr_read(VA2VRN(va)); |
rid = rr.map.rid; |
page_table_lock(AS, true); |
t = page_mapping_find(AS, va); |
if (t) { |
/* |
* The mapping was found in software page hash table. |
* Insert it into data translation cache. |
*/ |
itc_pte_copy(t); |
page_table_unlock(AS, true); |
} else { |
/* |
* Forward the page fault to address space page fault handler. |
*/ |
page_table_unlock(AS, true); |
if (as_page_fault(va, PF_ACCESS_EXEC, istate) == AS_PF_FAULT) { |
fault_if_from_uspace(istate,"Page fault at %p",va); |
panic("%s: va=%p, rid=%d, iip=%p\n", __func__, va, rid, istate->cr_iip); |
} |
} |
} |
/** Data TLB fault handler for faults with VHPT turned off. |
* |
* @param vector Interruption vector. |
* @param istate Structure with saved interruption state. |
*/ |
void alternate_data_tlb_fault(uint64_t vector, istate_t *istate) |
{ |
region_register rr; |
rid_t rid; |
uintptr_t va; |
pte_t *t; |
va = istate->cr_ifa; /* faulting address */ |
rr.word = rr_read(VA2VRN(va)); |
rid = rr.map.rid; |
if (RID2ASID(rid) == ASID_KERNEL) { |
if (VA2VRN(va) == VRN_KERNEL) { |
/* |
* Provide KA2PA(identity) mapping for faulting piece of |
* kernel address space. |
*/ |
dtlb_kernel_mapping_insert(va, KA2PA(va), false, 0); |
return; |
} |
} |
page_table_lock(AS, true); |
t = page_mapping_find(AS, va); |
if (t) { |
/* |
* The mapping was found in the software page hash table. |
* Insert it into data translation cache. |
*/ |
dtc_pte_copy(t); |
page_table_unlock(AS, true); |
} else { |
/* |
* Forward the page fault to the address space page fault handler. |
*/ |
page_table_unlock(AS, true); |
if (as_page_fault(va, PF_ACCESS_READ, istate) == AS_PF_FAULT) { |
fault_if_from_uspace(istate,"Page fault at %p",va); |
panic("%s: va=%p, rid=%d, iip=%p\n", __func__, va, rid, istate->cr_iip); |
} |
} |
} |
/** Data nested TLB fault handler. |
* |
* This fault should not occur. |
* |
* @param vector Interruption vector. |
* @param istate Structure with saved interruption state. |
*/ |
void data_nested_tlb_fault(uint64_t vector, istate_t *istate) |
{ |
panic("%s\n", __func__); |
} |
/** Data Dirty bit fault handler. |
* |
* @param vector Interruption vector. |
* @param istate Structure with saved interruption state. |
*/ |
void data_dirty_bit_fault(uint64_t vector, istate_t *istate) |
{ |
region_register rr; |
rid_t rid; |
uintptr_t va; |
pte_t *t; |
va = istate->cr_ifa; /* faulting address */ |
rr.word = rr_read(VA2VRN(va)); |
rid = rr.map.rid; |
page_table_lock(AS, true); |
t = page_mapping_find(AS, va); |
ASSERT(t && t->p); |
if (t && t->p && t->w) { |
/* |
* Update the Dirty bit in page tables and reinsert |
* the mapping into DTC. |
*/ |
t->d = true; |
dtc_pte_copy(t); |
} else { |
if (as_page_fault(va, PF_ACCESS_WRITE, istate) == AS_PF_FAULT) { |
fault_if_from_uspace(istate,"Page fault at %p",va); |
panic("%s: va=%p, rid=%d, iip=%p\n", __func__, va, rid, istate->cr_iip); |
t->d = true; |
dtc_pte_copy(t); |
} |
} |
page_table_unlock(AS, true); |
} |
/** Instruction access bit fault handler. |
* |
* @param vector Interruption vector. |
* @param istate Structure with saved interruption state. |
*/ |
void instruction_access_bit_fault(uint64_t vector, istate_t *istate) |
{ |
region_register rr; |
rid_t rid; |
uintptr_t va; |
pte_t *t; |
va = istate->cr_ifa; /* faulting address */ |
rr.word = rr_read(VA2VRN(va)); |
rid = rr.map.rid; |
page_table_lock(AS, true); |
t = page_mapping_find(AS, va); |
ASSERT(t && t->p); |
if (t && t->p && t->x) { |
/* |
* Update the Accessed bit in page tables and reinsert |
* the mapping into ITC. |
*/ |
t->a = true; |
itc_pte_copy(t); |
} else { |
if (as_page_fault(va, PF_ACCESS_EXEC, istate) == AS_PF_FAULT) { |
fault_if_from_uspace(istate,"Page fault at %p",va); |
panic("%s: va=%p, rid=%d, iip=%p\n", __func__, va, rid, istate->cr_iip); |
t->a = true; |
itc_pte_copy(t); |
} |
} |
page_table_unlock(AS, true); |
} |
/** Data access bit fault handler. |
* |
* @param vector Interruption vector. |
* @param istate Structure with saved interruption state. |
*/ |
void data_access_bit_fault(uint64_t vector, istate_t *istate) |
{ |
region_register rr; |
rid_t rid; |
uintptr_t va; |
pte_t *t; |
va = istate->cr_ifa; /* faulting address */ |
rr.word = rr_read(VA2VRN(va)); |
rid = rr.map.rid; |
page_table_lock(AS, true); |
t = page_mapping_find(AS, va); |
ASSERT(t && t->p); |
if (t && t->p) { |
/* |
* Update the Accessed bit in page tables and reinsert |
* the mapping into DTC. |
*/ |
t->a = true; |
dtc_pte_copy(t); |
} else { |
if (as_page_fault(va, PF_ACCESS_READ, istate) == AS_PF_FAULT) { |
fault_if_from_uspace(istate,"Page fault at %p",va); |
panic("%s: va=%p, rid=%d, iip=%p\n", __func__, va, rid, istate->cr_iip); |
t->a = true; |
itc_pte_copy(t); |
} |
} |
page_table_unlock(AS, true); |
} |
/** Page not present fault handler. |
* |
* @param vector Interruption vector. |
* @param istate Structure with saved interruption state. |
*/ |
void page_not_present(uint64_t vector, istate_t *istate) |
{ |
region_register rr; |
rid_t rid; |
uintptr_t va; |
pte_t *t; |
va = istate->cr_ifa; /* faulting address */ |
rr.word = rr_read(VA2VRN(va)); |
rid = rr.map.rid; |
page_table_lock(AS, true); |
t = page_mapping_find(AS, va); |
ASSERT(t); |
if (t->p) { |
/* |
* If the Present bit is set in page hash table, just copy it |
* and update ITC/DTC. |
*/ |
if (t->x) |
itc_pte_copy(t); |
else |
dtc_pte_copy(t); |
page_table_unlock(AS, true); |
} else { |
page_table_unlock(AS, true); |
if (as_page_fault(va, PF_ACCESS_READ, istate) == AS_PF_FAULT) { |
fault_if_from_uspace(istate,"Page fault at %p",va); |
panic("%s: va=%p, rid=%d\n", __func__, va, rid); |
} |
} |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia64/src/mm/frame.c |
---|
0,0 → 1,62 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia64mm |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/mm/frame.h> |
#include <mm/frame.h> |
#include <config.h> |
#include <panic.h> |
/* |
* This is Ski-specific and certainly not sufficient |
* for real ia64 systems that provide memory map. |
*/ |
#define MEMORY_SIZE (64 * 1024 * 1024) |
#define MEMORY_BASE (64 * 1024 * 1024) |
#define ROM_BASE 0xa0000 //For ski |
#define ROM_SIZE (384 * 1024) //For ski |
void poke_char(int x,int y,char ch, char c); |
void frame_arch_init(void) |
{ |
zone_create(MEMORY_BASE >> FRAME_WIDTH, SIZE2FRAMES(MEMORY_SIZE), (MEMORY_SIZE) >> FRAME_WIDTH, 0); |
/* |
* Blacklist ROM regions. |
*/ |
frame_mark_unavailable(ADDR2PFN(ROM_BASE), SIZE2FRAMES(ROM_SIZE)); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia64/src/mm/as.c |
---|
0,0 → 1,81 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia64mm |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/mm/as.h> |
#include <arch/mm/asid.h> |
#include <arch/mm/page.h> |
#include <genarch/mm/as_ht.h> |
#include <genarch/mm/page_ht.h> |
#include <genarch/mm/asid_fifo.h> |
#include <mm/asid.h> |
#include <arch/barrier.h> |
/** Architecture dependent address space init. */ |
void as_arch_init(void) |
{ |
as_operations = &as_ht_operations; |
asid_fifo_init(); |
} |
/** Prepare registers for switching to another address space. |
* |
* @param as Address space. |
*/ |
void as_install_arch(as_t *as) |
{ |
region_register rr; |
int i; |
ASSERT(as->asid != ASID_INVALID); |
/* |
* Load respective ASID (7 consecutive RIDs) to |
* region registers. |
*/ |
for (i = 0; i < REGION_REGISTERS; i++) { |
if (i == VRN_KERNEL) |
continue; |
rr.word = rr_read(i); |
rr.map.ve = false; /* disable VHPT walker */ |
rr.map.rid = ASID2RID(as->asid, i); |
rr.map.ps = PAGE_WIDTH; |
rr_write(i, rr.word); |
} |
srlz_d(); |
srlz_i(); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia64/src/mm/vhpt.c |
---|
0,0 → 1,93 |
/* |
* Copyright (c) 2006 Jakub Vana |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia64mm |
* @{ |
*/ |
/** @file |
*/ |
#include <memstr.h> |
#include <arch/mm/vhpt.h> |
#include <mm/frame.h> |
#include <print.h> |
static vhpt_entry_t* vhpt_base; |
uintptr_t vhpt_set_up(void) |
{ |
vhpt_base = frame_alloc(VHPT_WIDTH - FRAME_WIDTH, FRAME_KA | FRAME_ATOMIC); |
if (!vhpt_base) |
panic("Kernel configured with VHPT but no memory for table."); |
vhpt_invalidate_all(); |
return (uintptr_t) vhpt_base; |
} |
void vhpt_mapping_insert(uintptr_t va, asid_t asid, tlb_entry_t entry) |
{ |
region_register rr_save, rr; |
index_t vrn; |
rid_t rid; |
uint64_t tag; |
vhpt_entry_t *ventry; |
vrn = va >> VRN_SHIFT; |
rid = ASID2RID(asid, vrn); |
rr_save.word = rr_read(vrn); |
rr.word = rr_save.word; |
rr.map.rid = rid; |
rr_write(vrn, rr.word); |
srlz_i(); |
ventry = (vhpt_entry_t *) thash(va); |
tag = ttag(va); |
rr_write(vrn, rr_save.word); |
srlz_i(); |
srlz_d(); |
ventry->word[0] = entry.word[0]; |
ventry->word[1] = entry.word[1]; |
ventry->present.tag.tag_word = tag; |
} |
void vhpt_invalidate_all() |
{ |
memsetb((uintptr_t) vhpt_base, 1 << VHPT_WIDTH, 0); |
} |
void vhpt_invalidate_asid(asid_t asid) |
{ |
vhpt_invalidate_all(); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia64/src/mm/page.c |
---|
0,0 → 1,266 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* Copyright (c) 2006 Jakub Vana |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia64mm |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/mm/page.h> |
#include <genarch/mm/page_ht.h> |
#include <mm/asid.h> |
#include <arch/mm/asid.h> |
#include <arch/mm/vhpt.h> |
#include <arch/types.h> |
#include <print.h> |
#include <mm/page.h> |
#include <mm/frame.h> |
#include <config.h> |
#include <panic.h> |
#include <arch/asm.h> |
#include <arch/barrier.h> |
#include <memstr.h> |
static void set_environment(void); |
/** Initialize ia64 virtual address translation subsystem. */ |
void page_arch_init(void) |
{ |
page_mapping_operations = &ht_mapping_operations; |
pk_disable(); |
set_environment(); |
} |
/** Initialize VHPT and region registers. */ |
void set_environment(void) |
{ |
region_register rr; |
pta_register pta; |
int i; |
#ifdef CONFIG_VHPT |
uintptr_t vhpt_base; |
#endif |
/* |
* First set up kernel region register. |
* This is redundant (see start.S) but we keep it here just for sure. |
*/ |
rr.word = rr_read(VRN_KERNEL); |
rr.map.ve = 0; /* disable VHPT walker */ |
rr.map.ps = PAGE_WIDTH; |
rr.map.rid = ASID2RID(ASID_KERNEL, VRN_KERNEL); |
rr_write(VRN_KERNEL, rr.word); |
srlz_i(); |
srlz_d(); |
/* |
* And setup the rest of region register. |
*/ |
for(i = 0; i < REGION_REGISTERS; i++) { |
/* skip kernel rr */ |
if (i == VRN_KERNEL) |
continue; |
rr.word = rr_read(i); |
rr.map.ve = 0; /* disable VHPT walker */ |
rr.map.rid = RID_KERNEL; |
rr.map.ps = PAGE_WIDTH; |
rr_write(i, rr.word); |
srlz_i(); |
srlz_d(); |
} |
#ifdef CONFIG_VHPT |
vhpt_base = vhpt_set_up(); |
#endif |
/* |
* Set up PTA register. |
*/ |
pta.word = pta_read(); |
#ifndef CONFIG_VHPT |
pta.map.ve = 0; /* disable VHPT walker */ |
pta.map.base = 0 >> PTA_BASE_SHIFT; |
#else |
pta.map.ve = 1; /* enable VHPT walker */ |
pta.map.base = vhpt_base >> PTA_BASE_SHIFT; |
#endif |
pta.map.vf = 1; /* large entry format */ |
pta.map.size = VHPT_WIDTH; |
pta_write(pta.word); |
srlz_i(); |
srlz_d(); |
} |
/** Calculate address of collision chain from VPN and ASID. |
* |
* Interrupts must be disabled. |
* |
* @param page Address of virtual page including VRN bits. |
* @param asid Address space identifier. |
* |
* @return VHPT entry address. |
*/ |
vhpt_entry_t *vhpt_hash(uintptr_t page, asid_t asid) |
{ |
region_register rr_save, rr; |
index_t vrn; |
rid_t rid; |
vhpt_entry_t *v; |
vrn = page >> VRN_SHIFT; |
rid = ASID2RID(asid, vrn); |
rr_save.word = rr_read(vrn); |
if (rr_save.map.rid == rid) { |
/* |
* The RID is already in place, compute thash and return. |
*/ |
v = (vhpt_entry_t *) thash(page); |
return v; |
} |
/* |
* The RID must be written to some region register. |
* To speed things up, register indexed by vrn is used. |
*/ |
rr.word = rr_save.word; |
rr.map.rid = rid; |
rr_write(vrn, rr.word); |
srlz_i(); |
v = (vhpt_entry_t *) thash(page); |
rr_write(vrn, rr_save.word); |
srlz_i(); |
srlz_d(); |
return v; |
} |
/** Compare ASID and VPN against PTE. |
* |
* Interrupts must be disabled. |
* |
* @param page Address of virtual page including VRN bits. |
* @param asid Address space identifier. |
* |
* @return True if page and asid match the page and asid of t, false otherwise. |
*/ |
bool vhpt_compare(uintptr_t page, asid_t asid, vhpt_entry_t *v) |
{ |
region_register rr_save, rr; |
index_t vrn; |
rid_t rid; |
bool match; |
ASSERT(v); |
vrn = page >> VRN_SHIFT; |
rid = ASID2RID(asid, vrn); |
rr_save.word = rr_read(vrn); |
if (rr_save.map.rid == rid) { |
/* |
* The RID is already in place, compare ttag with t and return. |
*/ |
return ttag(page) == v->present.tag.tag_word; |
} |
/* |
* The RID must be written to some region register. |
* To speed things up, register indexed by vrn is used. |
*/ |
rr.word = rr_save.word; |
rr.map.rid = rid; |
rr_write(vrn, rr.word); |
srlz_i(); |
match = (ttag(page) == v->present.tag.tag_word); |
rr_write(vrn, rr_save.word); |
srlz_i(); |
srlz_d(); |
return match; |
} |
/** Set up one VHPT entry. |
* |
* @param v VHPT entry to be set up. |
* @param page Virtual address of the page mapped by the entry. |
* @param asid Address space identifier of the address space to which page belongs. |
* @param frame Physical address of the frame to wich page is mapped. |
* @param flags Different flags for the mapping. |
*/ |
void vhpt_set_record(vhpt_entry_t *v, uintptr_t page, asid_t asid, uintptr_t frame, int flags) |
{ |
region_register rr_save, rr; |
index_t vrn; |
rid_t rid; |
uint64_t tag; |
ASSERT(v); |
vrn = page >> VRN_SHIFT; |
rid = ASID2RID(asid, vrn); |
/* |
* Compute ttag. |
*/ |
rr_save.word = rr_read(vrn); |
rr.word = rr_save.word; |
rr.map.rid = rid; |
rr_write(vrn, rr.word); |
srlz_i(); |
tag = ttag(page); |
rr_write(vrn, rr_save.word); |
srlz_i(); |
srlz_d(); |
/* |
* Clear the entry. |
*/ |
v->word[0] = 0; |
v->word[1] = 0; |
v->word[2] = 0; |
v->word[3] = 0; |
v->present.p = true; |
v->present.ma = (flags & PAGE_CACHEABLE) ? MA_WRITEBACK : MA_UNCACHEABLE; |
v->present.a = false; /* not accessed */ |
v->present.d = false; /* not dirty */ |
v->present.pl = (flags & PAGE_USER) ? PL_USER : PL_KERNEL; |
v->present.ar = (flags & PAGE_WRITE) ? AR_WRITE : AR_READ; |
v->present.ar |= (flags & PAGE_EXEC) ? AR_EXECUTE : 0; |
v->present.ppn = frame >> PPN_SHIFT; |
v->present.ed = false; /* exception not deffered */ |
v->present.ps = PAGE_WIDTH; |
v->present.key = 0; |
v->present.tag.tag_word = tag; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia64/src/start.S |
---|
0,0 → 1,190 |
# |
# Copyright (c) 2005 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
#include <arch/register.h> |
#include <arch/mm/page.h> |
#include <arch/mm/asid.h> |
#include <mm/asid.h> |
#define RR_MASK (0xFFFFFFFF00000002) |
#define RID_SHIFT 8 |
#define PS_SHIFT 2 |
#define KERNEL_TRANSLATION_I 0x0010000000000661 |
#define KERNEL_TRANSLATION_D 0x0010000000000661 |
#define KERNEL_TRANSLATION_VIO 0x0010000000000671 |
#define KERNEL_TRANSLATION_IO 0x00100FFFFC000671 |
#define VIO_OFFSET 0x0002000000000000 |
#define IO_OFFSET 0x0001000000000000 |
.section K_TEXT_START, "ax" |
.global kernel_image_start |
stack0: |
kernel_image_start: |
.auto |
mov psr.l = r0 |
srlz.i |
srlz.d |
# Fill TR.i and TR.d using Region Register #VRN_KERNEL |
movl r8 = (VRN_KERNEL << VRN_SHIFT) |
mov r9 = rr[r8] |
movl r10 = (RR_MASK) |
and r9 = r10, r9 |
movl r10 = ((RID_KERNEL << RID_SHIFT) | (KERNEL_PAGE_WIDTH << PS_SHIFT)) |
or r9 = r10, r9 |
mov rr[r8] = r9 |
movl r8 = (VRN_KERNEL << VRN_SHIFT) |
mov cr.ifa = r8 |
mov r11 = cr.itir ;; |
movl r10 = (KERNEL_PAGE_WIDTH << PS_SHIFT);; |
or r10 =r10 , r11 ;; |
mov cr.itir = r10;; |
movl r10 = (KERNEL_TRANSLATION_I) |
itr.i itr[r0] = r10 |
movl r10 = (KERNEL_TRANSLATION_D) |
itr.d dtr[r0] = r10 |
movl r7 = 1 |
movl r8 = (VRN_KERNEL << VRN_SHIFT) | VIO_OFFSET |
mov cr.ifa = r8 |
movl r10 = (KERNEL_TRANSLATION_VIO) |
itr.d dtr[r7] = r10 |
mov r11 = cr.itir ;; |
movl r10 = ~0xfc;; |
and r10 =r10 , r11 ;; |
movl r11 = (IO_PAGE_WIDTH << PS_SHIFT);; |
or r10 =r10 , r11 ;; |
mov cr.itir = r10;; |
movl r7 = 2 |
movl r8 = (VRN_KERNEL << VRN_SHIFT) | IO_OFFSET |
mov cr.ifa = r8 |
movl r10 = (KERNEL_TRANSLATION_IO) |
itr.d dtr[r7] = r10 |
# initialize PSR |
movl r10 = (PSR_DT_MASK | PSR_RT_MASK | PSR_IT_MASK | PSR_IC_MASK) /* Enable paging */ |
mov r9 = psr |
or r10 = r10, r9 |
mov cr.ipsr = r10 |
mov cr.ifs = r0 |
movl r8 = paging_start |
mov cr.iip = r8 |
srlz.d |
srlz.i |
.explicit |
/* |
* Return From Interupt is the only the way to fill upper half word of PSR. |
*/ |
rfi;; |
.global paging_start |
paging_start: |
/* |
* Now we are paging. |
*/ |
# switch to register bank 1 |
bsw.1 |
# initialize register stack |
mov ar.rsc = r0 |
movl r8 = (VRN_KERNEL << VRN_SHIFT) ;; |
mov ar.bspstore = r8 |
loadrs |
# initialize memory stack to some sane value |
movl r12 = stack0 ;; |
add r12 = -16, r12 /* allocate a scratch area on the stack */ |
# initialize gp (Global Pointer) register |
movl r20 = (VRN_KERNEL << VRN_SHIFT);; |
or r20 = r20,r1;; |
movl r1 = _hardcoded_load_address |
/* |
* Initialize hardcoded_* variables. |
*/ |
movl r14 = _hardcoded_ktext_size |
movl r15 = _hardcoded_kdata_size |
movl r16 = _hardcoded_load_address ;; |
addl r17 = @gprel(hardcoded_ktext_size), gp |
addl r18 = @gprel(hardcoded_kdata_size), gp |
addl r19 = @gprel(hardcoded_load_address), gp |
addl r21 = @gprel(bootinfo), gp |
;; |
st8 [r17] = r14 |
st8 [r18] = r15 |
st8 [r19] = r16 |
st8 [r21] = r20 |
ssm (1 << 19) ;; /* Disable f32 - f127 */ |
srlz.i |
srlz.d ;; |
br.call.sptk.many b0 = arch_pre_main |
movl r18 = main_bsp ;; |
mov b1 = r18 ;; |
br.call.sptk.many b0 = b1 |
0: |
br 0b |
/tags/0.3.0/kernel/arch/ia64/src/ivt.S |
---|
0,0 → 1,585 |
# |
# Copyright (c) 2005 Jakub Vana |
# Copyright (c) 2005 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
#include <arch/stack.h> |
#include <arch/register.h> |
#include <arch/mm/page.h> |
#include <align.h> |
#define FRS_TO_SAVE 30 |
#define STACK_ITEMS (21 + FRS_TO_SAVE * 2) |
#define STACK_FRAME_SIZE ALIGN_UP((STACK_ITEMS*STACK_ITEM_SIZE) + STACK_SCRATCH_AREA_SIZE, STACK_ALIGNMENT) |
#if (STACK_ITEMS % 2 == 0) |
# define STACK_FRAME_BIAS 8 |
#else |
# define STACK_FRAME_BIAS 16 |
#endif |
/** Partitioning of bank 0 registers. */ |
#define R_OFFS r16 |
#define R_HANDLER r17 |
#define R_RET r18 |
#define R_TMP r19 |
#define R_KSTACK_BSP r22 /* keep in sync with before_thread_runs_arch() */ |
#define R_KSTACK r23 /* keep in sync with before_thread_runs_arch() */ |
/** Heavyweight interrupt handler |
* |
* This macro roughly follows steps from 1 to 19 described in |
* Intel Itanium Architecture Software Developer's Manual, Chapter 3.4.2. |
* |
* HEAVYWEIGHT_HANDLER macro must cram into 16 bundles (48 instructions). |
* This goal is achieved by using procedure calls after RSE becomes operational. |
* |
* Some steps are skipped (enabling and disabling interrupts). |
* |
* @param offs Offset from the beginning of IVT. |
* @param handler Interrupt handler address. |
*/ |
.macro HEAVYWEIGHT_HANDLER offs, handler=universal_handler |
.org ivt + \offs |
mov R_OFFS = \offs |
movl R_HANDLER = \handler ;; |
br heavyweight_handler |
.endm |
.global heavyweight_handler |
heavyweight_handler: |
/* 1. copy interrupt registers into bank 0 */ |
/* |
* Note that r24-r31 from bank 0 can be used only as long as PSR.ic = 0. |
*/ |
/* Set up FPU as in interrupted context. */ |
mov r24 = psr |
mov r25 = cr.ipsr |
mov r26 = PSR_DFH_MASK |
mov r27 = ~PSR_DFH_MASK ;; |
and r26 = r25, r26 |
and r24 = r24, r27;; |
or r24 = r24, r26;; |
mov psr.l = r24;; |
srlz.i |
srlz.d;; |
mov r24 = cr.iip |
mov r25 = cr.ipsr |
mov r26 = cr.iipa |
mov r27 = cr.isr |
mov r28 = cr.ifa |
/* 2. preserve predicate register into bank 0 */ |
mov r29 = pr ;; |
/* 3. switch to kernel memory stack */ |
mov r30 = cr.ipsr |
shr.u r31 = r12, VRN_SHIFT ;; |
shr.u r30 = r30, PSR_CPL_SHIFT ;; |
and r30 = PSR_CPL_MASK_SHIFTED, r30 ;; |
/* |
* Set p3 to true if the interrupted context executed in kernel mode. |
* Set p4 to false if the interrupted context didn't execute in kernel mode. |
*/ |
cmp.eq p3, p4 = r30, r0 ;; |
cmp.eq p1, p2 = r30, r0 ;; /* remember IPSR setting in p1 and p2 */ |
/* |
* Set p3 to true if the stack register references kernel address space. |
* Set p4 to false if the stack register doesn't reference kernel address space. |
*/ |
(p3) cmp.eq p3, p4 = VRN_KERNEL, r31 ;; |
/* |
* Now, p4 is true iff the stack needs to be switched to kernel stack. |
*/ |
mov r30 = r12 |
(p4) mov r12 = R_KSTACK ;; |
add r31 = -STACK_FRAME_BIAS, r12 ;; |
add r12 = -STACK_FRAME_SIZE, r12 |
/* 4. save registers in bank 0 into memory stack */ |
/* |
* If this is break_instruction handler, |
* copy input parameters to stack. |
*/ |
mov R_TMP = 0x2c00 ;; |
cmp.eq p6, p5 = R_OFFS, R_TMP ;; |
/* |
* From now on, if this is break_instruction handler, p6 is true and p5 |
* is false. Otherwise p6 is false and p5 is true. |
* Note that p5 is a preserved predicate register and we make use of it. |
*/ |
(p6) st8 [r31] = r38, -8 ;; /* save in6 */ |
(p6) st8 [r31] = r37, -8 ;; /* save in5 */ |
(p6) st8 [r31] = r36, -8 ;; /* save in4 */ |
(p6) st8 [r31] = r35, -8 ;; /* save in3 */ |
(p6) st8 [r31] = r34, -8 ;; /* save in2 */ |
(p6) st8 [r31] = r33, -8 ;; /* save in1 */ |
(p6) st8 [r31] = r32, -8 ;; /* save in0 */ |
(p5) add r31 = -56, r31 ;; |
st8 [r31] = r30, -8 ;; /* save old stack pointer */ |
st8 [r31] = r29, -8 ;; /* save predicate registers */ |
st8 [r31] = r24, -8 ;; /* save cr.iip */ |
st8 [r31] = r25, -8 ;; /* save cr.ipsr */ |
st8 [r31] = r26, -8 ;; /* save cr.iipa */ |
st8 [r31] = r27, -8 ;; /* save cr.isr */ |
st8 [r31] = r28, -8 ;; /* save cr.ifa */ |
/* 5. RSE switch from interrupted context */ |
mov r24 = ar.rsc |
mov r25 = ar.pfs |
cover |
mov r26 = cr.ifs |
st8 [r31] = r24, -8 ;; /* save ar.rsc */ |
st8 [r31] = r25, -8 ;; /* save ar.pfs */ |
st8 [r31] = r26, -8 /* save ar.ifs */ |
and r24 = ~(RSC_PL_MASK), r24 ;; |
and r30 = ~(RSC_MODE_MASK), r24 ;; |
mov ar.rsc = r30 ;; /* update RSE state */ |
mov r27 = ar.rnat |
mov r28 = ar.bspstore ;; |
/* |
* Inspect BSPSTORE to figure out whether it is necessary to switch to |
* kernel BSPSTORE. |
*/ |
(p1) shr.u r30 = r28, VRN_SHIFT ;; |
(p1) cmp.eq p1, p2 = VRN_KERNEL, r30 ;; |
/* |
* If BSPSTORE needs to be switched, p1 is false and p2 is true. |
*/ |
(p1) mov r30 = r28 |
(p2) mov r30 = R_KSTACK_BSP ;; |
(p2) mov ar.bspstore = r30 ;; |
mov r29 = ar.bsp |
st8 [r31] = r27, -8 ;; /* save ar.rnat */ |
st8 [r31] = r30, -8 ;; /* save new value written to ar.bspstore */ |
st8 [r31] = r28, -8 ;; /* save ar.bspstore */ |
st8 [r31] = r29, -8 /* save ar.bsp */ |
mov ar.rsc = r24 /* restore RSE's setting + kernel privileges */ |
/* steps 6 - 15 are done by heavyweight_handler_inner() */ |
mov R_RET = b0 /* save b0 belonging to interrupted context */ |
br.call.sptk.many b0 = heavyweight_handler_inner |
0: mov b0 = R_RET /* restore b0 belonging to the interrupted context */ |
/* 16. RSE switch to interrupted context */ |
cover /* allocate zero size frame (step 1 (from Intel Docs)) */ |
add r31 = (STACK_SCRATCH_AREA_SIZE + (FRS_TO_SAVE * 2 * 8)), r12 ;; |
ld8 r30 = [r31], +8 ;; /* load ar.bsp */ |
ld8 r29 = [r31], +8 ;; /* load ar.bspstore */ |
ld8 r28 = [r31], +8 ;; /* load ar.bspstore_new */ |
sub r27 = r30 , r28 ;; /* calculate loadrs (step 2) */ |
shl r27 = r27, 16 |
mov r24 = ar.rsc ;; |
and r30 = ~3, r24 ;; |
or r24 = r30 , r27 ;; |
mov ar.rsc = r24 ;; /* place RSE in enforced lazy mode */ |
loadrs /* (step 3) */ |
ld8 r27 = [r31], +8 ;; /* load ar.rnat */ |
ld8 r26 = [r31], +8 ;; /* load cr.ifs */ |
ld8 r25 = [r31], +8 ;; /* load ar.pfs */ |
ld8 r24 = [r31], +8 ;; /* load ar.rsc */ |
mov ar.bspstore = r29 ;; /* (step 4) */ |
mov ar.rnat = r27 /* (step 5) */ |
mov ar.pfs = r25 /* (step 6) */ |
mov cr.ifs = r26 |
mov ar.rsc = r24 /* (step 7) */ |
/* 17. restore interruption state from memory stack */ |
ld8 r28 = [r31], +8 ;; /* load cr.ifa */ |
ld8 r27 = [r31], +8 ;; /* load cr.isr */ |
ld8 r26 = [r31], +8 ;; /* load cr.iipa */ |
ld8 r25 = [r31], +8 ;; /* load cr.ipsr */ |
ld8 r24 = [r31], +8 ;; /* load cr.iip */ |
mov cr.iip = r24;; |
mov cr.iipa = r26 |
mov cr.isr = r27 |
mov cr.ifa = r28 |
/* Set up FPU as in exception. */ |
mov r24 = psr |
mov r26 = PSR_DFH_MASK |
mov r27 = ~PSR_DFH_MASK ;; |
and r25 = r25, r27 |
and r24 = r24, r26 ;; |
or r25 = r25, r24;; |
mov cr.ipsr = r25 |
/* 18. restore predicate registers from memory stack */ |
ld8 r29 = [r31], +8 ;; /* load predicate registers */ |
mov pr = r29 |
/* 19. return from interruption */ |
ld8 r12 = [r31] /* load stack pointer */ |
rfi ;; |
.global heavyweight_handler_inner |
heavyweight_handler_inner: |
/* |
* From this point, the rest of the interrupted context |
* will be preserved in stacked registers and backing store. |
*/ |
alloc loc0 = ar.pfs, 0, 48, 2, 0 ;; |
/* bank 0 is going to be shadowed, copy essential data from there */ |
mov loc1 = R_RET /* b0 belonging to interrupted context */ |
mov loc2 = R_HANDLER |
mov out0 = R_OFFS |
add out1 = STACK_SCRATCH_AREA_SIZE, r12 |
/* 6. switch to bank 1 and reenable PSR.ic */ |
ssm PSR_IC_MASK |
bsw.1 ;; |
srlz.d |
/* 7. preserve branch and application registers */ |
mov loc3 = ar.unat |
mov loc4 = ar.lc |
mov loc5 = ar.ec |
mov loc6 = ar.ccv |
mov loc7 = ar.csd |
mov loc8 = ar.ssd |
mov loc9 = b0 |
mov loc10 = b1 |
mov loc11 = b2 |
mov loc12 = b3 |
mov loc13 = b4 |
mov loc14 = b5 |
mov loc15 = b6 |
mov loc16 = b7 |
/* 8. preserve general and floating-point registers */ |
mov loc17 = r1 |
mov loc18 = r2 |
mov loc19 = r3 |
mov loc20 = r4 |
mov loc21 = r5 |
mov loc22 = r6 |
mov loc23 = r7 |
(p5) mov loc24 = r8 /* only if not in break_instruction handler */ |
mov loc25 = r9 |
mov loc26 = r10 |
mov loc27 = r11 |
/* skip r12 (stack pointer) */ |
mov loc28 = r13 |
mov loc29 = r14 |
mov loc30 = r15 |
mov loc31 = r16 |
mov loc32 = r17 |
mov loc33 = r18 |
mov loc34 = r19 |
mov loc35 = r20 |
mov loc36 = r21 |
mov loc37 = r22 |
mov loc38 = r23 |
mov loc39 = r24 |
mov loc40 = r25 |
mov loc41 = r26 |
mov loc42 = r27 |
mov loc43 = r28 |
mov loc44 = r29 |
mov loc45 = r30 |
mov loc46 = r31 |
add r24 = 96 + STACK_SCRATCH_AREA_SIZE, r12 |
add r25 = 112 + STACK_SCRATCH_AREA_SIZE, r12 |
add r26 = 0 + STACK_SCRATCH_AREA_SIZE, r12 |
add r27 = 16 + STACK_SCRATCH_AREA_SIZE, r12 |
add r28 = 32 + STACK_SCRATCH_AREA_SIZE, r12 |
add r29 = 48 + STACK_SCRATCH_AREA_SIZE, r12 |
add r30 = 64 + STACK_SCRATCH_AREA_SIZE, r12 |
add r31 = 80 + STACK_SCRATCH_AREA_SIZE, r12 ;; |
stf.spill [r26] = f2, 0x80 |
stf.spill [r27] = f3, 0x80 |
stf.spill [r28] = f4, 0x80 |
stf.spill [r29] = f5, 0x80 |
stf.spill [r30] = f6, 0x80 |
stf.spill [r31] = f7, 0x80 ;; |
stf.spill [r24] = f8, 0x80 |
stf.spill [r25] = f9, 0x80 |
stf.spill [r26] = f10, 0x80 |
stf.spill [r27] = f11, 0x80 |
stf.spill [r28] = f12, 0x80 |
stf.spill [r29] = f13, 0x80 |
stf.spill [r30] = f14, 0x80 |
stf.spill [r31] = f15, 0x80 ;; |
stf.spill [r24] = f16, 0x80 |
stf.spill [r25] = f17, 0x80 |
stf.spill [r26] = f18, 0x80 |
stf.spill [r27] = f19, 0x80 |
stf.spill [r28] = f20, 0x80 |
stf.spill [r29] = f21, 0x80 |
stf.spill [r30] = f22, 0x80 |
stf.spill [r31] = f23, 0x80 ;; |
stf.spill [r24] = f24, 0x80 |
stf.spill [r25] = f25, 0x80 |
stf.spill [r26] = f26, 0x80 |
stf.spill [r27] = f27, 0x80 |
stf.spill [r28] = f28, 0x80 |
stf.spill [r29] = f29, 0x80 |
stf.spill [r30] = f30, 0x80 |
stf.spill [r31] = f31, 0x80 ;; |
mov loc47 = ar.fpsr /* preserve floating point status register */ |
/* 9. skipped (will not enable interrupts) */ |
/* |
* ssm PSR_I_MASK |
* ;; |
* srlz.d |
*/ |
/* 10. call handler */ |
movl r1 = _hardcoded_load_address |
mov b1 = loc2 |
br.call.sptk.many b0 = b1 |
/* 11. return from handler */ |
0: |
/* 12. skipped (will not disable interrupts) */ |
/* |
* rsm PSR_I_MASK |
* ;; |
* srlz.d |
*/ |
/* 13. restore general and floating-point registers */ |
add r24 = 96 + STACK_SCRATCH_AREA_SIZE, r12 |
add r25 = 112 + STACK_SCRATCH_AREA_SIZE, r12 |
add r26 = 0 + STACK_SCRATCH_AREA_SIZE, r12 |
add r27 = 16 + STACK_SCRATCH_AREA_SIZE, r12 |
add r28 = 32 + STACK_SCRATCH_AREA_SIZE, r12 |
add r29 = 48 + STACK_SCRATCH_AREA_SIZE, r12 |
add r30 = 64 + STACK_SCRATCH_AREA_SIZE, r12 |
add r31 = 80 + STACK_SCRATCH_AREA_SIZE, r12 ;; |
ldf.fill f2 = [r26], 0x80 |
ldf.fill f3 = [r27], 0x80 |
ldf.fill f4 = [r28], 0x80 |
ldf.fill f5 = [r29], 0x80 |
ldf.fill f6 = [r30], 0x80 |
ldf.fill f7 = [r31], 0x80 ;; |
ldf.fill f8 = [r24], 0x80 |
ldf.fill f9 = [r25], 0x80 |
ldf.fill f10 = [r26], 0x80 |
ldf.fill f11 = [r27], 0x80 |
ldf.fill f12 = [r28], 0x80 |
ldf.fill f13 = [r29], 0x80 |
ldf.fill f14 = [r30], 0x80 |
ldf.fill f15 = [r31], 0x80 ;; |
ldf.fill f16 = [r24], 0x80 |
ldf.fill f17 = [r25], 0x80 |
ldf.fill f18 = [r26], 0x80 |
ldf.fill f19 = [r27], 0x80 |
ldf.fill f20 = [r28], 0x80 |
ldf.fill f21 = [r29], 0x80 |
ldf.fill f22 = [r30], 0x80 |
ldf.fill f23 = [r31], 0x80 ;; |
ldf.fill f24 = [r24], 0x80 |
ldf.fill f25 = [r25], 0x80 |
ldf.fill f26 = [r26], 0x80 |
ldf.fill f27 = [r27], 0x80 |
ldf.fill f28 = [r28], 0x80 |
ldf.fill f29 = [r29], 0x80 |
ldf.fill f30 = [r30], 0x80 |
ldf.fill f31 = [r31], 0x80 ;; |
mov r1 = loc17 |
mov r2 = loc18 |
mov r3 = loc19 |
mov r4 = loc20 |
mov r5 = loc21 |
mov r6 = loc22 |
mov r7 = loc23 |
(p5) mov r8 = loc24 /* only if not in break_instruction handler */ |
mov r9 = loc25 |
mov r10 = loc26 |
mov r11 = loc27 |
/* skip r12 (stack pointer) */ |
mov r13 = loc28 |
mov r14 = loc29 |
mov r15 = loc30 |
mov r16 = loc31 |
mov r17 = loc32 |
mov r18 = loc33 |
mov r19 = loc34 |
mov r20 = loc35 |
mov r21 = loc36 |
mov r22 = loc37 |
mov r23 = loc38 |
mov r24 = loc39 |
mov r25 = loc40 |
mov r26 = loc41 |
mov r27 = loc42 |
mov r28 = loc43 |
mov r29 = loc44 |
mov r30 = loc45 |
mov r31 = loc46 |
mov ar.fpsr = loc47 /* restore floating point status register */ |
/* 14. restore branch and application registers */ |
mov ar.unat = loc3 |
mov ar.lc = loc4 |
mov ar.ec = loc5 |
mov ar.ccv = loc6 |
mov ar.csd = loc7 |
mov ar.ssd = loc8 |
mov b0 = loc9 |
mov b1 = loc10 |
mov b2 = loc11 |
mov b3 = loc12 |
mov b4 = loc13 |
mov b5 = loc14 |
mov b6 = loc15 |
mov b7 = loc16 |
/* 15. disable PSR.ic and switch to bank 0 */ |
rsm PSR_IC_MASK |
bsw.0 ;; |
srlz.d |
mov R_RET = loc1 |
mov ar.pfs = loc0 |
br.ret.sptk.many b0 |
.global ivt |
.align 32768 |
ivt: |
HEAVYWEIGHT_HANDLER 0x0000 |
HEAVYWEIGHT_HANDLER 0x0400 |
HEAVYWEIGHT_HANDLER 0x0800 |
HEAVYWEIGHT_HANDLER 0x0c00 alternate_instruction_tlb_fault |
HEAVYWEIGHT_HANDLER 0x1000 alternate_data_tlb_fault |
HEAVYWEIGHT_HANDLER 0x1400 data_nested_tlb_fault |
HEAVYWEIGHT_HANDLER 0x1800 |
HEAVYWEIGHT_HANDLER 0x1c00 |
HEAVYWEIGHT_HANDLER 0x2000 data_dirty_bit_fault |
HEAVYWEIGHT_HANDLER 0x2400 instruction_access_bit_fault |
HEAVYWEIGHT_HANDLER 0x2800 data_access_bit_fault |
HEAVYWEIGHT_HANDLER 0x2c00 break_instruction |
HEAVYWEIGHT_HANDLER 0x3000 external_interrupt /* For external interrupt, heavyweight handler is used. */ |
HEAVYWEIGHT_HANDLER 0x3400 |
HEAVYWEIGHT_HANDLER 0x3800 |
HEAVYWEIGHT_HANDLER 0x3c00 |
HEAVYWEIGHT_HANDLER 0x4000 |
HEAVYWEIGHT_HANDLER 0x4400 |
HEAVYWEIGHT_HANDLER 0x4800 |
HEAVYWEIGHT_HANDLER 0x4c00 |
HEAVYWEIGHT_HANDLER 0x5000 page_not_present |
HEAVYWEIGHT_HANDLER 0x5100 |
HEAVYWEIGHT_HANDLER 0x5200 |
HEAVYWEIGHT_HANDLER 0x5300 |
HEAVYWEIGHT_HANDLER 0x5400 general_exception |
HEAVYWEIGHT_HANDLER 0x5500 disabled_fp_register |
HEAVYWEIGHT_HANDLER 0x5600 |
HEAVYWEIGHT_HANDLER 0x5700 |
HEAVYWEIGHT_HANDLER 0x5800 |
HEAVYWEIGHT_HANDLER 0x5900 |
HEAVYWEIGHT_HANDLER 0x5a00 |
HEAVYWEIGHT_HANDLER 0x5b00 |
HEAVYWEIGHT_HANDLER 0x5c00 |
HEAVYWEIGHT_HANDLER 0x5d00 |
HEAVYWEIGHT_HANDLER 0x5e00 |
HEAVYWEIGHT_HANDLER 0x5f00 |
HEAVYWEIGHT_HANDLER 0x6000 |
HEAVYWEIGHT_HANDLER 0x6100 |
HEAVYWEIGHT_HANDLER 0x6200 |
HEAVYWEIGHT_HANDLER 0x6300 |
HEAVYWEIGHT_HANDLER 0x6400 |
HEAVYWEIGHT_HANDLER 0x6500 |
HEAVYWEIGHT_HANDLER 0x6600 |
HEAVYWEIGHT_HANDLER 0x6700 |
HEAVYWEIGHT_HANDLER 0x6800 |
HEAVYWEIGHT_HANDLER 0x6900 |
HEAVYWEIGHT_HANDLER 0x6a00 |
HEAVYWEIGHT_HANDLER 0x6b00 |
HEAVYWEIGHT_HANDLER 0x6c00 |
HEAVYWEIGHT_HANDLER 0x6d00 |
HEAVYWEIGHT_HANDLER 0x6e00 |
HEAVYWEIGHT_HANDLER 0x6f00 |
HEAVYWEIGHT_HANDLER 0x7000 |
HEAVYWEIGHT_HANDLER 0x7100 |
HEAVYWEIGHT_HANDLER 0x7200 |
HEAVYWEIGHT_HANDLER 0x7300 |
HEAVYWEIGHT_HANDLER 0x7400 |
HEAVYWEIGHT_HANDLER 0x7500 |
HEAVYWEIGHT_HANDLER 0x7600 |
HEAVYWEIGHT_HANDLER 0x7700 |
HEAVYWEIGHT_HANDLER 0x7800 |
HEAVYWEIGHT_HANDLER 0x7900 |
HEAVYWEIGHT_HANDLER 0x7a00 |
HEAVYWEIGHT_HANDLER 0x7b00 |
HEAVYWEIGHT_HANDLER 0x7c00 |
HEAVYWEIGHT_HANDLER 0x7d00 |
HEAVYWEIGHT_HANDLER 0x7e00 |
HEAVYWEIGHT_HANDLER 0x7f00 |
/tags/0.3.0/kernel/arch/ia64/src/interrupt.c |
---|
0,0 → 1,266 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* Copyright (c) 2005 Jakub Vana |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia64interrupt |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/interrupt.h> |
#include <interrupt.h> |
#include <ddi/irq.h> |
#include <panic.h> |
#include <print.h> |
#include <symtab.h> |
#include <debug.h> |
#include <console/console.h> |
#include <arch/types.h> |
#include <arch/asm.h> |
#include <arch/barrier.h> |
#include <arch/register.h> |
#include <arch.h> |
#include <syscall/syscall.h> |
#include <print.h> |
#include <proc/scheduler.h> |
#include <ipc/sysipc.h> |
#include <ipc/irq.h> |
#include <ipc/ipc.h> |
#include <synch/spinlock.h> |
#define VECTORS_64_BUNDLE 20 |
#define VECTORS_16_BUNDLE 48 |
#define VECTORS_16_BUNDLE_START 0x5000 |
#define VECTOR_MAX 0x7f00 |
#define BUNDLE_SIZE 16 |
char *vector_names_64_bundle[VECTORS_64_BUNDLE] = { |
"VHPT Translation vector", |
"Instruction TLB vector", |
"Data TLB vector", |
"Alternate Instruction TLB vector", |
"Alternate Data TLB vector", |
"Data Nested TLB vector", |
"Instruction Key Miss vector", |
"Data Key Miss vector", |
"Dirty-Bit vector", |
"Instruction Access-Bit vector", |
"Data Access-Bit vector" |
"Break Instruction vector", |
"External Interrupt vector" |
"Reserved", |
"Reserved", |
"Reserved", |
"Reserved", |
"Reserved", |
"Reserved", |
"Reserved" |
}; |
char *vector_names_16_bundle[VECTORS_16_BUNDLE] = { |
"Page Not Present vector", |
"Key Permission vector", |
"Instruction Access rights vector", |
"Data Access Rights vector", |
"General Exception vector", |
"Disabled FP-Register vector", |
"NaT Consumption vector", |
"Speculation vector", |
"Reserved", |
"Debug vector", |
"Unaligned Reference vector", |
"Unsupported Data Reference vector", |
"Floating-point Fault vector", |
"Floating-point Trap vector", |
"Lower-Privilege Transfer Trap vector", |
"Taken Branch Trap vector", |
"Single Step Trap vector", |
"Reserved", |
"Reserved", |
"Reserved", |
"Reserved", |
"Reserved", |
"Reserved", |
"Reserved", |
"Reserved", |
"IA-32 Exception vector", |
"IA-32 Intercept vector", |
"IA-32 Interrupt vector", |
"Reserved", |
"Reserved", |
"Reserved" |
}; |
static char *vector_to_string(uint16_t vector); |
static void dump_interrupted_context(istate_t *istate); |
char *vector_to_string(uint16_t vector) |
{ |
ASSERT(vector <= VECTOR_MAX); |
if (vector >= VECTORS_16_BUNDLE_START) |
return vector_names_16_bundle[(vector - |
VECTORS_16_BUNDLE_START) / (16 * BUNDLE_SIZE)]; |
else |
return vector_names_64_bundle[vector / (64 * BUNDLE_SIZE)]; |
} |
void dump_interrupted_context(istate_t *istate) |
{ |
char *ifa, *iipa, *iip; |
ifa = get_symtab_entry(istate->cr_ifa); |
iipa = get_symtab_entry(istate->cr_iipa); |
iip = get_symtab_entry(istate->cr_iip); |
putchar('\n'); |
printf("Interrupted context dump:\n"); |
printf("ar.bsp=%p\tar.bspstore=%p\n", istate->ar_bsp, |
istate->ar_bspstore); |
printf("ar.rnat=%#018llx\tar.rsc=%#018llx\n", istate->ar_rnat, |
istate->ar_rsc); |
printf("ar.ifs=%#018llx\tar.pfs=%#018llx\n", istate->ar_ifs, |
istate->ar_pfs); |
printf("cr.isr=%#018llx\tcr.ipsr=%#018llx\t\n", istate->cr_isr.value, |
istate->cr_ipsr); |
printf("cr.iip=%#018llx, #%d\t(%s)\n", istate->cr_iip, |
istate->cr_isr.ei, iip); |
printf("cr.iipa=%#018llx\t(%s)\n", istate->cr_iipa, iipa); |
printf("cr.ifa=%#018llx\t(%s)\n", istate->cr_ifa, ifa); |
} |
void general_exception(uint64_t vector, istate_t *istate) |
{ |
char *desc = ""; |
switch (istate->cr_isr.ge_code) { |
case GE_ILLEGALOP: |
desc = "Illegal Operation fault"; |
break; |
case GE_PRIVOP: |
desc = "Privileged Operation fault"; |
break; |
case GE_PRIVREG: |
desc = "Privileged Register fault"; |
break; |
case GE_RESREGFLD: |
desc = "Reserved Register/Field fault"; |
break; |
case GE_DISBLDISTRAN: |
desc = "Disabled Instruction Set Transition fault"; |
break; |
case GE_ILLEGALDEP: |
desc = "Illegal Dependency fault"; |
break; |
default: |
desc = "unknown"; |
break; |
} |
fault_if_from_uspace(istate, "General Exception (%s)", desc); |
dump_interrupted_context(istate); |
panic("General Exception (%s)\n", desc); |
} |
void disabled_fp_register(uint64_t vector, istate_t *istate) |
{ |
#ifdef CONFIG_FPU_LAZY |
scheduler_fpu_lazy_request(); |
#else |
fault_if_from_uspace(istate, "Interruption: %#hx (%s)", |
(uint16_t) vector, vector_to_string(vector)); |
dump_interrupted_context(istate); |
panic("Interruption: %#hx (%s)\n", (uint16_t) vector, |
vector_to_string(vector)); |
#endif |
} |
void nop_handler(uint64_t vector, istate_t *istate) |
{ |
} |
/** Handle syscall. */ |
int break_instruction(uint64_t vector, istate_t *istate) |
{ |
/* |
* Move to next instruction after BREAK. |
*/ |
if (istate->cr_ipsr.ri == 2) { |
istate->cr_ipsr.ri = 0; |
istate->cr_iip += 16; |
} else { |
istate->cr_ipsr.ri++; |
} |
return syscall_handler(istate->in0, istate->in1, istate->in2, |
istate->in3, istate->in4, istate->in5, istate->in6); |
} |
void universal_handler(uint64_t vector, istate_t *istate) |
{ |
fault_if_from_uspace(istate, "Interruption: %#hx (%s)\n", |
(uint16_t) vector, vector_to_string(vector)); |
dump_interrupted_context(istate); |
panic("Interruption: %#hx (%s)\n", (uint16_t) vector, |
vector_to_string(vector)); |
} |
void external_interrupt(uint64_t vector, istate_t *istate) |
{ |
irq_t *irq; |
cr_ivr_t ivr; |
ivr.value = ivr_read(); |
srlz_d(); |
irq = irq_dispatch_and_lock(ivr.vector); |
if (irq) { |
irq->handler(irq, irq->arg); |
spinlock_unlock(&irq->lock); |
} else { |
switch (ivr.vector) { |
case INTERRUPT_SPURIOUS: |
#ifdef CONFIG_DEBUG |
printf("cpu%d: spurious interrupt\n", CPU->id); |
#endif |
break; |
default: |
panic("\nUnhandled External Interrupt Vector %d\n", |
ivr.vector); |
break; |
} |
} |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia64/src/cpu/cpu.c |
---|
0,0 → 1,78 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia64 |
* @{ |
*/ |
/** @file |
*/ |
#include <cpu.h> |
#include <arch.h> |
#include <arch/register.h> |
#include <print.h> |
void cpu_arch_init(void) |
{ |
} |
void cpu_identify(void) |
{ |
CPU->arch.cpuid0 = cpuid_read(0); |
CPU->arch.cpuid1 = cpuid_read(1); |
CPU->arch.cpuid3.value = cpuid_read(3); |
} |
void cpu_print_report(cpu_t *m) |
{ |
char *family_str; |
char vendor[2 * sizeof(uint64_t) + 1]; |
*((uint64_t *) &vendor[0 * sizeof(uint64_t)]) = CPU->arch.cpuid0; |
*((uint64_t *) &vendor[1 * sizeof(uint64_t)]) = CPU->arch.cpuid1; |
vendor[sizeof(vendor) - 1] = '\0'; |
switch(m->arch.cpuid3.family) { |
case FAMILY_ITANIUM: |
family_str = "Itanium"; |
break; |
case FAMILY_ITANIUM2: |
family_str = "Itanium 2"; |
break; |
default: |
family_str = "Unknown"; |
break; |
} |
printf("cpu%d: %s (%s), archrev=%d, model=%d, revision=%d\n", CPU->id, |
family_str, vendor, CPU->arch.cpuid3.archrev, CPU->arch.cpuid3.model, |
CPU->arch.cpuid3.revision); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia64/src/drivers/ega.c |
---|
0,0 → 1,139 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32 |
* @{ |
*/ |
/** |
* @file |
* @brief EGA driver. |
*/ |
#include <putchar.h> |
#include <mm/page.h> |
#include <mm/as.h> |
#include <arch/mm/page.h> |
#include <synch/spinlock.h> |
#include <arch/types.h> |
#include <arch/asm.h> |
#include <memstr.h> |
#include <console/chardev.h> |
#include <console/console.h> |
#include <sysinfo/sysinfo.h> |
#include <arch/drivers/ega.h> |
/* |
* The EGA driver. |
* Simple and short. Function for displaying characters and "scrolling". |
*/ |
SPINLOCK_INITIALIZE(egalock); |
static uint32_t ega_cursor; |
static uint8_t *videoram; |
static void ega_putchar(chardev_t *d, const char ch); |
chardev_t ega_console; |
static chardev_operations_t ega_ops = { |
.write = ega_putchar |
}; |
void ega_init(void) |
{ |
videoram = (uint8_t *) (VIDEORAM); |
/* |
* Clear the screen. |
*/ |
_memsetw((uintptr_t) videoram, SCREEN, 0x0720); |
chardev_initialize("ega_out", &ega_console, &ega_ops); |
stdout = &ega_console; |
sysinfo_set_item_val("fb", NULL, true); |
sysinfo_set_item_val("fb.kind", NULL, 2); |
sysinfo_set_item_val("fb.width", NULL, ROW); |
sysinfo_set_item_val("fb.height", NULL, ROWS); |
sysinfo_set_item_val("fb.address.physical", NULL, VIDEORAM); |
#ifndef CONFIG_FB |
putchar('\n'); |
#endif |
} |
static void ega_display_char(char ch) |
{ |
videoram[ega_cursor * 2] = ch; |
videoram[ega_cursor * 2 + 1] = 7; |
} |
/* |
* This function takes care of scrolling. |
*/ |
static void ega_check_cursor(void) |
{ |
if (ega_cursor < SCREEN) |
return; |
memcpy((void *) videoram, (void *) (videoram + ROW * 2), (SCREEN - ROW) * 2); |
_memsetw((uintptr_t) (videoram + (SCREEN - ROW) * 2), ROW, 0x0720); |
ega_cursor = ega_cursor - ROW; |
} |
void ega_putchar(chardev_t *d, const char ch) |
{ |
ipl_t ipl; |
ipl = interrupts_disable(); |
spinlock_lock(&egalock); |
switch (ch) { |
case '\n': |
ega_cursor = (ega_cursor + ROW) - ega_cursor % ROW; |
break; |
case '\t': |
ega_cursor = (ega_cursor + 8) - ega_cursor % 8; |
break; |
case '\b': |
if (ega_cursor % ROW) |
ega_cursor--; |
break; |
default: |
ega_display_char(ch); |
ega_cursor++; |
break; |
} |
ega_check_cursor(); |
spinlock_unlock(&egalock); |
interrupts_restore(ipl); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia64/src/drivers/it.c |
---|
0,0 → 1,127 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia64 |
* @{ |
*/ |
/** @file |
*/ |
/** Interval Timer driver. */ |
#include <arch/drivers/it.h> |
#include <arch/interrupt.h> |
#include <arch/register.h> |
#include <arch/asm.h> |
#include <arch/barrier.h> |
#include <time/clock.h> |
#include <ddi/irq.h> |
#include <ddi/device.h> |
#include <arch.h> |
#define IT_SERVICE_CLOCKS 64 |
static irq_t it_irq; |
static irq_ownership_t it_claim(void); |
static void it_interrupt(irq_t *irq, void *arg, ...); |
/** Initialize Interval Timer. */ |
void it_init(void) |
{ |
cr_itv_t itv; |
irq_initialize(&it_irq); |
it_irq.inr = INTERRUPT_TIMER; |
it_irq.devno = device_assign_devno(); |
it_irq.claim = it_claim; |
it_irq.handler = it_interrupt; |
irq_register(&it_irq); |
/* initialize Interval Timer external interrupt vector */ |
itv.value = itv_read(); |
itv.vector = INTERRUPT_TIMER; |
itv.m = 0; |
itv_write(itv.value); |
/* set Interval Timer Counter to zero */ |
itc_write(0); |
/* generate first Interval Timer interrupt in IT_DELTA ticks */ |
itm_write(IT_DELTA); |
/* propagate changes */ |
srlz_d(); |
} |
/** Always claim ownership for this IRQ. |
* |
* Other devices are responsible to avoid using INR 0. |
* |
* @return Always IRQ_ACCEPT. |
*/ |
irq_ownership_t it_claim(void) |
{ |
return IRQ_ACCEPT; |
} |
/** Process Interval Timer interrupt. */ |
void it_interrupt(irq_t *irq, void *arg, ...) |
{ |
int64_t c; |
int64_t m; |
eoi_write(EOI); |
m = itm_read(); |
while (1) { |
c = itc_read(); |
c += IT_SERVICE_CLOCKS; |
m += IT_DELTA; |
if (m - c < 0) |
CPU->missed_clock_ticks++; |
else |
break; |
} |
itm_write(m); |
srlz_d(); /* propagate changes */ |
/* |
* We are holding a lock which prevents preemption. |
* Release the lock, call clock() and reacquire the lock again. |
*/ |
spinlock_unlock(&irq->lock); |
clock(); |
spinlock_lock(&irq->lock); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia64/src/ski/ski.c |
---|
0,0 → 1,264 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia64 |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/ski/ski.h> |
#include <console/console.h> |
#include <console/chardev.h> |
#include <arch/interrupt.h> |
#include <sysinfo/sysinfo.h> |
#include <arch/types.h> |
#include <ddi/device.h> |
#include <ddi/irq.h> |
#include <ipc/irq.h> |
#include <proc/thread.h> |
#include <synch/spinlock.h> |
#include <arch/asm.h> |
#define SKI_KBD_INR 0 |
static irq_t ski_kbd_irq; |
static devno_t ski_kbd_devno; |
chardev_t ski_console; |
chardev_t ski_uconsole; |
static bool kbd_disabled; |
static void ski_putchar(chardev_t *d, const char ch); |
static int32_t ski_getchar(void); |
/** Display character on debug console |
* |
* Use SSC (Simulator System Call) to |
* display character on debug console. |
* |
* @param d Character device. |
* @param ch Character to be printed. |
*/ |
void ski_putchar(chardev_t *d, const char ch) |
{ |
asm volatile ( |
"mov r15 = %0\n" |
"mov r32 = %1\n" /* r32 is in0 */ |
"break 0x80000\n" /* modifies r8 */ |
: |
: "i" (SKI_PUTCHAR), "r" (ch) |
: "r15", "in0", "r8" |
); |
if (ch == '\n') |
ski_putchar(d, '\r'); |
} |
/** Ask debug console if a key was pressed. |
* |
* Use SSC (Simulator System Call) to |
* get character from debug console. |
* |
* This call is non-blocking. |
* |
* @return ASCII code of pressed key or 0 if no key pressed. |
*/ |
int32_t ski_getchar(void) |
{ |
uint64_t ch; |
asm volatile ( |
"mov r15 = %1\n" |
"break 0x80000;;\n" /* modifies r8 */ |
"mov %0 = r8;;\n" |
: "=r" (ch) |
: "i" (SKI_GETCHAR) |
: "r15", "r8" |
); |
return (int32_t) ch; |
} |
/** |
* This is a blocking wrapper for ski_getchar(). |
* To be used when the kernel crashes. |
*/ |
static char ski_getchar_blocking(chardev_t *d) |
{ |
int ch; |
while(!(ch = ski_getchar())) |
; |
if(ch == '\r') |
ch = '\n'; |
return (char) ch; |
} |
/** Ask keyboard if a key was pressed. */ |
static void poll_keyboard(void) |
{ |
char ch; |
static char last; |
ipl_t ipl; |
ipl = interrupts_disable(); |
if (kbd_disabled) { |
interrupts_restore(ipl); |
return; |
} |
spinlock_lock(&ski_kbd_irq.lock); |
ch = ski_getchar(); |
if(ch == '\r') |
ch = '\n'; |
if (ch) { |
if (ski_kbd_irq.notif_cfg.notify && ski_kbd_irq.notif_cfg.answerbox) { |
chardev_push_character(&ski_uconsole, ch); |
ipc_irq_send_notif(&ski_kbd_irq); |
} else { |
chardev_push_character(&ski_console, ch); |
} |
last = ch; |
spinlock_unlock(&ski_kbd_irq.lock); |
interrupts_restore(ipl); |
return; |
} |
if (last) { |
if (ski_kbd_irq.notif_cfg.notify && ski_kbd_irq.notif_cfg.answerbox) { |
chardev_push_character(&ski_uconsole, 0); |
ipc_irq_send_notif(&ski_kbd_irq); |
} |
last = 0; |
} |
spinlock_unlock(&ski_kbd_irq.lock); |
interrupts_restore(ipl); |
} |
/* Called from getc(). */ |
static void ski_kbd_enable(chardev_t *d) |
{ |
kbd_disabled = false; |
} |
/* Called from getc(). */ |
static void ski_kbd_disable(chardev_t *d) |
{ |
kbd_disabled = true; |
} |
/** Decline to service hardware IRQ. |
* |
* This is only a virtual IRQ, so always decline. |
* |
* @return Always IRQ_DECLINE. |
*/ |
static irq_ownership_t ski_kbd_claim(void) |
{ |
return IRQ_DECLINE; |
} |
static chardev_operations_t ski_ops = { |
.resume = ski_kbd_enable, |
.suspend = ski_kbd_disable, |
.write = ski_putchar, |
.read = ski_getchar_blocking |
}; |
/** Initialize debug console |
* |
* Issue SSC (Simulator System Call) to |
* to open debug console. |
*/ |
void ski_init_console(void) |
{ |
asm volatile ( |
"mov r15 = %0\n" |
"break 0x80000\n" |
: |
: "i" (SKI_INIT_CONSOLE) |
: "r15", "r8" |
); |
chardev_initialize("ski_console", &ski_console, &ski_ops); |
chardev_initialize("ski_uconsole", &ski_uconsole, &ski_ops); |
stdin = &ski_console; |
stdout = &ski_console; |
ski_kbd_devno = device_assign_devno(); |
irq_initialize(&ski_kbd_irq); |
ski_kbd_irq.inr = SKI_KBD_INR; |
ski_kbd_irq.devno = ski_kbd_devno; |
ski_kbd_irq.claim = ski_kbd_claim; |
irq_register(&ski_kbd_irq); |
sysinfo_set_item_val("kbd", NULL, true); |
sysinfo_set_item_val("kbd.inr", NULL, SKI_KBD_INR); |
sysinfo_set_item_val("kbd.devno", NULL, ski_kbd_devno); |
} |
void ski_kbd_grab(void) |
{ |
ipl_t ipl = interrupts_disable(); |
spinlock_lock(&ski_kbd_irq.lock); |
ski_kbd_irq.notif_cfg.notify = false; |
spinlock_unlock(&ski_kbd_irq.lock); |
interrupts_restore(ipl); |
} |
void ski_kbd_release(void) |
{ |
ipl_t ipl = interrupts_disable(); |
spinlock_lock(&ski_kbd_irq.lock); |
if (ski_kbd_irq.notif_cfg.answerbox) |
ski_kbd_irq.notif_cfg.notify = true; |
spinlock_unlock(&ski_kbd_irq.lock); |
interrupts_restore(ipl); |
} |
#define POLL_INTERVAL 50000 /* 50 ms */ |
/** Kernel thread for polling keyboard. */ |
void kkbdpoll(void *arg) |
{ |
while (1) { |
poll_keyboard(); |
thread_usleep(POLL_INTERVAL); |
} |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia64/src/ddi/ddi.c |
---|
0,0 → 1,55 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia64ddi |
* @{ |
*/ |
/** @file |
*/ |
#include <ddi/ddi.h> |
#include <proc/task.h> |
#include <arch/types.h> |
/** Enable I/O space range for task. |
* |
* Interrupts are disabled and task is locked. |
* |
* @param task Task. |
* @param ioaddr Startign I/O space address. |
* @param size Size of the enabled I/O range. |
* |
* @return 0 on success or an error code from errno.h. |
*/ |
int ddi_iospace_enable_arch(task_t *task, uintptr_t ioaddr, size_t size) |
{ |
return 0; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia64/src/proc/scheduler.c |
---|
0,0 → 1,92 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia64proc |
* @{ |
*/ |
/** @file |
*/ |
#include <proc/scheduler.h> |
#include <proc/thread.h> |
#include <arch.h> |
#include <arch/register.h> |
#include <arch/context.h> |
#include <arch/stack.h> |
#include <arch/mm/tlb.h> |
#include <config.h> |
#include <align.h> |
/** Perform ia64 specific tasks needed before the new task is run. */ |
void before_task_runs_arch(void) |
{ |
} |
/** Prepare kernel stack pointers in bank 0 r22 and r23 and make sure the stack is mapped in DTR. */ |
void before_thread_runs_arch(void) |
{ |
uintptr_t base; |
base = ALIGN_DOWN(config.base, 1<<KERNEL_PAGE_WIDTH); |
if ((uintptr_t) THREAD->kstack < base || (uintptr_t) THREAD->kstack > base + (1<<(KERNEL_PAGE_WIDTH))) { |
/* |
* Kernel stack of this thread is not mapped by DTR[TR_KERNEL]. |
* Use DTR[TR_KSTACK1] and DTR[TR_KSTACK2] to map it. |
*/ |
/* purge DTR[TR_STACK1] and DTR[TR_STACK2] */ |
dtr_purge((uintptr_t) THREAD->kstack, PAGE_WIDTH+1); |
/* insert DTR[TR_STACK1] and DTR[TR_STACK2] */ |
dtlb_kernel_mapping_insert((uintptr_t) THREAD->kstack, KA2PA(THREAD->kstack), true, DTR_KSTACK1); |
dtlb_kernel_mapping_insert((uintptr_t) THREAD->kstack + PAGE_SIZE, KA2PA(THREAD->kstack) + FRAME_SIZE, true, DTR_KSTACK2); |
} |
/* |
* Record address of kernel backing store to bank 0 r22. |
* Record address of kernel stack to bank 0 r23. |
* These values will be found there after switch from userspace. |
*/ |
asm volatile ( |
"bsw.0\n" |
"mov r22 = %0\n" |
"mov r23 = %1\n" |
"bsw.1\n" |
: |
: "r" (&THREAD->kstack[THREAD_STACK_SIZE]), |
"r" (&THREAD->kstack[THREAD_STACK_SIZE - SP_DELTA]) |
); |
} |
void after_thread_ran_arch(void) |
{ |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia64/src/fpu_context.c |
---|
0,0 → 1,473 |
/* |
* Copyright (c) 2005 Jakub Vana |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia64 |
* @{ |
*/ |
/** @file |
* |
*/ |
#include <fpu_context.h> |
#include <arch/register.h> |
#include <print.h> |
void fpu_context_save(fpu_context_t *fctx) |
{ |
asm volatile ( |
"stf.spill [%0] = f32, 0x80\n" |
"stf.spill [%1] = f33, 0x80\n" |
"stf.spill [%2] = f34, 0x80\n" |
"stf.spill [%3] = f35, 0x80\n" |
"stf.spill [%4] = f36, 0x80\n" |
"stf.spill [%5] = f37, 0x80\n" |
"stf.spill [%6] = f38, 0x80\n" |
"stf.spill [%7] = f39, 0x80\n;;" |
"stf.spill [%0] = f40, 0x80\n" |
"stf.spill [%1] = f41, 0x80\n" |
"stf.spill [%2] = f42, 0x80\n" |
"stf.spill [%3] = f43, 0x80\n" |
"stf.spill [%4] = f44, 0x80\n" |
"stf.spill [%5] = f45, 0x80\n" |
"stf.spill [%6] = f46, 0x80\n" |
"stf.spill [%7] = f47, 0x80\n;;" |
"stf.spill [%0] = f48, 0x80\n" |
"stf.spill [%1] = f49, 0x80\n" |
"stf.spill [%2] = f50, 0x80\n" |
"stf.spill [%3] = f51, 0x80\n" |
"stf.spill [%4] = f52, 0x80\n" |
"stf.spill [%5] = f53, 0x80\n" |
"stf.spill [%6] = f54, 0x80\n" |
"stf.spill [%7] = f55, 0x80\n;;" |
"stf.spill [%0] = f56, 0x80\n" |
"stf.spill [%1] = f57, 0x80\n" |
"stf.spill [%2] = f58, 0x80\n" |
"stf.spill [%3] = f59, 0x80\n" |
"stf.spill [%4] = f60, 0x80\n" |
"stf.spill [%5] = f61, 0x80\n" |
"stf.spill [%6] = f62, 0x80\n" |
"stf.spill [%7] = f63, 0x80\n;;" |
"stf.spill [%0] = f64, 0x80\n" |
"stf.spill [%1] = f65, 0x80\n" |
"stf.spill [%2] = f66, 0x80\n" |
"stf.spill [%3] = f67, 0x80\n" |
"stf.spill [%4] = f68, 0x80\n" |
"stf.spill [%5] = f69, 0x80\n" |
"stf.spill [%6] = f70, 0x80\n" |
"stf.spill [%7] = f71, 0x80\n;;" |
"stf.spill [%0] = f72, 0x80\n" |
"stf.spill [%1] = f73, 0x80\n" |
"stf.spill [%2] = f74, 0x80\n" |
"stf.spill [%3] = f75, 0x80\n" |
"stf.spill [%4] = f76, 0x80\n" |
"stf.spill [%5] = f77, 0x80\n" |
"stf.spill [%6] = f78, 0x80\n" |
"stf.spill [%7] = f79, 0x80\n;;" |
"stf.spill [%0] = f80, 0x80\n" |
"stf.spill [%1] = f81, 0x80\n" |
"stf.spill [%2] = f82, 0x80\n" |
"stf.spill [%3] = f83, 0x80\n" |
"stf.spill [%4] = f84, 0x80\n" |
"stf.spill [%5] = f85, 0x80\n" |
"stf.spill [%6] = f86, 0x80\n" |
"stf.spill [%7] = f87, 0x80\n;;" |
"stf.spill [%0] = f88, 0x80\n" |
"stf.spill [%1] = f89, 0x80\n" |
"stf.spill [%2] = f90, 0x80\n" |
"stf.spill [%3] = f91, 0x80\n" |
"stf.spill [%4] = f92, 0x80\n" |
"stf.spill [%5] = f93, 0x80\n" |
"stf.spill [%6] = f94, 0x80\n" |
"stf.spill [%7] = f95, 0x80\n;;" |
"stf.spill [%0] = f96, 0x80\n" |
"stf.spill [%1] = f97, 0x80\n" |
"stf.spill [%2] = f98, 0x80\n" |
"stf.spill [%3] = f99, 0x80\n" |
"stf.spill [%4] = f100, 0x80\n" |
"stf.spill [%5] = f101, 0x80\n" |
"stf.spill [%6] = f102, 0x80\n" |
"stf.spill [%7] = f103, 0x80\n;;" |
"stf.spill [%0] = f104, 0x80\n" |
"stf.spill [%1] = f105, 0x80\n" |
"stf.spill [%2] = f106, 0x80\n" |
"stf.spill [%3] = f107, 0x80\n" |
"stf.spill [%4] = f108, 0x80\n" |
"stf.spill [%5] = f109, 0x80\n" |
"stf.spill [%6] = f110, 0x80\n" |
"stf.spill [%7] = f111, 0x80\n;;" |
"stf.spill [%0] = f112, 0x80\n" |
"stf.spill [%1] = f113, 0x80\n" |
"stf.spill [%2] = f114, 0x80\n" |
"stf.spill [%3] = f115, 0x80\n" |
"stf.spill [%4] = f116, 0x80\n" |
"stf.spill [%5] = f117, 0x80\n" |
"stf.spill [%6] = f118, 0x80\n" |
"stf.spill [%7] = f119, 0x80\n;;" |
"stf.spill [%0] = f120, 0x80\n" |
"stf.spill [%1] = f121, 0x80\n" |
"stf.spill [%2] = f122, 0x80\n" |
"stf.spill [%3] = f123, 0x80\n" |
"stf.spill [%4] = f124, 0x80\n" |
"stf.spill [%5] = f125, 0x80\n" |
"stf.spill [%6] = f126, 0x80\n" |
"stf.spill [%7] = f127, 0x80\n;;" |
: |
: "r" (&((fctx->fr)[0])), "r" (&((fctx->fr)[1])), "r" (&((fctx->fr)[2])), "r" (&((fctx->fr)[3])), |
"r" (&((fctx->fr)[4])), "r" (&((fctx->fr)[5])), "r" (&((fctx->fr)[6])), "r" (&((fctx->fr)[7])) |
); |
} |
void fpu_context_restore(fpu_context_t *fctx) |
{ |
asm volatile ( |
"ldf.fill f32 = [%0], 0x80\n" |
"ldf.fill f33 = [%1], 0x80\n" |
"ldf.fill f34 = [%2], 0x80\n" |
"ldf.fill f35 = [%3], 0x80\n" |
"ldf.fill f36 = [%4], 0x80\n" |
"ldf.fill f37 = [%5], 0x80\n" |
"ldf.fill f38 = [%6], 0x80\n" |
"ldf.fill f39 = [%7], 0x80\n;;" |
"ldf.fill f40 = [%0], 0x80\n" |
"ldf.fill f41 = [%1], 0x80\n" |
"ldf.fill f42 = [%2], 0x80\n" |
"ldf.fill f43 = [%3], 0x80\n" |
"ldf.fill f44 = [%4], 0x80\n" |
"ldf.fill f45 = [%5], 0x80\n" |
"ldf.fill f46 = [%6], 0x80\n" |
"ldf.fill f47 = [%7], 0x80\n;;" |
"ldf.fill f48 = [%0], 0x80\n" |
"ldf.fill f49 = [%1], 0x80\n" |
"ldf.fill f50 = [%2], 0x80\n" |
"ldf.fill f51 = [%3], 0x80\n" |
"ldf.fill f52 = [%4], 0x80\n" |
"ldf.fill f53 = [%5], 0x80\n" |
"ldf.fill f54 = [%6], 0x80\n" |
"ldf.fill f55 = [%7], 0x80\n;;" |
"ldf.fill f56 = [%0], 0x80\n" |
"ldf.fill f57 = [%1], 0x80\n" |
"ldf.fill f58 = [%2], 0x80\n" |
"ldf.fill f59 = [%3], 0x80\n" |
"ldf.fill f60 = [%4], 0x80\n" |
"ldf.fill f61 = [%5], 0x80\n" |
"ldf.fill f62 = [%6], 0x80\n" |
"ldf.fill f63 = [%7], 0x80\n;;" |
"ldf.fill f64 = [%0], 0x80\n" |
"ldf.fill f65 = [%1], 0x80\n" |
"ldf.fill f66 = [%2], 0x80\n" |
"ldf.fill f67 = [%3], 0x80\n" |
"ldf.fill f68 = [%4], 0x80\n" |
"ldf.fill f69 = [%5], 0x80\n" |
"ldf.fill f70 = [%6], 0x80\n" |
"ldf.fill f71 = [%7], 0x80\n;;" |
"ldf.fill f72 = [%0], 0x80\n" |
"ldf.fill f73 = [%1], 0x80\n" |
"ldf.fill f74 = [%2], 0x80\n" |
"ldf.fill f75 = [%3], 0x80\n" |
"ldf.fill f76 = [%4], 0x80\n" |
"ldf.fill f77 = [%5], 0x80\n" |
"ldf.fill f78 = [%6], 0x80\n" |
"ldf.fill f79 = [%7], 0x80\n;;" |
"ldf.fill f80 = [%0], 0x80\n" |
"ldf.fill f81 = [%1], 0x80\n" |
"ldf.fill f82 = [%2], 0x80\n" |
"ldf.fill f83 = [%3], 0x80\n" |
"ldf.fill f84 = [%4], 0x80\n" |
"ldf.fill f85 = [%5], 0x80\n" |
"ldf.fill f86 = [%6], 0x80\n" |
"ldf.fill f87 = [%7], 0x80\n;;" |
"ldf.fill f88 = [%0], 0x80\n" |
"ldf.fill f89 = [%1], 0x80\n" |
"ldf.fill f90 = [%2], 0x80\n" |
"ldf.fill f91 = [%3], 0x80\n" |
"ldf.fill f92 = [%4], 0x80\n" |
"ldf.fill f93 = [%5], 0x80\n" |
"ldf.fill f94 = [%6], 0x80\n" |
"ldf.fill f95 = [%7], 0x80\n;;" |
"ldf.fill f96 = [%0], 0x80\n" |
"ldf.fill f97 = [%1], 0x80\n" |
"ldf.fill f98 = [%2], 0x80\n" |
"ldf.fill f99 = [%3], 0x80\n" |
"ldf.fill f100 = [%4], 0x80\n" |
"ldf.fill f101 = [%5], 0x80\n" |
"ldf.fill f102 = [%6], 0x80\n" |
"ldf.fill f103 = [%7], 0x80\n;;" |
"ldf.fill f104 = [%0], 0x80\n" |
"ldf.fill f105 = [%1], 0x80\n" |
"ldf.fill f106 = [%2], 0x80\n" |
"ldf.fill f107 = [%3], 0x80\n" |
"ldf.fill f108 = [%4], 0x80\n" |
"ldf.fill f109 = [%5], 0x80\n" |
"ldf.fill f110 = [%6], 0x80\n" |
"ldf.fill f111 = [%7], 0x80\n;;" |
"ldf.fill f112 = [%0], 0x80\n" |
"ldf.fill f113 = [%1], 0x80\n" |
"ldf.fill f114 = [%2], 0x80\n" |
"ldf.fill f115 = [%3], 0x80\n" |
"ldf.fill f116 = [%4], 0x80\n" |
"ldf.fill f117 = [%5], 0x80\n" |
"ldf.fill f118 = [%6], 0x80\n" |
"ldf.fill f119 = [%7], 0x80\n;;" |
"ldf.fill f120 = [%0], 0x80\n" |
"ldf.fill f121 = [%1], 0x80\n" |
"ldf.fill f122 = [%2], 0x80\n" |
"ldf.fill f123 = [%3], 0x80\n" |
"ldf.fill f124 = [%4], 0x80\n" |
"ldf.fill f125 = [%5], 0x80\n" |
"ldf.fill f126 = [%6], 0x80\n" |
"ldf.fill f127 = [%7], 0x80\n;;" |
: |
: "r" (&((fctx->fr)[0])), "r" (&((fctx->fr)[1])), "r" (&((fctx->fr)[2])), "r" (&((fctx->fr)[3])), |
"r" (&((fctx->fr)[4])), "r" (&((fctx->fr)[5])), "r" (&((fctx->fr)[6])), "r" (&((fctx->fr)[7])) |
); |
} |
void fpu_enable(void) |
{ |
uint64_t a = 0 ; |
asm volatile ( |
"rsm %0 ;;" |
"srlz.i\n" |
"srlz.d ;;\n" |
: |
: "i" (PSR_DFH_MASK) |
); |
asm volatile ( |
"mov %0 = ar.fpsr ;;\n" |
"or %0 = %0,%1 ;;\n" |
"mov ar.fpsr = %0 ;;\n" |
: "+r" (a) |
: "r" (0x38) |
); |
} |
void fpu_disable(void) |
{ |
uint64_t a = 0 ; |
asm volatile ( |
"ssm %0 ;;\n" |
"srlz.i\n" |
"srlz.d ;;\n" |
: |
: "i" (PSR_DFH_MASK) |
); |
asm volatile ( |
"mov %0 = ar.fpsr ;;\n" |
"or %0 = %0,%1 ;;\n" |
"mov ar.fpsr = %0 ;;\n" |
: "+r" (a) |
: "r" (0x38) |
); |
} |
void fpu_init(void) |
{ |
uint64_t a = 0 ; |
asm volatile ( |
"mov %0 = ar.fpsr ;;\n" |
"or %0 = %0,%1 ;;\n" |
"mov ar.fpsr = %0 ;;\n" |
: "+r" (a) |
: "r" (0x38) |
); |
asm volatile ( |
"mov f2 = f0\n" |
"mov f3 = f0\n" |
"mov f4 = f0\n" |
"mov f5 = f0\n" |
"mov f6 = f0\n" |
"mov f7 = f0\n" |
"mov f8 = f0\n" |
"mov f9 = f0\n" |
"mov f10 = f0\n" |
"mov f11 = f0\n" |
"mov f12 = f0\n" |
"mov f13 = f0\n" |
"mov f14 = f0\n" |
"mov f15 = f0\n" |
"mov f16 = f0\n" |
"mov f17 = f0\n" |
"mov f18 = f0\n" |
"mov f19 = f0\n" |
"mov f20 = f0\n" |
"mov f21 = f0\n" |
"mov f22 = f0\n" |
"mov f23 = f0\n" |
"mov f24 = f0\n" |
"mov f25 = f0\n" |
"mov f26 = f0\n" |
"mov f27 = f0\n" |
"mov f28 = f0\n" |
"mov f29 = f0\n" |
"mov f30 = f0\n" |
"mov f31 = f0\n" |
"mov f32 = f0\n" |
"mov f33 = f0\n" |
"mov f34 = f0\n" |
"mov f35 = f0\n" |
"mov f36 = f0\n" |
"mov f37 = f0\n" |
"mov f38 = f0\n" |
"mov f39 = f0\n" |
"mov f40 = f0\n" |
"mov f41 = f0\n" |
"mov f42 = f0\n" |
"mov f43 = f0\n" |
"mov f44 = f0\n" |
"mov f45 = f0\n" |
"mov f46 = f0\n" |
"mov f47 = f0\n" |
"mov f48 = f0\n" |
"mov f49 = f0\n" |
"mov f50 = f0\n" |
"mov f51 = f0\n" |
"mov f52 = f0\n" |
"mov f53 = f0\n" |
"mov f54 = f0\n" |
"mov f55 = f0\n" |
"mov f56 = f0\n" |
"mov f57 = f0\n" |
"mov f58 = f0\n" |
"mov f59 = f0\n" |
"mov f60 = f0\n" |
"mov f61 = f0\n" |
"mov f62 = f0\n" |
"mov f63 = f0\n" |
"mov f64 = f0\n" |
"mov f65 = f0\n" |
"mov f66 = f0\n" |
"mov f67 = f0\n" |
"mov f68 = f0\n" |
"mov f69 = f0\n" |
"mov f70 = f0\n" |
"mov f71 = f0\n" |
"mov f72 = f0\n" |
"mov f73 = f0\n" |
"mov f74 = f0\n" |
"mov f75 = f0\n" |
"mov f76 = f0\n" |
"mov f77 = f0\n" |
"mov f78 = f0\n" |
"mov f79 = f0\n" |
"mov f80 = f0\n" |
"mov f81 = f0\n" |
"mov f82 = f0\n" |
"mov f83 = f0\n" |
"mov f84 = f0\n" |
"mov f85 = f0\n" |
"mov f86 = f0\n" |
"mov f87 = f0\n" |
"mov f88 = f0\n" |
"mov f89 = f0\n" |
"mov f90 = f0\n" |
"mov f91 = f0\n" |
"mov f92 = f0\n" |
"mov f93 = f0\n" |
"mov f94 = f0\n" |
"mov f95 = f0\n" |
"mov f96 = f0\n" |
"mov f97 = f0\n" |
"mov f98 = f0\n" |
"mov f99 = f0\n" |
"mov f100 = f0\n" |
"mov f101 = f0\n" |
"mov f102 = f0\n" |
"mov f103 = f0\n" |
"mov f104 = f0\n" |
"mov f105 = f0\n" |
"mov f106 = f0\n" |
"mov f107 = f0\n" |
"mov f108 = f0\n" |
"mov f109 = f0\n" |
"mov f110 = f0\n" |
"mov f111 = f0\n" |
"mov f112 = f0\n" |
"mov f113 = f0\n" |
"mov f114 = f0\n" |
"mov f115 = f0\n" |
"mov f116 = f0\n" |
"mov f117 = f0\n" |
"mov f118 = f0\n" |
"mov f119 = f0\n" |
"mov f120 = f0\n" |
"mov f121 = f0\n" |
"mov f122 = f0\n" |
"mov f123 = f0\n" |
"mov f124 = f0\n" |
"mov f125 = f0\n" |
"mov f126 = f0\n" |
"mov f127 = f0\n" |
); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia64/src/asm.S |
---|
0,0 → 1,184 |
# |
# Copyright (c) 2005 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
#include <arch/register.h> |
.text |
/** Copy memory from/to userspace. |
* |
* This memcpy() has been taken from the assembler output of |
* the generic _memcpy() and modified to have the failover part. |
* |
* @param in0 Destination address. |
* @param in1 Source address. |
* @param in2 Number of byte to copy. |
*/ |
.global memcpy |
.global memcpy_from_uspace |
.global memcpy_to_uspace |
.global memcpy_from_uspace_failover_address |
.global memcpy_to_uspace_failover_address |
memcpy: |
memcpy_from_uspace: |
memcpy_to_uspace: |
alloc loc0 = ar.pfs, 3, 1, 0, 0 |
adds r14 = 7, in1 |
mov r2 = ar.lc |
mov r8 = in1 ;; |
and r14 = -8, r14 ;; |
cmp.ne p6, p7 = r14, in1 |
(p7) br.cond.dpnt 3f ;; |
0: |
cmp.ne p6, p7 = 0, in2 |
(p7) br.cond.dpnt 2f ;; |
(p6) adds r14 = -1, in2 |
(p6) mov r16 = r0 |
(p6) mov r17 = r0 ;; |
(p6) mov ar.lc = r14 |
1: |
add r14 = r16, r8 |
add r15 = r16, in0 |
adds r17 = 1, r17 ;; |
ld1 r14 = [r14] |
mov r16 = r17 ;; |
st1 [r15] = r14 |
br.cloop.sptk.few 1b ;; |
2: |
mov ar.lc = r2 |
mov ar.pfs = loc0 |
br.ret.sptk.many rp |
3: |
adds r14 = 7, in0 ;; |
and r14 = -8, r14 ;; |
cmp.eq p6, p7 = r14, in0 |
(p7) br.cond.dptk 0b |
shr.u r18 = in2, 3 ;; |
cmp.ne p6, p7 = 0, r18 |
(p7) br.cond.dpnt 5f ;; |
(p6) adds r14 = -1, r18 |
(p6) mov r16 = r0 |
(p6) mov r17 = r0 ;; |
(p6) mov ar.lc = r14 |
4: |
shladd r14 = r16, 3, r0 |
adds r16 = 1, r17 ;; |
add r15 = r8, r14 |
add r14 = in0, r14 |
mov r17 = r16 ;; |
ld8 r15 = [r15] ;; |
st8 [r14] = r15 |
br.cloop.sptk.few 4b |
5: |
and r15 = 7, in2 |
shladd r14 = r18, 3, r0 |
mov r16 = r0 |
mov r18 = r0 ;; |
cmp.eq p6, p7 = 0, r15 |
add in0 = r14, in0 |
adds r15 = -1, r15 |
add r17 = r14, r8 |
(p6) br.cond.dpnt 2b ;; |
mov ar.lc = r15 |
6: |
add r14 = r16, r17 |
add r15 = r16, in0 |
adds r16 = 1, r18 ;; |
ld1 r14 = [r14] |
mov r18 = r16 ;; |
st1 [r15] = r14 |
br.cloop.sptk.few 6b ;; |
mov ar.lc = r2 |
mov ar.pfs = loc0 |
br.ret.sptk.many rp |
memcpy_from_uspace_failover_address: |
memcpy_to_uspace_failover_address: |
mov r8 = r0 /* return 0 on failure */ |
mov ar.pfs = loc0 |
br.ret.sptk.many rp |
.global memsetb |
memsetb: |
br _memsetb |
.global cpu_halt |
cpu_halt: |
br cpu_halt |
.global panic_printf |
panic_printf: |
{ |
br.call.sptk.many b0=printf |
} |
br halt |
/** Switch to userspace - low level code. |
* |
* @param in0 Userspace entry point address. |
* @param in1 Userspace stack pointer address. |
* @param in2 Userspace register stack pointer address. |
* @param in3 Userspace address of thread uspace_arg_t structure. |
* @param in4 Value to be stored in IPSR. |
* @param in5 Value to be stored in RSC. |
*/ |
.global switch_to_userspace |
switch_to_userspace: |
alloc loc0 = ar.pfs, 6, 3, 0, 0 |
rsm (PSR_IC_MASK | PSR_I_MASK) /* disable interruption collection and interrupts */ |
srlz.d ;; |
srlz.i ;; |
mov cr.ipsr = in4 |
mov cr.iip = in0 |
mov r12 = in1 |
xor r1 = r1, r1 |
mov loc1 = cr.ifs |
movl loc2 = PFM_MASK ;; |
and loc1 = loc2, loc1 ;; |
mov cr.ifs = loc1 ;; /* prevent decrementing BSP by rfi */ |
invala |
mov loc1 = ar.rsc ;; |
and loc1 = ~3, loc1 ;; |
mov ar.rsc = loc1 ;; /* put RSE into enforced lazy mode */ |
flushrs ;; |
mov ar.bspstore = in2 ;; |
mov ar.rsc = in5 ;; |
mov r8 = in3 |
rfi ;; |
/tags/0.3.0/kernel/arch/ia64/src/context.S |
---|
0,0 → 1,246 |
# |
# Copyright (c) 2005 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
.text |
.global context_save_arch |
.global context_restore_arch |
context_save_arch: |
alloc loc0 = ar.pfs, 1, 8, 0, 0 |
mov loc1 = ar.unat ;; |
/* loc2 */ |
mov loc3 = ar.rsc |
.auto |
/* |
* Flush dirty registers to backing store. |
* After this ar.bsp and ar.bspstore are equal. |
*/ |
flushrs |
mov loc4 = ar.bsp |
/* |
* Put RSE to enforced lazy mode. |
* So that ar.rnat can be read. |
*/ |
and loc5 = ~3, loc3 |
mov ar.rsc = loc5 |
mov loc5 = ar.rnat |
.explicit |
mov loc6 = ar.lc |
/* |
* Save application registers |
*/ |
st8 [in0] = loc0, 8 ;; /* save ar.pfs */ |
st8 [in0] = loc1, 8 ;; /* save ar.unat (caller) */ |
mov loc2 = in0 ;; |
add in0 = 8, in0 ;; /* skip ar.unat (callee) */ |
st8 [in0] = loc3, 8 ;; /* save ar.rsc */ |
st8 [in0] = loc4, 8 ;; /* save ar.bsp */ |
st8 [in0] = loc5, 8 ;; /* save ar.rnat */ |
st8 [in0] = loc6, 8 ;; /* save ar.lc */ |
/* |
* Save general registers including NaT bits |
*/ |
st8.spill [in0] = r1, 8 ;; |
st8.spill [in0] = r4, 8 ;; |
st8.spill [in0] = r5, 8 ;; |
st8.spill [in0] = r6, 8 ;; |
st8.spill [in0] = r7, 8 ;; |
st8.spill [in0] = r12, 8 ;; /* save sp */ |
st8.spill [in0] = r13, 8 ;; |
mov loc3 = ar.unat ;; |
st8 [loc2] = loc3 /* save ar.unat (callee) */ |
/* |
* Save branch registers |
*/ |
mov loc2 = b0 ;; |
st8 [in0] = loc2, 8 /* save pc */ |
mov loc3 = b1 ;; |
st8 [in0] = loc3, 8 |
mov loc4 = b2 ;; |
st8 [in0] = loc4, 8 |
mov loc5 = b3 ;; |
st8 [in0] = loc5, 8 |
mov loc6 = b4 ;; |
st8 [in0] = loc6, 8 |
mov loc7 = b5 ;; |
st8 [in0] = loc7, 8 |
/* |
* Save predicate registers |
*/ |
mov loc2 = pr ;; |
st8 [in0] = loc2, 16;; /* Next fpu registers should be spilled to 16B aligned address */ |
/* |
* Save floating-point registers. |
*/ |
stf.spill [in0] = f2, 16 ;; |
stf.spill [in0] = f3, 16 ;; |
stf.spill [in0] = f4, 16 ;; |
stf.spill [in0] = f5, 16 ;; |
stf.spill [in0] = f16, 16 ;; |
stf.spill [in0] = f17, 16 ;; |
stf.spill [in0] = f18, 16 ;; |
stf.spill [in0] = f19, 16 ;; |
stf.spill [in0] = f20, 16 ;; |
stf.spill [in0] = f21, 16 ;; |
stf.spill [in0] = f22, 16 ;; |
stf.spill [in0] = f23, 16 ;; |
stf.spill [in0] = f24, 16 ;; |
stf.spill [in0] = f25, 16 ;; |
stf.spill [in0] = f26, 16 ;; |
stf.spill [in0] = f27, 16 ;; |
stf.spill [in0] = f28, 16 ;; |
stf.spill [in0] = f29, 16 ;; |
stf.spill [in0] = f30, 16 ;; |
stf.spill [in0] = f31, 16 ;; |
mov ar.unat = loc1 |
add r8 = r0, r0, 1 /* context_save returns 1 */ |
br.ret.sptk.many b0 |
context_restore_arch: |
alloc loc0 = ar.pfs, 1, 9, 0, 0 ;; |
ld8 loc0 = [in0], 8 ;; /* load ar.pfs */ |
ld8 loc1 = [in0], 8 ;; /* load ar.unat (caller) */ |
ld8 loc2 = [in0], 8 ;; /* load ar.unat (callee) */ |
ld8 loc3 = [in0], 8 ;; /* load ar.rsc */ |
ld8 loc4 = [in0], 8 ;; /* load ar.bsp */ |
ld8 loc5 = [in0], 8 ;; /* load ar.rnat */ |
ld8 loc6 = [in0], 8 ;; /* load ar.lc */ |
.auto |
/* |
* Invalidate the ALAT |
*/ |
invala |
/* |
* Put RSE to enforced lazy mode. |
* So that ar.bspstore and ar.rnat can be written. |
*/ |
movl loc8 = ~3 |
and loc8 = loc3, loc8 |
mov ar.rsc = loc8 |
/* |
* Flush dirty registers to backing store. |
* We do this because we want the following move |
* to ar.bspstore to assign the same value to ar.bsp. |
*/ |
flushrs |
/* |
* Restore application registers |
*/ |
mov ar.bspstore = loc4 /* rse.bspload = ar.bsp = ar.bspstore = loc4 */ |
mov ar.rnat = loc5 |
mov ar.pfs = loc0 |
mov ar.rsc = loc3 |
.explicit |
mov ar.unat = loc2 ;; |
mov ar.lc = loc6 |
/* |
* Restore general registers including NaT bits |
*/ |
ld8.fill r1 = [in0], 8 ;; |
ld8.fill r4 = [in0], 8 ;; |
ld8.fill r5 = [in0], 8 ;; |
ld8.fill r6 = [in0], 8 ;; |
ld8.fill r7 = [in0], 8 ;; |
ld8.fill r12 = [in0], 8 ;; /* restore sp */ |
ld8.fill r13 = [in0], 8 ;; |
/* |
* Restore branch registers |
*/ |
ld8 loc2 = [in0], 8 ;; /* restore pc */ |
mov b0 = loc2 |
ld8 loc3 = [in0], 8 ;; |
mov b1 = loc3 |
ld8 loc4 = [in0], 8 ;; |
mov b2 = loc4 |
ld8 loc5 = [in0], 8 ;; |
mov b3 = loc5 |
ld8 loc6 = [in0], 8 ;; |
mov b4 = loc6 |
ld8 loc7 = [in0], 8 ;; |
mov b5 = loc7 |
/* |
* Restore predicate registers |
*/ |
ld8 loc2 = [in0], 16 ;; |
mov pr = loc2, ~0 |
/* |
* Restore floating-point registers. |
*/ |
ldf.fill f2 = [in0], 16 ;; |
ldf.fill f3 = [in0], 16 ;; |
ldf.fill f4 = [in0], 16 ;; |
ldf.fill f5 = [in0], 16 ;; |
ldf.fill f16 = [in0], 16 ;; |
ldf.fill f17 = [in0], 16 ;; |
ldf.fill f18 = [in0], 16 ;; |
ldf.fill f19 = [in0], 16 ;; |
ldf.fill f20 = [in0], 16 ;; |
ldf.fill f21 = [in0], 16 ;; |
ldf.fill f22 = [in0], 16 ;; |
ldf.fill f23 = [in0], 16 ;; |
ldf.fill f24 = [in0], 16 ;; |
ldf.fill f25 = [in0], 16 ;; |
ldf.fill f26 = [in0], 16 ;; |
ldf.fill f27 = [in0], 16 ;; |
ldf.fill f28 = [in0], 16 ;; |
ldf.fill f29 = [in0], 16 ;; |
ldf.fill f30 = [in0], 16 ;; |
ldf.fill f31 = [in0], 16 ;; |
mov ar.unat = loc1 |
mov r8 = r0 /* context_restore returns 0 */ |
br.ret.sptk.many b0 |
/tags/0.3.0/kernel/arch/ia64/src/putchar.c |
---|
0,0 → 1,44 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia64 |
* @{ |
*/ |
/** @file |
*/ |
#include <putchar.h> |
#include <arch/ski/ski.h> |
void putchar(const char ch) |
{ |
ski_write(ch); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia64/src/dummy.s |
---|
0,0 → 1,42 |
# |
# Copyright (c) 2005 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
.text |
.global calibrate_delay_loop |
.global asm_delay_loop |
.global cpu_sleep |
.global dummy |
calibrate_delay_loop: |
asm_delay_loop: |
cpu_sleep: |
dummy: |
br.ret.sptk.many b0 |
/tags/0.3.0/kernel/arch/ia64/include/asm.h |
---|
0,0 → 1,305 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia64_ASM_H_ |
#define KERN_ia64_ASM_H_ |
#include <config.h> |
#include <arch/types.h> |
#include <arch/register.h> |
#define IA64_IOSPACE_ADDRESS 0xE001000000000000ULL |
static inline void outb(uint64_t port,uint8_t v) |
{ |
*((char *)(IA64_IOSPACE_ADDRESS + ( (port & 0xfff) | ( (port >> 2) << 12 )))) = v; |
asm volatile ("mf\n" ::: "memory"); |
} |
static inline uint8_t inb(uint64_t port) |
{ |
asm volatile ("mf\n" ::: "memory"); |
return *((char *)(IA64_IOSPACE_ADDRESS + ( (port & 0xfff) | ( (port >> 2) << 12 )))); |
} |
/** Return base address of current stack |
* |
* Return the base address of the current stack. |
* The stack is assumed to be STACK_SIZE long. |
* The stack must start on page boundary. |
*/ |
static inline uintptr_t get_stack_base(void) |
{ |
uint64_t v; |
asm volatile ("and %0 = %1, r12" : "=r" (v) : "r" (~(STACK_SIZE-1))); |
return v; |
} |
/** Return Processor State Register. |
* |
* @return PSR. |
*/ |
static inline uint64_t psr_read(void) |
{ |
uint64_t v; |
asm volatile ("mov %0 = psr\n" : "=r" (v)); |
return v; |
} |
/** Read IVA (Interruption Vector Address). |
* |
* @return Return location of interruption vector table. |
*/ |
static inline uint64_t iva_read(void) |
{ |
uint64_t v; |
asm volatile ("mov %0 = cr.iva\n" : "=r" (v)); |
return v; |
} |
/** Write IVA (Interruption Vector Address) register. |
* |
* @param v New location of interruption vector table. |
*/ |
static inline void iva_write(uint64_t v) |
{ |
asm volatile ("mov cr.iva = %0\n" : : "r" (v)); |
} |
/** Read IVR (External Interrupt Vector Register). |
* |
* @return Highest priority, pending, unmasked external interrupt vector. |
*/ |
static inline uint64_t ivr_read(void) |
{ |
uint64_t v; |
asm volatile ("mov %0 = cr.ivr\n" : "=r" (v)); |
return v; |
} |
/** Write ITC (Interval Timer Counter) register. |
* |
* @param v New counter value. |
*/ |
static inline void itc_write(uint64_t v) |
{ |
asm volatile ("mov ar.itc = %0\n" : : "r" (v)); |
} |
/** Read ITC (Interval Timer Counter) register. |
* |
* @return Current counter value. |
*/ |
static inline uint64_t itc_read(void) |
{ |
uint64_t v; |
asm volatile ("mov %0 = ar.itc\n" : "=r" (v)); |
return v; |
} |
/** Write ITM (Interval Timer Match) register. |
* |
* @param v New match value. |
*/ |
static inline void itm_write(uint64_t v) |
{ |
asm volatile ("mov cr.itm = %0\n" : : "r" (v)); |
} |
/** Read ITM (Interval Timer Match) register. |
* |
* @return Match value. |
*/ |
static inline uint64_t itm_read(void) |
{ |
uint64_t v; |
asm volatile ("mov %0 = cr.itm\n" : "=r" (v)); |
return v; |
} |
/** Read ITV (Interval Timer Vector) register. |
* |
* @return Current vector and mask bit. |
*/ |
static inline uint64_t itv_read(void) |
{ |
uint64_t v; |
asm volatile ("mov %0 = cr.itv\n" : "=r" (v)); |
return v; |
} |
/** Write ITV (Interval Timer Vector) register. |
* |
* @param v New vector and mask bit. |
*/ |
static inline void itv_write(uint64_t v) |
{ |
asm volatile ("mov cr.itv = %0\n" : : "r" (v)); |
} |
/** Write EOI (End Of Interrupt) register. |
* |
* @param v This value is ignored. |
*/ |
static inline void eoi_write(uint64_t v) |
{ |
asm volatile ("mov cr.eoi = %0\n" : : "r" (v)); |
} |
/** Read TPR (Task Priority Register). |
* |
* @return Current value of TPR. |
*/ |
static inline uint64_t tpr_read(void) |
{ |
uint64_t v; |
asm volatile ("mov %0 = cr.tpr\n" : "=r" (v)); |
return v; |
} |
/** Write TPR (Task Priority Register). |
* |
* @param v New value of TPR. |
*/ |
static inline void tpr_write(uint64_t v) |
{ |
asm volatile ("mov cr.tpr = %0\n" : : "r" (v)); |
} |
/** Disable interrupts. |
* |
* Disable interrupts and return previous |
* value of PSR. |
* |
* @return Old interrupt priority level. |
*/ |
static ipl_t interrupts_disable(void) |
{ |
uint64_t v; |
asm volatile ( |
"mov %0 = psr\n" |
"rsm %1\n" |
: "=r" (v) |
: "i" (PSR_I_MASK) |
); |
return (ipl_t) v; |
} |
/** Enable interrupts. |
* |
* Enable interrupts and return previous |
* value of PSR. |
* |
* @return Old interrupt priority level. |
*/ |
static ipl_t interrupts_enable(void) |
{ |
uint64_t v; |
asm volatile ( |
"mov %0 = psr\n" |
"ssm %1\n" |
";;\n" |
"srlz.d\n" |
: "=r" (v) |
: "i" (PSR_I_MASK) |
); |
return (ipl_t) v; |
} |
/** Restore interrupt priority level. |
* |
* Restore PSR. |
* |
* @param ipl Saved interrupt priority level. |
*/ |
static inline void interrupts_restore(ipl_t ipl) |
{ |
if (ipl & PSR_I_MASK) |
(void) interrupts_enable(); |
else |
(void) interrupts_disable(); |
} |
/** Return interrupt priority level. |
* |
* @return PSR. |
*/ |
static inline ipl_t interrupts_read(void) |
{ |
return (ipl_t) psr_read(); |
} |
/** Disable protection key checking. */ |
static inline void pk_disable(void) |
{ |
asm volatile ("rsm %0\n" : : "i" (PSR_PK_MASK)); |
} |
extern void cpu_halt(void); |
extern void cpu_sleep(void); |
extern void asm_delay_loop(uint32_t t); |
extern void switch_to_userspace(uintptr_t entry, uintptr_t sp, uintptr_t bsp, uintptr_t uspace_uarg, uint64_t ipsr, uint64_t rsc); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia64/include/mm/page.h |
---|
0,0 → 1,286 |
/* |
* Copyright (c) 2005 - 2006 Jakub Jermar |
* Copyright (c) 2006 Jakub Vana |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia64mm |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia64_PAGE_H_ |
#define KERN_ia64_PAGE_H_ |
#include <arch/mm/frame.h> |
#define PAGE_SIZE FRAME_SIZE |
#define PAGE_WIDTH FRAME_WIDTH |
#define PAGE_COLOR_BITS 0 /* dummy */ |
#ifdef KERNEL |
/** Bit width of the TLB-locked portion of kernel address space. */ |
#define KERNEL_PAGE_WIDTH 28 /* 256M */ |
#define IO_PAGE_WIDTH 26 /* 64M */ |
#define PPN_SHIFT 12 |
#define VRN_SHIFT 61 |
#define VRN_MASK (7LL << VRN_SHIFT) |
#define VA2VRN(va) ((va)>>VRN_SHIFT) |
#ifdef __ASM__ |
#define VRN_KERNEL 7 |
#else |
#define VRN_KERNEL 7LL |
#endif |
#define REGION_REGISTERS 8 |
#define KA2PA(x) ((uintptr_t) (x-(VRN_KERNEL<<VRN_SHIFT))) |
#define PA2KA(x) ((uintptr_t) (x+(VRN_KERNEL<<VRN_SHIFT))) |
#define VHPT_WIDTH 20 /* 1M */ |
#define VHPT_SIZE (1 << VHPT_WIDTH) |
#define PTA_BASE_SHIFT 15 |
/** Memory Attributes. */ |
#define MA_WRITEBACK 0x0 |
#define MA_UNCACHEABLE 0x4 |
/** Privilege Levels. Only the most and the least privileged ones are ever used. */ |
#define PL_KERNEL 0x0 |
#define PL_USER 0x3 |
/* Access Rigths. Only certain combinations are used by the kernel. */ |
#define AR_READ 0x0 |
#define AR_EXECUTE 0x1 |
#define AR_WRITE 0x2 |
#ifndef __ASM__ |
#include <arch/mm/as.h> |
#include <arch/mm/frame.h> |
#include <arch/interrupt.h> |
#include <arch/barrier.h> |
#include <arch/mm/asid.h> |
#include <arch/types.h> |
#include <debug.h> |
struct vhpt_tag_info { |
unsigned long long tag : 63; |
unsigned ti : 1; |
} __attribute__ ((packed)); |
union vhpt_tag { |
struct vhpt_tag_info tag_info; |
unsigned tag_word; |
}; |
struct vhpt_entry_present { |
/* Word 0 */ |
unsigned p : 1; |
unsigned : 1; |
unsigned ma : 3; |
unsigned a : 1; |
unsigned d : 1; |
unsigned pl : 2; |
unsigned ar : 3; |
unsigned long long ppn : 38; |
unsigned : 2; |
unsigned ed : 1; |
unsigned ig1 : 11; |
/* Word 1 */ |
unsigned : 2; |
unsigned ps : 6; |
unsigned key : 24; |
unsigned : 32; |
/* Word 2 */ |
union vhpt_tag tag; |
/* Word 3 */ |
uint64_t ig3 : 64; |
} __attribute__ ((packed)); |
struct vhpt_entry_not_present { |
/* Word 0 */ |
unsigned p : 1; |
unsigned long long ig0 : 52; |
unsigned ig1 : 11; |
/* Word 1 */ |
unsigned : 2; |
unsigned ps : 6; |
unsigned long long ig2 : 56; |
/* Word 2 */ |
union vhpt_tag tag; |
/* Word 3 */ |
uint64_t ig3 : 64; |
} __attribute__ ((packed)); |
typedef union vhpt_entry { |
struct vhpt_entry_present present; |
struct vhpt_entry_not_present not_present; |
uint64_t word[4]; |
} vhpt_entry_t; |
struct region_register_map { |
unsigned ve : 1; |
unsigned : 1; |
unsigned ps : 6; |
unsigned rid : 24; |
unsigned : 32; |
} __attribute__ ((packed)); |
typedef union region_register { |
struct region_register_map map; |
unsigned long long word; |
} region_register; |
struct pta_register_map { |
unsigned ve : 1; |
unsigned : 1; |
unsigned size : 6; |
unsigned vf : 1; |
unsigned : 6; |
unsigned long long base : 49; |
} __attribute__ ((packed)); |
typedef union pta_register { |
struct pta_register_map map; |
uint64_t word; |
} pta_register; |
/** Return Translation Hashed Entry Address. |
* |
* VRN bits are used to read RID (ASID) from one |
* of the eight region registers registers. |
* |
* @param va Virtual address including VRN bits. |
* |
* @return Address of the head of VHPT collision chain. |
*/ |
static inline uint64_t thash(uint64_t va) |
{ |
uint64_t ret; |
asm volatile ("thash %0 = %1\n" : "=r" (ret) : "r" (va)); |
return ret; |
} |
/** Return Translation Hashed Entry Tag. |
* |
* VRN bits are used to read RID (ASID) from one |
* of the eight region registers. |
* |
* @param va Virtual address including VRN bits. |
* |
* @return The unique tag for VPN and RID in the collision chain returned by thash(). |
*/ |
static inline uint64_t ttag(uint64_t va) |
{ |
uint64_t ret; |
asm volatile ("ttag %0 = %1\n" : "=r" (ret) : "r" (va)); |
return ret; |
} |
/** Read Region Register. |
* |
* @param i Region register index. |
* |
* @return Current contents of rr[i]. |
*/ |
static inline uint64_t rr_read(index_t i) |
{ |
uint64_t ret; |
ASSERT(i < REGION_REGISTERS); |
asm volatile ("mov %0 = rr[%1]\n" : "=r" (ret) : "r" (i << VRN_SHIFT)); |
return ret; |
} |
/** Write Region Register. |
* |
* @param i Region register index. |
* @param v Value to be written to rr[i]. |
*/ |
static inline void rr_write(index_t i, uint64_t v) |
{ |
ASSERT(i < REGION_REGISTERS); |
asm volatile ( |
"mov rr[%0] = %1\n" |
: |
: "r" (i << VRN_SHIFT), "r" (v) |
); |
} |
/** Read Page Table Register. |
* |
* @return Current value stored in PTA. |
*/ |
static inline uint64_t pta_read(void) |
{ |
uint64_t ret; |
asm volatile ("mov %0 = cr.pta\n" : "=r" (ret)); |
return ret; |
} |
/** Write Page Table Register. |
* |
* @param v New value to be stored in PTA. |
*/ |
static inline void pta_write(uint64_t v) |
{ |
asm volatile ("mov cr.pta = %0\n" : : "r" (v)); |
} |
extern void page_arch_init(void); |
extern vhpt_entry_t *vhpt_hash(uintptr_t page, asid_t asid); |
extern bool vhpt_compare(uintptr_t page, asid_t asid, vhpt_entry_t *v); |
extern void vhpt_set_record(vhpt_entry_t *v, uintptr_t page, asid_t asid, uintptr_t frame, int flags); |
#endif /* __ASM__ */ |
#endif /* KERNEL */ |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia64/include/mm/frame.h |
---|
0,0 → 1,55 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia64mm |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia64_FRAME_H_ |
#define KERN_ia64_FRAME_H_ |
#define FRAME_WIDTH 14 /* 16K */ |
#define FRAME_SIZE (1 << FRAME_WIDTH) |
#ifdef KERNEL |
#ifndef __ASM__ |
extern void frame_arch_init(void); |
#define physmem_print() |
#define ARCH_STACK_FRAMES TWO_FRAMES |
#endif /* __ASM__ */ |
#endif /* KERNEL */ |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia64/include/mm/tlb.h |
---|
0,0 → 1,103 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia64mm |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia64_TLB_H_ |
#define KERN_ia64_TLB_H_ |
#define tlb_arch_init() |
#define tlb_print() |
#include <arch/mm/page.h> |
#include <arch/mm/asid.h> |
#include <arch/interrupt.h> |
#include <arch/types.h> |
/** Data and instruction Translation Register indices. */ |
#define DTR_KERNEL 0 |
#define ITR_KERNEL 0 |
#define DTR_KSTACK1 1 |
#define DTR_KSTACK2 2 |
/** Portion of TLB insertion format data structure. */ |
union tlb_entry { |
uint64_t word[2]; |
struct { |
/* Word 0 */ |
unsigned p : 1; /**< Present. */ |
unsigned : 1; |
unsigned ma : 3; /**< Memory attribute. */ |
unsigned a : 1; /**< Accessed. */ |
unsigned d : 1; /**< Dirty. */ |
unsigned pl : 2; /**< Privilege level. */ |
unsigned ar : 3; /**< Access rights. */ |
unsigned long long ppn : 38; /**< Physical Page Number, a.k.a. PFN. */ |
unsigned : 2; |
unsigned ed : 1; |
unsigned ig1 : 11; |
/* Word 1 */ |
unsigned : 2; |
unsigned ps : 6; /**< Page size will be 2^ps. */ |
unsigned key : 24; /**< Protection key, unused. */ |
unsigned : 32; |
} __attribute__ ((packed)); |
} __attribute__ ((packed)); |
typedef union tlb_entry tlb_entry_t; |
extern void tc_mapping_insert(uintptr_t va, asid_t asid, tlb_entry_t entry, bool dtc); |
extern void dtc_mapping_insert(uintptr_t va, asid_t asid, tlb_entry_t entry); |
extern void itc_mapping_insert(uintptr_t va, asid_t asid, tlb_entry_t entry); |
extern void tr_mapping_insert(uintptr_t va, asid_t asid, tlb_entry_t entry, bool dtr, index_t tr); |
extern void dtr_mapping_insert(uintptr_t va, asid_t asid, tlb_entry_t entry, index_t tr); |
extern void itr_mapping_insert(uintptr_t va, asid_t asid, tlb_entry_t entry, index_t tr); |
extern void dtlb_kernel_mapping_insert(uintptr_t page, uintptr_t frame, bool dtr, index_t tr); |
extern void dtr_purge(uintptr_t page, count_t width); |
extern void dtc_pte_copy(pte_t *t); |
extern void itc_pte_copy(pte_t *t); |
extern void alternate_instruction_tlb_fault(uint64_t vector, istate_t *istate); |
extern void alternate_data_tlb_fault(uint64_t vector, istate_t *istate); |
extern void data_nested_tlb_fault(uint64_t vector, istate_t *istate); |
extern void data_dirty_bit_fault(uint64_t vector, istate_t *istate); |
extern void instruction_access_bit_fault(uint64_t vector, istate_t *istate); |
extern void data_access_bit_fault(uint64_t vector, istate_t *istate); |
extern void page_not_present(uint64_t vector, istate_t *istate); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia64/include/mm/as.h |
---|
0,0 → 1,63 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia64mm |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia64_AS_H_ |
#define KERN_ia64_AS_H_ |
#define KERNEL_ADDRESS_SPACE_SHADOWED_ARCH 0 |
#define KERNEL_ADDRESS_SPACE_START_ARCH (unsigned long) 0xe000000000000000ULL |
#define KERNEL_ADDRESS_SPACE_END_ARCH (unsigned long) 0xffffffffffffffffULL |
#define USER_ADDRESS_SPACE_START_ARCH (unsigned long) 0x0000000000000000ULL |
#define USER_ADDRESS_SPACE_END_ARCH (unsigned long) 0xdfffffffffffffffULL |
#define USTACK_ADDRESS_ARCH 0x0000000ff0000000ULL |
typedef struct { |
} as_arch_t; |
#include <genarch/mm/as_ht.h> |
#define as_constructor_arch(as, flags) (as != as) |
#define as_destructor_arch(as) (as != as) |
#define as_create_arch(as, flags) (as != as) |
#define as_deinstall_arch(as) |
#define as_invalidate_translation_cache(as, page, cnt) |
extern void as_arch_init(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia64/include/mm/asid.h |
---|
0,0 → 1,66 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia64mm |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia64_ASID_H_ |
#define KERN_ia64_ASID_H_ |
#ifndef __ASM__ |
#include <arch/types.h> |
typedef uint16_t asid_t; |
typedef uint32_t rid_t; |
#endif /* __ASM__ */ |
/** |
* Number of ia64 RIDs (Region Identifiers) per kernel ASID. |
* Note that some architectures may support more bits, |
* but those extra bits are not used by the kernel. |
*/ |
#define RIDS_PER_ASID 7 |
#define RID_MAX 262143 /* 2^18 - 1 */ |
#define RID_KERNEL 0 |
#define RID_INVALID 1 |
#define ASID2RID(asid, vrn) (((asid)>RIDS_PER_ASID)?(((asid)*RIDS_PER_ASID)+(vrn)):(asid)) |
#define RID2ASID(rid) ((rid)/RIDS_PER_ASID) |
#define ASID_MAX_ARCH (RID_MAX/RIDS_PER_ASID) |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia64/include/mm/vhpt.h |
---|
0,0 → 1,60 |
/* |
* Copyright (c) 2006 Jakub Vana |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia64mm |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia64_VHPT_H_ |
#define KERN_ia64_VHPT_H_ |
#include <arch/mm/tlb.h> |
#include <arch/mm/page.h> |
uintptr_t vhpt_set_up(void); |
static inline vhpt_entry_t tlb_entry_t2vhpt_entry_t(tlb_entry_t tentry) |
{ |
vhpt_entry_t ventry; |
ventry.word[0]=tentry.word[0]; |
ventry.word[1]=tentry.word[1]; |
return ventry; |
} |
void vhpt_mapping_insert(uintptr_t va, asid_t asid, tlb_entry_t entry); |
void vhpt_invalidate_all(void); |
void vhpt_invalidate_asid(asid_t asid); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia64/include/drivers/ega.h |
---|
0,0 → 1,50 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* 2007 Jakub Vana |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia64_EGA_H |
#define KERN_ia64_EGA_H |
#define VIDEORAM (0xe0020000000B8000LL) |
#define ROW 80 |
#define ROWS 25 |
#define SCREEN (ROW * ROWS) |
extern void ega_init(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia64/include/drivers/i8042.h |
---|
0,0 → 1,71 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia32 |
* @{ |
*/ |
/** @file |
*/ |
/** |
* This file implements ia32 specific access to i8042 registers. |
*/ |
#ifndef KERN_ia64_I8042_H_ |
#define KERN_ia64_I8042_H_ |
#include <arch/asm.h> |
#include <arch/types.h> |
#define i8042_DATA 0x60 |
#define i8042_STATUS 0x64 |
static inline void i8042_data_write(uint8_t data) |
{ |
outb(i8042_DATA, data); |
} |
static inline uint8_t i8042_data_read(void) |
{ |
return inb(i8042_DATA); |
} |
static inline uint8_t i8042_status_read(void) |
{ |
return inb(i8042_STATUS); |
} |
static inline void i8042_command_write(uint8_t command) |
{ |
outb(i8042_STATUS, command); |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia64/include/drivers/it.h |
---|
0,0 → 1,51 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia64_IT_H_ |
#define KERN_ia64_IT_H_ |
/* |
* Unfortunately, Ski does not emulate PAL, |
* so we can't read the real frequency ratios |
* from firmware. |
* |
*/ |
#define IT_DELTA 100000 |
extern void it_init(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia64/include/interrupt.h |
---|
0,0 → 1,156 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia64interrupt |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia64_INTERRUPT_H_ |
#define KERN_ia64_INTERRUPT_H_ |
#include <arch/types.h> |
#include <arch/register.h> |
/** ia64 has 256 INRs. */ |
#define INR_COUNT 256 |
/* |
* We need to keep this just to compile. |
* We might eventually move interrupt/ stuff |
* to genarch. |
*/ |
#define IVT_ITEMS 0 |
#define IVT_FIRST 0 |
/** External Interrupt vectors. */ |
#define INTERRUPT_TIMER 255 |
#define IRQ_KBD 241 |
#define IRQ_MOUSE 252 |
#define INTERRUPT_SPURIOUS 15 |
/** General Exception codes. */ |
#define GE_ILLEGALOP 0 |
#define GE_PRIVOP 1 |
#define GE_PRIVREG 2 |
#define GE_RESREGFLD 3 |
#define GE_DISBLDISTRAN 4 |
#define GE_ILLEGALDEP 8 |
#define EOI 0 /**< The actual value doesn't matter. */ |
typedef struct { |
uint128_t f2; |
uint128_t f3; |
uint128_t f4; |
uint128_t f5; |
uint128_t f6; |
uint128_t f7; |
uint128_t f8; |
uint128_t f9; |
uint128_t f10; |
uint128_t f11; |
uint128_t f12; |
uint128_t f13; |
uint128_t f14; |
uint128_t f15; |
uint128_t f16; |
uint128_t f17; |
uint128_t f18; |
uint128_t f19; |
uint128_t f20; |
uint128_t f21; |
uint128_t f22; |
uint128_t f23; |
uint128_t f24; |
uint128_t f25; |
uint128_t f26; |
uint128_t f27; |
uint128_t f28; |
uint128_t f29; |
uint128_t f30; |
uint128_t f31; |
uintptr_t ar_bsp; |
uintptr_t ar_bspstore; |
uintptr_t ar_bspstore_new; |
uint64_t ar_rnat; |
uint64_t ar_ifs; |
uint64_t ar_pfs; |
uint64_t ar_rsc; |
uintptr_t cr_ifa; |
cr_isr_t cr_isr; |
uintptr_t cr_iipa; |
psr_t cr_ipsr; |
uintptr_t cr_iip; |
uint64_t pr; |
uintptr_t sp; |
/* |
* The following variables are defined only for break_instruction |
* handler. |
*/ |
uint64_t in0; |
uint64_t in1; |
uint64_t in2; |
uint64_t in3; |
uint64_t in4; |
uint64_t in5; |
uint64_t in6; |
} istate_t; |
static inline void istate_set_retaddr(istate_t *istate, uintptr_t retaddr) |
{ |
istate->cr_iip = retaddr; |
istate->cr_ipsr.ri = 0; /* return to instruction slot #0 */ |
} |
static inline unative_t istate_get_pc(istate_t *istate) |
{ |
return istate->cr_iip; |
} |
static inline int istate_from_uspace(istate_t *istate) |
{ |
return (istate->cr_iip) < 0xe000000000000000ULL; |
} |
extern void *ivt; |
extern void general_exception(uint64_t vector, istate_t *istate); |
extern int break_instruction(uint64_t vector, istate_t *istate); |
extern void universal_handler(uint64_t vector, istate_t *istate); |
extern void nop_handler(uint64_t vector, istate_t *istate); |
extern void external_interrupt(uint64_t vector, istate_t *istate); |
extern void disabled_fp_register(uint64_t vector, istate_t *istate); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia64/include/bootinfo.h |
---|
0,0 → 1,56 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#ifndef KERN_ia64_BOOTINFO_H_ |
#define KERN_ia64_BOOTINFO_H_ |
#define CONFIG_INIT_TASKS 32 |
typedef struct { |
void *addr; |
unsigned long size; |
} binit_task_t; |
typedef struct { |
unsigned long count; |
binit_task_t tasks[CONFIG_INIT_TASKS]; |
} binit_t; |
typedef struct { |
binit_t taskmap; |
} bootinfo_t; |
extern bootinfo_t *bootinfo; |
extern void start(void); |
extern void bootstrap(void); |
#endif |
/tags/0.3.0/kernel/arch/ia64/include/types.h |
---|
0,0 → 1,83 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia64_TYPES_H_ |
#define KERN_ia64_TYPES_H_ |
#define NULL 0 |
#define false 0 |
#define true 1 |
typedef signed char int8_t; |
typedef signed short int16_t; |
typedef signed int int32_t; |
typedef signed long int64_t; |
typedef struct { |
int64_t lo; |
int64_t hi; |
} int128_t; |
typedef unsigned char uint8_t; |
typedef unsigned short uint16_t; |
typedef unsigned int uint32_t; |
typedef unsigned long uint64_t; |
typedef struct { |
uint64_t lo; |
uint64_t hi; |
} uint128_t; |
typedef uint64_t size_t; |
typedef uint64_t count_t; |
typedef uint64_t index_t; |
typedef uint64_t uintptr_t; |
typedef uint64_t pfn_t; |
typedef uint64_t ipl_t; |
typedef uint64_t unative_t; |
typedef int64_t native_t; |
typedef uint8_t bool; |
typedef uint64_t thread_id_t; |
typedef uint64_t task_id_t; |
typedef uint32_t context_id_t; |
typedef int32_t inr_t; |
typedef int32_t devno_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia64/include/fpu_context.h |
---|
0,0 → 1,52 |
/* |
* Copyright (c) 2005 Jakub Vana |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia64_FPU_CONTEXT_H_ |
#define KERN_ia64_FPU_CONTEXT_H_ |
#define ARCH_HAS_FPU 1 |
#define FPU_CONTEXT_ALIGN 16 |
#include <arch/types.h> |
#define FRS 96 |
typedef struct { |
uint128_t fr[FRS]; |
} fpu_context_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia64/include/context.h |
---|
0,0 → 1,135 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia64_CONTEXT_H_ |
#define KERN_ia64_CONTEXT_H_ |
#include <arch/types.h> |
#include <arch/register.h> |
#include <align.h> |
#include <arch/stack.h> |
/* |
* context_save_arch() and context_restore_arch() are both leaf procedures. |
* No need to allocate scratch area. |
* |
* One item is put onto the stack to support get_stack_base(). |
*/ |
#define SP_DELTA (0 + ALIGN_UP(STACK_ITEM_SIZE, STACK_ALIGNMENT)) |
#ifdef context_set |
#undef context_set |
#endif |
/* RSE stack starts at the bottom of memory stack. */ |
#define context_set(c, _pc, stack, size) \ |
do { \ |
(c)->pc = (uintptr_t) _pc; \ |
(c)->bsp = ((uintptr_t) stack) + ALIGN_UP((size), REGISTER_STACK_ALIGNMENT); \ |
(c)->ar_pfs &= PFM_MASK; \ |
(c)->sp = ((uintptr_t) stack) + ALIGN_UP((size), STACK_ALIGNMENT) - SP_DELTA; \ |
} while (0); |
/* |
* Only save registers that must be preserved across |
* function calls. |
*/ |
typedef struct { |
/* |
* Application registers |
*/ |
uint64_t ar_pfs; |
uint64_t ar_unat_caller; |
uint64_t ar_unat_callee; |
uint64_t ar_rsc; |
uintptr_t bsp; /* ar_bsp */ |
uint64_t ar_rnat; |
uint64_t ar_lc; |
/* |
* General registers |
*/ |
uint64_t r1; |
uint64_t r4; |
uint64_t r5; |
uint64_t r6; |
uint64_t r7; |
uintptr_t sp; /* r12 */ |
uint64_t r13; |
/* |
* Branch registers |
*/ |
uintptr_t pc; /* b0 */ |
uint64_t b1; |
uint64_t b2; |
uint64_t b3; |
uint64_t b4; |
uint64_t b5; |
/* |
* Predicate registers |
*/ |
uint64_t pr; |
uint128_t f2 __attribute__ ((aligned(16))); |
uint128_t f3; |
uint128_t f4; |
uint128_t f5; |
uint128_t f16; |
uint128_t f17; |
uint128_t f18; |
uint128_t f19; |
uint128_t f20; |
uint128_t f21; |
uint128_t f22; |
uint128_t f23; |
uint128_t f24; |
uint128_t f25; |
uint128_t f26; |
uint128_t f27; |
uint128_t f28; |
uint128_t f29; |
uint128_t f30; |
uint128_t f31; |
ipl_t ipl; |
} context_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia64/include/cpu.h |
---|
0,0 → 1,69 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia64_CPU_H_ |
#define KERN_ia64_CPU_H_ |
#include <arch/types.h> |
#include <arch/register.h> |
#include <arch/asm.h> |
#define FAMILY_ITANIUM 0x7 |
#define FAMILY_ITANIUM2 0x1f |
typedef struct { |
uint64_t cpuid0; |
uint64_t cpuid1; |
cpuid3_t cpuid3; |
} cpu_arch_t; |
/** Read CPUID register. |
* |
* @param n CPUID register number. |
* |
* @return Value of CPUID[n] register. |
*/ |
static inline uint64_t cpuid_read(int n) |
{ |
uint64_t v; |
asm volatile ("mov %0 = cpuid[%1]\n" : "=r" (v) : "r" (n)); |
return v; |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia64/include/atomic.h |
---|
0,0 → 1,66 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia64_ATOMIC_H_ |
#define KERN_ia64_ATOMIC_H_ |
/** Atomic addition. |
* |
* @param val Atomic value. |
* @param imm Value to add. |
* |
* @return Value before addition. |
*/ |
static inline long atomic_add(atomic_t *val, int imm) |
{ |
long v; |
asm volatile ("fetchadd8.rel %0 = %1, %2\n" : "=r" (v), "+m" (val->count) : "i" (imm)); |
return v; |
} |
static inline void atomic_inc(atomic_t *val) { atomic_add(val, 1); } |
static inline void atomic_dec(atomic_t *val) { atomic_add(val, -1); } |
static inline long atomic_preinc(atomic_t *val) { return atomic_add(val, 1) + 1; } |
static inline long atomic_predec(atomic_t *val) { return atomic_add(val, -1) - 1; } |
static inline long atomic_postinc(atomic_t *val) { return atomic_add(val, 1); } |
static inline long atomic_postdec(atomic_t *val) { return atomic_add(val, -1); } |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia64/include/barrier.h |
---|
0,0 → 1,54 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia64_BARRIER_H_ |
#define KERN_ia64_BARRIER_H_ |
/* |
* TODO: Implement true IA-64 memory barriers for macros below. |
*/ |
#define CS_ENTER_BARRIER() memory_barrier() |
#define CS_LEAVE_BARRIER() memory_barrier() |
#define memory_barrier() asm volatile ("mf\n" ::: "memory") |
#define read_barrier() memory_barrier() |
#define write_barrier() memory_barrier() |
#define srlz_i() asm volatile (";; srlz.i ;;\n" ::: "memory") |
#define srlz_d() asm volatile (";; srlz.d\n" ::: "memory") |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia64/include/cycle.h |
---|
0,0 → 1,46 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia64_CYCLE_H_ |
#define KERN_ia64_CYCLE_H_ |
static inline uint64_t get_cycle(void) |
{ |
return 0; |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia64/include/byteorder.h |
---|
0,0 → 1,50 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia64_BYTEORDER_H_ |
#define KERN_ia64_BYTEORDER_H_ |
#include <byteorder.h> |
/* IA-64 is little-endian */ |
#define uint32_t_le2host(n) (n) |
#define uint64_t_le2host(n) (n) |
#define uint32_t_be2host(n) uint32_t_byteorder_swap(n) |
#define uint64_t_be2host(n) uint64_t_byteorder_swap(n) |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia64/include/ski/ski.h |
---|
0,0 → 1,57 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia64_SKI_H_ |
#define KERN_ia64_SKI_H_ |
#include <arch/types.h> |
#include <console/console.h> |
#define SKI_INIT_CONSOLE 20 |
#define SKI_GETCHAR 21 |
#define SKI_PUTCHAR 31 |
extern chardev_t ski_uconsole; |
extern void ski_init_console(void); |
extern void ski_kbd_grab(void); |
extern void ski_kbd_release(void); |
extern void kkbdpoll(void *arg); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia64/include/stack.h |
---|
0,0 → 1,46 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia64_STACK_H_ |
#define KERN_ia64_STACK_H_ |
#define STACK_ITEM_SIZE 8 |
#define STACK_ALIGNMENT 16 |
#define STACK_SCRATCH_AREA_SIZE 16 |
#define REGISTER_STACK_ALIGNMENT 8 |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia64/include/elf.h |
---|
0,0 → 1,45 |
/* |
* Copyright (c) 2006 Sergey Bondari |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia64_ELF_H_ |
#define KERN_ia64_ELF_H_ |
#define ELF_MACHINE EM_IA_64 |
#define ELF_DATA_ENCODING ELFDATA2LSB |
#define ELF_CLASS ELFCLASS64 |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia64/include/memstr.h |
---|
0,0 → 1,48 |
/* |
* Copyright (c) 2005 Sergey Bondari |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia64_MEMSTR_H_ |
#define KERN_ia64_MEMSTR_H_ |
#define memcpy(dst, src, cnt) __builtin_memcpy((dst), (src), (cnt)) |
extern void memsetw(uintptr_t dst, size_t cnt, uint16_t x); |
extern void memsetb(uintptr_t dst, size_t cnt, uint8_t x); |
extern int memcmp(uintptr_t src, uintptr_t dst, int cnt); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia64/include/arg.h |
---|
0,0 → 1,43 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia64_ARG_H_ |
#define KERN_ia64_ARG_H_ |
#include <stdarg.h> |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia64/include/arch.h |
---|
0,0 → 1,45 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia64_ARCH_H_ |
#define KERN_ia64_ARCH_H_ |
#define LOADED_PROG_STACK_PAGES_NO 2 |
#include <arch/ski/ski.h> |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia64/include/proc/task.h |
---|
0,0 → 1,47 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia64proc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia64_TASK_H_ |
#define KERN_ia64_TASK_H_ |
typedef struct { |
} task_arch_t; |
#define task_create_arch(t) |
#define task_destroy_arch(t) |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia64/include/proc/thread.h |
---|
0,0 → 1,48 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia64proc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia64_THREAD_H_ |
#define KERN_ia64_THREAD_H_ |
typedef struct { |
} thread_arch_t; |
#define thr_constructor_arch(t) |
#define thr_destructor_arch(t) |
#define thread_create_arch(t) |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia64/include/faddr.h |
---|
0,0 → 1,53 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia64_FADDR_H_ |
#define KERN_ia64_FADDR_H_ |
#include <arch/types.h> |
/** |
* |
* Calculate absolute address of function |
* referenced by fptr pointer. |
* |
* @param f Function pointer. |
* |
*/ |
#define FADDR(f) (*((uintptr_t *)(f))); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia64/include/register.h |
---|
0,0 → 1,278 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia64_REGISTER_H_ |
#define KERN_ia64_REGISTER_H_ |
#define CR_IVR_MASK 0xf |
#define PSR_IC_MASK 0x2000 |
#define PSR_I_MASK 0x4000 |
#define PSR_PK_MASK 0x8000 |
#define PSR_DT_MASK (1<<17) |
#define PSR_RT_MASK (1<<27) |
#define PSR_DFL_MASK (1<<18) |
#define PSR_DFH_MASK (1<<19) |
#define PSR_IT_MASK 0x0000001000000000 |
#define PSR_CPL_SHIFT 32 |
#define PSR_CPL_MASK_SHIFTED 3 |
#define PFM_MASK (~0x3fffffffff) |
#define RSC_MODE_MASK 3 |
#define RSC_PL_MASK 12 |
/** Application registers. */ |
#define AR_KR0 0 |
#define AR_KR1 1 |
#define AR_KR2 2 |
#define AR_KR3 3 |
#define AR_KR4 4 |
#define AR_KR5 5 |
#define AR_KR6 6 |
#define AR_KR7 7 |
/* AR 8-15 reserved */ |
#define AR_RSC 16 |
#define AR_BSP 17 |
#define AR_BSPSTORE 18 |
#define AR_RNAT 19 |
/* AR 20 reserved */ |
#define AR_FCR 21 |
/* AR 22-23 reserved */ |
#define AR_EFLAG 24 |
#define AR_CSD 25 |
#define AR_SSD 26 |
#define AR_CFLG 27 |
#define AR_FSR 28 |
#define AR_FIR 29 |
#define AR_FDR 30 |
/* AR 31 reserved */ |
#define AR_CCV 32 |
/* AR 33-35 reserved */ |
#define AR_UNAT 36 |
/* AR 37-39 reserved */ |
#define AR_FPSR 40 |
/* AR 41-43 reserved */ |
#define AR_ITC 44 |
/* AR 45-47 reserved */ |
/* AR 48-63 ignored */ |
#define AR_PFS 64 |
#define AR_LC 65 |
#define AR_EC 66 |
/* AR 67-111 reserved */ |
/* AR 112-127 ignored */ |
/** Control registers. */ |
#define CR_DCR 0 |
#define CR_ITM 1 |
#define CR_IVA 2 |
/* CR3-CR7 reserved */ |
#define CR_PTA 8 |
/* CR9-CR15 reserved */ |
#define CR_IPSR 16 |
#define CR_ISR 17 |
/* CR18 reserved */ |
#define CR_IIP 19 |
#define CR_IFA 20 |
#define CR_ITIR 21 |
#define CR_IIPA 22 |
#define CR_IFS 23 |
#define CR_IIM 24 |
#define CR_IHA 25 |
/* CR26-CR63 reserved */ |
#define CR_LID 64 |
#define CR_IVR 65 |
#define CR_TPR 66 |
#define CR_EOI 67 |
#define CR_IRR0 68 |
#define CR_IRR1 69 |
#define CR_IRR2 70 |
#define CR_IRR3 71 |
#define CR_ITV 72 |
#define CR_PMV 73 |
#define CR_CMCV 74 |
/* CR75-CR79 reserved */ |
#define CR_LRR0 80 |
#define CR_LRR1 81 |
/* CR82-CR127 reserved */ |
#ifndef __ASM__ |
#include <arch/types.h> |
/** Processor Status Register. */ |
union psr { |
uint64_t value; |
struct { |
unsigned : 1; |
unsigned be : 1; /**< Big-Endian data accesses. */ |
unsigned up : 1; /**< User Performance monitor enable. */ |
unsigned ac : 1; /**< Alignment Check. */ |
unsigned mfl : 1; /**< Lower floating-point register written. */ |
unsigned mfh : 1; /**< Upper floating-point register written. */ |
unsigned : 7; |
unsigned ic : 1; /**< Interruption Collection. */ |
unsigned i : 1; /**< Interrupt Bit. */ |
unsigned pk : 1; /**< Protection Key enable. */ |
unsigned : 1; |
unsigned dt : 1; /**< Data address Translation. */ |
unsigned dfl : 1; /**< Disabled Floating-point Low register set. */ |
unsigned dfh : 1; /**< Disabled Floating-point High register set. */ |
unsigned sp : 1; /**< Secure Performance monitors. */ |
unsigned pp : 1; /**< Privileged Performance monitor enable. */ |
unsigned di : 1; /**< Disable Instruction set transition. */ |
unsigned si : 1; /**< Secure Interval timer. */ |
unsigned db : 1; /**< Debug Breakpoint fault. */ |
unsigned lp : 1; /**< Lower Privilege transfer trap. */ |
unsigned tb : 1; /**< Taken Branch trap. */ |
unsigned rt : 1; /**< Register Stack Translation. */ |
unsigned : 4; |
unsigned cpl : 2; /**< Current Privilege Level. */ |
unsigned is : 1; /**< Instruction Set. */ |
unsigned mc : 1; /**< Machine Check abort mask. */ |
unsigned it : 1; /**< Instruction address Translation. */ |
unsigned id : 1; /**< Instruction Debug fault disable. */ |
unsigned da : 1; /**< Disable Data Access and Dirty-bit faults. */ |
unsigned dd : 1; /**< Data Debug fault disable. */ |
unsigned ss : 1; /**< Single Step enable. */ |
unsigned ri : 2; /**< Restart Instruction. */ |
unsigned ed : 1; /**< Exception Deferral. */ |
unsigned bn : 1; /**< Register Bank. */ |
unsigned ia : 1; /**< Disable Instruction Access-bit faults. */ |
} __attribute__ ((packed)); |
}; |
typedef union psr psr_t; |
/** Register Stack Configuration Register */ |
union rsc { |
uint64_t value; |
struct { |
unsigned mode : 2; |
unsigned pl : 2; /**< Privilege Level. */ |
unsigned be : 1; /**< Big-endian. */ |
unsigned : 11; |
unsigned loadrs : 14; |
} __attribute__ ((packed)); |
}; |
typedef union rsc rsc_t; |
/** External Interrupt Vector Register */ |
union cr_ivr { |
uint8_t vector; |
uint64_t value; |
}; |
typedef union cr_ivr cr_ivr_t; |
/** Task Priority Register */ |
union cr_tpr { |
struct { |
unsigned : 4; |
unsigned mic: 4; /**< Mask Interrupt Class. */ |
unsigned : 8; |
unsigned mmi: 1; /**< Mask Maskable Interrupts. */ |
} __attribute__ ((packed)); |
uint64_t value; |
}; |
typedef union cr_tpr cr_tpr_t; |
/** Interval Timer Vector */ |
union cr_itv { |
struct { |
unsigned vector : 8; |
unsigned : 4; |
unsigned : 1; |
unsigned : 3; |
unsigned m : 1; /**< Mask. */ |
} __attribute__ ((packed)); |
uint64_t value; |
}; |
typedef union cr_itv cr_itv_t; |
/** Interruption Status Register */ |
union cr_isr { |
struct { |
union { |
/** General Exception code field structuring. */ |
struct { |
unsigned ge_na : 4; |
unsigned ge_code : 4; |
} __attribute__ ((packed)); |
uint16_t code; |
}; |
uint8_t vector; |
unsigned : 8; |
unsigned x : 1; /**< Execute exception. */ |
unsigned w : 1; /**< Write exception. */ |
unsigned r : 1; /**< Read exception. */ |
unsigned na : 1; /**< Non-access exception. */ |
unsigned sp : 1; /**< Speculative load exception. */ |
unsigned rs : 1; /**< Register stack. */ |
unsigned ir : 1; /**< Incomplete Register frame. */ |
unsigned ni : 1; /**< Nested Interruption. */ |
unsigned so : 1; /**< IA-32 Supervisor Override. */ |
unsigned ei : 2; /**< Excepting Instruction. */ |
unsigned ed : 1; /**< Exception Deferral. */ |
unsigned : 20; |
} __attribute__ ((packed)); |
uint64_t value; |
}; |
typedef union cr_isr cr_isr_t; |
/** CPUID Register 3 */ |
union cpuid3 { |
struct { |
uint8_t number; |
uint8_t revision; |
uint8_t model; |
uint8_t family; |
uint8_t archrev; |
} __attribute__ ((packed)); |
uint64_t value; |
}; |
typedef union cpuid3 cpuid3_t; |
#endif /* !__ASM__ */ |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia64/include/debug.h |
---|
0,0 → 1,42 |
/* |
* Copyright (c) 2005 |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia64debug ia64 |
* @ingroup debug |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia64_DEBUG_H_ |
#define KERN_ia64_DEBUG_H_ |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia64/include/pal/pal.h |
---|
0,0 → 1,109 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ia64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ia64_PAL_H_ |
#define KERN_ia64_PAL_H_ |
#define PAL_OK 0 /**< Call completed without error. */ |
#define PAL_UNIMPL -1 /**< Unimplemented procedure. */ |
#define PAL_INVARG -2 /**< Invalid argument. */ |
#define PAL_ERR -3 /**< Can not compete call without error. */ |
/** These are the indices for PAL_PROC. */ |
#define PAL_CACHE_FLUSH 1 |
#define PAL_CACHE_INFO 2 |
#define PAL_CACHE_INIT 3 |
#define PAL_CACHE_PROT_INFO 38 |
#define PAL_CACHE_SHARED_INFO 43 |
#define PAL_CACHE_SUMMARY 4 |
#define PAL_MEM_ATTRIB 5 |
#define PAL_PREFETCH_VISIBILITY 41 |
#define PAL_PTCE_INFO 6 |
#define PAL_VM_INFO 7 |
#define PAL_VM_PAGE_SIZE 34 |
#define PAL_VM_SUMMARY 8 |
#define PAL_VM_TR_READ 261 |
#define PAL_BUS_GET_FEATURES 9 |
#define PAL_BUS_SET_FEATURES 10 |
#define PAL_DEBUG_INFO 11 |
#define PAL_FIXED_ADDR 12 |
#define PAL_FREQ_BASE 13 |
#define PAL_FREQ_RATIOS 14 |
#define PAL_LOGICAL_TO_PHYSICAL 42 |
#define PAL_PERF_MON_INFO 15 |
#define PAL_PLATFORM_ADDR 16 |
#define PAL_PROC_GET_FEATURES 17 |
#define PAL_PROC_SET_FEATURES 18 |
#define PAL_REGISTER_INFO 39 |
#define PAL_RSE_INFO 19 |
#define PAL_VERSION 20 |
#define PAL_MC_CLEAR_LOG 21 |
#define PAL_MC_DRAIN 22 |
#define PAL_MC_DYNAMIC_STATE 24 |
#define PAL_MC_ERROR_INFO 25 |
#define PAL_MC_EXPECTED 23 |
#define PAL_MC_REGISTER_MEM 27 |
#define PAL_MC_RESUME 26 |
#define PAL_HALT 28 |
#define PAL_HALT_INFO 257 |
#define PAL_HALT_LIGHT 29 |
#define PAL_CACHE_LINE_INIT 31 |
#define PAL_CACHE_READ 259 |
#define PAL_CACHE_WRITE 260 |
#define PAL_TEST_INFO 37 |
#define PAL_TEST_PROC 258 |
#define PAL_COPY_INFO 30 |
#define PAL_COPY_PAL 256 |
#define PAL_ENTER_IA_32_ENV 33 |
#define PAL_PMI_ENTRYPOINT 32 |
/* |
* Ski PTCE data |
*/ |
#define PAL_PTCE_INFO_BASE() (0x100000000LL) |
#define PAL_PTCE_INFO_COUNT1() (2) |
#define PAL_PTCE_INFO_COUNT2() (3) |
#define PAL_PTCE_INFO_STRIDE1() (0x10000000) |
#define PAL_PTCE_INFO_STRIDE2() (0x2000) |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ia64/Makefile.inc |
---|
0,0 → 1,101 |
# |
# Copyright (c) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
## Toolchain configuration |
# |
BFD_NAME = elf64-little |
BFD_ARCH = ia64-elf64 |
TARGET = ia64-pc-linux-gnu |
TOOLCHAIN_DIR = /usr/local/ia64 |
INIT0_ADDRESS = 0xe000000004404000 |
INIT0_SIZE = 0x100000 |
CMN1 = -mconstant-gp -fno-unwind-tables -mfixed-range=f32-f127 |
GCC_CFLAGS += $(CMN1) |
ICC_CFLAGS += $(CMN1) |
LFLAGS += -EL |
AFLAGS += -mconstant-gp |
DEFS += -D__64_BITS__ -DINIT0_ADDRESS=$(INIT0_ADDRESS) -DINIT0_SIZE=$(INIT0_SIZE) -D$(MACHINE) |
## Compile with page hash table support. |
# |
CONFIG_PAGE_HT = y |
DEFS += -DCONFIG_PAGE_HT |
## Compile with support for address space identifiers. |
# |
CONFIG_ASID = y |
CONFIG_ASID_FIFO = y |
## Compile with support for software integer division. |
# |
CONFIG_SOFTINT = y |
ARCH_SOURCES = \ |
arch/$(ARCH)/src/start.S \ |
arch/$(ARCH)/src/asm.S \ |
arch/$(ARCH)/src/dummy.s \ |
arch/$(ARCH)/src/ia64.c \ |
arch/$(ARCH)/src/fpu_context.c \ |
arch/$(ARCH)/src/context.S \ |
arch/$(ARCH)/src/cpu/cpu.c \ |
arch/$(ARCH)/src/ivt.S \ |
arch/$(ARCH)/src/interrupt.c \ |
arch/$(ARCH)/src/mm/as.c \ |
arch/$(ARCH)/src/mm/frame.c \ |
arch/$(ARCH)/src/mm/page.c \ |
arch/$(ARCH)/src/mm/tlb.c \ |
arch/$(ARCH)/src/mm/vhpt.c \ |
arch/$(ARCH)/src/proc/scheduler.c \ |
arch/$(ARCH)/src/ddi/ddi.c \ |
arch/$(ARCH)/src/drivers/it.c |
ifeq ($(MACHINE),ski) |
ARCH_SOURCES += arch/$(ARCH)/src/ski/ski.c |
DEFS += -DSKI |
# BFD = elf64-ia64-little |
BFD = binary |
endif |
ifeq ($(MACHINE),i460GX) |
ARCH_SOURCES += arch/$(ARCH)/src/drivers/ega.c |
CONFIG_I8042 = y |
DEFS += -DI460GX -DCONFIG_I8042 |
BFD = binary |
endif |
/tags/0.3.0/kernel/arch/ia64/_link.ld.in |
---|
0,0 → 1,44 |
/** IA-64 linker script |
* |
* It is ELF format, but its only section looks like this: |
* kernel text |
* kernel data |
* |
*/ |
ENTRY(kernel_image_start) |
SECTIONS { |
.image 0xe000000004404000: AT (0x0000000004404000) { |
ktext_start = .; |
*(K_TEXT_START); |
*(.text) |
ktext_end = .; |
kdata_start = .; |
*(K_DATA_START) |
*(.rodata .rodata.*) |
*(.opd) |
*(.data .data.*) |
*(.got .got.*) |
*(.sdata) |
*(.sbss) |
*(.scommon) |
*(.bss) |
*(COMMON); |
symbol_table = .; |
*(symtab.*); /* Symbol table, must be LAST symbol!*/ |
kdata_end = .; |
} |
/DISCARD/ : { |
*(*); |
} |
_hardcoded_ktext_size = ktext_end - ktext_start; |
_hardcoded_kdata_size = kdata_end - kdata_start; |
_hardcoded_load_address = 0xe000000004404000; |
} |
/tags/0.3.0/kernel/arch/ppc64/include/mm/frame.h |
---|
0,0 → 1,57 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc64mm |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc64_FRAME_H_ |
#define KERN_ppc64_FRAME_H_ |
#define FRAME_WIDTH 12 /* 4K */ |
#define FRAME_SIZE (1 << FRAME_WIDTH) |
#ifdef KERNEL |
#ifndef __ASM__ |
#include <arch/types.h> |
extern uintptr_t last_frame; |
extern void frame_arch_init(void); |
extern void physmem_print(void); |
#endif /* __ASM__ */ |
#endif /* KERNEL */ |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc64/include/mm/page.h |
---|
0,0 → 1,186 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc64mm |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc64_PAGE_H_ |
#define KERN_ppc64_PAGE_H_ |
#include <arch/mm/frame.h> |
#define PAGE_WIDTH FRAME_WIDTH |
#define PAGE_SIZE FRAME_SIZE |
#define PAGE_COLOR_BITS 0 /* dummy */ |
#ifdef KERNEL |
#ifndef __ASM__ |
# define KA2PA(x) (((uintptr_t) (x)) - 0x80000000) |
# define PA2KA(x) (((uintptr_t) (x)) + 0x80000000) |
#else |
# define KA2PA(x) ((x) - 0x80000000) |
# define PA2KA(x) ((x) + 0x80000000) |
#endif |
/* |
* Implementation of generic 4-level page table interface, |
* the hardware Page Hash Table is used as cache. |
* |
* Page table layout: |
* - 32-bit virtual addressess |
* - Offset is 12 bits => pages are 4K long |
* - PTL0 has 1024 entries (10 bits) |
* - PTL1 is not used |
* - PTL2 is not used |
* - PLT3 has 1024 entries (10 bits) |
*/ |
/* Number of entries in each level. */ |
#define PTL0_ENTRIES_ARCH 1024 |
#define PTL1_ENTRIES_ARCH 0 |
#define PTL2_ENTRIES_ARCH 0 |
#define PTL3_ENTRIES_ARCH 1024 |
/* Sizes of page tables in each level. */ |
#define PTL0_SIZE_ARCH ONE_FRAME |
#define PTL1_SIZE_ARCH 0 |
#define PTL2_SIZE_ARCH 0 |
#define PTL3_SIZE_ARCH ONE_FRAME |
/* Macros calculating indices into page tables in each level. */ |
#define PTL0_INDEX_ARCH(vaddr) (((vaddr) >> 22) & 0x3ff) |
#define PTL1_INDEX_ARCH(vaddr) 0 |
#define PTL2_INDEX_ARCH(vaddr) 0 |
#define PTL3_INDEX_ARCH(vaddr) (((vaddr) >> 12) & 0x3ff) |
/* Get PTE address accessors for each level. */ |
#define GET_PTL1_ADDRESS_ARCH(ptl0, i) \ |
(((pte_t *) (ptl0))[(i)].pfn << 12) |
#define GET_PTL2_ADDRESS_ARCH(ptl1, i) \ |
(ptl1) |
#define GET_PTL3_ADDRESS_ARCH(ptl2, i) \ |
(ptl2) |
#define GET_FRAME_ADDRESS_ARCH(ptl3, i) \ |
(((pte_t *) (ptl3))[(i)].pfn << 12) |
/* Set PTE address accessors for each level. */ |
#define SET_PTL0_ADDRESS_ARCH(ptl0) |
#define SET_PTL1_ADDRESS_ARCH(ptl0, i, a) \ |
(((pte_t *) (ptl0))[(i)].pfn = (a) >> 12) |
#define SET_PTL2_ADDRESS_ARCH(ptl1, i, a) |
#define SET_PTL3_ADDRESS_ARCH(ptl2, i, a) |
#define SET_FRAME_ADDRESS_ARCH(ptl3, i, a) \ |
(((pte_t *) (ptl3))[(i)].pfn = (a) >> 12) |
/* Get PTE flags accessors for each level. */ |
#define GET_PTL1_FLAGS_ARCH(ptl0, i) \ |
get_pt_flags((pte_t *) (ptl0), (index_t) (i)) |
#define GET_PTL2_FLAGS_ARCH(ptl1, i) \ |
PAGE_PRESENT |
#define GET_PTL3_FLAGS_ARCH(ptl2, i) \ |
PAGE_PRESENT |
#define GET_FRAME_FLAGS_ARCH(ptl3, i) \ |
get_pt_flags((pte_t *) (ptl3), (index_t) (i)) |
/* Set PTE flags accessors for each level. */ |
#define SET_PTL1_FLAGS_ARCH(ptl0, i, x) \ |
set_pt_flags((pte_t *) (ptl0), (index_t) (i), (x)) |
#define SET_PTL2_FLAGS_ARCH(ptl1, i, x) |
#define SET_PTL3_FLAGS_ARCH(ptl2, i, x) |
#define SET_FRAME_FLAGS_ARCH(ptl3, i, x) \ |
set_pt_flags((pte_t *) (ptl3), (index_t) (i), (x)) |
/* Macros for querying the last-level PTEs. */ |
#define PTE_VALID_ARCH(pte) (*((uint32_t *) (pte)) != 0) |
#define PTE_PRESENT_ARCH(pte) ((pte)->p != 0) |
#define PTE_GET_FRAME_ARCH(pte) ((uintptr_t) ((pte)->pfn << 12)) |
#define PTE_WRITABLE_ARCH(pte) 1 |
#define PTE_EXECUTABLE_ARCH(pte) 1 |
#ifndef __ASM__ |
#include <mm/mm.h> |
#include <arch/interrupt.h> |
static inline int get_pt_flags(pte_t *pt, index_t i) |
{ |
pte_t *p = &pt[i]; |
return ((1 << PAGE_CACHEABLE_SHIFT) | |
((!p->p) << PAGE_PRESENT_SHIFT) | |
(1 << PAGE_USER_SHIFT) | |
(1 << PAGE_READ_SHIFT) | |
(1 << PAGE_WRITE_SHIFT) | |
(1 << PAGE_EXEC_SHIFT) | |
(p->g << PAGE_GLOBAL_SHIFT)); |
} |
static inline void set_pt_flags(pte_t *pt, index_t i, int flags) |
{ |
pte_t *p = &pt[i]; |
p->p = !(flags & PAGE_NOT_PRESENT); |
p->g = (flags & PAGE_GLOBAL) != 0; |
p->valid = 1; |
} |
extern void page_arch_init(void); |
#define PHT_BITS 16 |
#define PHT_ORDER 4 |
typedef struct { |
unsigned v : 1; /**< Valid */ |
unsigned vsid : 24; /**< Virtual Segment ID */ |
unsigned h : 1; /**< Primary/secondary hash */ |
unsigned api : 6; /**< Abbreviated Page Index */ |
unsigned rpn : 20; /**< Real Page Number */ |
unsigned reserved0 : 3; |
unsigned r : 1; /**< Reference */ |
unsigned c : 1; /**< Change */ |
unsigned wimg : 4; /**< Access control */ |
unsigned reserved1 : 1; |
unsigned pp : 2; /**< Page protection */ |
} phte_t; |
extern void pht_refill(bool data, istate_t *istate); |
extern void pht_init(void); |
#endif /* __ASM__ */ |
#endif /* KERNEL */ |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc64/include/mm/as.h |
---|
0,0 → 1,64 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc64mm |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc64_AS_H_ |
#define KERN_ppc64_AS_H_ |
#define KERNEL_ADDRESS_SPACE_SHADOWED_ARCH 0 |
#define KERNEL_ADDRESS_SPACE_START_ARCH ((unsigned long) 0x80000000) |
#define KERNEL_ADDRESS_SPACE_END_ARCH ((unsigned long) 0xffffffff) |
#define USER_ADDRESS_SPACE_START_ARCH ((unsigned long) 0x00000000) |
#define USER_ADDRESS_SPACE_END_ARCH ((unsigned long) 0x7fffffff) |
#define USTACK_ADDRESS_ARCH (0x7fffffff - (PAGE_SIZE - 1)) |
typedef struct { |
} as_arch_t; |
#include <genarch/mm/as_pt.h> |
#define as_constructor_arch(as, flags) (as != as) |
#define as_destructor_arch(as) (as != as) |
#define as_create_arch(as, flags) (as != as) |
#define as_install_arch(as) |
#define as_deinstall_arch(as) |
#define as_invalidate_translation_cache(as, page, cnt) |
extern void as_arch_init(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc64/include/mm/asid.h |
---|
0,0 → 1,48 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc64mm |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc64_ASID_H_ |
#define KERN_ppc64_ASID_H_ |
typedef int asid_t; |
#define ASID_MAX_ARCH 3 |
#define asid_get() (ASID_START+1) |
#define asid_put(asid) |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc64/include/mm/tlb.h |
---|
0,0 → 1,41 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc64mm |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc64_TLB_H_ |
#define KERN_ppc64_TLB_H_ |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc64/include/types.h |
---|
0,0 → 1,84 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc64_TYPES_H_ |
#define KERN_ppc64_TYPES_H_ |
#define NULL 0 |
#define false 0 |
#define true 1 |
typedef signed char int8_t; |
typedef signed short int16_t; |
typedef signed int int32_t; |
typedef signed long int64_t; |
typedef unsigned char uint8_t; |
typedef unsigned short uint16_t; |
typedef unsigned int uint32_t; |
typedef unsigned long uint64_t; |
typedef uint64_t size_t; |
typedef uint64_t count_t; |
typedef uint64_t index_t; |
typedef uint64_t uintptr_t; |
typedef uint64_t pfn_t; |
typedef uint64_t ipl_t; |
typedef uint64_t unative_t; |
typedef int64_t native_t; |
typedef uint8_t bool; |
typedef uint64_t thread_id_t; |
typedef uint64_t task_id_t; |
typedef uint32_t context_id_t; |
typedef int32_t inr_t; |
typedef int32_t devno_t; |
/** Page Table Entry. */ |
typedef struct { |
unsigned p : 1; /**< Present bit. */ |
unsigned a : 1; /**< Accessed bit. */ |
unsigned g : 1; /**< Global bit. */ |
unsigned valid : 1; /**< Valid content even if not present. */ |
unsigned pfn : 20; /**< Physical frame number. */ |
} pte_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc64/include/exception.h |
---|
0,0 → 1,100 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc64_EXCEPTION_H_ |
#define KERN_ppc64_EXCEPTION_H_ |
#include <arch/types.h> |
typedef struct { |
uint64_t r0; |
uint64_t r2; |
uint64_t r3; |
uint64_t r4; |
uint64_t r5; |
uint64_t r6; |
uint64_t r7; |
uint64_t r8; |
uint64_t r9; |
uint64_t r10; |
uint64_t r11; |
uint64_t r13; |
uint64_t r14; |
uint64_t r15; |
uint64_t r16; |
uint64_t r17; |
uint64_t r18; |
uint64_t r19; |
uint64_t r20; |
uint64_t r21; |
uint64_t r22; |
uint64_t r23; |
uint64_t r24; |
uint64_t r25; |
uint64_t r26; |
uint64_t r27; |
uint64_t r28; |
uint64_t r29; |
uint64_t r30; |
uint64_t r31; |
uint64_t cr; |
uint64_t pc; |
uint64_t srr1; |
uint64_t lr; |
uint64_t ctr; |
uint64_t xer; |
uint64_t r12; |
uint64_t sp; |
} istate_t; |
static inline void istate_set_retaddr(istate_t *istate, uintptr_t retaddr) |
{ |
istate->pc = retaddr; |
} |
/** Return true if exception happened while in userspace */ |
#include <panic.h> |
static inline int istate_from_uspace(istate_t *istate) |
{ |
panic("istate_from_uspace not yet implemented"); |
return 0; |
} |
static inline unative_t istate_get_pc(istate_t *istate) |
{ |
return istate->pc; |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc64/include/cpu.h |
---|
0,0 → 1,48 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc64_CPU_H_ |
#define KERN_ppc64_CPU_H_ |
#include <arch/asm.h> |
typedef struct { |
int version; |
int revision; |
} cpu_arch_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc64/include/drivers/pic.h |
---|
0,0 → 1,56 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc64_PIC_H_ |
#define KERN_ppc64_PIC_H_ |
#include <arch/types.h> |
#define PIC_PENDING_LOW 8 |
#define PIC_PENDING_HIGH 4 |
#define PIC_MASK_LOW 9 |
#define PIC_MASK_HIGH 5 |
#define PIC_ACK_LOW 10 |
#define PIC_ACK_HIGH 6 |
void pic_init(uintptr_t base, size_t size); |
void pic_enable_interrupt(int intnum); |
void pic_disable_interrupt(int intnum); |
void pic_ack_interrupt(int intnum); |
int pic_get_pending(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc64/include/fpu_context.h |
---|
0,0 → 1,67 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc64_FPU_CONTEXT_H_ |
#define KERN_ppc64_FPU_CONTEXT_H_ |
#ifndef KERN_ppc64_TYPES_H_ |
# include <arch/types.h> |
#endif |
typedef struct { |
uint64_t fr14; |
uint64_t fr15; |
uint64_t fr16; |
uint64_t fr17; |
uint64_t fr18; |
uint64_t fr19; |
uint64_t fr20; |
uint64_t fr21; |
uint64_t fr22; |
uint64_t fr23; |
uint64_t fr24; |
uint64_t fr25; |
uint64_t fr26; |
uint64_t fr27; |
uint64_t fr28; |
uint64_t fr29; |
uint64_t fr30; |
uint64_t fr31; |
uint32_t fpscr; |
} __attribute__ ((packed)) fpu_context_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc64/include/context.h |
---|
0,0 → 1,75 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc64_CONTEXT_H_ |
#define KERN_ppc64_CONTEXT_H_ |
#include <arch/types.h> |
#define SP_DELTA 16 |
typedef struct { |
uintptr_t sp; |
uintptr_t pc; |
uint64_t r2; |
uint64_t r13; |
uint64_t r14; |
uint64_t r15; |
uint64_t r16; |
uint64_t r17; |
uint64_t r18; |
uint64_t r19; |
uint64_t r20; |
uint64_t r21; |
uint64_t r22; |
uint64_t r23; |
uint64_t r24; |
uint64_t r25; |
uint64_t r26; |
uint64_t r27; |
uint64_t r28; |
uint64_t r29; |
uint64_t r30; |
uint64_t r31; |
uint64_t cr; |
ipl_t ipl; |
} __attribute__ ((packed)) context_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc64/include/cpuid.h |
---|
0,0 → 1,56 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc64_CPUID_H_ |
#define KERN_ppc64_CPUID_H_ |
#include <arch/types.h> |
typedef struct { |
uint16_t version; |
uint16_t revision; |
} __attribute__ ((packed)) cpu_info_t; |
static inline void cpu_version(cpu_info_t *info) |
{ |
asm volatile ( |
"mfpvr %0\n" |
: "=r" (*info) |
); |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc64/include/context_offset.h |
---|
0,0 → 1,76 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#ifndef KERN_ppc64_CONTEXT_OFFSET_H_ |
#define KERN_ppc64_CONTEXT_OFFSET_H_ |
#define OFFSET_SP 0x0 |
#define OFFSET_PC 0x8 |
#define OFFSET_R2 0x10 |
#define OFFSET_R13 0x18 |
#define OFFSET_R14 0x20 |
#define OFFSET_R15 0x28 |
#define OFFSET_R16 0x30 |
#define OFFSET_R17 0x38 |
#define OFFSET_R18 0x40 |
#define OFFSET_R19 0x48 |
#define OFFSET_R20 0x50 |
#define OFFSET_R21 0x58 |
#define OFFSET_R22 0x60 |
#define OFFSET_R23 0x68 |
#define OFFSET_R24 0x70 |
#define OFFSET_R25 0x78 |
#define OFFSET_R26 0x80 |
#define OFFSET_R27 0x88 |
#define OFFSET_R28 0x90 |
#define OFFSET_R29 0x98 |
#define OFFSET_R30 0xa0 |
#define OFFSET_R31 0xa8 |
#define OFFSET_CR 0xb0 |
#define OFFSET_FR14 0x0 |
#define OFFSET_FR15 0x8 |
#define OFFSET_FR16 0x10 |
#define OFFSET_FR17 0x18 |
#define OFFSET_FR18 0x20 |
#define OFFSET_FR19 0x28 |
#define OFFSET_FR20 0x30 |
#define OFFSET_FR21 0x38 |
#define OFFSET_FR22 0x40 |
#define OFFSET_FR23 0x48 |
#define OFFSET_FR24 0x50 |
#define OFFSET_FR25 0x58 |
#define OFFSET_FR26 0x60 |
#define OFFSET_FR27 0x68 |
#define OFFSET_FR28 0x70 |
#define OFFSET_FR29 0x78 |
#define OFFSET_FR30 0x80 |
#define OFFSET_FR31 0x88 |
#define OFFSET_FPSCR 0x90 |
#endif |
/tags/0.3.0/kernel/arch/ppc64/include/asm/regname.h |
---|
0,0 → 1,215 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc64_REGNAME_H_ |
#define KERN_ppc64_REGNAME_H_ |
/* Condition Register Bit Fields */ |
#define cr0 0 |
#define cr1 1 |
#define cr2 2 |
#define cr3 3 |
#define cr4 4 |
#define cr5 5 |
#define cr6 6 |
#define cr7 7 |
/* General Purpose Registers (GPRs) */ |
#define r0 0 |
#define r1 1 |
#define r2 2 |
#define r3 3 |
#define r4 4 |
#define r5 5 |
#define r6 6 |
#define r7 7 |
#define r8 8 |
#define r9 9 |
#define r10 10 |
#define r11 11 |
#define r12 12 |
#define r13 13 |
#define r14 14 |
#define r15 15 |
#define r16 16 |
#define r17 17 |
#define r18 18 |
#define r19 19 |
#define r20 20 |
#define r21 21 |
#define r22 22 |
#define r23 23 |
#define r24 24 |
#define r25 25 |
#define r26 26 |
#define r27 27 |
#define r28 28 |
#define r29 29 |
#define r30 30 |
#define r31 31 |
/* GPR Aliases */ |
#define sp 1 |
/* Floating Point Registers (FPRs) */ |
#define fr0 0 |
#define fr1 1 |
#define fr2 2 |
#define fr3 3 |
#define fr4 4 |
#define fr5 5 |
#define fr6 6 |
#define fr7 7 |
#define fr8 8 |
#define fr9 9 |
#define fr10 10 |
#define fr11 11 |
#define fr12 12 |
#define fr13 13 |
#define fr14 14 |
#define fr15 15 |
#define fr16 16 |
#define fr17 17 |
#define fr18 18 |
#define fr19 19 |
#define fr20 20 |
#define fr21 21 |
#define fr22 22 |
#define fr23 23 |
#define fr24 24 |
#define fr25 25 |
#define fr26 26 |
#define fr27 27 |
#define fr28 28 |
#define fr29 29 |
#define fr30 30 |
#define fr31 31 |
#define vr0 0 |
#define vr1 1 |
#define vr2 2 |
#define vr3 3 |
#define vr4 4 |
#define vr5 5 |
#define vr6 6 |
#define vr7 7 |
#define vr8 8 |
#define vr9 9 |
#define vr10 10 |
#define vr11 11 |
#define vr12 12 |
#define vr13 13 |
#define vr14 14 |
#define vr15 15 |
#define vr16 16 |
#define vr17 17 |
#define vr18 18 |
#define vr19 19 |
#define vr20 20 |
#define vr21 21 |
#define vr22 22 |
#define vr23 23 |
#define vr24 24 |
#define vr25 25 |
#define vr26 26 |
#define vr27 27 |
#define vr28 28 |
#define vr29 29 |
#define vr30 30 |
#define vr31 31 |
#define evr0 0 |
#define evr1 1 |
#define evr2 2 |
#define evr3 3 |
#define evr4 4 |
#define evr5 5 |
#define evr6 6 |
#define evr7 7 |
#define evr8 8 |
#define evr9 9 |
#define evr10 10 |
#define evr11 11 |
#define evr12 12 |
#define evr13 13 |
#define evr14 14 |
#define evr15 15 |
#define evr16 16 |
#define evr17 17 |
#define evr18 18 |
#define evr19 19 |
#define evr20 20 |
#define evr21 21 |
#define evr22 22 |
#define evr23 23 |
#define evr24 24 |
#define evr25 25 |
#define evr26 26 |
#define evr27 27 |
#define evr28 28 |
#define evr29 29 |
#define evr30 30 |
#define evr31 31 |
/* Special Purpose Registers (SPRs) */ |
#define xer 1 |
#define lr 8 |
#define ctr 9 |
#define dec 22 |
#define sdr1 25 |
#define srr0 26 |
#define srr1 27 |
#define sprg0 272 |
#define sprg1 273 |
#define sprg2 274 |
#define sprg3 275 |
#define prv 287 |
#define hid0 1008 |
/* MSR bits */ |
#define msr_ir (1 << 4) |
#define msr_dr (1 << 5) |
#define msr_pr (1 << 14) |
#define msr_ee (1 << 15) |
/* HID0 bits */ |
#define hid0_ice (1 << 15) |
#define hid0_dce (1 << 14) |
#define hid0_icfi (1 << 11) |
#define hid0_dci (1 << 10) |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc64/include/interrupt.h |
---|
0,0 → 1,55 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc64interrupt |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc64_INTERRUPT_H_ |
#define KERN_ppc64_INTERRUPT_H_ |
#include <arch/exception.h> |
#define IVT_ITEMS 16 |
#define IVT_FIRST 0 |
#define VECTOR_DATA_STORAGE 2 |
#define VECTOR_INSTRUCTION_STORAGE 3 |
#define VECTOR_EXTERNAL 4 |
#define VECTOR_DECREMENTER 8 |
extern void start_decrementer(void); |
extern void interrupt_init(void); |
extern void extint_handler(int n, istate_t *istate); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc64/include/cycle.h |
---|
0,0 → 1,46 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc64_CYCLE_H_ |
#define KERN_ppc64_CYCLE_H_ |
static inline uint64_t get_cycle(void) |
{ |
return 0; |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc64/include/byteorder.h |
---|
0,0 → 1,49 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc64_BYTEORDER_H_ |
#define KERN_ppc64_BYTEORDER_H_ |
#include <byteorder.h> |
#define uint32_t_le2host(n) uint32_t_byteorder_swap(n) |
#define uint64_t_le2host(n) uint64_t_byteorder_swap(n) |
#define uint32_t_be2host(n) (n) |
#define uint64_t_be2host(n) (n) |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc64/include/elf.h |
---|
0,0 → 1,45 |
/* |
* Copyright (c) 2006 Sergey Bondari |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc64_ELF_H_ |
#define KERN_ppc64_ELF_H_ |
#define ELF_MACHINE EM_PPC64 |
#define ELF_DATA_ENCODING ELFDATA2MSB |
#define ELF_CLASS ELFCLASS32 |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc64/include/memstr.h |
---|
0,0 → 1,48 |
/* |
* Copyright (c) 2005 Sergey Bondari |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc64_MEMSTR_H_ |
#define KERN_ppc64_MEMSTR_H_ |
#define memcpy(dst, src, cnt) __builtin_memcpy((dst), (src), (cnt)) |
extern void memsetw(uintptr_t dst, size_t cnt, uint16_t x); |
extern void memsetb(uintptr_t dst, size_t cnt, uint8_t x); |
extern int memcmp(uintptr_t src, uintptr_t dst, int cnt); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc64/include/arg.h |
---|
0,0 → 1,43 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc64_ARG_H_ |
#define KERN_ppc64_ARG_H_ |
#include <stdarg.h> |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc64/include/atomic.h |
---|
0,0 → 1,97 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc64_ATOMIC_H_ |
#define KERN_ppc64_ATOMIC_H_ |
static inline void atomic_inc(atomic_t *val) |
{ |
long tmp; |
asm volatile ( |
"1:\n" |
"lwarx %0, 0, %2\n" |
"addic %0, %0, 1\n" |
"stwcx. %0, 0, %2\n" |
"bne- 1b" |
: "=&r" (tmp), "=m" (val->count) |
: "r" (&val->count), "m" (val->count) |
: "cc" |
); |
} |
static inline void atomic_dec(atomic_t *val) |
{ |
long tmp; |
asm volatile ( |
"1:\n" |
"lwarx %0, 0, %2\n" |
"addic %0, %0, -1\n" |
"stwcx. %0, 0, %2\n" |
"bne- 1b" |
: "=&r" (tmp), "=m" (val->count) |
: "r" (&val->count), "m" (val->count) |
: "cc" |
); |
} |
static inline long atomic_postinc(atomic_t *val) |
{ |
atomic_inc(val); |
return val->count - 1; |
} |
static inline long atomic_postdec(atomic_t *val) |
{ |
atomic_dec(val); |
return val->count + 1; |
} |
static inline long atomic_preinc(atomic_t *val) |
{ |
atomic_inc(val); |
return val->count; |
} |
static inline long atomic_predec(atomic_t *val) |
{ |
atomic_dec(val); |
return val->count; |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc64/include/boot/boot.h |
---|
0,0 → 1,92 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc64_BOOT_H_ |
#define KERN_ppc64_BOOT_H_ |
#define BOOT_OFFSET 0x4000 |
/* Temporary stack size for boot process */ |
#define TEMP_STACK_SIZE 0x100 |
#define TASKMAP_MAX_RECORDS 32 |
#define MEMMAP_MAX_RECORDS 32 |
#ifndef __ASM__ |
#include <arch/types.h> |
typedef struct { |
uintptr_t addr; |
uint64_t size; |
} utask_t; |
typedef struct { |
uint32_t count; |
utask_t tasks[TASKMAP_MAX_RECORDS]; |
} taskmap_t; |
typedef struct { |
uintptr_t start; |
uint64_t size; |
} memzone_t; |
typedef struct { |
uint64_t total; |
uint32_t count; |
memzone_t zones[MEMMAP_MAX_RECORDS]; |
} memmap_t; |
typedef struct { |
uintptr_t addr; |
unsigned int width; |
unsigned int height; |
unsigned int bpp; |
unsigned int scanline; |
} screen_t; |
typedef struct { |
taskmap_t taskmap; |
memmap_t memmap; |
screen_t screen; |
} bootinfo_t; |
extern bootinfo_t bootinfo; |
#endif |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc64/include/arch.h |
---|
0,0 → 1,41 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc64_ARCH_H_ |
#define KERN_ppc64_ARCH_H_ |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc64/include/proc/task.h |
---|
0,0 → 1,47 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc64proc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc64_TASK_H_ |
#define KERN_ppc64_TASK_H_ |
typedef struct { |
} task_arch_t; |
#define task_create_arch(t) |
#define task_destroy_arch(t) |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc64/include/proc/thread.h |
---|
0,0 → 1,48 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc64proc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc64_THREAD_H_ |
#define KERN_ppc64_THREAD_H_ |
typedef struct { |
} thread_arch_t; |
#define thr_constructor_arch(t) |
#define thr_destructor_arch(t) |
#define thread_create_arch(t) |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc64/include/asm.h |
---|
0,0 → 1,161 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc64_ASM_H_ |
#define KERN_ppc64_ASM_H_ |
#include <arch/types.h> |
#include <config.h> |
/** Enable interrupts. |
* |
* Enable interrupts and return previous |
* value of EE. |
* |
* @return Old interrupt priority level. |
*/ |
static inline ipl_t interrupts_enable(void) |
{ |
ipl_t v; |
ipl_t tmp; |
asm volatile ( |
"mfmsr %0\n" |
"mfmsr %1\n" |
"ori %1, %1, 1 << 15\n" |
"mtmsr %1\n" |
: "=r" (v), "=r" (tmp) |
); |
return v; |
} |
/** Disable interrupts. |
* |
* Disable interrupts and return previous |
* value of EE. |
* |
* @return Old interrupt priority level. |
*/ |
static inline ipl_t interrupts_disable(void) |
{ |
ipl_t v; |
ipl_t tmp; |
asm volatile ( |
"mfmsr %0\n" |
"mfmsr %1\n" |
"rlwinm %1, %1, 0, 17, 15\n" |
"mtmsr %1\n" |
: "=r" (v), "=r" (tmp) |
); |
return v; |
} |
/** Restore interrupt priority level. |
* |
* Restore EE. |
* |
* @param ipl Saved interrupt priority level. |
*/ |
static inline void interrupts_restore(ipl_t ipl) |
{ |
ipl_t tmp; |
asm volatile ( |
"mfmsr %1\n" |
"rlwimi %0, %1, 0, 17, 15\n" |
"cmpw 0, %0, %1\n" |
"beq 0f\n" |
"mtmsr %0\n" |
"0:\n" |
: "=r" (ipl), "=r" (tmp) |
: "0" (ipl) |
: "cr0" |
); |
} |
/** Return interrupt priority level. |
* |
* Return EE. |
* |
* @return Current interrupt priority level. |
*/ |
static inline ipl_t interrupts_read(void) |
{ |
ipl_t v; |
asm volatile ( |
"mfmsr %0\n" |
: "=r" (v) |
); |
return v; |
} |
/** Return base address of current stack. |
* |
* Return the base address of the current stack. |
* The stack is assumed to be STACK_SIZE bytes long. |
* The stack must start on page boundary. |
*/ |
static inline uintptr_t get_stack_base(void) |
{ |
uintptr_t v; |
asm volatile ( |
"and %0, %%sp, %1\n" |
: "=r" (v) |
: "r" (~(STACK_SIZE - 1)) |
); |
return v; |
} |
static inline void cpu_sleep(void) |
{ |
} |
static inline void cpu_halt(void) |
{ |
asm volatile ( |
"b 0\n" |
); |
} |
void asm_delay_loop(uint32_t t); |
extern void userspace_asm(uintptr_t uspace_uarg, uintptr_t stack, uintptr_t entry); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc64/include/faddr.h |
---|
0,0 → 1,45 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc64_FADDR_H_ |
#define KERN_ppc64_FADDR_H_ |
#include <arch/types.h> |
#define FADDR(fptr) ((uintptr_t) (fptr)) |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc64/include/debug.h |
---|
0,0 → 1,41 |
/* |
* Copyright (c) 2005 |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc64debug |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc64_DEBUG_H_ |
#define KERN_ppc64_DEBUG_H_ |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc64/include/barrier.h |
---|
0,0 → 1,48 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ppc64_BARRIER_H_ |
#define KERN_ppc64_BARRIER_H_ |
#define CS_ENTER_BARRIER() asm volatile ("" ::: "memory") |
#define CS_LEAVE_BARRIER() asm volatile ("" ::: "memory") |
#define memory_barrier() asm volatile ("sync" ::: "memory") |
#define read_barrier() asm volatile ("sync" ::: "memory") |
#define write_barrier() asm volatile ("eieio" ::: "memory") |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc64/Makefile.inc |
---|
0,0 → 1,72 |
# |
# Copyright (c) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
## Toolchain configuration |
# |
BFD_NAME = elf64-powerpc |
BFD_ARCH = powerpc:common64 |
BFD = binary |
TARGET = ppc64-linux-gnu |
TOOLCHAIN_DIR = /usr/local/ppc64 |
GCC_CFLAGS += -mcpu=powerpc64 -msoft-float -m64 |
AFLAGS += -a64 |
LFLAGS += -no-check-sections -N |
DEFS += -D__64_BITS__ |
## Own configuration directives |
# |
CONFIG_FB = y |
## Compile with hierarchical page tables support. |
# |
CONFIG_PAGE_PT = y |
DEFS += -DCONFIG_PAGE_PT |
ARCH_SOURCES = \ |
arch/$(ARCH)/src/context.S \ |
arch/$(ARCH)/src/debug/panic.s \ |
arch/$(ARCH)/src/fpu_context.S \ |
arch/$(ARCH)/src/boot/boot.S \ |
arch/$(ARCH)/src/ppc64.c \ |
arch/$(ARCH)/src/dummy.s \ |
arch/$(ARCH)/src/exception.S \ |
arch/$(ARCH)/src/interrupt.c \ |
arch/$(ARCH)/src/asm.S \ |
arch/$(ARCH)/src/cpu/cpu.c \ |
arch/$(ARCH)/src/proc/scheduler.c \ |
arch/$(ARCH)/src/ddi/ddi.c \ |
arch/$(ARCH)/src/mm/as.c \ |
arch/$(ARCH)/src/mm/frame.c \ |
arch/$(ARCH)/src/mm/page.c \ |
arch/$(ARCH)/src/mm/tlb.c \ |
arch/$(ARCH)/src/drivers/pic.c |
/tags/0.3.0/kernel/arch/ppc64/src/mm/frame.c |
---|
0,0 → 1,84 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc64mm |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/boot/boot.h> |
#include <arch/mm/frame.h> |
#include <mm/frame.h> |
#include <align.h> |
#include <macros.h> |
#include <print.h> |
uintptr_t last_frame = 0; |
void physmem_print(void) |
{ |
unsigned int i; |
printf("Base Size\n"); |
printf("---------- ----------\n"); |
for (i = 0; i < bootinfo.memmap.count; i++) { |
printf("%#10x %#10x\n", bootinfo.memmap.zones[i].start, |
bootinfo.memmap.zones[i].size); |
} |
} |
void frame_arch_init(void) |
{ |
pfn_t minconf = 2; |
count_t i; |
pfn_t start, conf; |
size_t size; |
for (i = 0; i < bootinfo.memmap.count; i++) { |
start = ADDR2PFN(ALIGN_UP(bootinfo.memmap.zones[i].start, FRAME_SIZE)); |
size = SIZE2FRAMES(ALIGN_DOWN(bootinfo.memmap.zones[i].size, FRAME_SIZE)); |
if ((minconf < start) || (minconf >= start + size)) |
conf = start; |
else |
conf = minconf; |
zone_create(start, size, conf, 0); |
if (last_frame < ALIGN_UP(bootinfo.memmap.zones[i].start + bootinfo.memmap.zones[i].size, FRAME_SIZE)) |
last_frame = ALIGN_UP(bootinfo.memmap.zones[i].start + bootinfo.memmap.zones[i].size, FRAME_SIZE); |
} |
/* First is exception vector, second is 'implementation specific', third and fourth is reserved */ |
frame_mark_unavailable(0, 4); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc64/src/mm/page.c |
---|
0,0 → 1,305 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc64mm |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/mm/page.h> |
#include <genarch/mm/page_pt.h> |
#include <arch/mm/frame.h> |
#include <arch/asm.h> |
#include <mm/frame.h> |
#include <mm/page.h> |
#include <mm/as.h> |
#include <arch.h> |
#include <arch/types.h> |
#include <arch/exception.h> |
#include <align.h> |
#include <config.h> |
#include <print.h> |
#include <symtab.h> |
static phte_t *phte; |
/** Try to find PTE for faulting address |
* |
* Try to find PTE for faulting address. |
* The as->lock must be held on entry to this function |
* if lock is true. |
* |
* @param as Address space. |
* @param lock Lock/unlock the address space. |
* @param badvaddr Faulting virtual address. |
* @param access Access mode that caused the fault. |
* @param istate Pointer to interrupted state. |
* @param pfrc Pointer to variable where as_page_fault() return code will be stored. |
* @return PTE on success, NULL otherwise. |
* |
*/ |
static pte_t *find_mapping_and_check(as_t *as, bool lock, uintptr_t badvaddr, int access, |
istate_t *istate, int *pfrc) |
{ |
/* |
* Check if the mapping exists in page tables. |
*/ |
pte_t *pte = page_mapping_find(as, badvaddr); |
if ((pte) && (pte->p)) { |
/* |
* Mapping found in page tables. |
* Immediately succeed. |
*/ |
return pte; |
} else { |
int rc; |
/* |
* Mapping not found in page tables. |
* Resort to higher-level page fault handler. |
*/ |
page_table_unlock(as, lock); |
switch (rc = as_page_fault(badvaddr, access, istate)) { |
case AS_PF_OK: |
/* |
* The higher-level page fault handler succeeded, |
* The mapping ought to be in place. |
*/ |
page_table_lock(as, lock); |
pte = page_mapping_find(as, badvaddr); |
ASSERT((pte) && (pte->p)); |
*pfrc = 0; |
return pte; |
case AS_PF_DEFER: |
page_table_lock(as, lock); |
*pfrc = rc; |
return NULL; |
case AS_PF_FAULT: |
page_table_lock(as, lock); |
printf("Page fault.\n"); |
*pfrc = rc; |
return NULL; |
default: |
panic("unexpected rc (%d)\n", rc); |
} |
} |
} |
static void pht_refill_fail(uintptr_t badvaddr, istate_t *istate) |
{ |
char *symbol = ""; |
char *sym2 = ""; |
char *s = get_symtab_entry(istate->pc); |
if (s) |
symbol = s; |
s = get_symtab_entry(istate->lr); |
if (s) |
sym2 = s; |
panic("%p: PHT Refill Exception at %p (%s<-%s)\n", badvaddr, istate->pc, symbol, sym2); |
} |
static void pht_insert(const uintptr_t vaddr, const pfn_t pfn) |
{ |
uint32_t page = (vaddr >> 12) & 0xffff; |
uint32_t api = (vaddr >> 22) & 0x3f; |
uint32_t vsid; |
asm volatile ( |
"mfsrin %0, %1\n" |
: "=r" (vsid) |
: "r" (vaddr) |
); |
/* Primary hash (xor) */ |
uint32_t h = 0; |
uint32_t hash = vsid ^ page; |
uint32_t base = (hash & 0x3ff) << 3; |
uint32_t i; |
bool found = false; |
/* Find unused or colliding |
PTE in PTEG */ |
for (i = 0; i < 8; i++) { |
if ((!phte[base + i].v) || ((phte[base + i].vsid == vsid) && (phte[base + i].api == api))) { |
found = true; |
break; |
} |
} |
if (!found) { |
/* Secondary hash (not) */ |
uint32_t base2 = (~hash & 0x3ff) << 3; |
/* Find unused or colliding |
PTE in PTEG */ |
for (i = 0; i < 8; i++) { |
if ((!phte[base2 + i].v) || ((phte[base2 + i].vsid == vsid) && (phte[base2 + i].api == api))) { |
found = true; |
base = base2; |
h = 1; |
break; |
} |
} |
if (!found) { |
// TODO: A/C precedence groups |
i = page % 8; |
} |
} |
phte[base + i].v = 1; |
phte[base + i].vsid = vsid; |
phte[base + i].h = h; |
phte[base + i].api = api; |
phte[base + i].rpn = pfn; |
phte[base + i].r = 0; |
phte[base + i].c = 0; |
phte[base + i].pp = 2; // FIXME |
} |
/** Process Instruction/Data Storage Interrupt |
* |
* @param data True if Data Storage Interrupt. |
* @param istate Interrupted register context. |
* |
*/ |
void pht_refill(bool data, istate_t *istate) |
{ |
uintptr_t badvaddr; |
pte_t *pte; |
int pfrc; |
as_t *as; |
bool lock; |
if (AS == NULL) { |
as = AS_KERNEL; |
lock = false; |
} else { |
as = AS; |
lock = true; |
} |
if (data) { |
asm volatile ( |
"mfdar %0\n" |
: "=r" (badvaddr) |
); |
} else |
badvaddr = istate->pc; |
page_table_lock(as, lock); |
pte = find_mapping_and_check(as, lock, badvaddr, PF_ACCESS_READ /* FIXME */, istate, &pfrc); |
if (!pte) { |
switch (pfrc) { |
case AS_PF_FAULT: |
goto fail; |
break; |
case AS_PF_DEFER: |
/* |
* The page fault came during copy_from_uspace() |
* or copy_to_uspace(). |
*/ |
page_table_unlock(as, lock); |
return; |
default: |
panic("Unexpected pfrc (%d)\n", pfrc); |
} |
} |
pte->a = 1; /* Record access to PTE */ |
pht_insert(badvaddr, pte->pfn); |
page_table_unlock(as, lock); |
return; |
fail: |
page_table_unlock(as, lock); |
pht_refill_fail(badvaddr, istate); |
} |
void pht_init(void) |
{ |
memsetb((uintptr_t) phte, 1 << PHT_BITS, 0); |
} |
void page_arch_init(void) |
{ |
if (config.cpu_active == 1) { |
page_mapping_operations = &pt_mapping_operations; |
uintptr_t cur; |
int flags; |
for (cur = 128 << 20; cur < last_frame; cur += FRAME_SIZE) { |
flags = PAGE_CACHEABLE | PAGE_WRITE; |
if ((PA2KA(cur) >= config.base) && (PA2KA(cur) < config.base + config.kernel_size)) |
flags |= PAGE_GLOBAL; |
page_mapping_insert(AS_KERNEL, PA2KA(cur), cur, flags); |
} |
/* Allocate page hash table */ |
phte_t *physical_phte = (phte_t *) frame_alloc(PHT_ORDER, FRAME_KA | FRAME_ATOMIC); |
ASSERT((uintptr_t) physical_phte % (1 << PHT_BITS) == 0); |
pht_init(); |
asm volatile ( |
"mtsdr1 %0\n" |
: |
: "r" ((uintptr_t) physical_phte) |
); |
} |
} |
uintptr_t hw_map(uintptr_t physaddr, size_t size) |
{ |
if (last_frame + ALIGN_UP(size, PAGE_SIZE) > KA2PA(KERNEL_ADDRESS_SPACE_END_ARCH)) |
panic("Unable to map physical memory %p (%d bytes)", physaddr, size) |
uintptr_t virtaddr = PA2KA(last_frame); |
pfn_t i; |
for (i = 0; i < ADDR2PFN(ALIGN_UP(size, PAGE_SIZE)); i++) |
page_mapping_insert(AS_KERNEL, virtaddr + PFN2ADDR(i), physaddr + PFN2ADDR(i), PAGE_NOT_CACHEABLE | PAGE_WRITE); |
last_frame = ALIGN_UP(last_frame + size, FRAME_SIZE); |
return virtaddr; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc64/src/mm/as.c |
---|
0,0 → 1,46 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc64mm |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/mm/as.h> |
#include <genarch/mm/page_pt.h> |
/** Architecture dependent address space init. */ |
void as_arch_init(void) |
{ |
as_operations = &as_pt_operations; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc64/src/mm/tlb.c |
---|
0,0 → 1,86 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc64mm |
* @{ |
*/ |
/** @file |
*/ |
#include <mm/tlb.h> |
/** Initialize Page Hash Table. |
* |
* Setup the Page Hash Table with no entries. |
* |
*/ |
void tlb_arch_init(void) |
{ |
tlb_invalidate_all(); |
} |
void tlb_invalidate_all(void) |
{ |
asm volatile ( |
"tlbia\n" |
"tlbsync\n" |
); |
} |
/** Invalidate all entries in TLB that belong to specified address space. |
* |
* @param asid This parameter is ignored as the architecture doesn't support it. |
*/ |
void tlb_invalidate_asid(asid_t asid) |
{ |
tlb_invalidate_all(); |
} |
/** Invalidate TLB entries for specified page range belonging to specified address space. |
* |
* @param asid This parameter is ignored as the architecture doesn't support it. |
* @param page Address of the first page whose entry is to be invalidated. |
* @param cnt Number of entries to invalidate. |
*/ |
void tlb_invalidate_pages(asid_t asid, uintptr_t page, count_t cnt) |
{ |
tlb_invalidate_all(); |
} |
/** Print contents of Page Hash Table. */ |
void tlb_print(void) |
{ |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc64/src/ppc64.c |
---|
0,0 → 1,144 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc64 |
* @{ |
*/ |
/** @file |
*/ |
#include <arch.h> |
#include <arch/boot/boot.h> |
#include <arch/interrupt.h> |
#include <genarch/fb/fb.h> |
#include <genarch/fb/visuals.h> |
#include <userspace.h> |
#include <proc/uarg.h> |
#include <console/console.h> |
bootinfo_t bootinfo; |
void arch_pre_main(void) |
{ |
/* Setup usermode */ |
init.cnt = bootinfo.taskmap.count; |
uint32_t i; |
for (i = 0; i < bootinfo.taskmap.count; i++) { |
init.tasks[i].addr = PA2KA(bootinfo.taskmap.tasks[i].addr); |
init.tasks[i].size = bootinfo.taskmap.tasks[i].size; |
} |
} |
void arch_pre_mm_init(void) |
{ |
/* Initialize dispatch table */ |
interrupt_init(); |
/* Start decrementer */ |
start_decrementer(); |
} |
void arch_post_mm_init(void) |
{ |
if (config.cpu_active == 1) { |
/* Initialize framebuffer */ |
unsigned int visual; |
switch (bootinfo.screen.bpp) { |
case 8: |
visual = VISUAL_INDIRECT_8; |
break; |
case 16: |
visual = VISUAL_RGB_5_5_5; |
break; |
case 24: |
visual = VISUAL_RGB_8_8_8; |
break; |
case 32: |
visual = VISUAL_RGB_0_8_8_8; |
break; |
default: |
panic("Unsupported bits per pixel"); |
} |
fb_init(bootinfo.screen.addr, bootinfo.screen.width, bootinfo.screen.height, bootinfo.screen.scanline, visual); |
/* Merge all zones to 1 big zone */ |
zone_merge_all(); |
} |
} |
void arch_post_cpu_init(void) |
{ |
} |
void arch_pre_smp_init(void) |
{ |
} |
void arch_post_smp_init(void) |
{ |
} |
void calibrate_delay_loop(void) |
{ |
} |
void userspace(uspace_arg_t *kernel_uarg) |
{ |
userspace_asm((uintptr_t) kernel_uarg->uspace_uarg, (uintptr_t) kernel_uarg->uspace_stack + THREAD_STACK_SIZE - SP_DELTA, (uintptr_t) kernel_uarg->uspace_entry); |
/* Unreachable */ |
for (;;) |
; |
} |
/** Acquire console back for kernel |
* |
*/ |
void arch_grab_console(void) |
{ |
} |
/** Return console to userspace |
* |
*/ |
void arch_release_console(void) |
{ |
} |
void arch_reboot(void) |
{ |
// TODO |
while (1); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc64/src/interrupt.c |
---|
0,0 → 1,108 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc64interrupt |
* @{ |
*/ |
/** @file |
*/ |
#include <ddi/irq.h> |
#include <interrupt.h> |
#include <arch/interrupt.h> |
#include <arch/types.h> |
#include <arch.h> |
#include <time/clock.h> |
#include <ipc/sysipc.h> |
#include <arch/drivers/pic.h> |
#include <arch/mm/tlb.h> |
#include <print.h> |
void start_decrementer(void) |
{ |
asm volatile ( |
"mtdec %0\n" |
: |
: "r" (1000) |
); |
} |
/** Handler of external interrupts */ |
static void exception_external(int n, istate_t *istate) |
{ |
int inum; |
while ((inum = pic_get_pending()) != -1) { |
bool ack = false; |
irq_t *irq = irq_dispatch_and_lock(inum); |
if (irq) { |
/* |
* The IRQ handler was found. |
*/ |
if (irq->preack) { |
/* Acknowledge the interrupt before processing */ |
pic_ack_interrupt(inum); |
ack = true; |
} |
irq->handler(irq, irq->arg); |
spinlock_unlock(&irq->lock); |
} else { |
/* |
* Spurious interrupt. |
*/ |
#ifdef CONFIG_DEBUG |
printf("cpu%d: spurious interrupt (inum=%d)\n", CPU->id, inum); |
#endif |
} |
if (!ack) |
pic_ack_interrupt(inum); |
} |
} |
static void exception_decrementer(int n, istate_t *istate) |
{ |
clock(); |
start_decrementer(); |
} |
/* Initialize basic tables for exception dispatching */ |
void interrupt_init(void) |
{ |
exc_register(VECTOR_EXTERNAL, "external", exception_external); |
exc_register(VECTOR_DECREMENTER, "timer", exception_decrementer); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc64/src/ddi/ddi.c |
---|
0,0 → 1,55 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc64ddi |
* @{ |
*/ |
/** @file |
*/ |
#include <ddi/ddi.h> |
#include <proc/task.h> |
#include <arch/types.h> |
/** Enable I/O space range for task. |
* |
* Interrupts are disabled and task is locked. |
* |
* @param task Task. |
* @param ioaddr Startign I/O space address. |
* @param size Size of the enabled I/O range. |
* |
* @return 0 on success or an error code from errno.h. |
*/ |
int ddi_iospace_enable_arch(task_t *task, uintptr_t ioaddr, size_t size) |
{ |
return 0; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc64/src/cpu/cpu.c |
---|
0,0 → 1,60 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc64 |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/cpu.h> |
#include <arch/cpuid.h> |
#include <cpu.h> |
#include <arch.h> |
#include <print.h> |
void cpu_arch_init(void) |
{ |
} |
void cpu_identify(void) |
{ |
cpu_info_t info; |
cpu_version(&info); |
CPU->arch.version = info.version; |
CPU->arch.revision = info.revision; |
} |
void cpu_print_report(cpu_t *m) |
{ |
printf("cpu%d: version=%d, revision=%d\n", m->id, m->arch.version, m->arch.revision); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc64/src/drivers/pic.c |
---|
0,0 → 1,94 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc64 |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/drivers/pic.h> |
#include <mm/page.h> |
#include <byteorder.h> |
#include <bitops.h> |
static volatile uint32_t *pic; |
void pic_init(uintptr_t base, size_t size) |
{ |
pic = (uint32_t *) hw_map(base, size); |
} |
void pic_enable_interrupt(int intnum) |
{ |
if (intnum < 32) { |
pic[PIC_MASK_LOW] = pic[PIC_MASK_LOW] | (1 << intnum); |
} else { |
pic[PIC_MASK_HIGH] = pic[PIC_MASK_HIGH] | (1 << (intnum - 32)); |
} |
} |
void pic_disable_interrupt(int intnum) |
{ |
if (intnum < 32) { |
pic[PIC_MASK_LOW] = pic[PIC_MASK_LOW] & (~(1 << intnum)); |
} else { |
pic[PIC_MASK_HIGH] = pic[PIC_MASK_HIGH] & (~(1 << (intnum - 32))); |
} |
} |
void pic_ack_interrupt(int intnum) |
{ |
if (intnum < 32) |
pic[PIC_ACK_LOW] = 1 << intnum; |
else |
pic[PIC_ACK_HIGH] = 1 << (intnum - 32); |
} |
/** Return number of pending interrupt */ |
int pic_get_pending(void) |
{ |
int pending; |
pending = pic[PIC_PENDING_LOW]; |
if (pending) |
return fnzb32(pending); |
pending = pic[PIC_PENDING_HIGH]; |
if (pending) |
return fnzb32(pending) + 32; |
return -1; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc64/src/exception.S |
---|
0,0 → 1,237 |
# |
# Copyright (c) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
#include <arch/asm/regname.h> |
#include <arch/mm/page.h> |
.section K_UNMAPPED_TEXT_START, "ax" |
.macro CONTEXT_STORE |
# save R12 in SPRG1, backup CR in R12 |
# save SP in SPRG2 |
mtsprg1 r12 |
mfcr r12 |
mtsprg2 sp |
# check whether SP is in kernel |
andis. sp, sp, 0x8000 |
bne 1f |
# stack is in user-space |
mfsprg0 sp |
b 2f |
1: |
# stack is in kernel |
mfsprg2 sp |
subis sp, sp, 0x8000 |
2: |
subi sp, sp, 160 |
stw r0, 8(sp) |
stw r2, 12(sp) |
stw r3, 16(sp) |
stw r4, 20(sp) |
stw r5, 24(sp) |
stw r6, 28(sp) |
stw r7, 32(sp) |
stw r8, 36(sp) |
stw r9, 40(sp) |
stw r10, 44(sp) |
stw r11, 48(sp) |
stw r13, 52(sp) |
stw r14, 56(sp) |
stw r15, 60(sp) |
stw r16, 64(sp) |
stw r17, 68(sp) |
stw r18, 72(sp) |
stw r19, 76(sp) |
stw r20, 80(sp) |
stw r21, 84(sp) |
stw r22, 88(sp) |
stw r23, 92(sp) |
stw r24, 96(sp) |
stw r25, 100(sp) |
stw r26, 104(sp) |
stw r27, 108(sp) |
stw r28, 112(sp) |
stw r29, 116(sp) |
stw r30, 120(sp) |
stw r31, 124(sp) |
stw r12, 128(sp) |
mfsrr0 r12 |
stw r12, 132(sp) |
mfsrr1 r12 |
stw r12, 136(sp) |
mflr r12 |
stw r12, 140(sp) |
mfctr r12 |
stw r12, 144(sp) |
mfxer r12 |
stw r12, 148(sp) |
mfsprg1 r12 |
stw r12, 152(sp) |
mfsprg2 r12 |
stw r12, 156(sp) |
.endm |
.org 0x060 |
jump_to_kernel: |
lis r12, iret@ha |
addi r12, r12, iret@l |
mtlr r12 |
mfmsr r12 |
ori r12, r12, (msr_ir | msr_dr)@l |
mtsrr1 r12 |
addis sp, sp, 0x8000 |
mr r4, sp |
addi r4, r4, 8 |
rfi |
jump_to_kernel_syscall: |
lis r12, syscall_handler@ha |
addi r12, r12, syscall_handler@l |
mtsrr0 r12 |
lis r12, iret_syscall@ha |
addi r12, r12, iret_syscall@l |
mtlr r12 |
mfmsr r12 |
ori r12, r12, (msr_ir | msr_dr)@l |
mtsrr1 r12 |
addis sp, sp, 0x8000 |
rfi |
.org 0x100 |
.global exc_system_reset |
exc_system_reset: |
b exc_system_reset |
.org 0x200 |
.global exc_machine_check |
exc_machine_check: |
b exc_machine_check |
.org 0x300 |
.global exc_data_storage |
exc_data_storage: |
CONTEXT_STORE |
lis r12, pht_refill@ha |
addi r12, r12, pht_refill@l |
mtsrr0 r12 |
li r3, 1 |
b jump_to_kernel |
.org 0x400 |
.global exc_instruction_storage |
exc_instruction_storage: |
CONTEXT_STORE |
lis r12, pht_refill@ha |
addi r12, r12, pht_refill@l |
mtsrr0 r12 |
li r3, 0 |
b jump_to_kernel |
.org 0x500 |
.global exc_external |
exc_external: |
b exc_external |
.org 0x600 |
.global exc_alignment |
exc_alignment: |
b exc_alignment |
.org 0x700 |
.global exc_program |
exc_program: |
b exc_program |
.org 0x800 |
.global exc_fp_unavailable |
exc_fp_unavailable: |
b exc_fp_unavailable |
.org 0x900 |
.global exc_decrementer |
exc_decrementer: |
CONTEXT_STORE |
lis r12, exc_dispatch@ha |
addi r12, r12, exc_dispatch@l |
mtsrr0 r12 |
li r3, 10 |
b jump_to_kernel |
.org 0xa00 |
.global exc_reserved0 |
exc_reserved0: |
b exc_reserved0 |
.org 0xb00 |
.global exc_reserved1 |
exc_reserved1: |
b exc_reserved1 |
.org 0xc00 |
.global exc_syscall |
exc_syscall: |
CONTEXT_STORE |
b jump_to_kernel_syscall |
.org 0xd00 |
.global exc_trace |
exc_trace: |
b exc_trace |
/tags/0.3.0/kernel/arch/ppc64/src/fpu_context.S |
---|
0,0 → 1,105 |
# |
# Copyright (c) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
#include <arch/asm/regname.h> |
#include <arch/context_offset.h> |
.text |
.global fpu_context_save |
.global fpu_context_restore |
.global fpu_init |
.global fpu_enable |
.global fpu_disable |
.macro FPU_CONTEXT_STORE r |
stfd fr14, OFFSET_FR14(\r) |
stfd fr15, OFFSET_FR15(\r) |
stfd fr16, OFFSET_FR16(\r) |
stfd fr17, OFFSET_FR17(\r) |
stfd fr18, OFFSET_FR18(\r) |
stfd fr19, OFFSET_FR19(\r) |
stfd fr20, OFFSET_FR20(\r) |
stfd fr21, OFFSET_FR21(\r) |
stfd fr22, OFFSET_FR22(\r) |
stfd fr23, OFFSET_FR23(\r) |
stfd fr24, OFFSET_FR24(\r) |
stfd fr25, OFFSET_FR25(\r) |
stfd fr26, OFFSET_FR26(\r) |
stfd fr27, OFFSET_FR27(\r) |
stfd fr28, OFFSET_FR28(\r) |
stfd fr29, OFFSET_FR29(\r) |
stfd fr30, OFFSET_FR30(\r) |
stfd fr31, OFFSET_FR31(\r) |
.endm |
.macro FPU_CONTEXT_LOAD r |
lfd fr14, OFFSET_FR14(\r) |
lfd fr15, OFFSET_FR15(\r) |
lfd fr16, OFFSET_FR16(\r) |
lfd fr17, OFFSET_FR17(\r) |
lfd fr18, OFFSET_FR18(\r) |
lfd fr19, OFFSET_FR19(\r) |
lfd fr20, OFFSET_FR20(\r) |
lfd fr21, OFFSET_FR21(\r) |
lfd fr22, OFFSET_FR22(\r) |
lfd fr23, OFFSET_FR23(\r) |
lfd fr24, OFFSET_FR24(\r) |
lfd fr25, OFFSET_FR25(\r) |
lfd fr26, OFFSET_FR26(\r) |
lfd fr27, OFFSET_FR27(\r) |
lfd fr28, OFFSET_FR28(\r) |
lfd fr29, OFFSET_FR29(\r) |
lfd fr30, OFFSET_FR30(\r) |
lfd fr31, OFFSET_FR31(\r) |
.endm |
fpu_context_save: |
// FPU_CONTEXT_STORE r3 |
// |
// mffs fr0 |
// stfd fr0, OFFSET_FPSCR(r3) |
blr |
fpu_context_restore: |
// FPU_CONTEXT_LOAD r3 |
// |
// lfd fr0, OFFSET_FPSCR(r3) |
// mtfsf 7, fr0 |
blr |
fpu_init: |
blr |
fpu_enable: |
blr |
fpu_disable: |
blr |
/tags/0.3.0/kernel/arch/ppc64/src/asm.S |
---|
0,0 → 1,311 |
# |
# Copyright (c) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
#include <arch/asm/regname.h> |
.text |
.global userspace_asm |
.global iret |
.global iret_syscall |
.global memsetb |
.global memcpy |
.global memcpy_from_uspace |
.global memcpy_to_uspace |
.global memcpy_from_uspace_failover_address |
.global memcpy_to_uspace_failover_address |
userspace_asm: |
# r3 = uspace_uarg |
# r4 = stack |
# r5 = entry |
# disable interrupts |
mfmsr r31 |
rlwinm r31, r31, 0, 17, 15 |
mtmsr r31 |
# set entry point |
mtsrr0 r5 |
# set problem state, enable interrupts |
ori r31, r31, msr_pr |
ori r31, r31, msr_ee |
mtsrr1 r31 |
# set stack |
mr sp, r4 |
# jump to userspace |
rfi |
iret: |
# disable interrupts |
mfmsr r31 |
rlwinm r31, r31, 0, 17, 15 |
mtmsr r31 |
lwz r0, 8(sp) |
lwz r2, 12(sp) |
lwz r3, 16(sp) |
lwz r4, 20(sp) |
lwz r5, 24(sp) |
lwz r6, 28(sp) |
lwz r7, 32(sp) |
lwz r8, 36(sp) |
lwz r9, 40(sp) |
lwz r10, 44(sp) |
lwz r11, 48(sp) |
lwz r13, 52(sp) |
lwz r14, 56(sp) |
lwz r15, 60(sp) |
lwz r16, 64(sp) |
lwz r17, 68(sp) |
lwz r18, 72(sp) |
lwz r19, 76(sp) |
lwz r20, 80(sp) |
lwz r21, 84(sp) |
lwz r22, 88(sp) |
lwz r23, 92(sp) |
lwz r24, 96(sp) |
lwz r25, 100(sp) |
lwz r26, 104(sp) |
lwz r27, 108(sp) |
lwz r28, 112(sp) |
lwz r29, 116(sp) |
lwz r30, 120(sp) |
lwz r31, 124(sp) |
lwz r12, 128(sp) |
mtcr r12 |
lwz r12, 132(sp) |
mtsrr0 r12 |
lwz r12, 136(sp) |
mtsrr1 r12 |
lwz r12, 140(sp) |
mtlr r12 |
lwz r12, 144(sp) |
mtctr r12 |
lwz r12, 148(sp) |
mtxer r12 |
lwz r12, 152(sp) |
lwz sp, 156(sp) |
rfi |
iret_syscall: |
# reset decrementer |
li r31, 1000 |
mtdec r31 |
# disable interrupts |
mfmsr r31 |
rlwinm r31, r31, 0, 17, 15 |
mtmsr r31 |
lwz r0, 8(sp) |
lwz r2, 12(sp) |
lwz r4, 20(sp) |
lwz r5, 24(sp) |
lwz r6, 28(sp) |
lwz r7, 32(sp) |
lwz r8, 36(sp) |
lwz r9, 40(sp) |
lwz r10, 44(sp) |
lwz r11, 48(sp) |
lwz r13, 52(sp) |
lwz r14, 56(sp) |
lwz r15, 60(sp) |
lwz r16, 64(sp) |
lwz r17, 68(sp) |
lwz r18, 72(sp) |
lwz r19, 76(sp) |
lwz r20, 80(sp) |
lwz r21, 84(sp) |
lwz r22, 88(sp) |
lwz r23, 92(sp) |
lwz r24, 96(sp) |
lwz r25, 100(sp) |
lwz r26, 104(sp) |
lwz r27, 108(sp) |
lwz r28, 112(sp) |
lwz r29, 116(sp) |
lwz r30, 120(sp) |
lwz r31, 124(sp) |
lwz r12, 128(sp) |
mtcr r12 |
lwz r12, 132(sp) |
mtsrr0 r12 |
lwz r12, 136(sp) |
mtsrr1 r12 |
lwz r12, 140(sp) |
mtlr r12 |
lwz r12, 144(sp) |
mtctr r12 |
lwz r12, 148(sp) |
mtxer r12 |
lwz r12, 152(sp) |
lwz sp, 156(sp) |
rfi |
memsetb: |
rlwimi r5, r5, 8, 16, 23 |
rlwimi r5, r5, 16, 0, 15 |
addi r14, r3, -4 |
cmplwi 0, r4, 4 |
blt 7f |
stwu r5, 4(r14) |
beqlr |
andi. r15, r14, 3 |
add r4, r15, r4 |
subf r14, r15, r14 |
srwi r15, r4, 2 |
mtctr r15 |
bdz 6f |
1: |
stwu r5, 4(r14) |
bdnz 1b |
6: |
andi. r4, r4, 3 |
7: |
cmpwi 0, r4, 0 |
beqlr |
mtctr r4 |
addi r6, r6, 3 |
8: |
stbu r5, 1(r14) |
bdnz 8b |
blr |
memcpy: |
memcpy_from_uspace: |
memcpy_to_uspace: |
srwi. r7, r5, 3 |
addi r6, r3, -4 |
addi r4, r4, -4 |
beq 2f |
andi. r0, r6, 3 |
mtctr r7 |
bne 5f |
1: |
lwz r7, 4(r4) |
lwzu r8, 8(r4) |
stw r7, 4(r6) |
stwu r8, 8(r6) |
bdnz 1b |
andi. r5, r5, 7 |
2: |
cmplwi 0, r5, 4 |
blt 3f |
lwzu r0, 4(r4) |
addi r5, r5, -4 |
stwu r0, 4(r6) |
3: |
cmpwi 0, r5, 0 |
beqlr |
mtctr r5 |
addi r4, r4, 3 |
addi r6, r6, 3 |
4: |
lbzu r0, 1(r4) |
stbu r0, 1(r6) |
bdnz 4b |
blr |
5: |
subfic r0, r0, 4 |
mtctr r0 |
6: |
lbz r7, 4(r4) |
addi r4, r4, 1 |
stb r7, 4(r6) |
addi r6, r6, 1 |
bdnz 6b |
subf r5, r0, r5 |
rlwinm. r7, r5, 32-3, 3, 31 |
beq 2b |
mtctr r7 |
b 1b |
memcpy_from_uspace_failover_address: |
memcpy_to_uspace_failover_address: |
b memcpy_from_uspace_failover_address |
/tags/0.3.0/kernel/arch/ppc64/src/boot/boot.S |
---|
0,0 → 1,81 |
# |
# Copyright (c) 2005 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
#include <arch/asm/regname.h> |
#include <arch/boot/boot.h> |
.section K_TEXT_START, "ax" |
.global kernel_image_start |
kernel_image_start: |
# load temporal kernel stack |
lis sp, kernel_stack@ha |
addi sp, sp, kernel_stack@l |
# set kernel stack for interrupt handling |
mr r31, sp |
subis r31, r31, 0x8000 |
mtsprg0 r31 |
# r3 contains physical address of bootinfo_t |
# r4 contains size of bootinfo_t |
addis r3, r3, 0x8000 |
lis r31, bootinfo@ha |
addi r31, r31, bootinfo@l # r31 = bootinfo |
cmpwi r4, 0 |
beq bootinfo_end |
bootinfo_loop: |
lwz r30, 0(r3) |
stw r30, 0(r31) |
addi r3, r3, 4 |
addi r31, r31, 4 |
subi r4, r4, 4 |
cmpwi r4, 0 |
bgt bootinfo_loop |
bootinfo_end: |
bl arch_pre_main |
b main_bsp |
.section K_DATA_START, "aw", @progbits |
.align 12 |
kernel_stack_bottom: |
.space TEMP_STACK_SIZE |
kernel_stack: |
/tags/0.3.0/kernel/arch/ppc64/src/proc/scheduler.c |
---|
0,0 → 1,63 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ppc64proc |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/mm/page.h> |
#include <arch/boot/boot.h> |
#include <proc/scheduler.h> |
#include <proc/thread.h> |
#include <arch.h> |
/** Perform ppc64 specific tasks needed before the new task is run. */ |
void before_task_runs_arch(void) |
{ |
} |
/** Perform ppc64 specific tasks needed before the new thread is scheduled. */ |
void before_thread_runs_arch(void) |
{ |
pht_init(); |
tlb_invalidate_all(); |
asm volatile ( |
"mtsprg0 %0\n" |
: |
: "r" (KA2PA(&THREAD->kstack[THREAD_STACK_SIZE - SP_DELTA])) |
); |
} |
void after_thread_ran_arch(void) |
{ |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/arch/ppc64/src/context.S |
---|
0,0 → 1,109 |
# |
# Copyright (c) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
#include <arch/asm/regname.h> |
#include <arch/context_offset.h> |
.text |
.global context_save_arch |
.global context_restore_arch |
.macro CONTEXT_STORE r |
stw sp, OFFSET_SP(\r) |
stw r2, OFFSET_R2(\r) |
stw r13, OFFSET_R13(\r) |
stw r14, OFFSET_R14(\r) |
stw r15, OFFSET_R15(\r) |
stw r16, OFFSET_R16(\r) |
stw r17, OFFSET_R17(\r) |
stw r18, OFFSET_R18(\r) |
stw r19, OFFSET_R19(\r) |
stw r20, OFFSET_R20(\r) |
stw r21, OFFSET_R21(\r) |
stw r22, OFFSET_R22(\r) |
stw r23, OFFSET_R23(\r) |
stw r24, OFFSET_R24(\r) |
stw r25, OFFSET_R25(\r) |
stw r26, OFFSET_R26(\r) |
stw r27, OFFSET_R27(\r) |
stw r28, OFFSET_R28(\r) |
stw r29, OFFSET_R29(\r) |
stw r30, OFFSET_R30(\r) |
stw r31, OFFSET_R31(\r) |
.endm |
.macro CONTEXT_LOAD r |
lwz sp, OFFSET_SP(\r) |
lwz r2, OFFSET_R2(\r) |
lwz r13, OFFSET_R13(\r) |
lwz r14, OFFSET_R14(\r) |
lwz r15, OFFSET_R15(\r) |
lwz r16, OFFSET_R16(\r) |
lwz r17, OFFSET_R17(\r) |
lwz r18, OFFSET_R18(\r) |
lwz r19, OFFSET_R19(\r) |
lwz r20, OFFSET_R20(\r) |
lwz r21, OFFSET_R21(\r) |
lwz r22, OFFSET_R22(\r) |
lwz r23, OFFSET_R23(\r) |
lwz r24, OFFSET_R24(\r) |
lwz r25, OFFSET_R25(\r) |
lwz r26, OFFSET_R26(\r) |
lwz r27, OFFSET_R27(\r) |
lwz r28, OFFSET_R28(\r) |
lwz r29, OFFSET_R29(\r) |
lwz r30, OFFSET_R30(\r) |
lwz r31, OFFSET_R31(\r) |
.endm |
context_save_arch: |
CONTEXT_STORE r3 |
mflr r4 |
stw r4, OFFSET_PC(r3) |
mfcr r4 |
stw r4, OFFSET_CR(r3) |
# context_save returns 1 |
li r3, 1 |
blr |
context_restore_arch: |
CONTEXT_LOAD r3 |
lwz r4, OFFSET_CR(r3) |
mtcr r4 |
lwz r4, OFFSET_PC(r3) |
mtlr r4 |
# context_restore returns 0 |
li r3, 0 |
blr |
/tags/0.3.0/kernel/arch/ppc64/src/debug/panic.s |
---|
0,0 → 1,38 |
# |
# Copyright (c) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
#include <arch/asm/macro.h> |
.text |
.global panic_printf |
panic_printf: |
lis %r14, halt@ha |
addi %r14, %r14, halt@l |
mtlr %r14 # fake stack to make printf return to halt |
b printf |
/tags/0.3.0/kernel/arch/ppc64/src/dummy.s |
---|
0,0 → 1,38 |
# |
# Copyright (c) 2005 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
.text |
.global asm_delay_loop |
.global sys_tls_set |
sys_tls_set: |
b sys_tls_set |
asm_delay_loop: |
blr |
/tags/0.3.0/kernel/arch/ppc64/_link.ld.in |
---|
0,0 → 1,58 |
/** PPC64 linker script |
* |
* umapped section: |
* kernel text |
* kernel data |
* mapped section: |
* kernel text |
* kernel data |
* |
*/ |
#include <arch/boot/boot.h> |
#include <arch/mm/page.h> |
ENTRY(kernel_image_start) |
OUTPUT_FORMAT("elf64-powerpc") |
OUTPUT_ARCH(powerpc:common64) |
SECTIONS { |
.unmapped 0: AT (0) { |
unmapped_ktext_start = .; |
*(K_UNMAPPED_TEXT_START); |
unmapped_ktext_end = .; |
unmapped_kdata_start = .; |
*(K_UNMAPPED_DATA_START); |
unmapped_kdata_start = .; |
} |
.mapped PA2KA(BOOT_OFFSET): AT (BOOT_OFFSET) { |
ktext_start = .; |
*(K_TEXT_START); |
*(.text); |
ktext_end = .; |
kdata_start = .; |
*(K_DATA_START); |
*(.rodata); |
*(.rodata.*); |
*(.data); /* initialized data */ |
*(.sdata); |
*(.sdata2); |
*(.sbss); |
hardcoded_ktext_size = .; |
LONG(ktext_end - ktext_start); |
hardcoded_kdata_size = .; |
LONG(kdata_end - kdata_start); |
hardcoded_load_address = .; |
LONG(PA2KA(BOOT_OFFSET)); |
*(.bss); /* uninitialized static variables */ |
*(COMMON); /* global variables */ |
symbol_table = .; |
*(symtab.*); /* Symbol table, must be LAST symbol!*/ |
kdata_end = .; |
} |
} |
/tags/0.3.0/kernel/generic/src/proc/tasklet.c |
---|
0,0 → 1,64 |
/* |
* Copyright (c) 2007 Jan Hudecek |
* Copyright (c) 2008 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericproc |
* @{ |
*/ |
/** @file tasklet.c |
* @brief Tasklet implementation |
*/ |
#include <proc/tasklet.h> |
#include <synch/spinlock.h> |
#include <mm/slab.h> |
#include <config.h> |
/** Spinlock protecting list of tasklets */ |
SPINLOCK_INITIALIZE(tasklet_lock); |
/** Array of tasklet lists for every CPU */ |
tasklet_descriptor_t **tasklet_list; |
void tasklet_init(void) |
{ |
unsigned int i; |
tasklet_list = malloc(sizeof(tasklet_descriptor_t *) * config.cpu_count, 0); |
if (!tasklet_list) |
panic("Error initializing tasklets"); |
for (i = 0; i < config.cpu_count; i++) |
tasklet_list[i] = NULL; |
spinlock_initialize(&tasklet_lock, "tasklet_lock"); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/proc/task.c |
---|
0,0 → 1,470 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericproc |
* @{ |
*/ |
/** |
* @file |
* @brief Task management. |
*/ |
#include <main/uinit.h> |
#include <proc/thread.h> |
#include <proc/task.h> |
#include <proc/uarg.h> |
#include <mm/as.h> |
#include <mm/slab.h> |
#include <atomic.h> |
#include <synch/spinlock.h> |
#include <synch/waitq.h> |
#include <arch.h> |
#include <panic.h> |
#include <adt/avl.h> |
#include <adt/btree.h> |
#include <adt/list.h> |
#include <ipc/ipc.h> |
#include <security/cap.h> |
#include <memstr.h> |
#include <print.h> |
#include <lib/elf.h> |
#include <errno.h> |
#include <func.h> |
#include <syscall/copy.h> |
#ifndef LOADED_PROG_STACK_PAGES_NO |
#define LOADED_PROG_STACK_PAGES_NO 1 |
#endif |
/** Spinlock protecting the tasks_tree AVL tree. */ |
SPINLOCK_INITIALIZE(tasks_lock); |
/** AVL tree of active tasks. |
* |
* The task is guaranteed to exist after it was found in the tasks_tree as |
* long as: |
* @li the tasks_lock is held, |
* @li the task's lock is held when task's lock is acquired before releasing |
* tasks_lock or |
* @li the task's refcount is greater than 0 |
* |
*/ |
avltree_t tasks_tree; |
static task_id_t task_counter = 0; |
/** Initialize tasks |
* |
* Initialize kernel tasks support. |
* |
*/ |
void task_init(void) |
{ |
TASK = NULL; |
avltree_create(&tasks_tree); |
} |
/* |
* The idea behind this walker is to remember a single task different from TASK. |
*/ |
static bool task_done_walker(avltree_node_t *node, void *arg) |
{ |
task_t *t = avltree_get_instance(node, task_t, tasks_tree_node); |
task_t **tp = (task_t **) arg; |
if (t != TASK) { |
*tp = t; |
return false; /* stop walking */ |
} |
return true; /* continue the walk */ |
} |
/** Kill all tasks except the current task. |
* |
*/ |
void task_done(void) |
{ |
task_t *t; |
do { /* Repeat until there are any tasks except TASK */ |
/* Messing with task structures, avoid deadlock */ |
ipl_t ipl = interrupts_disable(); |
spinlock_lock(&tasks_lock); |
t = NULL; |
avltree_walk(&tasks_tree, task_done_walker, &t); |
if (t != NULL) { |
task_id_t id = t->taskid; |
spinlock_unlock(&tasks_lock); |
interrupts_restore(ipl); |
#ifdef CONFIG_DEBUG |
printf("Killing task %llu\n", id); |
#endif |
task_kill(id); |
thread_usleep(10000); |
} else { |
spinlock_unlock(&tasks_lock); |
interrupts_restore(ipl); |
} |
} while (t != NULL); |
} |
/** Create new task |
* |
* Create new task with no threads. |
* |
* @param as Task's address space. |
* @param name Symbolic name. |
* |
* @return New task's structure |
* |
*/ |
task_t *task_create(as_t *as, char *name) |
{ |
ipl_t ipl; |
task_t *ta; |
int i; |
ta = (task_t *) malloc(sizeof(task_t), 0); |
task_create_arch(ta); |
spinlock_initialize(&ta->lock, "task_ta_lock"); |
list_initialize(&ta->th_head); |
ta->as = as; |
ta->name = name; |
atomic_set(&ta->refcount, 0); |
atomic_set(&ta->lifecount, 0); |
ta->context = CONTEXT; |
ta->capabilities = 0; |
ta->cycles = 0; |
ipc_answerbox_init(&ta->answerbox); |
for (i = 0; i < IPC_MAX_PHONES; i++) |
ipc_phone_init(&ta->phones[i]); |
if ((ipc_phone_0) && (context_check(ipc_phone_0->task->context, |
ta->context))) |
ipc_phone_connect(&ta->phones[0], ipc_phone_0); |
atomic_set(&ta->active_calls, 0); |
mutex_initialize(&ta->futexes_lock); |
btree_create(&ta->futexes); |
ipl = interrupts_disable(); |
/* |
* Increment address space reference count. |
*/ |
atomic_inc(&as->refcount); |
spinlock_lock(&tasks_lock); |
ta->taskid = ++task_counter; |
avltree_node_initialize(&ta->tasks_tree_node); |
ta->tasks_tree_node.key = ta->taskid; |
avltree_insert(&tasks_tree, &ta->tasks_tree_node); |
spinlock_unlock(&tasks_lock); |
interrupts_restore(ipl); |
return ta; |
} |
/** Destroy task. |
* |
* @param t Task to be destroyed. |
*/ |
void task_destroy(task_t *t) |
{ |
/* |
* Remove the task from the task B+tree. |
*/ |
spinlock_lock(&tasks_lock); |
avltree_delete(&tasks_tree, &t->tasks_tree_node); |
spinlock_unlock(&tasks_lock); |
/* |
* Perform architecture specific task destruction. |
*/ |
task_destroy_arch(t); |
/* |
* Free up dynamically allocated state. |
*/ |
btree_destroy(&t->futexes); |
/* |
* Drop our reference to the address space. |
*/ |
if (atomic_predec(&t->as->refcount) == 0) |
as_destroy(t->as); |
free(t); |
TASK = NULL; |
} |
/** Create new task with 1 thread and run it |
* |
* @param program_addr Address of program executable image. |
* @param name Program name. |
* |
* @return Task of the running program or NULL on error. |
*/ |
task_t *task_run_program(void *program_addr, char *name) |
{ |
as_t *as; |
as_area_t *a; |
unsigned int rc; |
thread_t *t; |
task_t *task; |
uspace_arg_t *kernel_uarg; |
as = as_create(0); |
ASSERT(as); |
rc = elf_load((elf_header_t *) program_addr, as); |
if (rc != EE_OK) { |
as_destroy(as); |
return NULL; |
} |
kernel_uarg = (uspace_arg_t *) malloc(sizeof(uspace_arg_t), 0); |
kernel_uarg->uspace_entry = |
(void *) ((elf_header_t *) program_addr)->e_entry; |
kernel_uarg->uspace_stack = (void *) USTACK_ADDRESS; |
kernel_uarg->uspace_thread_function = NULL; |
kernel_uarg->uspace_thread_arg = NULL; |
kernel_uarg->uspace_uarg = NULL; |
task = task_create(as, name); |
ASSERT(task); |
/* |
* Create the data as_area. |
*/ |
a = as_area_create(as, AS_AREA_READ | AS_AREA_WRITE | AS_AREA_CACHEABLE, |
LOADED_PROG_STACK_PAGES_NO * PAGE_SIZE, USTACK_ADDRESS, |
AS_AREA_ATTR_NONE, &anon_backend, NULL); |
/* |
* Create the main thread. |
*/ |
t = thread_create(uinit, kernel_uarg, task, THREAD_FLAG_USPACE, |
"uinit", false); |
ASSERT(t); |
thread_ready(t); |
return task; |
} |
/** Syscall for reading task ID from userspace. |
* |
* @param uspace_task_id Userspace address of 8-byte buffer where to store |
* current task ID. |
* |
* @return 0 on success or an error code from @ref errno.h. |
*/ |
unative_t sys_task_get_id(task_id_t *uspace_task_id) |
{ |
/* |
* No need to acquire lock on TASK because taskid |
* remains constant for the lifespan of the task. |
*/ |
return (unative_t) copy_to_uspace(uspace_task_id, &TASK->taskid, |
sizeof(TASK->taskid)); |
} |
/** Find task structure corresponding to task ID. |
* |
* The tasks_lock must be already held by the caller of this function |
* and interrupts must be disabled. |
* |
* @param id Task ID. |
* |
* @return Task structure address or NULL if there is no such task ID. |
*/ |
task_t *task_find_by_id(task_id_t id) |
{ |
avltree_node_t *node; |
node = avltree_search(&tasks_tree, (avltree_key_t) id); |
if (node) |
return avltree_get_instance(node, task_t, tasks_tree_node); |
return NULL; |
} |
/** Get accounting data of given task. |
* |
* Note that task lock of 't' must be already held and |
* interrupts must be already disabled. |
* |
* @param t Pointer to thread. |
* |
*/ |
uint64_t task_get_accounting(task_t *t) |
{ |
/* Accumulated value of task */ |
uint64_t ret = t->cycles; |
/* Current values of threads */ |
link_t *cur; |
for (cur = t->th_head.next; cur != &t->th_head; cur = cur->next) { |
thread_t *thr = list_get_instance(cur, thread_t, th_link); |
spinlock_lock(&thr->lock); |
/* Process only counted threads */ |
if (!thr->uncounted) { |
if (thr == THREAD) { |
/* Update accounting of current thread */ |
thread_update_accounting(); |
} |
ret += thr->cycles; |
} |
spinlock_unlock(&thr->lock); |
} |
return ret; |
} |
/** Kill task. |
* |
* This function is idempotent. |
* It signals all the task's threads to bail it out. |
* |
* @param id ID of the task to be killed. |
* |
* @return 0 on success or an error code from errno.h |
*/ |
int task_kill(task_id_t id) |
{ |
ipl_t ipl; |
task_t *ta; |
link_t *cur; |
if (id == 1) |
return EPERM; |
ipl = interrupts_disable(); |
spinlock_lock(&tasks_lock); |
if (!(ta = task_find_by_id(id))) { |
spinlock_unlock(&tasks_lock); |
interrupts_restore(ipl); |
return ENOENT; |
} |
spinlock_unlock(&tasks_lock); |
/* |
* Interrupt all threads except ktaskclnp. |
*/ |
spinlock_lock(&ta->lock); |
for (cur = ta->th_head.next; cur != &ta->th_head; cur = cur->next) { |
thread_t *thr; |
bool sleeping = false; |
thr = list_get_instance(cur, thread_t, th_link); |
spinlock_lock(&thr->lock); |
thr->interrupted = true; |
if (thr->state == Sleeping) |
sleeping = true; |
spinlock_unlock(&thr->lock); |
if (sleeping) |
waitq_interrupt_sleep(thr); |
} |
spinlock_unlock(&ta->lock); |
interrupts_restore(ipl); |
return 0; |
} |
static bool task_print_walker(avltree_node_t *node, void *arg) |
{ |
task_t *t = avltree_get_instance(node, task_t, tasks_tree_node); |
int j; |
spinlock_lock(&t->lock); |
uint64_t cycles; |
char suffix; |
order(task_get_accounting(t), &cycles, &suffix); |
if (sizeof(void *) == 4) |
printf("%-6llu %-10s %-3ld %#10zx %#10zx %9llu%c %7zd %6zd", |
t->taskid, t->name, t->context, t, t->as, cycles, suffix, |
t->refcount, atomic_get(&t->active_calls)); |
else |
printf("%-6llu %-10s %-3ld %#18zx %#18zx %9llu%c %7zd %6zd", |
t->taskid, t->name, t->context, t, t->as, cycles, suffix, |
t->refcount, atomic_get(&t->active_calls)); |
for (j = 0; j < IPC_MAX_PHONES; j++) { |
if (t->phones[j].callee) |
printf(" %zd:%#zx", j, t->phones[j].callee); |
} |
printf("\n"); |
spinlock_unlock(&t->lock); |
return true; |
} |
/** Print task list */ |
void task_print_list(void) |
{ |
ipl_t ipl; |
/* Messing with task structures, avoid deadlock */ |
ipl = interrupts_disable(); |
spinlock_lock(&tasks_lock); |
if (sizeof(void *) == 4) { |
printf("taskid name ctx address as " |
"cycles threads calls callee\n"); |
printf("------ ---------- --- ---------- ---------- " |
"---------- ------- ------ ------>\n"); |
} else { |
printf("taskid name ctx address as " |
"cycles threads calls callee\n"); |
printf("------ ---------- --- ------------------ ------------------ " |
"---------- ------- ------ ------>\n"); |
} |
avltree_walk(&tasks_tree, task_print_walker, NULL); |
spinlock_unlock(&tasks_lock); |
interrupts_restore(ipl); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/proc/thread.c |
---|
0,0 → 1,770 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericproc |
* @{ |
*/ |
/** |
* @file |
* @brief Thread management functions. |
*/ |
#include <proc/scheduler.h> |
#include <proc/thread.h> |
#include <proc/task.h> |
#include <proc/uarg.h> |
#include <mm/frame.h> |
#include <mm/page.h> |
#include <arch/asm.h> |
#include <arch/cycle.h> |
#include <arch.h> |
#include <synch/synch.h> |
#include <synch/spinlock.h> |
#include <synch/waitq.h> |
#include <synch/rwlock.h> |
#include <cpu.h> |
#include <func.h> |
#include <context.h> |
#include <adt/avl.h> |
#include <adt/list.h> |
#include <time/clock.h> |
#include <time/timeout.h> |
#include <config.h> |
#include <arch/interrupt.h> |
#include <smp/ipi.h> |
#include <arch/faddr.h> |
#include <atomic.h> |
#include <memstr.h> |
#include <print.h> |
#include <mm/slab.h> |
#include <debug.h> |
#include <main/uinit.h> |
#include <syscall/copy.h> |
#include <errno.h> |
#include <console/klog.h> |
/** Thread states */ |
char *thread_states[] = { |
"Invalid", |
"Running", |
"Sleeping", |
"Ready", |
"Entering", |
"Exiting", |
"Lingering" |
}; |
/** Lock protecting the threads_tree AVL tree. |
* |
* For locking rules, see declaration thereof. |
*/ |
SPINLOCK_INITIALIZE(threads_lock); |
/** ALV tree of all threads. |
* |
* When a thread is found in the threads_tree AVL tree, it is guaranteed to |
* exist as long as the threads_lock is held. |
*/ |
avltree_t threads_tree; |
SPINLOCK_INITIALIZE(tidlock); |
thread_id_t last_tid = 0; |
static slab_cache_t *thread_slab; |
#ifdef ARCH_HAS_FPU |
slab_cache_t *fpu_context_slab; |
#endif |
/** Thread wrapper. |
* |
* This wrapper is provided to ensure that every thread makes a call to |
* thread_exit() when its implementing function returns. |
* |
* interrupts_disable() is assumed. |
* |
*/ |
static void cushion(void) |
{ |
void (*f)(void *) = THREAD->thread_code; |
void *arg = THREAD->thread_arg; |
THREAD->last_cycle = get_cycle(); |
/* This is where each thread wakes up after its creation */ |
spinlock_unlock(&THREAD->lock); |
interrupts_enable(); |
f(arg); |
/* Accumulate accounting to the task */ |
ipl_t ipl = interrupts_disable(); |
spinlock_lock(&THREAD->lock); |
if (!THREAD->uncounted) { |
thread_update_accounting(); |
uint64_t cycles = THREAD->cycles; |
THREAD->cycles = 0; |
spinlock_unlock(&THREAD->lock); |
spinlock_lock(&TASK->lock); |
TASK->cycles += cycles; |
spinlock_unlock(&TASK->lock); |
} else |
spinlock_unlock(&THREAD->lock); |
interrupts_restore(ipl); |
thread_exit(); |
/* not reached */ |
} |
/** Initialization and allocation for thread_t structure */ |
static int thr_constructor(void *obj, int kmflags) |
{ |
thread_t *t = (thread_t *) obj; |
spinlock_initialize(&t->lock, "thread_t_lock"); |
link_initialize(&t->rq_link); |
link_initialize(&t->wq_link); |
link_initialize(&t->th_link); |
/* call the architecture-specific part of the constructor */ |
thr_constructor_arch(t); |
#ifdef ARCH_HAS_FPU |
#ifdef CONFIG_FPU_LAZY |
t->saved_fpu_context = NULL; |
#else |
t->saved_fpu_context = slab_alloc(fpu_context_slab, kmflags); |
if (!t->saved_fpu_context) |
return -1; |
#endif |
#endif |
t->kstack = (uint8_t *) frame_alloc(STACK_FRAMES, FRAME_KA | kmflags); |
if (!t->kstack) { |
#ifdef ARCH_HAS_FPU |
if (t->saved_fpu_context) |
slab_free(fpu_context_slab, t->saved_fpu_context); |
#endif |
return -1; |
} |
return 0; |
} |
/** Destruction of thread_t object */ |
static int thr_destructor(void *obj) |
{ |
thread_t *t = (thread_t *) obj; |
/* call the architecture-specific part of the destructor */ |
thr_destructor_arch(t); |
frame_free(KA2PA(t->kstack)); |
#ifdef ARCH_HAS_FPU |
if (t->saved_fpu_context) |
slab_free(fpu_context_slab, t->saved_fpu_context); |
#endif |
return 1; /* One page freed */ |
} |
/** Initialize threads |
* |
* Initialize kernel threads support. |
* |
*/ |
void thread_init(void) |
{ |
THREAD = NULL; |
atomic_set(&nrdy,0); |
thread_slab = slab_cache_create("thread_slab", sizeof(thread_t), 0, |
thr_constructor, thr_destructor, 0); |
#ifdef ARCH_HAS_FPU |
fpu_context_slab = slab_cache_create("fpu_slab", sizeof(fpu_context_t), |
FPU_CONTEXT_ALIGN, NULL, NULL, 0); |
#endif |
avltree_create(&threads_tree); |
} |
/** Make thread ready |
* |
* Switch thread t to the ready state. |
* |
* @param t Thread to make ready. |
* |
*/ |
void thread_ready(thread_t *t) |
{ |
cpu_t *cpu; |
runq_t *r; |
ipl_t ipl; |
int i, avg; |
ipl = interrupts_disable(); |
spinlock_lock(&t->lock); |
ASSERT(!(t->state == Ready)); |
i = (t->priority < RQ_COUNT - 1) ? ++t->priority : t->priority; |
cpu = CPU; |
if (t->flags & THREAD_FLAG_WIRED) { |
ASSERT(t->cpu != NULL); |
cpu = t->cpu; |
} |
t->state = Ready; |
spinlock_unlock(&t->lock); |
/* |
* Append t to respective ready queue on respective processor. |
*/ |
r = &cpu->rq[i]; |
spinlock_lock(&r->lock); |
list_append(&t->rq_link, &r->rq_head); |
r->n++; |
spinlock_unlock(&r->lock); |
atomic_inc(&nrdy); |
avg = atomic_get(&nrdy) / config.cpu_active; |
atomic_inc(&cpu->nrdy); |
interrupts_restore(ipl); |
} |
/** Create new thread |
* |
* Create a new thread. |
* |
* @param func Thread's implementing function. |
* @param arg Thread's implementing function argument. |
* @param task Task to which the thread belongs. |
* @param flags Thread flags. |
* @param name Symbolic name. |
* @param uncounted Thread's accounting doesn't affect accumulated task |
* accounting. |
* |
* @return New thread's structure on success, NULL on failure. |
* |
*/ |
thread_t *thread_create(void (* func)(void *), void *arg, task_t *task, |
int flags, char *name, bool uncounted) |
{ |
thread_t *t; |
ipl_t ipl; |
t = (thread_t *) slab_alloc(thread_slab, 0); |
if (!t) |
return NULL; |
/* Not needed, but good for debugging */ |
memsetb((uintptr_t) t->kstack, THREAD_STACK_SIZE * 1 << STACK_FRAMES, |
0); |
ipl = interrupts_disable(); |
spinlock_lock(&tidlock); |
t->tid = ++last_tid; |
spinlock_unlock(&tidlock); |
interrupts_restore(ipl); |
context_save(&t->saved_context); |
context_set(&t->saved_context, FADDR(cushion), (uintptr_t) t->kstack, |
THREAD_STACK_SIZE); |
the_initialize((the_t *) t->kstack); |
ipl = interrupts_disable(); |
t->saved_context.ipl = interrupts_read(); |
interrupts_restore(ipl); |
memcpy(t->name, name, THREAD_NAME_BUFLEN); |
t->thread_code = func; |
t->thread_arg = arg; |
t->ticks = -1; |
t->cycles = 0; |
t->uncounted = uncounted; |
t->priority = -1; /* start in rq[0] */ |
t->cpu = NULL; |
t->flags = flags; |
t->state = Entering; |
t->call_me = NULL; |
t->call_me_with = NULL; |
timeout_initialize(&t->sleep_timeout); |
t->sleep_interruptible = false; |
t->sleep_queue = NULL; |
t->timeout_pending = 0; |
t->in_copy_from_uspace = false; |
t->in_copy_to_uspace = false; |
t->interrupted = false; |
t->detached = false; |
waitq_initialize(&t->join_wq); |
t->rwlock_holder_type = RWLOCK_NONE; |
t->task = task; |
t->fpu_context_exists = 0; |
t->fpu_context_engaged = 0; |
avltree_node_initialize(&t->threads_tree_node); |
t->threads_tree_node.key = (uintptr_t) t; |
/* might depend on previous initialization */ |
thread_create_arch(t); |
if (!(flags & THREAD_FLAG_NOATTACH)) |
thread_attach(t, task); |
return t; |
} |
/** Destroy thread memory structure |
* |
* Detach thread from all queues, cpus etc. and destroy it. |
* |
* Assume thread->lock is held!! |
*/ |
void thread_destroy(thread_t *t) |
{ |
ASSERT(t->state == Exiting || t->state == Lingering); |
ASSERT(t->task); |
ASSERT(t->cpu); |
spinlock_lock(&t->cpu->lock); |
if (t->cpu->fpu_owner == t) |
t->cpu->fpu_owner = NULL; |
spinlock_unlock(&t->cpu->lock); |
spinlock_unlock(&t->lock); |
spinlock_lock(&threads_lock); |
avltree_delete(&threads_tree, &t->threads_tree_node); |
spinlock_unlock(&threads_lock); |
/* |
* Detach from the containing task. |
*/ |
spinlock_lock(&t->task->lock); |
list_remove(&t->th_link); |
spinlock_unlock(&t->task->lock); |
/* |
* t is guaranteed to be the very last thread of its task. |
* It is safe to destroy the task. |
*/ |
if (atomic_predec(&t->task->refcount) == 0) |
task_destroy(t->task); |
slab_free(thread_slab, t); |
} |
/** Make the thread visible to the system. |
* |
* Attach the thread structure to the current task and make it visible in the |
* threads_tree. |
* |
* @param t Thread to be attached to the task. |
* @param task Task to which the thread is to be attached. |
*/ |
void thread_attach(thread_t *t, task_t *task) |
{ |
ipl_t ipl; |
/* |
* Attach to the current task. |
*/ |
ipl = interrupts_disable(); |
spinlock_lock(&task->lock); |
atomic_inc(&task->refcount); |
atomic_inc(&task->lifecount); |
list_append(&t->th_link, &task->th_head); |
spinlock_unlock(&task->lock); |
/* |
* Register this thread in the system-wide list. |
*/ |
spinlock_lock(&threads_lock); |
avltree_insert(&threads_tree, &t->threads_tree_node); |
spinlock_unlock(&threads_lock); |
interrupts_restore(ipl); |
} |
/** Terminate thread. |
* |
* End current thread execution and switch it to the exiting state. All pending |
* timeouts are executed. |
*/ |
void thread_exit(void) |
{ |
ipl_t ipl; |
if (atomic_predec(&TASK->lifecount) == 0) { |
/* |
* We are the last thread in the task that still has not exited. |
* With the exception of the moment the task was created, new |
* threads can only be created by threads of the same task. |
* We are safe to perform cleanup. |
*/ |
if (THREAD->flags & THREAD_FLAG_USPACE) { |
ipc_cleanup(); |
futex_cleanup(); |
klog_printf("Cleanup of task %llu completed.", |
TASK->taskid); |
} |
} |
restart: |
ipl = interrupts_disable(); |
spinlock_lock(&THREAD->lock); |
if (THREAD->timeout_pending) { |
/* busy waiting for timeouts in progress */ |
spinlock_unlock(&THREAD->lock); |
interrupts_restore(ipl); |
goto restart; |
} |
THREAD->state = Exiting; |
spinlock_unlock(&THREAD->lock); |
scheduler(); |
/* Not reached */ |
while (1) |
; |
} |
/** Thread sleep |
* |
* Suspend execution of the current thread. |
* |
* @param sec Number of seconds to sleep. |
* |
*/ |
void thread_sleep(uint32_t sec) |
{ |
thread_usleep(sec * 1000000); |
} |
/** Wait for another thread to exit. |
* |
* @param t Thread to join on exit. |
* @param usec Timeout in microseconds. |
* @param flags Mode of operation. |
* |
* @return An error code from errno.h or an error code from synch.h. |
*/ |
int thread_join_timeout(thread_t *t, uint32_t usec, int flags) |
{ |
ipl_t ipl; |
int rc; |
if (t == THREAD) |
return EINVAL; |
/* |
* Since thread join can only be called once on an undetached thread, |
* the thread pointer is guaranteed to be still valid. |
*/ |
ipl = interrupts_disable(); |
spinlock_lock(&t->lock); |
ASSERT(!t->detached); |
spinlock_unlock(&t->lock); |
interrupts_restore(ipl); |
rc = waitq_sleep_timeout(&t->join_wq, usec, flags); |
return rc; |
} |
/** Detach thread. |
* |
* Mark the thread as detached, if the thread is already in the Lingering |
* state, deallocate its resources. |
* |
* @param t Thread to be detached. |
*/ |
void thread_detach(thread_t *t) |
{ |
ipl_t ipl; |
/* |
* Since the thread is expected not to be already detached, |
* pointer to it must be still valid. |
*/ |
ipl = interrupts_disable(); |
spinlock_lock(&t->lock); |
ASSERT(!t->detached); |
if (t->state == Lingering) { |
thread_destroy(t); /* unlocks &t->lock */ |
interrupts_restore(ipl); |
return; |
} else { |
t->detached = true; |
} |
spinlock_unlock(&t->lock); |
interrupts_restore(ipl); |
} |
/** Thread usleep |
* |
* Suspend execution of the current thread. |
* |
* @param usec Number of microseconds to sleep. |
* |
*/ |
void thread_usleep(uint32_t usec) |
{ |
waitq_t wq; |
waitq_initialize(&wq); |
(void) waitq_sleep_timeout(&wq, usec, SYNCH_FLAGS_NON_BLOCKING); |
} |
/** Register thread out-of-context invocation |
* |
* Register a function and its argument to be executed |
* on next context switch to the current thread. |
* |
* @param call_me Out-of-context function. |
* @param call_me_with Out-of-context function argument. |
* |
*/ |
void thread_register_call_me(void (* call_me)(void *), void *call_me_with) |
{ |
ipl_t ipl; |
ipl = interrupts_disable(); |
spinlock_lock(&THREAD->lock); |
THREAD->call_me = call_me; |
THREAD->call_me_with = call_me_with; |
spinlock_unlock(&THREAD->lock); |
interrupts_restore(ipl); |
} |
static bool thread_walker(avltree_node_t *node, void *arg) |
{ |
thread_t *t; |
t = avltree_get_instance(node, thread_t, threads_tree_node); |
uint64_t cycles; |
char suffix; |
order(t->cycles, &cycles, &suffix); |
if (sizeof(void *) == 4) |
printf("%-6llu %-10s %#10zx %-8s %#10zx %-3ld %#10zx %#10zx %9llu%c ", |
t->tid, t->name, t, thread_states[t->state], t->task, |
t->task->context, t->thread_code, t->kstack, cycles, suffix); |
else |
printf("%-6llu %-10s %#18zx %-8s %#18zx %-3ld %#18zx %#18zx %9llu%c ", |
t->tid, t->name, t, thread_states[t->state], t->task, |
t->task->context, t->thread_code, t->kstack, cycles, suffix); |
if (t->cpu) |
printf("%-4zd", t->cpu->id); |
else |
printf("none"); |
if (t->state == Sleeping) { |
if (sizeof(uintptr_t) == 4) |
printf(" %#10zx", t->sleep_queue); |
else |
printf(" %#18zx", t->sleep_queue); |
} |
printf("\n"); |
return true; |
} |
/** Print list of threads debug info */ |
void thread_print_list(void) |
{ |
ipl_t ipl; |
/* Messing with thread structures, avoid deadlock */ |
ipl = interrupts_disable(); |
spinlock_lock(&threads_lock); |
if (sizeof(uintptr_t) == 4) { |
printf("tid name address state task " |
"ctx code stack cycles cpu " |
"waitqueue\n"); |
printf("------ ---------- ---------- -------- ---------- " |
"--- ---------- ---------- ---------- ---- " |
"----------\n"); |
} else { |
printf("tid name address state task " |
"ctx code stack cycles cpu " |
"waitqueue\n"); |
printf("------ ---------- ------------------ -------- ------------------ " |
"--- ------------------ ------------------ ---------- ---- " |
"------------------\n"); |
} |
avltree_walk(&threads_tree, thread_walker, NULL); |
spinlock_unlock(&threads_lock); |
interrupts_restore(ipl); |
} |
/** Check whether thread exists. |
* |
* Note that threads_lock must be already held and |
* interrupts must be already disabled. |
* |
* @param t Pointer to thread. |
* |
* @return True if thread t is known to the system, false otherwise. |
*/ |
bool thread_exists(thread_t *t) |
{ |
avltree_node_t *node; |
node = avltree_search(&threads_tree, (avltree_key_t) ((uintptr_t) t)); |
return node != NULL; |
} |
/** Update accounting of current thread. |
* |
* Note that thread_lock on THREAD must be already held and |
* interrupts must be already disabled. |
* |
*/ |
void thread_update_accounting(void) |
{ |
uint64_t time = get_cycle(); |
THREAD->cycles += time - THREAD->last_cycle; |
THREAD->last_cycle = time; |
} |
/** Process syscall to create new thread. |
* |
*/ |
unative_t sys_thread_create(uspace_arg_t *uspace_uarg, char *uspace_name, |
thread_id_t *uspace_thread_id) |
{ |
thread_t *t; |
char namebuf[THREAD_NAME_BUFLEN]; |
uspace_arg_t *kernel_uarg; |
int rc; |
rc = copy_from_uspace(namebuf, uspace_name, THREAD_NAME_BUFLEN); |
if (rc != 0) |
return (unative_t) rc; |
/* |
* In case of failure, kernel_uarg will be deallocated in this function. |
* In case of success, kernel_uarg will be freed in uinit(). |
*/ |
kernel_uarg = (uspace_arg_t *) malloc(sizeof(uspace_arg_t), 0); |
rc = copy_from_uspace(kernel_uarg, uspace_uarg, sizeof(uspace_arg_t)); |
if (rc != 0) { |
free(kernel_uarg); |
return (unative_t) rc; |
} |
t = thread_create(uinit, kernel_uarg, TASK, |
THREAD_FLAG_USPACE | THREAD_FLAG_NOATTACH, namebuf, false); |
if (t) { |
if (uspace_thread_id != NULL) { |
int rc; |
rc = copy_to_uspace(uspace_thread_id, &t->tid, |
sizeof(t->tid)); |
if (rc != 0) { |
/* |
* We have encountered a failure, but the thread |
* has already been created. We need to undo its |
* creation now. |
*/ |
/* |
* The new thread structure is initialized, but |
* is still not visible to the system. |
* We can safely deallocate it. |
*/ |
slab_free(thread_slab, t); |
free(kernel_uarg); |
return (unative_t) rc; |
} |
} |
thread_attach(t, TASK); |
thread_ready(t); |
return 0; |
} else |
free(kernel_uarg); |
return (unative_t) ENOMEM; |
} |
/** Process syscall to terminate thread. |
* |
*/ |
unative_t sys_thread_exit(int uspace_status) |
{ |
thread_exit(); |
/* Unreachable */ |
return 0; |
} |
/** Syscall for getting TID. |
* |
* @param uspace_thread_id Userspace address of 8-byte buffer where to store |
* current thread ID. |
* |
* @return 0 on success or an error code from @ref errno.h. |
*/ |
unative_t sys_thread_get_id(thread_id_t *uspace_thread_id) |
{ |
/* |
* No need to acquire lock on THREAD because tid |
* remains constant for the lifespan of the thread. |
*/ |
return (unative_t) copy_to_uspace(uspace_thread_id, &THREAD->tid, |
sizeof(THREAD->tid)); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/proc/scheduler.c |
---|
0,0 → 1,739 |
/* |
* Copyright (c) 2001-2007 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericproc |
* @{ |
*/ |
/** |
* @file |
* @brief Scheduler and load balancing. |
* |
* This file contains the scheduler and kcpulb kernel thread which |
* performs load-balancing of per-CPU run queues. |
*/ |
#include <proc/scheduler.h> |
#include <proc/thread.h> |
#include <proc/task.h> |
#include <mm/frame.h> |
#include <mm/page.h> |
#include <mm/as.h> |
#include <time/timeout.h> |
#include <time/delay.h> |
#include <arch/asm.h> |
#include <arch/faddr.h> |
#include <arch/cycle.h> |
#include <atomic.h> |
#include <synch/spinlock.h> |
#include <config.h> |
#include <context.h> |
#include <fpu_context.h> |
#include <func.h> |
#include <arch.h> |
#include <adt/list.h> |
#include <panic.h> |
#include <cpu.h> |
#include <print.h> |
#include <debug.h> |
static void before_task_runs(void); |
static void before_thread_runs(void); |
static void after_thread_ran(void); |
static void scheduler_separated_stack(void); |
atomic_t nrdy; /**< Number of ready threads in the system. */ |
/** Carry out actions before new task runs. */ |
void before_task_runs(void) |
{ |
before_task_runs_arch(); |
} |
/** Take actions before new thread runs. |
* |
* Perform actions that need to be |
* taken before the newly selected |
* tread is passed control. |
* |
* THREAD->lock is locked on entry |
* |
*/ |
void before_thread_runs(void) |
{ |
before_thread_runs_arch(); |
#ifdef CONFIG_FPU_LAZY |
if(THREAD == CPU->fpu_owner) |
fpu_enable(); |
else |
fpu_disable(); |
#else |
fpu_enable(); |
if (THREAD->fpu_context_exists) |
fpu_context_restore(THREAD->saved_fpu_context); |
else { |
fpu_init(); |
THREAD->fpu_context_exists = 1; |
} |
#endif |
} |
/** Take actions after THREAD had run. |
* |
* Perform actions that need to be |
* taken after the running thread |
* had been preempted by the scheduler. |
* |
* THREAD->lock is locked on entry |
* |
*/ |
void after_thread_ran(void) |
{ |
after_thread_ran_arch(); |
} |
#ifdef CONFIG_FPU_LAZY |
void scheduler_fpu_lazy_request(void) |
{ |
restart: |
fpu_enable(); |
spinlock_lock(&CPU->lock); |
/* Save old context */ |
if (CPU->fpu_owner != NULL) { |
spinlock_lock(&CPU->fpu_owner->lock); |
fpu_context_save(CPU->fpu_owner->saved_fpu_context); |
/* don't prevent migration */ |
CPU->fpu_owner->fpu_context_engaged = 0; |
spinlock_unlock(&CPU->fpu_owner->lock); |
CPU->fpu_owner = NULL; |
} |
spinlock_lock(&THREAD->lock); |
if (THREAD->fpu_context_exists) { |
fpu_context_restore(THREAD->saved_fpu_context); |
} else { |
/* Allocate FPU context */ |
if (!THREAD->saved_fpu_context) { |
/* Might sleep */ |
spinlock_unlock(&THREAD->lock); |
spinlock_unlock(&CPU->lock); |
THREAD->saved_fpu_context = |
(fpu_context_t *) slab_alloc(fpu_context_slab, 0); |
/* We may have switched CPUs during slab_alloc */ |
goto restart; |
} |
fpu_init(); |
THREAD->fpu_context_exists = 1; |
} |
CPU->fpu_owner = THREAD; |
THREAD->fpu_context_engaged = 1; |
spinlock_unlock(&THREAD->lock); |
spinlock_unlock(&CPU->lock); |
} |
#endif |
/** Initialize scheduler |
* |
* Initialize kernel scheduler. |
* |
*/ |
void scheduler_init(void) |
{ |
} |
/** Get thread to be scheduled |
* |
* Get the optimal thread to be scheduled |
* according to thread accounting and scheduler |
* policy. |
* |
* @return Thread to be scheduled. |
* |
*/ |
static thread_t *find_best_thread(void) |
{ |
thread_t *t; |
runq_t *r; |
int i; |
ASSERT(CPU != NULL); |
loop: |
interrupts_enable(); |
if (atomic_get(&CPU->nrdy) == 0) { |
/* |
* For there was nothing to run, the CPU goes to sleep |
* until a hardware interrupt or an IPI comes. |
* This improves energy saving and hyperthreading. |
*/ |
/* |
* An interrupt might occur right now and wake up a thread. |
* In such case, the CPU will continue to go to sleep |
* even though there is a runnable thread. |
*/ |
cpu_sleep(); |
goto loop; |
} |
interrupts_disable(); |
for (i = 0; i < RQ_COUNT; i++) { |
r = &CPU->rq[i]; |
spinlock_lock(&r->lock); |
if (r->n == 0) { |
/* |
* If this queue is empty, try a lower-priority queue. |
*/ |
spinlock_unlock(&r->lock); |
continue; |
} |
atomic_dec(&CPU->nrdy); |
atomic_dec(&nrdy); |
r->n--; |
/* |
* Take the first thread from the queue. |
*/ |
t = list_get_instance(r->rq_head.next, thread_t, rq_link); |
list_remove(&t->rq_link); |
spinlock_unlock(&r->lock); |
spinlock_lock(&t->lock); |
t->cpu = CPU; |
t->ticks = us2ticks((i + 1) * 10000); |
t->priority = i; /* correct rq index */ |
/* |
* Clear the THREAD_FLAG_STOLEN flag so that t can be migrated |
* when load balancing needs emerge. |
*/ |
t->flags &= ~THREAD_FLAG_STOLEN; |
spinlock_unlock(&t->lock); |
return t; |
} |
goto loop; |
} |
/** Prevent rq starvation |
* |
* Prevent low priority threads from starving in rq's. |
* |
* When the function decides to relink rq's, it reconnects |
* respective pointers so that in result threads with 'pri' |
* greater or equal start are moved to a higher-priority queue. |
* |
* @param start Threshold priority. |
* |
*/ |
static void relink_rq(int start) |
{ |
link_t head; |
runq_t *r; |
int i, n; |
list_initialize(&head); |
spinlock_lock(&CPU->lock); |
if (CPU->needs_relink > NEEDS_RELINK_MAX) { |
for (i = start; i < RQ_COUNT - 1; i++) { |
/* remember and empty rq[i + 1] */ |
r = &CPU->rq[i + 1]; |
spinlock_lock(&r->lock); |
list_concat(&head, &r->rq_head); |
n = r->n; |
r->n = 0; |
spinlock_unlock(&r->lock); |
/* append rq[i + 1] to rq[i] */ |
r = &CPU->rq[i]; |
spinlock_lock(&r->lock); |
list_concat(&r->rq_head, &head); |
r->n += n; |
spinlock_unlock(&r->lock); |
} |
CPU->needs_relink = 0; |
} |
spinlock_unlock(&CPU->lock); |
} |
/** The scheduler |
* |
* The thread scheduling procedure. |
* Passes control directly to |
* scheduler_separated_stack(). |
* |
*/ |
void scheduler(void) |
{ |
volatile ipl_t ipl; |
ASSERT(CPU != NULL); |
ipl = interrupts_disable(); |
if (atomic_get(&haltstate)) |
halt(); |
if (THREAD) { |
spinlock_lock(&THREAD->lock); |
/* Update thread accounting */ |
THREAD->cycles += get_cycle() - THREAD->last_cycle; |
#ifndef CONFIG_FPU_LAZY |
fpu_context_save(THREAD->saved_fpu_context); |
#endif |
if (!context_save(&THREAD->saved_context)) { |
/* |
* This is the place where threads leave scheduler(); |
*/ |
/* Save current CPU cycle */ |
THREAD->last_cycle = get_cycle(); |
spinlock_unlock(&THREAD->lock); |
interrupts_restore(THREAD->saved_context.ipl); |
return; |
} |
/* |
* Interrupt priority level of preempted thread is recorded |
* here to facilitate scheduler() invocations from |
* interrupts_disable()'d code (e.g. waitq_sleep_timeout()). |
*/ |
THREAD->saved_context.ipl = ipl; |
} |
/* |
* Through the 'THE' structure, we keep track of THREAD, TASK, CPU, VM |
* and preemption counter. At this point THE could be coming either |
* from THREAD's or CPU's stack. |
*/ |
the_copy(THE, (the_t *) CPU->stack); |
/* |
* We may not keep the old stack. |
* Reason: If we kept the old stack and got blocked, for instance, in |
* find_best_thread(), the old thread could get rescheduled by another |
* CPU and overwrite the part of its own stack that was also used by |
* the scheduler on this CPU. |
* |
* Moreover, we have to bypass the compiler-generated POP sequence |
* which is fooled by SP being set to the very top of the stack. |
* Therefore the scheduler() function continues in |
* scheduler_separated_stack(). |
*/ |
context_save(&CPU->saved_context); |
context_set(&CPU->saved_context, FADDR(scheduler_separated_stack), |
(uintptr_t) CPU->stack, CPU_STACK_SIZE); |
context_restore(&CPU->saved_context); |
/* not reached */ |
} |
/** Scheduler stack switch wrapper |
* |
* Second part of the scheduler() function |
* using new stack. Handling the actual context |
* switch to a new thread. |
* |
* Assume THREAD->lock is held. |
*/ |
void scheduler_separated_stack(void) |
{ |
int priority; |
DEADLOCK_PROBE_INIT(p_joinwq); |
ASSERT(CPU != NULL); |
if (THREAD) { |
/* must be run after the switch to scheduler stack */ |
after_thread_ran(); |
switch (THREAD->state) { |
case Running: |
spinlock_unlock(&THREAD->lock); |
thread_ready(THREAD); |
break; |
case Exiting: |
repeat: |
if (THREAD->detached) { |
thread_destroy(THREAD); |
} else { |
/* |
* The thread structure is kept allocated until |
* somebody calls thread_detach() on it. |
*/ |
if (!spinlock_trylock(&THREAD->join_wq.lock)) { |
/* |
* Avoid deadlock. |
*/ |
spinlock_unlock(&THREAD->lock); |
delay(HZ); |
spinlock_lock(&THREAD->lock); |
DEADLOCK_PROBE(p_joinwq, |
DEADLOCK_THRESHOLD); |
goto repeat; |
} |
_waitq_wakeup_unsafe(&THREAD->join_wq, |
WAKEUP_FIRST); |
spinlock_unlock(&THREAD->join_wq.lock); |
THREAD->state = Lingering; |
spinlock_unlock(&THREAD->lock); |
} |
break; |
case Sleeping: |
/* |
* Prefer the thread after it's woken up. |
*/ |
THREAD->priority = -1; |
/* |
* We need to release wq->lock which we locked in |
* waitq_sleep(). Address of wq->lock is kept in |
* THREAD->sleep_queue. |
*/ |
spinlock_unlock(&THREAD->sleep_queue->lock); |
/* |
* Check for possible requests for out-of-context |
* invocation. |
*/ |
if (THREAD->call_me) { |
THREAD->call_me(THREAD->call_me_with); |
THREAD->call_me = NULL; |
THREAD->call_me_with = NULL; |
} |
spinlock_unlock(&THREAD->lock); |
break; |
default: |
/* |
* Entering state is unexpected. |
*/ |
panic("tid%llu: unexpected state %s\n", THREAD->tid, |
thread_states[THREAD->state]); |
break; |
} |
THREAD = NULL; |
} |
THREAD = find_best_thread(); |
spinlock_lock(&THREAD->lock); |
priority = THREAD->priority; |
spinlock_unlock(&THREAD->lock); |
relink_rq(priority); |
/* |
* If both the old and the new task are the same, lots of work is |
* avoided. |
*/ |
if (TASK != THREAD->task) { |
as_t *as1 = NULL; |
as_t *as2; |
if (TASK) { |
spinlock_lock(&TASK->lock); |
as1 = TASK->as; |
spinlock_unlock(&TASK->lock); |
} |
spinlock_lock(&THREAD->task->lock); |
as2 = THREAD->task->as; |
spinlock_unlock(&THREAD->task->lock); |
/* |
* Note that it is possible for two tasks to share one address |
* space. |
*/ |
if (as1 != as2) { |
/* |
* Both tasks and address spaces are different. |
* Replace the old one with the new one. |
*/ |
as_switch(as1, as2); |
} |
TASK = THREAD->task; |
before_task_runs(); |
} |
spinlock_lock(&THREAD->lock); |
THREAD->state = Running; |
#ifdef SCHEDULER_VERBOSE |
printf("cpu%d: tid %llu (priority=%d, ticks=%llu, nrdy=%ld)\n", |
CPU->id, THREAD->tid, THREAD->priority, THREAD->ticks, |
atomic_get(&CPU->nrdy)); |
#endif |
/* |
* Some architectures provide late kernel PA2KA(identity) |
* mapping in a page fault handler. However, the page fault |
* handler uses the kernel stack of the running thread and |
* therefore cannot be used to map it. The kernel stack, if |
* necessary, is to be mapped in before_thread_runs(). This |
* function must be executed before the switch to the new stack. |
*/ |
before_thread_runs(); |
/* |
* Copy the knowledge of CPU, TASK, THREAD and preemption counter to |
* thread's stack. |
*/ |
the_copy(THE, (the_t *) THREAD->kstack); |
context_restore(&THREAD->saved_context); |
/* not reached */ |
} |
#ifdef CONFIG_SMP |
/** Load balancing thread |
* |
* SMP load balancing thread, supervising thread supplies |
* for the CPU it's wired to. |
* |
* @param arg Generic thread argument (unused). |
* |
*/ |
void kcpulb(void *arg) |
{ |
thread_t *t; |
int count, average, j, k = 0; |
unsigned int i; |
ipl_t ipl; |
/* |
* Detach kcpulb as nobody will call thread_join_timeout() on it. |
*/ |
thread_detach(THREAD); |
loop: |
/* |
* Work in 1s intervals. |
*/ |
thread_sleep(1); |
not_satisfied: |
/* |
* Calculate the number of threads that will be migrated/stolen from |
* other CPU's. Note that situation can have changed between two |
* passes. Each time get the most up to date counts. |
*/ |
average = atomic_get(&nrdy) / config.cpu_active + 1; |
count = average - atomic_get(&CPU->nrdy); |
if (count <= 0) |
goto satisfied; |
/* |
* Searching least priority queues on all CPU's first and most priority |
* queues on all CPU's last. |
*/ |
for (j = RQ_COUNT - 1; j >= 0; j--) { |
for (i = 0; i < config.cpu_active; i++) { |
link_t *l; |
runq_t *r; |
cpu_t *cpu; |
cpu = &cpus[(i + k) % config.cpu_active]; |
/* |
* Not interested in ourselves. |
* Doesn't require interrupt disabling for kcpulb has |
* THREAD_FLAG_WIRED. |
*/ |
if (CPU == cpu) |
continue; |
if (atomic_get(&cpu->nrdy) <= average) |
continue; |
ipl = interrupts_disable(); |
r = &cpu->rq[j]; |
spinlock_lock(&r->lock); |
if (r->n == 0) { |
spinlock_unlock(&r->lock); |
interrupts_restore(ipl); |
continue; |
} |
t = NULL; |
l = r->rq_head.prev; /* search rq from the back */ |
while (l != &r->rq_head) { |
t = list_get_instance(l, thread_t, rq_link); |
/* |
* We don't want to steal CPU-wired threads |
* neither threads already stolen. The latter |
* prevents threads from migrating between CPU's |
* without ever being run. We don't want to |
* steal threads whose FPU context is still in |
* CPU. |
*/ |
spinlock_lock(&t->lock); |
if ((!(t->flags & (THREAD_FLAG_WIRED | |
THREAD_FLAG_STOLEN))) && |
(!(t->fpu_context_engaged))) { |
/* |
* Remove t from r. |
*/ |
spinlock_unlock(&t->lock); |
atomic_dec(&cpu->nrdy); |
atomic_dec(&nrdy); |
r->n--; |
list_remove(&t->rq_link); |
break; |
} |
spinlock_unlock(&t->lock); |
l = l->prev; |
t = NULL; |
} |
spinlock_unlock(&r->lock); |
if (t) { |
/* |
* Ready t on local CPU |
*/ |
spinlock_lock(&t->lock); |
#ifdef KCPULB_VERBOSE |
printf("kcpulb%d: TID %llu -> cpu%d, nrdy=%ld, " |
"avg=%nd\n", CPU->id, t->tid, CPU->id, |
atomic_get(&CPU->nrdy), |
atomic_get(&nrdy) / config.cpu_active); |
#endif |
t->flags |= THREAD_FLAG_STOLEN; |
t->state = Entering; |
spinlock_unlock(&t->lock); |
thread_ready(t); |
interrupts_restore(ipl); |
if (--count == 0) |
goto satisfied; |
/* |
* We are not satisfied yet, focus on another |
* CPU next time. |
*/ |
k++; |
continue; |
} |
interrupts_restore(ipl); |
} |
} |
if (atomic_get(&CPU->nrdy)) { |
/* |
* Be a little bit light-weight and let migrated threads run. |
*/ |
scheduler(); |
} else { |
/* |
* We failed to migrate a single thread. |
* Give up this turn. |
*/ |
goto loop; |
} |
goto not_satisfied; |
satisfied: |
goto loop; |
} |
#endif /* CONFIG_SMP */ |
/** Print information about threads & scheduler queues */ |
void sched_print_list(void) |
{ |
ipl_t ipl; |
unsigned int cpu, i; |
runq_t *r; |
thread_t *t; |
link_t *cur; |
/* We are going to mess with scheduler structures, |
* let's not be interrupted */ |
ipl = interrupts_disable(); |
for (cpu = 0; cpu < config.cpu_count; cpu++) { |
if (!cpus[cpu].active) |
continue; |
spinlock_lock(&cpus[cpu].lock); |
printf("cpu%d: address=%p, nrdy=%ld, needs_relink=%ld\n", |
cpus[cpu].id, &cpus[cpu], atomic_get(&cpus[cpu].nrdy), |
cpus[cpu].needs_relink); |
for (i = 0; i < RQ_COUNT; i++) { |
r = &cpus[cpu].rq[i]; |
spinlock_lock(&r->lock); |
if (!r->n) { |
spinlock_unlock(&r->lock); |
continue; |
} |
printf("\trq[%d]: ", i); |
for (cur = r->rq_head.next; cur != &r->rq_head; |
cur = cur->next) { |
t = list_get_instance(cur, thread_t, rq_link); |
printf("%llu(%s) ", t->tid, |
thread_states[t->state]); |
} |
printf("\n"); |
spinlock_unlock(&r->lock); |
} |
spinlock_unlock(&cpus[cpu].lock); |
} |
interrupts_restore(ipl); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/proc/the.c |
---|
0,0 → 1,75 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericproc |
* @{ |
*/ |
/** |
* @file |
* @brief THE structure functions. |
* |
* This file contains functions to manage the THE structure. |
* The THE structure exists at the base address of every kernel |
* stack and carries information about current settings |
* (e.g. current CPU, current thread, task and address space |
* and current preemption counter). |
*/ |
#include <arch.h> |
/** Initialize THE structure |
* |
* Initialize THE structure passed as argument. |
* |
* @param the THE structure to be initialized. |
*/ |
void the_initialize(the_t *the) |
{ |
the->preemption_disabled = 0; |
the->cpu = NULL; |
the->thread = NULL; |
the->task = NULL; |
the->as = NULL; |
} |
/** Copy THE structure |
* |
* Copy the source THE structure to the destination THE structure. |
* |
* @param src The source THE structure. |
* @param dst The destination THE structure. |
*/ |
void the_copy(the_t *src, the_t *dst) |
{ |
*dst = *src; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/main/main.c |
---|
0,0 → 1,351 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup main |
* @{ |
*/ |
/** |
* @file |
* @brief Main initialization kernel function for all processors. |
* |
* During kernel boot, all processors, after architecture dependent |
* initialization, start executing code found in this file. After |
* bringing up all subsystems, control is passed to scheduler(). |
* |
* The bootstrap processor starts executing main_bsp() while |
* the application processors start executing main_ap(). |
* |
* @see scheduler() |
* @see main_bsp() |
* @see main_ap() |
*/ |
#include <arch/asm.h> |
#include <context.h> |
#include <print.h> |
#include <panic.h> |
#include <debug.h> |
#include <config.h> |
#include <time/clock.h> |
#include <time/timeout.h> |
#include <proc/scheduler.h> |
#include <proc/thread.h> |
#include <proc/task.h> |
#include <proc/tasklet.h> |
#include <main/kinit.h> |
#include <main/version.h> |
#include <console/kconsole.h> |
#include <cpu.h> |
#include <align.h> |
#include <interrupt.h> |
#include <mm/frame.h> |
#include <mm/page.h> |
#include <genarch/mm/page_pt.h> |
#include <mm/tlb.h> |
#include <mm/as.h> |
#include <mm/slab.h> |
#include <synch/waitq.h> |
#include <synch/futex.h> |
#include <arch/arch.h> |
#include <arch.h> |
#include <arch/faddr.h> |
#include <ipc/ipc.h> |
#include <macros.h> |
#include <adt/btree.h> |
#include <console/klog.h> |
#include <smp/smp.h> |
#include <ddi/ddi.h> |
/** Global configuration structure. */ |
config_t config; |
/** Initial user-space tasks */ |
init_t init = { |
.cnt = 0 |
}; |
/** Boot allocations. */ |
ballocs_t ballocs = { |
.base = NULL, |
.size = 0 |
}; |
context_t ctx; |
/* |
* These 'hardcoded' variables will be intialized by |
* the linker or the low level assembler code with |
* appropriate sizes and addresses. |
*/ |
/**< Virtual address of where the kernel is loaded. */ |
uintptr_t hardcoded_load_address = 0; |
/**< Size of the kernel code in bytes. */ |
size_t hardcoded_ktext_size = 0; |
/**< Size of the kernel data in bytes. */ |
size_t hardcoded_kdata_size = 0; |
/**< Lowest safe stack virtual address. */ |
uintptr_t stack_safe = 0; |
void main_bsp(void); |
void main_ap(void); |
/* |
* These two functions prevent stack from underflowing during the |
* kernel boot phase when SP is set to the very top of the reserved |
* space. The stack could get corrupted by a fooled compiler-generated |
* pop sequence otherwise. |
*/ |
static void main_bsp_separated_stack(void); |
#ifdef CONFIG_SMP |
static void main_ap_separated_stack(void); |
#endif |
#define CONFIG_STACK_SIZE ((1 << STACK_FRAMES) * STACK_SIZE) |
/** Main kernel routine for bootstrap CPU. |
* |
* Initializes the kernel by bootstrap CPU. |
* This function passes control directly to |
* main_bsp_separated_stack(). |
* |
* Assuming interrupts_disable(). |
* |
*/ |
void main_bsp(void) |
{ |
config.cpu_count = 1; |
config.cpu_active = 1; |
config.base = hardcoded_load_address; |
config.kernel_size = ALIGN_UP(hardcoded_ktext_size + |
hardcoded_kdata_size, PAGE_SIZE); |
config.stack_size = CONFIG_STACK_SIZE; |
/* Initialy the stack is placed just after the kernel */ |
config.stack_base = config.base + config.kernel_size; |
/* Avoid placing stack on top of init */ |
count_t i; |
for (i = 0; i < init.cnt; i++) { |
if (PA_overlaps(config.stack_base, config.stack_size, |
init.tasks[i].addr, init.tasks[i].size)) |
config.stack_base = ALIGN_UP(init.tasks[i].addr + |
init.tasks[i].size, config.stack_size); |
} |
/* Avoid placing stack on top of boot allocations. */ |
if (ballocs.size) { |
if (PA_overlaps(config.stack_base, config.stack_size, |
ballocs.base, ballocs.size)) |
config.stack_base = ALIGN_UP(ballocs.base + |
ballocs.size, PAGE_SIZE); |
} |
if (config.stack_base < stack_safe) |
config.stack_base = ALIGN_UP(stack_safe, PAGE_SIZE); |
context_save(&ctx); |
context_set(&ctx, FADDR(main_bsp_separated_stack), config.stack_base, |
THREAD_STACK_SIZE); |
context_restore(&ctx); |
/* not reached */ |
} |
/** Main kernel routine for bootstrap CPU using new stack. |
* |
* Second part of main_bsp(). |
* |
*/ |
void main_bsp_separated_stack(void) |
{ |
task_t *k; |
thread_t *t; |
count_t i; |
the_initialize(THE); |
/* |
* kconsole data structures must be initialized very early |
* because other subsystems will register their respective |
* commands. |
*/ |
kconsole_init(); |
/* |
* Exception handler initialization, before architecture |
* starts adding its own handlers |
*/ |
exc_init(); |
/* |
* Memory management subsystems initialization. |
*/ |
arch_pre_mm_init(); |
frame_init(); |
/* Initialize at least 1 memory segment big enough for slab to work. */ |
slab_cache_init(); |
btree_init(); |
as_init(); |
page_init(); |
tlb_init(); |
ddi_init(); |
tasklet_init(); |
arch_post_mm_init(); |
version_print(); |
printf("kernel: %.*p hardcoded_ktext_size=%zd KB, " |
"hardcoded_kdata_size=%zd KB\n", sizeof(uintptr_t) * 2, |
config.base, SIZE2KB(hardcoded_ktext_size), |
SIZE2KB(hardcoded_kdata_size)); |
printf("stack: %.*p size=%zd KB\n", sizeof(uintptr_t) * 2, |
config.stack_base, SIZE2KB(config.stack_size)); |
arch_pre_smp_init(); |
smp_init(); |
/* Slab must be initialized after we know the number of processors. */ |
slab_enable_cpucache(); |
printf("Detected %zu CPU(s), %llu MB free memory\n", |
config.cpu_count, SIZE2MB(zone_total_size())); |
cpu_init(); |
calibrate_delay_loop(); |
clock_counter_init(); |
timeout_init(); |
scheduler_init(); |
task_init(); |
thread_init(); |
futex_init(); |
klog_init(); |
if (init.cnt > 0) { |
for (i = 0; i < init.cnt; i++) |
printf("init[%zd].addr=%.*p, init[%zd].size=%zd\n", i, |
sizeof(uintptr_t) * 2, init.tasks[i].addr, i, |
init.tasks[i].size); |
} else |
printf("No init binaries found\n"); |
ipc_init(); |
/* |
* Create kernel task. |
*/ |
k = task_create(AS_KERNEL, "kernel"); |
if (!k) |
panic("can't create kernel task\n"); |
/* |
* Create the first thread. |
*/ |
t = thread_create(kinit, NULL, k, 0, "kinit", true); |
if (!t) |
panic("can't create kinit thread\n"); |
thread_ready(t); |
/* |
* This call to scheduler() will return to kinit, |
* starting the thread of kernel threads. |
*/ |
scheduler(); |
/* not reached */ |
} |
#ifdef CONFIG_SMP |
/** Main kernel routine for application CPUs. |
* |
* Executed by application processors, temporary stack |
* is at ctx.sp which was set during BSP boot. |
* This function passes control directly to |
* main_ap_separated_stack(). |
* |
* Assuming interrupts_disable()'d. |
* |
*/ |
void main_ap(void) |
{ |
/* |
* Incrementing the active CPU counter will guarantee that the |
* *_init() functions can find out that they need to |
* do initialization for AP only. |
*/ |
config.cpu_active++; |
/* |
* The THE structure is well defined because ctx.sp is used as stack. |
*/ |
the_initialize(THE); |
arch_pre_mm_init(); |
frame_init(); |
page_init(); |
tlb_init(); |
arch_post_mm_init(); |
cpu_init(); |
calibrate_delay_loop(); |
arch_post_cpu_init(); |
the_copy(THE, (the_t *) CPU->stack); |
/* |
* If we woke kmp up before we left the kernel stack, we could |
* collide with another CPU coming up. To prevent this, we |
* switch to this cpu's private stack prior to waking kmp up. |
*/ |
context_set(&CPU->saved_context, FADDR(main_ap_separated_stack), |
(uintptr_t) CPU->stack, CPU_STACK_SIZE); |
context_restore(&CPU->saved_context); |
/* not reached */ |
} |
/** Main kernel routine for application CPUs using new stack. |
* |
* Second part of main_ap(). |
* |
*/ |
void main_ap_separated_stack(void) |
{ |
/* |
* Configure timeouts for this cpu. |
*/ |
timeout_init(); |
waitq_wakeup(&ap_completion_wq, WAKEUP_FIRST); |
scheduler(); |
/* not reached */ |
} |
#endif /* CONFIG_SMP */ |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/main/version.c |
---|
0,0 → 1,64 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup main |
* @{ |
*/ |
/** @file |
*/ |
#include <main/version.h> |
#include <print.h> |
char *project = "SPARTAN kernel"; |
char *copyright = "Copyright (c) 2001-2008 HelenOS project"; |
char *release = RELEASE; |
char *name = NAME; |
char *arch = ARCH; |
#ifdef REVISION |
char *revision = ", revision " REVISION; |
#else |
char *revision = ""; |
#endif |
#ifdef TIMESTAMP |
char *timestamp = " on " TIMESTAMP; |
#else |
char *timestamp = ""; |
#endif |
/** Print version information. */ |
void version_print(void) |
{ |
printf("%s, release %s (%s)%s\nBuilt%s for %s\n%s\n", |
project, release, name, revision, timestamp, arch, copyright); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/main/uinit.c |
---|
0,0 → 1,80 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup main |
* @{ |
*/ |
/** |
* @file |
* @brief Userspace bootstrap thread. |
* |
* This file contains uinit kernel thread wich is used to start every |
* userspace thread including threads created by SYS_THREAD_CREATE syscall. |
* |
* @see SYS_THREAD_CREATE |
*/ |
#include <main/uinit.h> |
#include <arch/types.h> |
#include <proc/thread.h> |
#include <userspace.h> |
#include <mm/slab.h> |
#include <arch.h> |
/** Thread used to bring up userspace thread. |
* |
* @param arg Pointer to structure containing userspace entry and stack |
* addresses. |
*/ |
void uinit(void *arg) |
{ |
uspace_arg_t uarg; |
/* |
* So far, we don't have a use for joining userspace threads so we |
* immediately detach each uinit thread. If joining of userspace threads |
* is required, some userspace API based on the kernel mechanism will |
* have to be implemented. Moreover, garbage collecting of threads that |
* didn't detach themselves and nobody else joined them will have to be |
* deployed for the event of forceful task termination. |
*/ |
thread_detach(THREAD); |
uarg.uspace_entry = ((uspace_arg_t *) arg)->uspace_entry; |
uarg.uspace_stack = ((uspace_arg_t *) arg)->uspace_stack; |
uarg.uspace_uarg = ((uspace_arg_t *) arg)->uspace_uarg; |
uarg.uspace_thread_function = NULL; |
uarg.uspace_thread_arg = NULL; |
free((uspace_arg_t *) arg); |
userspace(&uarg); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/main/kinit.c |
---|
0,0 → 1,199 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup main |
* @{ |
*/ |
/** |
* @file |
* @brief Kernel initialization thread. |
* |
* This file contains kinit kernel thread which carries out |
* high level system initialization. |
* |
* This file is responsible for finishing SMP configuration |
* and creation of userspace init tasks. |
*/ |
#include <main/kinit.h> |
#include <config.h> |
#include <arch.h> |
#include <proc/scheduler.h> |
#include <proc/task.h> |
#include <proc/thread.h> |
#include <panic.h> |
#include <func.h> |
#include <cpu.h> |
#include <arch/asm.h> |
#include <mm/page.h> |
#include <arch/mm/page.h> |
#include <mm/as.h> |
#include <mm/frame.h> |
#include <print.h> |
#include <memstr.h> |
#include <console/console.h> |
#include <interrupt.h> |
#include <console/kconsole.h> |
#include <security/cap.h> |
#include <lib/rd.h> |
#include <ipc/ipc.h> |
#ifdef CONFIG_SMP |
#include <smp/smp.h> |
#endif /* CONFIG_SMP */ |
#include <synch/waitq.h> |
#include <synch/spinlock.h> |
/** Kernel initialization thread. |
* |
* kinit takes care of higher level kernel |
* initialization (i.e. thread creation, |
* userspace initialization etc.). |
* |
* @param arg Not used. |
*/ |
void kinit(void *arg) |
{ |
thread_t *t; |
/* |
* Detach kinit as nobody will call thread_join_timeout() on it. |
*/ |
thread_detach(THREAD); |
interrupts_disable(); |
#ifdef CONFIG_SMP |
if (config.cpu_count > 1) { |
waitq_initialize(&ap_completion_wq); |
/* |
* Create the kmp thread and wait for its completion. |
* cpu1 through cpuN-1 will come up consecutively and |
* not mess together with kcpulb threads. |
* Just a beautification. |
*/ |
if ((t = thread_create(kmp, NULL, TASK, THREAD_FLAG_WIRED, |
"kmp", true))) { |
spinlock_lock(&t->lock); |
t->cpu = &cpus[0]; |
spinlock_unlock(&t->lock); |
thread_ready(t); |
} else |
panic("thread_create/kmp\n"); |
thread_join(t); |
thread_detach(t); |
} |
#endif /* CONFIG_SMP */ |
/* |
* Now that all CPUs are up, we can report what we've found. |
*/ |
cpu_list(); |
#ifdef CONFIG_SMP |
if (config.cpu_count > 1) { |
count_t i; |
/* |
* For each CPU, create its load balancing thread. |
*/ |
for (i = 0; i < config.cpu_count; i++) { |
if ((t = thread_create(kcpulb, NULL, TASK, |
THREAD_FLAG_WIRED, "kcpulb", true))) { |
spinlock_lock(&t->lock); |
t->cpu = &cpus[i]; |
spinlock_unlock(&t->lock); |
thread_ready(t); |
} else |
panic("thread_create/kcpulb\n"); |
} |
} |
#endif /* CONFIG_SMP */ |
/* |
* At this point SMP, if present, is configured. |
*/ |
arch_post_smp_init(); |
/* |
* Create kernel console. |
*/ |
t = thread_create(kconsole, (void *) "kconsole", TASK, 0, "kconsole", false); |
if (t) |
thread_ready(t); |
else |
panic("thread_create/kconsole\n"); |
interrupts_enable(); |
count_t i; |
for (i = 0; i < init.cnt; i++) { |
/* |
* Run user tasks, load RAM disk images. |
*/ |
if (init.tasks[i].addr % FRAME_SIZE) { |
printf("init[%d].addr is not frame aligned", i); |
continue; |
} |
task_t *utask = task_run_program((void *) init.tasks[i].addr, |
"uspace"); |
if (utask) { |
/* |
* Set capabilities to init userspace tasks. |
*/ |
cap_set(utask, CAP_CAP | CAP_MEM_MANAGER | |
CAP_IO_MANAGER | CAP_PREEMPT_CONTROL | CAP_IRQ_REG); |
if (!ipc_phone_0) |
ipc_phone_0 = &utask->answerbox; |
} else { |
int rd = init_rd((rd_header *) init.tasks[i].addr, |
init.tasks[i].size); |
if (rd != RE_OK) |
printf("Init binary %zd not used, error code %d.\n", i, rd); |
} |
} |
if (!stdin) { |
while (1) { |
thread_sleep(1); |
printf("kinit... "); |
} |
} |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/main/shutdown.c |
---|
0,0 → 1,53 |
/* |
* Copyright (c) 2007 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup main |
* @{ |
*/ |
/** |
* @file |
* @brief Shutdown procedures. |
*/ |
#include <arch.h> |
#include <print.h> |
void reboot(void) |
{ |
task_done(); |
#ifdef CONFIG_DEBUG |
printf("Rebooting the system\n"); |
#endif |
arch_reboot(); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/synch/futex.c |
---|
0,0 → 1,345 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sync |
* @{ |
*/ |
/** |
* @file |
* @brief Kernel backend for futexes. |
*/ |
#include <synch/futex.h> |
#include <synch/rwlock.h> |
#include <synch/spinlock.h> |
#include <synch/synch.h> |
#include <mm/frame.h> |
#include <mm/page.h> |
#include <mm/slab.h> |
#include <proc/thread.h> |
#include <proc/task.h> |
#include <genarch/mm/page_pt.h> |
#include <genarch/mm/page_ht.h> |
#include <adt/hash_table.h> |
#include <adt/list.h> |
#include <arch.h> |
#include <align.h> |
#include <panic.h> |
#include <errno.h> |
#include <print.h> |
#define FUTEX_HT_SIZE 1024 /* keep it a power of 2 */ |
static void futex_initialize(futex_t *futex); |
static futex_t *futex_find(uintptr_t paddr); |
static index_t futex_ht_hash(unative_t *key); |
static bool futex_ht_compare(unative_t *key, count_t keys, link_t *item); |
static void futex_ht_remove_callback(link_t *item); |
/** |
* Read-write lock protecting global futex hash table. |
* It is also used to serialize access to all futex_t structures. |
* Must be acquired before the task futex B+tree lock. |
*/ |
static rwlock_t futex_ht_lock; |
/** Futex hash table. */ |
static hash_table_t futex_ht; |
/** Futex hash table operations. */ |
static hash_table_operations_t futex_ht_ops = { |
.hash = futex_ht_hash, |
.compare = futex_ht_compare, |
.remove_callback = futex_ht_remove_callback |
}; |
/** Initialize futex subsystem. */ |
void futex_init(void) |
{ |
rwlock_initialize(&futex_ht_lock); |
hash_table_create(&futex_ht, FUTEX_HT_SIZE, 1, &futex_ht_ops); |
} |
/** Initialize kernel futex structure. |
* |
* @param futex Kernel futex structure. |
*/ |
void futex_initialize(futex_t *futex) |
{ |
waitq_initialize(&futex->wq); |
link_initialize(&futex->ht_link); |
futex->paddr = 0; |
futex->refcount = 1; |
} |
/** Sleep in futex wait queue. |
* |
* @param uaddr Userspace address of the futex counter. |
* @param usec If non-zero, number of microseconds this thread is willing to |
* sleep. |
* @param flags Select mode of operation. |
* |
* @return One of ESYNCH_TIMEOUT, ESYNCH_OK_ATOMIC and ESYNCH_OK_BLOCKED. See |
* synch.h. If there is no physical mapping for uaddr ENOENT is returned. |
*/ |
unative_t sys_futex_sleep_timeout(uintptr_t uaddr, uint32_t usec, int flags) |
{ |
futex_t *futex; |
uintptr_t paddr; |
pte_t *t; |
ipl_t ipl; |
ipl = interrupts_disable(); |
/* |
* Find physical address of futex counter. |
*/ |
page_table_lock(AS, true); |
t = page_mapping_find(AS, ALIGN_DOWN(uaddr, PAGE_SIZE)); |
if (!t || !PTE_VALID(t) || !PTE_PRESENT(t)) { |
page_table_unlock(AS, true); |
interrupts_restore(ipl); |
return (unative_t) ENOENT; |
} |
paddr = PTE_GET_FRAME(t) + (uaddr - ALIGN_DOWN(uaddr, PAGE_SIZE)); |
page_table_unlock(AS, true); |
interrupts_restore(ipl); |
futex = futex_find(paddr); |
return (unative_t) waitq_sleep_timeout(&futex->wq, usec, flags | |
SYNCH_FLAGS_INTERRUPTIBLE); |
} |
/** Wakeup one thread waiting in futex wait queue. |
* |
* @param uaddr Userspace address of the futex counter. |
* |
* @return ENOENT if there is no physical mapping for uaddr. |
*/ |
unative_t sys_futex_wakeup(uintptr_t uaddr) |
{ |
futex_t *futex; |
uintptr_t paddr; |
pte_t *t; |
ipl_t ipl; |
ipl = interrupts_disable(); |
/* |
* Find physical address of futex counter. |
*/ |
page_table_lock(AS, true); |
t = page_mapping_find(AS, ALIGN_DOWN(uaddr, PAGE_SIZE)); |
if (!t || !PTE_VALID(t) || !PTE_PRESENT(t)) { |
page_table_unlock(AS, true); |
interrupts_restore(ipl); |
return (unative_t) ENOENT; |
} |
paddr = PTE_GET_FRAME(t) + (uaddr - ALIGN_DOWN(uaddr, PAGE_SIZE)); |
page_table_unlock(AS, true); |
interrupts_restore(ipl); |
futex = futex_find(paddr); |
waitq_wakeup(&futex->wq, WAKEUP_FIRST); |
return 0; |
} |
/** Find kernel address of the futex structure corresponding to paddr. |
* |
* If the structure does not exist already, a new one is created. |
* |
* @param paddr Physical address of the userspace futex counter. |
* |
* @return Address of the kernel futex structure. |
*/ |
futex_t *futex_find(uintptr_t paddr) |
{ |
link_t *item; |
futex_t *futex; |
btree_node_t *leaf; |
/* |
* Find the respective futex structure |
* or allocate new one if it does not exist already. |
*/ |
rwlock_read_lock(&futex_ht_lock); |
item = hash_table_find(&futex_ht, &paddr); |
if (item) { |
futex = hash_table_get_instance(item, futex_t, ht_link); |
/* |
* See if the current task knows this futex. |
*/ |
mutex_lock(&TASK->futexes_lock); |
if (!btree_search(&TASK->futexes, paddr, &leaf)) { |
/* |
* The futex is new to the current task. |
* However, we only have read access. |
* Gain write access and try again. |
*/ |
mutex_unlock(&TASK->futexes_lock); |
goto gain_write_access; |
} |
mutex_unlock(&TASK->futexes_lock); |
rwlock_read_unlock(&futex_ht_lock); |
} else { |
gain_write_access: |
/* |
* Upgrade to writer is not currently supported, |
* therefore, it is necessary to release the read lock |
* and reacquire it as a writer. |
*/ |
rwlock_read_unlock(&futex_ht_lock); |
rwlock_write_lock(&futex_ht_lock); |
/* |
* Avoid possible race condition by searching |
* the hash table once again with write access. |
*/ |
item = hash_table_find(&futex_ht, &paddr); |
if (item) { |
futex = hash_table_get_instance(item, futex_t, ht_link); |
/* |
* See if this futex is known to the current task. |
*/ |
mutex_lock(&TASK->futexes_lock); |
if (!btree_search(&TASK->futexes, paddr, &leaf)) { |
/* |
* The futex is new to the current task. |
* Upgrade its reference count and put it to the |
* current task's B+tree of known futexes. |
*/ |
futex->refcount++; |
btree_insert(&TASK->futexes, paddr, futex, |
leaf); |
} |
mutex_unlock(&TASK->futexes_lock); |
rwlock_write_unlock(&futex_ht_lock); |
} else { |
futex = (futex_t *) malloc(sizeof(futex_t), 0); |
futex_initialize(futex); |
futex->paddr = paddr; |
hash_table_insert(&futex_ht, &paddr, &futex->ht_link); |
/* |
* This is the first task referencing the futex. |
* It can be directly inserted into its |
* B+tree of known futexes. |
*/ |
mutex_lock(&TASK->futexes_lock); |
btree_insert(&TASK->futexes, paddr, futex, NULL); |
mutex_unlock(&TASK->futexes_lock); |
rwlock_write_unlock(&futex_ht_lock); |
} |
} |
return futex; |
} |
/** Compute hash index into futex hash table. |
* |
* @param key Address where the key (i.e. physical address of futex counter) is |
* stored. |
* |
* @return Index into futex hash table. |
*/ |
index_t futex_ht_hash(unative_t *key) |
{ |
return *key & (FUTEX_HT_SIZE-1); |
} |
/** Compare futex hash table item with a key. |
* |
* @param key Address where the key (i.e. physical address of futex counter) is |
* stored. |
* |
* @return True if the item matches the key. False otherwise. |
*/ |
bool futex_ht_compare(unative_t *key, count_t keys, link_t *item) |
{ |
futex_t *futex; |
ASSERT(keys == 1); |
futex = hash_table_get_instance(item, futex_t, ht_link); |
return *key == futex->paddr; |
} |
/** Callback for removal items from futex hash table. |
* |
* @param item Item removed from the hash table. |
*/ |
void futex_ht_remove_callback(link_t *item) |
{ |
futex_t *futex; |
futex = hash_table_get_instance(item, futex_t, ht_link); |
free(futex); |
} |
/** Remove references from futexes known to the current task. */ |
void futex_cleanup(void) |
{ |
link_t *cur; |
rwlock_write_lock(&futex_ht_lock); |
mutex_lock(&TASK->futexes_lock); |
for (cur = TASK->futexes.leaf_head.next; |
cur != &TASK->futexes.leaf_head; cur = cur->next) { |
btree_node_t *node; |
unsigned int i; |
node = list_get_instance(cur, btree_node_t, leaf_link); |
for (i = 0; i < node->keys; i++) { |
futex_t *ftx; |
uintptr_t paddr = node->key[i]; |
ftx = (futex_t *) node->value[i]; |
if (--ftx->refcount == 0) |
hash_table_remove(&futex_ht, &paddr, 1); |
} |
} |
mutex_unlock(&TASK->futexes_lock); |
rwlock_write_unlock(&futex_ht_lock); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/synch/waitq.c |
---|
0,0 → 1,461 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sync |
* @{ |
*/ |
/** |
* @file |
* @brief Wait queue. |
* |
* Wait queue is the basic synchronization primitive upon which all |
* other synchronization primitives build. |
* |
* It allows threads to wait for an event in first-come, first-served |
* fashion. Conditional operation as well as timeouts and interruptions |
* are supported. |
*/ |
#include <synch/waitq.h> |
#include <synch/synch.h> |
#include <synch/spinlock.h> |
#include <proc/thread.h> |
#include <proc/scheduler.h> |
#include <arch/asm.h> |
#include <arch/types.h> |
#include <time/timeout.h> |
#include <arch.h> |
#include <context.h> |
#include <adt/list.h> |
static void waitq_timeouted_sleep(void *data); |
/** Initialize wait queue |
* |
* Initialize wait queue. |
* |
* @param wq Pointer to wait queue to be initialized. |
*/ |
void waitq_initialize(waitq_t *wq) |
{ |
spinlock_initialize(&wq->lock, "waitq_lock"); |
list_initialize(&wq->head); |
wq->missed_wakeups = 0; |
} |
/** Handle timeout during waitq_sleep_timeout() call |
* |
* This routine is called when waitq_sleep_timeout() timeouts. |
* Interrupts are disabled. |
* |
* It is supposed to try to remove 'its' thread from the wait queue; |
* it can eventually fail to achieve this goal when these two events |
* overlap. In that case it behaves just as though there was no |
* timeout at all. |
* |
* @param data Pointer to the thread that called waitq_sleep_timeout(). |
*/ |
void waitq_timeouted_sleep(void *data) |
{ |
thread_t *t = (thread_t *) data; |
waitq_t *wq; |
bool do_wakeup = false; |
DEADLOCK_PROBE_INIT(p_wqlock); |
spinlock_lock(&threads_lock); |
if (!thread_exists(t)) |
goto out; |
grab_locks: |
spinlock_lock(&t->lock); |
if ((wq = t->sleep_queue)) { /* assignment */ |
if (!spinlock_trylock(&wq->lock)) { |
spinlock_unlock(&t->lock); |
DEADLOCK_PROBE(p_wqlock, DEADLOCK_THRESHOLD); |
goto grab_locks; /* avoid deadlock */ |
} |
list_remove(&t->wq_link); |
t->saved_context = t->sleep_timeout_context; |
do_wakeup = true; |
t->sleep_queue = NULL; |
spinlock_unlock(&wq->lock); |
} |
t->timeout_pending = false; |
spinlock_unlock(&t->lock); |
if (do_wakeup) |
thread_ready(t); |
out: |
spinlock_unlock(&threads_lock); |
} |
/** Interrupt sleeping thread. |
* |
* This routine attempts to interrupt a thread from its sleep in a waitqueue. |
* If the thread is not found sleeping, no action is taken. |
* |
* @param t Thread to be interrupted. |
*/ |
void waitq_interrupt_sleep(thread_t *t) |
{ |
waitq_t *wq; |
bool do_wakeup = false; |
ipl_t ipl; |
DEADLOCK_PROBE_INIT(p_wqlock); |
ipl = interrupts_disable(); |
spinlock_lock(&threads_lock); |
if (!thread_exists(t)) |
goto out; |
grab_locks: |
spinlock_lock(&t->lock); |
if ((wq = t->sleep_queue)) { /* assignment */ |
if (!(t->sleep_interruptible)) { |
/* |
* The sleep cannot be interrupted. |
*/ |
spinlock_unlock(&t->lock); |
goto out; |
} |
if (!spinlock_trylock(&wq->lock)) { |
spinlock_unlock(&t->lock); |
DEADLOCK_PROBE(p_wqlock, DEADLOCK_THRESHOLD); |
goto grab_locks; /* avoid deadlock */ |
} |
if (t->timeout_pending && timeout_unregister(&t->sleep_timeout)) |
t->timeout_pending = false; |
list_remove(&t->wq_link); |
t->saved_context = t->sleep_interruption_context; |
do_wakeup = true; |
t->sleep_queue = NULL; |
spinlock_unlock(&wq->lock); |
} |
spinlock_unlock(&t->lock); |
if (do_wakeup) |
thread_ready(t); |
out: |
spinlock_unlock(&threads_lock); |
interrupts_restore(ipl); |
} |
/** Sleep until either wakeup, timeout or interruption occurs |
* |
* This is a sleep implementation which allows itself to time out or to be |
* interrupted from the sleep, restoring a failover context. |
* |
* Sleepers are organised in a FIFO fashion in a structure called wait queue. |
* |
* This function is really basic in that other functions as waitq_sleep() |
* and all the *_timeout() functions use it. |
* |
* @param wq Pointer to wait queue. |
* @param usec Timeout in microseconds. |
* @param flags Specify mode of the sleep. |
* |
* The sleep can be interrupted only if the |
* SYNCH_FLAGS_INTERRUPTIBLE bit is specified in flags. |
* |
* If usec is greater than zero, regardless of the value of the |
* SYNCH_FLAGS_NON_BLOCKING bit in flags, the call will not return until either |
* timeout, interruption or wakeup comes. |
* |
* If usec is zero and the SYNCH_FLAGS_NON_BLOCKING bit is not set in flags, |
* the call will not return until wakeup or interruption comes. |
* |
* If usec is zero and the SYNCH_FLAGS_NON_BLOCKING bit is set in flags, the |
* call will immediately return, reporting either success or failure. |
* |
* @return One of: ESYNCH_WOULD_BLOCK, ESYNCH_TIMEOUT, ESYNCH_INTERRUPTED, |
* ESYNCH_OK_ATOMIC, ESYNCH_OK_BLOCKED. |
* |
* @li ESYNCH_WOULD_BLOCK means that the sleep failed because at the time of the |
* call there was no pending wakeup. |
* |
* @li ESYNCH_TIMEOUT means that the sleep timed out. |
* |
* @li ESYNCH_INTERRUPTED means that somebody interrupted the sleeping thread. |
* |
* @li ESYNCH_OK_ATOMIC means that the sleep succeeded and that there was |
* a pending wakeup at the time of the call. The caller was not put |
* asleep at all. |
* |
* @li ESYNCH_OK_BLOCKED means that the sleep succeeded; the full sleep was |
* attempted. |
*/ |
int waitq_sleep_timeout(waitq_t *wq, uint32_t usec, int flags) |
{ |
ipl_t ipl; |
int rc; |
ipl = waitq_sleep_prepare(wq); |
rc = waitq_sleep_timeout_unsafe(wq, usec, flags); |
waitq_sleep_finish(wq, rc, ipl); |
return rc; |
} |
/** Prepare to sleep in a waitq. |
* |
* This function will return holding the lock of the wait queue |
* and interrupts disabled. |
* |
* @param wq Wait queue. |
* |
* @return Interrupt level as it existed on entry to this function. |
*/ |
ipl_t waitq_sleep_prepare(waitq_t *wq) |
{ |
ipl_t ipl; |
restart: |
ipl = interrupts_disable(); |
if (THREAD) { /* needed during system initiailzation */ |
/* |
* Busy waiting for a delayed timeout. |
* This is an important fix for the race condition between |
* a delayed timeout and a next call to waitq_sleep_timeout(). |
* Simply, the thread is not allowed to go to sleep if |
* there are timeouts in progress. |
*/ |
spinlock_lock(&THREAD->lock); |
if (THREAD->timeout_pending) { |
spinlock_unlock(&THREAD->lock); |
interrupts_restore(ipl); |
goto restart; |
} |
spinlock_unlock(&THREAD->lock); |
} |
spinlock_lock(&wq->lock); |
return ipl; |
} |
/** Finish waiting in a wait queue. |
* |
* This function restores interrupts to the state that existed prior |
* to the call to waitq_sleep_prepare(). If necessary, the wait queue |
* lock is released. |
* |
* @param wq Wait queue. |
* @param rc Return code of waitq_sleep_timeout_unsafe(). |
* @param ipl Interrupt level returned by waitq_sleep_prepare(). |
*/ |
void waitq_sleep_finish(waitq_t *wq, int rc, ipl_t ipl) |
{ |
switch (rc) { |
case ESYNCH_WOULD_BLOCK: |
case ESYNCH_OK_ATOMIC: |
spinlock_unlock(&wq->lock); |
break; |
default: |
break; |
} |
interrupts_restore(ipl); |
} |
/** Internal implementation of waitq_sleep_timeout(). |
* |
* This function implements logic of sleeping in a wait queue. |
* This call must be preceeded by a call to waitq_sleep_prepare() |
* and followed by a call to waitq_slee_finish(). |
* |
* @param wq See waitq_sleep_timeout(). |
* @param usec See waitq_sleep_timeout(). |
* @param flags See waitq_sleep_timeout(). |
* |
* @return See waitq_sleep_timeout(). |
*/ |
int waitq_sleep_timeout_unsafe(waitq_t *wq, uint32_t usec, int flags) |
{ |
/* checks whether to go to sleep at all */ |
if (wq->missed_wakeups) { |
wq->missed_wakeups--; |
return ESYNCH_OK_ATOMIC; |
} |
else { |
if ((flags & SYNCH_FLAGS_NON_BLOCKING) && (usec == 0)) { |
/* return immediatelly instead of going to sleep */ |
return ESYNCH_WOULD_BLOCK; |
} |
} |
/* |
* Now we are firmly decided to go to sleep. |
*/ |
spinlock_lock(&THREAD->lock); |
if (flags & SYNCH_FLAGS_INTERRUPTIBLE) { |
/* |
* If the thread was already interrupted, |
* don't go to sleep at all. |
*/ |
if (THREAD->interrupted) { |
spinlock_unlock(&THREAD->lock); |
spinlock_unlock(&wq->lock); |
return ESYNCH_INTERRUPTED; |
} |
/* |
* Set context that will be restored if the sleep |
* of this thread is ever interrupted. |
*/ |
THREAD->sleep_interruptible = true; |
if (!context_save(&THREAD->sleep_interruption_context)) { |
/* Short emulation of scheduler() return code. */ |
spinlock_unlock(&THREAD->lock); |
return ESYNCH_INTERRUPTED; |
} |
} else { |
THREAD->sleep_interruptible = false; |
} |
if (usec) { |
/* We use the timeout variant. */ |
if (!context_save(&THREAD->sleep_timeout_context)) { |
/* Short emulation of scheduler() return code. */ |
spinlock_unlock(&THREAD->lock); |
return ESYNCH_TIMEOUT; |
} |
THREAD->timeout_pending = true; |
timeout_register(&THREAD->sleep_timeout, (uint64_t) usec, |
waitq_timeouted_sleep, THREAD); |
} |
list_append(&THREAD->wq_link, &wq->head); |
/* |
* Suspend execution. |
*/ |
THREAD->state = Sleeping; |
THREAD->sleep_queue = wq; |
spinlock_unlock(&THREAD->lock); |
/* wq->lock is released in scheduler_separated_stack() */ |
scheduler(); |
return ESYNCH_OK_BLOCKED; |
} |
/** Wake up first thread sleeping in a wait queue |
* |
* Wake up first thread sleeping in a wait queue. This is the SMP- and IRQ-safe |
* wrapper meant for general use. |
* |
* Besides its 'normal' wakeup operation, it attempts to unregister possible |
* timeout. |
* |
* @param wq Pointer to wait queue. |
* @param mode Wakeup mode. |
*/ |
void waitq_wakeup(waitq_t *wq, wakeup_mode_t mode) |
{ |
ipl_t ipl; |
ipl = interrupts_disable(); |
spinlock_lock(&wq->lock); |
_waitq_wakeup_unsafe(wq, mode); |
spinlock_unlock(&wq->lock); |
interrupts_restore(ipl); |
} |
/** Internal SMP- and IRQ-unsafe version of waitq_wakeup() |
* |
* This is the internal SMP- and IRQ-unsafe version of waitq_wakeup(). It |
* assumes wq->lock is already locked and interrupts are already disabled. |
* |
* @param wq Pointer to wait queue. |
* @param mode If mode is WAKEUP_FIRST, then the longest waiting thread, |
* if any, is woken up. If mode is WAKEUP_ALL, then all |
* waiting threads, if any, are woken up. If there are no |
* waiting threads to be woken up, the missed wakeup is |
* recorded in the wait queue. |
*/ |
void _waitq_wakeup_unsafe(waitq_t *wq, wakeup_mode_t mode) |
{ |
thread_t *t; |
count_t count = 0; |
loop: |
if (list_empty(&wq->head)) { |
wq->missed_wakeups++; |
if (count && mode == WAKEUP_ALL) |
wq->missed_wakeups--; |
return; |
} |
count++; |
t = list_get_instance(wq->head.next, thread_t, wq_link); |
/* |
* Lock the thread prior to removing it from the wq. |
* This is not necessary because of mutual exclusion |
* (the link belongs to the wait queue), but because |
* of synchronization with waitq_timeouted_sleep() |
* and thread_interrupt_sleep(). |
* |
* In order for these two functions to work, the following |
* invariant must hold: |
* |
* t->sleep_queue != NULL <=> t sleeps in a wait queue |
* |
* For an observer who locks the thread, the invariant |
* holds only when the lock is held prior to removing |
* it from the wait queue. |
*/ |
spinlock_lock(&t->lock); |
list_remove(&t->wq_link); |
if (t->timeout_pending && timeout_unregister(&t->sleep_timeout)) |
t->timeout_pending = false; |
t->sleep_queue = NULL; |
spinlock_unlock(&t->lock); |
thread_ready(t); |
if (mode == WAKEUP_ALL) |
goto loop; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/synch/spinlock.c |
---|
0,0 → 1,162 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sync |
* @{ |
*/ |
/** |
* @file |
* @brief Spinlocks. |
*/ |
#include <synch/spinlock.h> |
#include <atomic.h> |
#include <arch/barrier.h> |
#include <arch.h> |
#include <preemption.h> |
#include <print.h> |
#include <debug.h> |
#include <symtab.h> |
#ifdef CONFIG_FB |
#include <genarch/fb/fb.h> |
#endif |
#ifdef CONFIG_SMP |
/** Initialize spinlock |
* |
* Initialize spinlock. |
* |
* @param sl Pointer to spinlock_t structure. |
*/ |
void spinlock_initialize(spinlock_t *sl, char *name) |
{ |
atomic_set(&sl->val, 0); |
#ifdef CONFIG_DEBUG_SPINLOCK |
sl->name = name; |
#endif |
} |
/** Lock spinlock |
* |
* Lock spinlock. |
* This version has limitted ability to report |
* possible occurence of deadlock. |
* |
* @param sl Pointer to spinlock_t structure. |
*/ |
#ifdef CONFIG_DEBUG_SPINLOCK |
void spinlock_lock_debug(spinlock_t *sl) |
{ |
count_t i = 0; |
char *symbol; |
bool deadlock_reported = false; |
preemption_disable(); |
while (test_and_set(&sl->val)) { |
/* |
* We need to be careful about printf_lock and fb_lock. |
* Both of them are used to report deadlocks via |
* printf() and fb_putchar(). |
* |
* We trust our code that there is no possible deadlock |
* caused by these two locks (except when an exception |
* is triggered for instance by printf() or fb_putchar()). |
* However, we encountered false positives caused by very |
* slow VESA framebuffer interaction (especially when |
* run in a simulator) that caused problems with both |
* printf_lock and fb_lock. |
* |
* Possible deadlocks on both printf_lock and fb_lock |
* are therefore not reported as they would cause an |
* infinite recursion. |
*/ |
if (sl == &printf_lock) |
continue; |
#ifdef CONFIG_FB |
if (sl == &fb_lock) |
continue; |
#endif |
if (i++ > DEADLOCK_THRESHOLD) { |
printf("cpu%d: looping on spinlock %.*p:%s, " |
"caller=%.*p", CPU->id, sizeof(uintptr_t) * 2, sl, |
sl->name, sizeof(uintptr_t) * 2, CALLER); |
symbol = get_symtab_entry(CALLER); |
if (symbol) |
printf("(%s)", symbol); |
printf("\n"); |
i = 0; |
deadlock_reported = true; |
} |
} |
if (deadlock_reported) |
printf("cpu%d: not deadlocked\n", CPU->id); |
/* |
* Prevent critical section code from bleeding out this way up. |
*/ |
CS_ENTER_BARRIER(); |
} |
#endif |
/** Lock spinlock conditionally |
* |
* Lock spinlock conditionally. |
* If the spinlock is not available at the moment, |
* signal failure. |
* |
* @param sl Pointer to spinlock_t structure. |
* |
* @return Zero on failure, non-zero otherwise. |
*/ |
int spinlock_trylock(spinlock_t *sl) |
{ |
int rc; |
preemption_disable(); |
rc = !test_and_set(&sl->val); |
/* |
* Prevent critical section code from bleeding out this way up. |
*/ |
CS_ENTER_BARRIER(); |
if (!rc) |
preemption_enable(); |
return rc; |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/synch/rwlock.c |
---|
0,0 → 1,393 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sync |
* @{ |
*/ |
/** |
* @file |
* @brief Reader/Writer locks. |
* |
* A reader/writer lock can be held by multiple readers at a time. |
* Or it can be exclusively held by a sole writer at a time. |
* |
* These locks are not recursive. |
* Because a technique called direct hand-off is used and because |
* waiting takes place in a single wait queue, neither readers |
* nor writers will suffer starvation. |
* |
* If there is a writer followed by a reader waiting for the rwlock |
* and the writer times out, all leading readers are automatically woken up |
* and allowed in. |
*/ |
/* |
* NOTE ON rwlock_holder_type |
* This field is set on an attempt to acquire the exclusive mutex |
* to the respective value depending whether the caller is a reader |
* or a writer. The field is examined only if the thread had been |
* previously blocked on the exclusive mutex. Thus it is save |
* to store the rwlock type in the thread structure, because |
* each thread can block on only one rwlock at a time. |
*/ |
#include <synch/rwlock.h> |
#include <synch/spinlock.h> |
#include <synch/mutex.h> |
#include <synch/waitq.h> |
#include <synch/synch.h> |
#include <adt/list.h> |
#include <arch/asm.h> |
#include <arch.h> |
#include <proc/thread.h> |
#include <panic.h> |
#define ALLOW_ALL 0 |
#define ALLOW_READERS_ONLY 1 |
static void let_others_in(rwlock_t *rwl, int readers_only); |
static void release_spinlock(void *arg); |
/** Initialize reader/writer lock |
* |
* Initialize reader/writer lock. |
* |
* @param rwl Reader/Writer lock. |
*/ |
void rwlock_initialize(rwlock_t *rwl) { |
spinlock_initialize(&rwl->lock, "rwlock_t"); |
mutex_initialize(&rwl->exclusive); |
rwl->readers_in = 0; |
} |
/** Acquire reader/writer lock for reading |
* |
* Acquire reader/writer lock for reading. |
* Timeout and willingness to block may be specified. |
* |
* @param rwl Reader/Writer lock. |
* @param usec Timeout in microseconds. |
* @param flags Specify mode of operation. |
* |
* For exact description of possible combinations of |
* usec and flags, see comment for waitq_sleep_timeout(). |
* |
* @return See comment for waitq_sleep_timeout(). |
*/ |
int _rwlock_write_lock_timeout(rwlock_t *rwl, uint32_t usec, int flags) |
{ |
ipl_t ipl; |
int rc; |
ipl = interrupts_disable(); |
spinlock_lock(&THREAD->lock); |
THREAD->rwlock_holder_type = RWLOCK_WRITER; |
spinlock_unlock(&THREAD->lock); |
interrupts_restore(ipl); |
/* |
* Writers take the easy part. |
* They just need to acquire the exclusive mutex. |
*/ |
rc = _mutex_lock_timeout(&rwl->exclusive, usec, flags); |
if (SYNCH_FAILED(rc)) { |
/* |
* Lock operation timed out or was interrupted. |
* The state of rwl is UNKNOWN at this point. |
* No claims about its holder can be made. |
*/ |
ipl = interrupts_disable(); |
spinlock_lock(&rwl->lock); |
/* |
* Now when rwl is locked, we can inspect it again. |
* If it is held by some readers already, we can let |
* readers from the head of the wait queue in. |
*/ |
if (rwl->readers_in) |
let_others_in(rwl, ALLOW_READERS_ONLY); |
spinlock_unlock(&rwl->lock); |
interrupts_restore(ipl); |
} |
return rc; |
} |
/** Acquire reader/writer lock for writing |
* |
* Acquire reader/writer lock for writing. |
* Timeout and willingness to block may be specified. |
* |
* @param rwl Reader/Writer lock. |
* @param usec Timeout in microseconds. |
* @param flags Select mode of operation. |
* |
* For exact description of possible combinations of |
* usec and flags, see comment for waitq_sleep_timeout(). |
* |
* @return See comment for waitq_sleep_timeout(). |
*/ |
int _rwlock_read_lock_timeout(rwlock_t *rwl, uint32_t usec, int flags) |
{ |
int rc; |
ipl_t ipl; |
ipl = interrupts_disable(); |
spinlock_lock(&THREAD->lock); |
THREAD->rwlock_holder_type = RWLOCK_READER; |
spinlock_unlock(&THREAD->lock); |
spinlock_lock(&rwl->lock); |
/* |
* Find out whether we can get what we want without blocking. |
*/ |
rc = mutex_trylock(&rwl->exclusive); |
if (SYNCH_FAILED(rc)) { |
/* |
* 'exclusive' mutex is being held by someone else. |
* If the holder is a reader and there is no one |
* else waiting for it, we can enter the critical |
* section. |
*/ |
if (rwl->readers_in) { |
spinlock_lock(&rwl->exclusive.sem.wq.lock); |
if (list_empty(&rwl->exclusive.sem.wq.head)) { |
/* |
* We can enter. |
*/ |
spinlock_unlock(&rwl->exclusive.sem.wq.lock); |
goto shortcut; |
} |
spinlock_unlock(&rwl->exclusive.sem.wq.lock); |
} |
/* |
* In order to prevent a race condition when a reader |
* could block another reader at the head of the waitq, |
* we register a function to unlock rwl->lock |
* after this thread is put asleep. |
*/ |
#ifdef CONFIG_SMP |
thread_register_call_me(release_spinlock, &rwl->lock); |
#else |
thread_register_call_me(release_spinlock, NULL); |
#endif |
rc = _mutex_lock_timeout(&rwl->exclusive, usec, flags); |
switch (rc) { |
case ESYNCH_WOULD_BLOCK: |
/* |
* release_spinlock() wasn't called |
*/ |
thread_register_call_me(NULL, NULL); |
spinlock_unlock(&rwl->lock); |
case ESYNCH_TIMEOUT: |
case ESYNCH_INTERRUPTED: |
/* |
* The sleep timed out. |
* We just restore interrupt priority level. |
*/ |
case ESYNCH_OK_BLOCKED: |
/* |
* We were woken with rwl->readers_in already |
* incremented. |
* |
* Note that this arrangement avoids race condition |
* between two concurrent readers. (Race is avoided if |
* 'exclusive' is locked at the same time as |
* 'readers_in' is incremented. Same time means both |
* events happen atomically when rwl->lock is held.) |
*/ |
interrupts_restore(ipl); |
break; |
case ESYNCH_OK_ATOMIC: |
panic("_mutex_lock_timeout()==ESYNCH_OK_ATOMIC\n"); |
break; |
default: |
panic("invalid ESYNCH\n"); |
break; |
} |
return rc; |
} |
shortcut: |
/* |
* We can increment readers_in only if we didn't go to sleep. |
* For sleepers, rwlock_let_others_in() will do the job. |
*/ |
rwl->readers_in++; |
spinlock_unlock(&rwl->lock); |
interrupts_restore(ipl); |
return ESYNCH_OK_ATOMIC; |
} |
/** Release reader/writer lock held by writer |
* |
* Release reader/writer lock held by writer. |
* Handoff reader/writer lock ownership directly |
* to waiting readers or a writer. |
* |
* @param rwl Reader/Writer lock. |
*/ |
void rwlock_write_unlock(rwlock_t *rwl) |
{ |
ipl_t ipl; |
ipl = interrupts_disable(); |
spinlock_lock(&rwl->lock); |
let_others_in(rwl, ALLOW_ALL); |
spinlock_unlock(&rwl->lock); |
interrupts_restore(ipl); |
} |
/** Release reader/writer lock held by reader |
* |
* Release reader/writer lock held by reader. |
* Handoff reader/writer lock ownership directly |
* to a waiting writer or don't do anything if more |
* readers poses the lock. |
* |
* @param rwl Reader/Writer lock. |
*/ |
void rwlock_read_unlock(rwlock_t *rwl) |
{ |
ipl_t ipl; |
ipl = interrupts_disable(); |
spinlock_lock(&rwl->lock); |
if (!--rwl->readers_in) |
let_others_in(rwl, ALLOW_ALL); |
spinlock_unlock(&rwl->lock); |
interrupts_restore(ipl); |
} |
/** Direct handoff of reader/writer lock ownership. |
* |
* Direct handoff of reader/writer lock ownership |
* to waiting readers or a writer. |
* |
* Must be called with rwl->lock locked. |
* Must be called with interrupts_disable()'d. |
* |
* @param rwl Reader/Writer lock. |
* @param readers_only See the description below. |
* |
* If readers_only is false: (unlock scenario) |
* Let the first sleeper on 'exclusive' mutex in, no matter |
* whether it is a reader or a writer. If there are more leading |
* readers in line, let each of them in. |
* |
* Otherwise: (timeout scenario) |
* Let all leading readers in. |
*/ |
void let_others_in(rwlock_t *rwl, int readers_only) |
{ |
rwlock_type_t type = RWLOCK_NONE; |
thread_t *t = NULL; |
bool one_more = true; |
spinlock_lock(&rwl->exclusive.sem.wq.lock); |
if (!list_empty(&rwl->exclusive.sem.wq.head)) |
t = list_get_instance(rwl->exclusive.sem.wq.head.next, thread_t, |
wq_link); |
do { |
if (t) { |
spinlock_lock(&t->lock); |
type = t->rwlock_holder_type; |
spinlock_unlock(&t->lock); |
} |
/* |
* If readers_only is true, we wake all leading readers |
* if and only if rwl is locked by another reader. |
* Assumption: readers_only ==> rwl->readers_in |
*/ |
if (readers_only && (type != RWLOCK_READER)) |
break; |
if (type == RWLOCK_READER) { |
/* |
* Waking up a reader. |
* We are responsible for incrementing rwl->readers_in |
* for it. |
*/ |
rwl->readers_in++; |
} |
/* |
* Only the last iteration through this loop can increment |
* rwl->exclusive.sem.wq.missed_wakeup's. All preceeding |
* iterations will wake up a thread. |
*/ |
/* We call the internal version of waitq_wakeup, which |
* relies on the fact that the waitq is already locked. |
*/ |
_waitq_wakeup_unsafe(&rwl->exclusive.sem.wq, WAKEUP_FIRST); |
t = NULL; |
if (!list_empty(&rwl->exclusive.sem.wq.head)) { |
t = list_get_instance(rwl->exclusive.sem.wq.head.next, |
thread_t, wq_link); |
if (t) { |
spinlock_lock(&t->lock); |
if (t->rwlock_holder_type != RWLOCK_READER) |
one_more = false; |
spinlock_unlock(&t->lock); |
} |
} |
} while ((type == RWLOCK_READER) && t && one_more); |
spinlock_unlock(&rwl->exclusive.sem.wq.lock); |
} |
/** Release spinlock callback |
* |
* This is a callback function invoked from the scheduler. |
* The callback is registered in _rwlock_read_lock_timeout(). |
* |
* @param arg Spinlock. |
*/ |
void release_spinlock(void *arg) |
{ |
spinlock_unlock((spinlock_t *) arg); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/synch/condvar.c |
---|
0,0 → 1,107 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sync |
* @{ |
*/ |
/** |
* @file |
* @brief Condition variables. |
*/ |
#include <synch/condvar.h> |
#include <synch/mutex.h> |
#include <synch/waitq.h> |
#include <synch/synch.h> |
#include <arch.h> |
/** Initialize condition variable. |
* |
* @param cv Condition variable. |
*/ |
void condvar_initialize(condvar_t *cv) |
{ |
waitq_initialize(&cv->wq); |
} |
/** |
* Signal the condition has become true |
* to the first waiting thread by waking it up. |
* |
* @param cv Condition variable. |
*/ |
void condvar_signal(condvar_t *cv) |
{ |
waitq_wakeup(&cv->wq, WAKEUP_FIRST); |
} |
/** |
* Signal the condition has become true |
* to all waiting threads by waking them up. |
* |
* @param cv Condition variable. |
*/ |
void condvar_broadcast(condvar_t *cv) |
{ |
waitq_wakeup(&cv->wq, WAKEUP_ALL); |
} |
/** Wait for the condition becoming true. |
* |
* @param cv Condition variable. |
* @param mtx Mutex. |
* @param usec Timeout value in microseconds. |
* @param flags Select mode of operation. |
* |
* For exact description of meaning of possible combinations |
* of usec and flags, see comment for waitq_sleep_timeout(). |
* Note that when SYNCH_FLAGS_NON_BLOCKING is specified here, |
* ESYNCH_WOULD_BLOCK is always returned. |
* |
* @return See comment for waitq_sleep_timeout(). |
*/ |
int _condvar_wait_timeout(condvar_t *cv, mutex_t *mtx, uint32_t usec, int flags) |
{ |
int rc; |
ipl_t ipl; |
ipl = waitq_sleep_prepare(&cv->wq); |
mutex_unlock(mtx); |
cv->wq.missed_wakeups = 0; /* Enforce blocking. */ |
rc = waitq_sleep_timeout_unsafe(&cv->wq, usec, flags); |
mutex_lock(mtx); |
waitq_sleep_finish(&cv->wq, rc, ipl); |
return rc; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/synch/mutex.c |
---|
0,0 → 1,84 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sync |
* @{ |
*/ |
/** |
* @file |
* @brief Mutexes. |
*/ |
#include <synch/mutex.h> |
#include <synch/semaphore.h> |
#include <synch/synch.h> |
/** Initialize mutex |
* |
* Initialize mutex. |
* |
* @param mtx Mutex. |
*/ |
void mutex_initialize(mutex_t *mtx) |
{ |
semaphore_initialize(&mtx->sem, 1); |
} |
/** Acquire mutex |
* |
* Acquire mutex. |
* Timeout mode and non-blocking mode can be requested. |
* |
* @param mtx Mutex. |
* @param usec Timeout in microseconds. |
* @param flags Specify mode of operation. |
* |
* For exact description of possible combinations of |
* usec and flags, see comment for waitq_sleep_timeout(). |
* |
* @return See comment for waitq_sleep_timeout(). |
*/ |
int _mutex_lock_timeout(mutex_t *mtx, uint32_t usec, int flags) |
{ |
return _semaphore_down_timeout(&mtx->sem, usec, flags); |
} |
/** Release mutex |
* |
* Release mutex. |
* |
* @param mtx Mutex. |
*/ |
void mutex_unlock(mutex_t *mtx) |
{ |
semaphore_up(&mtx->sem); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/synch/semaphore.c |
---|
0,0 → 1,98 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sync |
* @{ |
*/ |
/** |
* @file |
* @brief Semaphores. |
*/ |
#include <synch/semaphore.h> |
#include <synch/waitq.h> |
#include <synch/spinlock.h> |
#include <synch/synch.h> |
#include <arch/asm.h> |
#include <arch.h> |
/** Initialize semaphore |
* |
* Initialize semaphore. |
* |
* @param s Semaphore. |
* @param val Maximal number of threads allowed to enter critical section. |
*/ |
void semaphore_initialize(semaphore_t *s, int val) |
{ |
ipl_t ipl; |
waitq_initialize(&s->wq); |
ipl = interrupts_disable(); |
spinlock_lock(&s->wq.lock); |
s->wq.missed_wakeups = val; |
spinlock_unlock(&s->wq.lock); |
interrupts_restore(ipl); |
} |
/** Semaphore down |
* |
* Semaphore down. |
* Conditional mode and mode with timeout can be requested. |
* |
* @param s Semaphore. |
* @param usec Timeout in microseconds. |
* @param flags Select mode of operation. |
* |
* For exact description of possible combinations of |
* usec and flags, see comment for waitq_sleep_timeout(). |
* |
* @return See comment for waitq_sleep_timeout(). |
*/ |
int _semaphore_down_timeout(semaphore_t *s, uint32_t usec, int flags) |
{ |
return waitq_sleep_timeout(&s->wq, usec, flags); |
} |
/** Semaphore up |
* |
* Semaphore up. |
* |
* @param s Semaphore. |
*/ |
void semaphore_up(semaphore_t *s) |
{ |
waitq_wakeup(&s->wq, WAKEUP_FIRST); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/debug/symtab.c |
---|
0,0 → 1,200 |
/* |
* Copyright (c) 2005 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericdebug |
* @{ |
*/ |
/** |
* @file |
* @brief Kernel symbol resolver. |
*/ |
#include <symtab.h> |
#include <arch/byteorder.h> |
#include <func.h> |
#include <print.h> |
/** Return entry that seems most likely to correspond to argument. |
* |
* Return entry that seems most likely to correspond |
* to address passed in the argument. |
* |
* @param addr Address. |
* |
* @return Pointer to respective symbol string on success, NULL otherwise. |
*/ |
char * get_symtab_entry(unative_t addr) |
{ |
count_t i; |
for (i=1;symbol_table[i].address_le;++i) { |
if (addr < uint64_t_le2host(symbol_table[i].address_le)) |
break; |
} |
if (addr >= uint64_t_le2host(symbol_table[i-1].address_le)) |
return symbol_table[i-1].symbol_name; |
return NULL; |
} |
/** Find symbols that match the parameter forward and print them. |
* |
* @param name - search string |
* @param startpos - starting position, changes to found position |
* @return Pointer to the part of string that should be completed or NULL |
*/ |
static char * symtab_search_one(const char *name, int *startpos) |
{ |
unsigned int namelen = strlen(name); |
char *curname; |
int i,j; |
int colonoffset = -1; |
for (i=0;name[i];i++) |
if (name[i] == ':') { |
colonoffset = i; |
break; |
} |
for (i=*startpos;symbol_table[i].address_le;++i) { |
/* Find a ':' in name */ |
curname = symbol_table[i].symbol_name; |
for (j=0; curname[j] && curname[j] != ':'; j++) |
; |
if (!curname[j]) |
continue; |
j -= colonoffset; |
curname += j; |
if (strlen(curname) < namelen) |
continue; |
if (strncmp(curname, name, namelen) == 0) { |
*startpos = i; |
return curname+namelen; |
} |
} |
return NULL; |
} |
/** Return address that corresponds to the entry |
* |
* Search symbol table, and if there is one match, return it |
* |
* @param name Name of the symbol |
* @return 0 - Not found, -1 - Duplicate symbol, other - address of symbol |
*/ |
uintptr_t get_symbol_addr(const char *name) |
{ |
count_t found = 0; |
uintptr_t addr = NULL; |
char *hint; |
int i; |
i = 0; |
while ((hint=symtab_search_one(name, &i))) { |
if (!strlen(hint)) { |
addr = uint64_t_le2host(symbol_table[i].address_le); |
found++; |
} |
i++; |
} |
if (found > 1) |
return ((uintptr_t) -1); |
return addr; |
} |
/** Find symbols that match parameter and prints them */ |
void symtab_print_search(const char *name) |
{ |
int i; |
uintptr_t addr; |
char *realname; |
i = 0; |
while (symtab_search_one(name, &i)) { |
addr = uint64_t_le2host(symbol_table[i].address_le); |
realname = symbol_table[i].symbol_name; |
printf("%.*p: %s\n", sizeof(uintptr_t) * 2, addr, realname); |
i++; |
} |
} |
/** Symtab completion |
* |
* @param input - Search string, completes to symbol name |
* @returns - 0 - nothing found, 1 - success, >1 print duplicates |
*/ |
int symtab_compl(char *input) |
{ |
char output[MAX_SYMBOL_NAME+1]; |
int startpos = 0; |
char *foundtxt; |
int found = 0; |
int i; |
char *name = input; |
/* Allow completion of pointers */ |
if (name[0] == '*' || name[0] == '&') |
name++; |
/* Do not print everything */ |
if (!strlen(name)) |
return 0; |
output[0] = '\0'; |
while ((foundtxt = symtab_search_one(name, &startpos))) { |
startpos++; |
if (!found) |
strncpy(output, foundtxt, strlen(foundtxt)+1); |
else { |
for (i=0; output[i] && foundtxt[i] && output[i]==foundtxt[i]; i++) |
; |
output[i] = '\0'; |
} |
found++; |
} |
if (!found) |
return 0; |
if (found > 1 && !strlen(output)) { |
printf("\n"); |
startpos = 0; |
while ((foundtxt = symtab_search_one(name, &startpos))) { |
printf("%s\n", symbol_table[startpos].symbol_name); |
startpos++; |
} |
} |
strncpy(input, output, MAX_SYMBOL_NAME); |
return found; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/interrupt/interrupt.c |
---|
0,0 → 1,170 |
/* |
* Copyright (c) 2005 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericinterrupt |
* @{ |
*/ |
/** |
* @file |
* @brief Interrupt redirector. |
* |
* This file provides means of registering interrupt handlers |
* by kernel functions and calling the handlers when interrupts |
* occur. |
*/ |
#include <interrupt.h> |
#include <debug.h> |
#include <console/kconsole.h> |
#include <console/console.h> |
#include <console/chardev.h> |
#include <console/cmd.h> |
#include <panic.h> |
#include <print.h> |
#include <symtab.h> |
static struct { |
const char *name; |
iroutine f; |
} exc_table[IVT_ITEMS]; |
SPINLOCK_INITIALIZE(exctbl_lock); |
/** Register exception handler |
* |
* @param n Exception number |
* @param name Description |
* @param f Exception handler |
*/ |
iroutine exc_register(int n, const char *name, iroutine f) |
{ |
ASSERT(n < IVT_ITEMS); |
iroutine old; |
spinlock_lock(&exctbl_lock); |
old = exc_table[n].f; |
exc_table[n].f = f; |
exc_table[n].name = name; |
spinlock_unlock(&exctbl_lock); |
return old; |
} |
/** Dispatch exception according to exception table |
* |
* Called directly from the assembler code. |
* CPU is interrupts_disable()'d. |
*/ |
void exc_dispatch(int n, istate_t *istate) |
{ |
ASSERT(n < IVT_ITEMS); |
exc_table[n].f(n + IVT_FIRST, istate); |
/* This is a safe place to exit exiting thread */ |
if (THREAD && THREAD->interrupted && istate_from_uspace(istate)) |
thread_exit(); |
} |
/** Default 'null' exception handler */ |
static void exc_undef(int n, istate_t *istate) |
{ |
fault_if_from_uspace(istate, "Unhandled exception %d.", n); |
panic("Unhandled exception %d.", n); |
} |
/** kconsole cmd - print all exceptions */ |
static int exc_print_cmd(cmd_arg_t *argv) |
{ |
#if (IVT_ITEMS > 0) |
unsigned int i; |
char *symbol; |
spinlock_lock(&exctbl_lock); |
if (sizeof(void *) == 4) { |
printf("Exc Description Handler Symbol\n"); |
printf("--- -------------------- ---------- --------\n"); |
} else { |
printf("Exc Description Handler Symbol\n"); |
printf("--- -------------------- ------------------ --------\n"); |
} |
for (i = 0; i < IVT_ITEMS; i++) { |
symbol = get_symtab_entry((unative_t) exc_table[i].f); |
if (!symbol) |
symbol = "not found"; |
if (sizeof(void *) == 4) |
printf("%-3u %-20s %#10zx %s\n", i + IVT_FIRST, exc_table[i].name, |
exc_table[i].f, symbol); |
else |
printf("%-3u %-20s %#18zx %s\n", i + IVT_FIRST, exc_table[i].name, |
exc_table[i].f, symbol); |
if (((i + 1) % 20) == 0) { |
printf(" -- Press any key to continue -- "); |
spinlock_unlock(&exctbl_lock); |
getc(stdin); |
spinlock_lock(&exctbl_lock); |
printf("\n"); |
} |
} |
spinlock_unlock(&exctbl_lock); |
#endif |
return 1; |
} |
static cmd_info_t exc_info = { |
.name = "exc", |
.description = "Print exception table.", |
.func = exc_print_cmd, |
.help = NULL, |
.argc = 0, |
.argv = NULL |
}; |
/** Initialize generic exception handling support */ |
void exc_init(void) |
{ |
int i; |
for (i=0;i < IVT_ITEMS; i++) |
exc_register(i, "undef", (iroutine) exc_undef); |
cmd_initialize(&exc_info); |
if (!cmd_register(&exc_info)) |
panic("could not register command %s\n", exc_info.name); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/time/clock.c |
---|
0,0 → 1,199 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup time |
* @{ |
*/ |
/** |
* @file |
* @brief High-level clock interrupt handler. |
* |
* This file contains the clock() function which is the source |
* of preemption. It is also responsible for executing expired |
* timeouts. |
*/ |
#include <time/clock.h> |
#include <time/timeout.h> |
#include <config.h> |
#include <synch/spinlock.h> |
#include <synch/waitq.h> |
#include <func.h> |
#include <proc/scheduler.h> |
#include <cpu.h> |
#include <arch.h> |
#include <adt/list.h> |
#include <atomic.h> |
#include <proc/thread.h> |
#include <sysinfo/sysinfo.h> |
#include <arch/barrier.h> |
#include <mm/frame.h> |
#include <ddi/ddi.h> |
/* Pointer to variable with uptime */ |
uptime_t *uptime; |
/** Physical memory area of the real time clock */ |
static parea_t clock_parea; |
/* Variable holding fragment of second, so that we would update |
* seconds correctly |
*/ |
static unative_t secfrag = 0; |
/** Initialize realtime clock counter |
* |
* The applications (and sometimes kernel) need to access accurate |
* information about realtime data. We allocate 1 page with these |
* data and update it periodically. |
*/ |
void clock_counter_init(void) |
{ |
void *faddr; |
faddr = frame_alloc(ONE_FRAME, FRAME_ATOMIC); |
if (!faddr) |
panic("Cannot allocate page for clock"); |
uptime = (uptime_t *) PA2KA(faddr); |
uptime->seconds1 = 0; |
uptime->seconds2 = 0; |
uptime->useconds = 0; |
clock_parea.pbase = (uintptr_t) faddr; |
clock_parea.vbase = (uintptr_t) uptime; |
clock_parea.frames = 1; |
clock_parea.cacheable = true; |
ddi_parea_register(&clock_parea); |
/* |
* Prepare information for the userspace so that it can successfully |
* physmem_map() the clock_parea. |
*/ |
sysinfo_set_item_val("clock.cacheable", NULL, (unative_t) true); |
sysinfo_set_item_val("clock.faddr", NULL, (unative_t) faddr); |
} |
/** Update public counters |
* |
* Update it only on first processor |
* TODO: Do we really need so many write barriers? |
*/ |
static void clock_update_counters(void) |
{ |
if (CPU->id == 0) { |
secfrag += 1000000 / HZ; |
if (secfrag >= 1000000) { |
secfrag -= 1000000; |
uptime->seconds1++; |
write_barrier(); |
uptime->useconds = secfrag; |
write_barrier(); |
uptime->seconds2 = uptime->seconds1; |
} else |
uptime->useconds += 1000000 / HZ; |
} |
} |
/** Clock routine |
* |
* Clock routine executed from clock interrupt handler |
* (assuming interrupts_disable()'d). Runs expired timeouts |
* and preemptive scheduling. |
* |
*/ |
void clock(void) |
{ |
link_t *l; |
timeout_t *h; |
timeout_handler_t f; |
void *arg; |
count_t missed_clock_ticks = CPU->missed_clock_ticks; |
unsigned int i; |
/* |
* To avoid lock ordering problems, |
* run all expired timeouts as you visit them. |
*/ |
for (i = 0; i <= missed_clock_ticks; i++) { |
clock_update_counters(); |
spinlock_lock(&CPU->timeoutlock); |
while ((l = CPU->timeout_active_head.next) != &CPU->timeout_active_head) { |
h = list_get_instance(l, timeout_t, link); |
spinlock_lock(&h->lock); |
if (h->ticks-- != 0) { |
spinlock_unlock(&h->lock); |
break; |
} |
list_remove(l); |
f = h->handler; |
arg = h->arg; |
timeout_reinitialize(h); |
spinlock_unlock(&h->lock); |
spinlock_unlock(&CPU->timeoutlock); |
f(arg); |
spinlock_lock(&CPU->timeoutlock); |
} |
spinlock_unlock(&CPU->timeoutlock); |
} |
CPU->missed_clock_ticks = 0; |
/* |
* Do CPU usage accounting and find out whether to preempt THREAD. |
*/ |
if (THREAD) { |
uint64_t ticks; |
spinlock_lock(&CPU->lock); |
CPU->needs_relink += 1 + missed_clock_ticks; |
spinlock_unlock(&CPU->lock); |
spinlock_lock(&THREAD->lock); |
if ((ticks = THREAD->ticks)) { |
if (ticks >= 1 + missed_clock_ticks) |
THREAD->ticks -= 1 + missed_clock_ticks; |
else |
THREAD->ticks = 0; |
} |
spinlock_unlock(&THREAD->lock); |
if (!ticks && !PREEMPTION_DISABLED) { |
scheduler(); |
} |
} |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/time/timeout.c |
---|
0,0 → 1,218 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup time |
* @{ |
*/ |
/** |
* @file |
* @brief Timeout management functions. |
*/ |
#include <time/timeout.h> |
#include <arch/types.h> |
#include <config.h> |
#include <panic.h> |
#include <synch/spinlock.h> |
#include <func.h> |
#include <cpu.h> |
#include <arch/asm.h> |
#include <arch.h> |
/** Initialize timeouts |
* |
* Initialize kernel timeouts. |
* |
*/ |
void timeout_init(void) |
{ |
spinlock_initialize(&CPU->timeoutlock, "timeout_lock"); |
list_initialize(&CPU->timeout_active_head); |
} |
/** Reinitialize timeout |
* |
* Initialize all members except the lock. |
* |
* @param t Timeout to be initialized. |
* |
*/ |
void timeout_reinitialize(timeout_t *t) |
{ |
t->cpu = NULL; |
t->ticks = 0; |
t->handler = NULL; |
t->arg = NULL; |
link_initialize(&t->link); |
} |
/** Initialize timeout |
* |
* Initialize all members including the lock. |
* |
* @param t Timeout to be initialized. |
* |
*/ |
void timeout_initialize(timeout_t *t) |
{ |
spinlock_initialize(&t->lock, "timeout_t_lock"); |
timeout_reinitialize(t); |
} |
/** Register timeout |
* |
* Insert timeout handler f (with argument arg) |
* to timeout list and make it execute in |
* time microseconds (or slightly more). |
* |
* @param t Timeout structure. |
* @param time Number of usec in the future to execute |
* the handler. |
* @param f Timeout handler function. |
* @param arg Timeout handler argument. |
* |
*/ |
void timeout_register(timeout_t *t, uint64_t time, timeout_handler_t f, void *arg) |
{ |
timeout_t *hlp = NULL; |
link_t *l, *m; |
ipl_t ipl; |
uint64_t sum; |
ipl = interrupts_disable(); |
spinlock_lock(&CPU->timeoutlock); |
spinlock_lock(&t->lock); |
if (t->cpu) |
panic("t->cpu != 0"); |
t->cpu = CPU; |
t->ticks = us2ticks(time); |
t->handler = f; |
t->arg = arg; |
/* |
* Insert t into the active timeouts list according to t->ticks. |
*/ |
sum = 0; |
l = CPU->timeout_active_head.next; |
while (l != &CPU->timeout_active_head) { |
hlp = list_get_instance(l, timeout_t, link); |
spinlock_lock(&hlp->lock); |
if (t->ticks < sum + hlp->ticks) { |
spinlock_unlock(&hlp->lock); |
break; |
} |
sum += hlp->ticks; |
spinlock_unlock(&hlp->lock); |
l = l->next; |
} |
m = l->prev; |
list_prepend(&t->link, m); /* avoid using l->prev */ |
/* |
* Adjust t->ticks according to ticks accumulated in h's predecessors. |
*/ |
t->ticks -= sum; |
/* |
* Decrease ticks of t's immediate succesor by t->ticks. |
*/ |
if (l != &CPU->timeout_active_head) { |
spinlock_lock(&hlp->lock); |
hlp->ticks -= t->ticks; |
spinlock_unlock(&hlp->lock); |
} |
spinlock_unlock(&t->lock); |
spinlock_unlock(&CPU->timeoutlock); |
interrupts_restore(ipl); |
} |
/** Unregister timeout |
* |
* Remove timeout from timeout list. |
* |
* @param t Timeout to unregister. |
* |
* @return true on success, false on failure. |
*/ |
bool timeout_unregister(timeout_t *t) |
{ |
timeout_t *hlp; |
link_t *l; |
ipl_t ipl; |
DEADLOCK_PROBE_INIT(p_tolock); |
grab_locks: |
ipl = interrupts_disable(); |
spinlock_lock(&t->lock); |
if (!t->cpu) { |
spinlock_unlock(&t->lock); |
interrupts_restore(ipl); |
return false; |
} |
if (!spinlock_trylock(&t->cpu->timeoutlock)) { |
spinlock_unlock(&t->lock); |
interrupts_restore(ipl); |
DEADLOCK_PROBE(p_tolock, DEADLOCK_THRESHOLD); |
goto grab_locks; |
} |
/* |
* Now we know for sure that t hasn't been activated yet |
* and is lurking in t->cpu->timeout_active_head queue. |
*/ |
l = t->link.next; |
if (l != &t->cpu->timeout_active_head) { |
hlp = list_get_instance(l, timeout_t, link); |
spinlock_lock(&hlp->lock); |
hlp->ticks += t->ticks; |
spinlock_unlock(&hlp->lock); |
} |
list_remove(&t->link); |
spinlock_unlock(&t->cpu->timeoutlock); |
timeout_reinitialize(t); |
spinlock_unlock(&t->lock); |
interrupts_restore(ipl); |
return true; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/time/delay.c |
---|
0,0 → 1,68 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup time |
* @{ |
*/ |
/** |
* @file |
* @brief Active delay function. |
*/ |
#include <time/delay.h> |
#include <arch/types.h> |
#include <cpu.h> |
#include <arch/asm.h> |
#include <arch.h> |
/** Active delay |
* |
* Delay the execution for the given number |
* of microseconds (or slightly more). The delay |
* is implemented as CPU calibrated active loop. |
* |
* @param usec Number of microseconds to sleep. |
*/ |
void delay(uint32_t usec) |
{ |
ipl_t ipl; |
/* |
* The delay loop is calibrated for each and every |
* CPU in the system. Therefore it is necessary to |
* call interrupts_disable() before calling the |
* asm_delay_loop(). |
*/ |
ipl = interrupts_disable(); |
asm_delay_loop(usec * CPU->delay_loop_const); |
interrupts_restore(ipl); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/printf/printf_core.c |
---|
0,0 → 1,752 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** |
* @file |
* @brief Printing functions. |
*/ |
#include <printf/printf_core.h> |
#include <putchar.h> |
#include <print.h> |
#include <arch/arg.h> |
#include <macros.h> |
#include <func.h> |
#include <arch.h> |
/** show prefixes 0x or 0 */ |
#define __PRINTF_FLAG_PREFIX 0x00000001 |
/** signed / unsigned number */ |
#define __PRINTF_FLAG_SIGNED 0x00000002 |
/** print leading zeroes */ |
#define __PRINTF_FLAG_ZEROPADDED 0x00000004 |
/** align to left */ |
#define __PRINTF_FLAG_LEFTALIGNED 0x00000010 |
/** always show + sign */ |
#define __PRINTF_FLAG_SHOWPLUS 0x00000020 |
/** print space instead of plus */ |
#define __PRINTF_FLAG_SPACESIGN 0x00000040 |
/** show big characters */ |
#define __PRINTF_FLAG_BIGCHARS 0x00000080 |
/** number has - sign */ |
#define __PRINTF_FLAG_NEGATIVE 0x00000100 |
/** |
* Buffer big enough for 64-bit number printed in base 2, sign, prefix and 0 |
* to terminate string... (last one is only for better testing end of buffer by |
* zero-filling subroutine) |
*/ |
#define PRINT_NUMBER_BUFFER_SIZE (64 + 5) |
/** Enumeration of possible arguments types. |
*/ |
typedef enum { |
PrintfQualifierByte = 0, |
PrintfQualifierShort, |
PrintfQualifierInt, |
PrintfQualifierLong, |
PrintfQualifierLongLong, |
PrintfQualifierNative, |
PrintfQualifierPointer |
} qualifier_t; |
static char digits_small[] = "0123456789abcdef"; |
static char digits_big[] = "0123456789ABCDEF"; |
/** Print one or more characters without adding newline. |
* |
* @param buf Buffer with size at least count bytes. NULL pointer is |
* not allowed! |
* @param count Number of characters to print. |
* @param ps Output method and its data. |
* @return Number of characters printed. |
*/ |
static int printf_putnchars(const char * buf, size_t count, |
struct printf_spec *ps) |
{ |
return ps->write((void *) buf, count, ps->data); |
} |
/** Print a string without adding a newline. |
* |
* @param str String to print. |
* @param ps Write function specification and support data. |
* @return Number of characters printed. |
*/ |
static int printf_putstr(const char * str, struct printf_spec *ps) |
{ |
size_t count; |
if (str == NULL) { |
char *nullstr = "(NULL)"; |
return printf_putnchars(nullstr, strlen(nullstr), ps); |
} |
count = strlen(str); |
return ps->write((void *) str, count, ps->data); |
} |
/** Print one character. |
* |
* @param c Character to be printed. |
* @param ps Output method. |
* |
* @return Number of characters printed. |
*/ |
static int printf_putchar(int c, struct printf_spec *ps) |
{ |
unsigned char ch = c; |
return ps->write((void *) &ch, 1, ps->data); |
} |
/** Print one formatted character. |
* |
* @param c Character to print. |
* @param width Width modifier. |
* @param flags Flags that change the way the character is printed. |
* |
* @return Number of characters printed, negative value on failure. |
*/ |
static int print_char(char c, int width, uint64_t flags, struct printf_spec *ps) |
{ |
int counter = 0; |
if (!(flags & __PRINTF_FLAG_LEFTALIGNED)) { |
while (--width > 0) { |
/* |
* One space is consumed by the character itself, hence |
* the predecrement. |
*/ |
if (printf_putchar(' ', ps) > 0) |
++counter; |
} |
} |
if (printf_putchar(c, ps) > 0) |
counter++; |
while (--width > 0) { |
/* |
* One space is consumed by the character itself, hence |
* the predecrement. |
*/ |
if (printf_putchar(' ', ps) > 0) |
++counter; |
} |
return ++counter; |
} |
/** Print string. |
* |
* @param s String to be printed. |
* @param width Width modifier. |
* @param precision Precision modifier. |
* @param flags Flags that modify the way the string is printed. |
* |
* @return Number of characters printed, negative value on failure. |
*/ |
static int print_string(char *s, int width, unsigned int precision, |
uint64_t flags, struct printf_spec *ps) |
{ |
int counter = 0; |
size_t size; |
int retval; |
if (s == NULL) { |
return printf_putstr("(NULL)", ps); |
} |
size = strlen(s); |
/* print leading spaces */ |
if (precision == 0) |
precision = size; |
width -= precision; |
if (!(flags & __PRINTF_FLAG_LEFTALIGNED)) { |
while (width-- > 0) { |
if (printf_putchar(' ', ps) == 1) |
counter++; |
} |
} |
if ((retval = printf_putnchars(s, min(size, precision), ps)) < 0) { |
return -counter; |
} |
counter += retval; |
while (width-- > 0) { |
if (printf_putchar(' ', ps) == 1) |
++counter; |
} |
return counter; |
} |
/** Print a number in a given base. |
* |
* Print significant digits of a number in given base. |
* |
* @param num Number to print. |
* @param widt Width modifier.h |
* @param precision Precision modifier. |
* @param base Base to print the number in (must be between 2 and 16). |
* @param flags Flags that modify the way the number is printed. |
* |
* @return Number of characters printed. |
* |
*/ |
static int print_number(uint64_t num, int width, int precision, int base, |
uint64_t flags, struct printf_spec *ps) |
{ |
char *digits = digits_small; |
char d[PRINT_NUMBER_BUFFER_SIZE]; |
char *ptr = &d[PRINT_NUMBER_BUFFER_SIZE - 1]; |
int size = 0; /* size of number with all prefixes and signs */ |
int number_size; /* size of plain number */ |
char sgn; |
int retval; |
int counter = 0; |
if (flags & __PRINTF_FLAG_BIGCHARS) |
digits = digits_big; |
*ptr-- = 0; /* Put zero at end of string */ |
if (num == 0) { |
*ptr-- = '0'; |
size++; |
} else { |
do { |
*ptr-- = digits[num % base]; |
size++; |
} while (num /= base); |
} |
number_size = size; |
/* |
* Collect the sum of all prefixes/signs/... to calculate padding and |
* leading zeroes. |
*/ |
if (flags & __PRINTF_FLAG_PREFIX) { |
switch(base) { |
case 2: /* Binary formating is not standard, but usefull */ |
size += 2; |
break; |
case 8: |
size++; |
break; |
case 16: |
size += 2; |
break; |
} |
} |
sgn = 0; |
if (flags & __PRINTF_FLAG_SIGNED) { |
if (flags & __PRINTF_FLAG_NEGATIVE) { |
sgn = '-'; |
size++; |
} else if (flags & __PRINTF_FLAG_SHOWPLUS) { |
sgn = '+'; |
size++; |
} else if (flags & __PRINTF_FLAG_SPACESIGN) { |
sgn = ' '; |
size++; |
} |
} |
if (flags & __PRINTF_FLAG_LEFTALIGNED) { |
flags &= ~__PRINTF_FLAG_ZEROPADDED; |
} |
/* |
* If the number is leftaligned or precision is specified then |
* zeropadding is ignored. |
*/ |
if (flags & __PRINTF_FLAG_ZEROPADDED) { |
if ((precision == 0) && (width > size)) { |
precision = width - size + number_size; |
} |
} |
/* print leading spaces */ |
if (number_size > precision) { |
/* print the whole number not only a part */ |
precision = number_size; |
} |
width -= precision + size - number_size; |
if (!(flags & __PRINTF_FLAG_LEFTALIGNED)) { |
while (width-- > 0) { |
if (printf_putchar(' ', ps) == 1) |
counter++; |
} |
} |
/* print sign */ |
if (sgn) { |
if (printf_putchar(sgn, ps) == 1) |
counter++; |
} |
/* print prefix */ |
if (flags & __PRINTF_FLAG_PREFIX) { |
switch(base) { |
case 2: /* Binary formating is not standard, but usefull */ |
if (printf_putchar('0', ps) == 1) |
counter++; |
if (flags & __PRINTF_FLAG_BIGCHARS) { |
if (printf_putchar('B', ps) == 1) |
counter++; |
} else { |
if (printf_putchar('b', ps) == 1) |
counter++; |
} |
break; |
case 8: |
if (printf_putchar('o', ps) == 1) |
counter++; |
break; |
case 16: |
if (printf_putchar('0', ps) == 1) |
counter++; |
if (flags & __PRINTF_FLAG_BIGCHARS) { |
if (printf_putchar('X', ps) == 1) |
counter++; |
} else { |
if (printf_putchar('x', ps) == 1) |
counter++; |
} |
break; |
} |
} |
/* print leading zeroes */ |
precision -= number_size; |
while (precision-- > 0) { |
if (printf_putchar('0', ps) == 1) |
counter++; |
} |
/* print number itself */ |
if ((retval = printf_putstr(++ptr, ps)) > 0) { |
counter += retval; |
} |
/* print ending spaces */ |
while (width-- > 0) { |
if (printf_putchar(' ', ps) == 1) |
counter++; |
} |
return counter; |
} |
/** Print formatted string. |
* |
* Print string formatted according to the fmt parameter and variadic arguments. |
* Each formatting directive must have the following form: |
* |
* \% [ FLAGS ] [ WIDTH ] [ .PRECISION ] [ TYPE ] CONVERSION |
* |
* FLAGS:@n |
* - "#" Force to print prefix.For \%o conversion, the prefix is 0, for |
* \%x and \%X prefixes are 0x and 0X and for conversion \%b the |
* prefix is 0b. |
* |
* - "-" Align to left. |
* |
* - "+" Print positive sign just as negative. |
* |
* - " " If the printed number is positive and "+" flag is not set, |
* print space in place of sign. |
* |
* - "0" Print 0 as padding instead of spaces. Zeroes are placed between |
* sign and the rest of the number. This flag is ignored if "-" |
* flag is specified. |
* |
* WIDTH:@n |
* - Specify the minimal width of a printed argument. If it is bigger, |
* width is ignored. If width is specified with a "*" character instead of |
* number, width is taken from parameter list. And integer parameter is |
* expected before parameter for processed conversion specification. If |
* this value is negative its absolute value is taken and the "-" flag is |
* set. |
* |
* PRECISION:@n |
* - Value precision. For numbers it specifies minimum valid numbers. |
* Smaller numbers are printed with leading zeroes. Bigger numbers are not |
* affected. Strings with more than precision characters are cut off. Just |
* as with width, an "*" can be used used instead of a number. An integer |
* value is then expected in parameters. When both width and precision are |
* specified using "*", the first parameter is used for width and the |
* second one for precision. |
* |
* TYPE:@n |
* - "hh" Signed or unsigned char.@n |
* - "h" Signed or unsigned short.@n |
* - "" Signed or unsigned int (default value).@n |
* - "l" Signed or unsigned long int.@n |
* - "ll" Signed or unsigned long long int.@n |
* - "z" unative_t (non-standard extension).@n |
* |
* |
* CONVERSION:@n |
* - % Print percentile character itself. |
* |
* - c Print single character. |
* |
* - s Print zero terminated string. If a NULL value is passed as |
* value, "(NULL)" is printed instead. |
* |
* - P, p Print value of a pointer. Void * value is expected and it is |
* printed in hexadecimal notation with prefix (as with \%#X / \%#x |
* for 32-bit or \%#X / \%#x for 64-bit long pointers). |
* |
* - b Print value as unsigned binary number. Prefix is not printed by |
* default. (Nonstandard extension.) |
* |
* - o Print value as unsigned octal number. Prefix is not printed by |
* default. |
* |
* - d, i Print signed decimal number. There is no difference between d |
* and i conversion. |
* |
* - u Print unsigned decimal number. |
* |
* - X, x Print hexadecimal number with upper- or lower-case. Prefix is |
* not printed by default. |
* |
* All other characters from fmt except the formatting directives are printed in |
* verbatim. |
* |
* @param fmt Formatting NULL terminated string. |
* @return Number of characters printed, negative value on failure. |
*/ |
int printf_core(const char *fmt, struct printf_spec *ps, va_list ap) |
{ |
int i = 0; /* index of the currently processed char from fmt */ |
int j = 0; /* index to the first not printed nonformating character */ |
int end; |
int counter; /* counter of printed characters */ |
int retval; /* used to store return values from called functions */ |
char c; |
qualifier_t qualifier; /* type of argument */ |
int base; /* base in which a numeric parameter will be printed */ |
uint64_t number; /* argument value */ |
size_t size; /* byte size of integer parameter */ |
int width, precision; |
uint64_t flags; |
counter = 0; |
while ((c = fmt[i])) { |
/* control character */ |
if (c == '%' ) { |
/* print common characters if any processed */ |
if (i > j) { |
if ((retval = printf_putnchars(&fmt[j], |
(size_t)(i - j), ps)) < 0) { /* error */ |
counter = -counter; |
goto out; |
} |
counter += retval; |
} |
j = i; |
/* parse modifiers */ |
flags = 0; |
end = 0; |
do { |
++i; |
switch (c = fmt[i]) { |
case '#': |
flags |= __PRINTF_FLAG_PREFIX; |
break; |
case '-': |
flags |= __PRINTF_FLAG_LEFTALIGNED; |
break; |
case '+': |
flags |= __PRINTF_FLAG_SHOWPLUS; |
break; |
case ' ': |
flags |= __PRINTF_FLAG_SPACESIGN; |
break; |
case '0': |
flags |= __PRINTF_FLAG_ZEROPADDED; |
break; |
default: |
end = 1; |
}; |
} while (end == 0); |
/* width & '*' operator */ |
width = 0; |
if (isdigit(fmt[i])) { |
while (isdigit(fmt[i])) { |
width *= 10; |
width += fmt[i++] - '0'; |
} |
} else if (fmt[i] == '*') { |
/* get width value from argument list */ |
i++; |
width = (int)va_arg(ap, int); |
if (width < 0) { |
/* negative width sets '-' flag */ |
width *= -1; |
flags |= __PRINTF_FLAG_LEFTALIGNED; |
} |
} |
/* precision and '*' operator */ |
precision = 0; |
if (fmt[i] == '.') { |
++i; |
if (isdigit(fmt[i])) { |
while (isdigit(fmt[i])) { |
precision *= 10; |
precision += fmt[i++] - '0'; |
} |
} else if (fmt[i] == '*') { |
/* |
* Get precision value from the argument |
* list. |
*/ |
i++; |
precision = (int)va_arg(ap, int); |
if (precision < 0) { |
/* ignore negative precision */ |
precision = 0; |
} |
} |
} |
switch (fmt[i++]) { |
/** @todo unimplemented qualifiers: |
* t ptrdiff_t - ISO C 99 |
*/ |
case 'h': /* char or short */ |
qualifier = PrintfQualifierShort; |
if (fmt[i] == 'h') { |
i++; |
qualifier = PrintfQualifierByte; |
} |
break; |
case 'l': /* long or long long*/ |
qualifier = PrintfQualifierLong; |
if (fmt[i] == 'l') { |
i++; |
qualifier = PrintfQualifierLongLong; |
} |
break; |
case 'z': /* unative_t */ |
qualifier = PrintfQualifierNative; |
break; |
default: |
/* default type */ |
qualifier = PrintfQualifierInt; |
--i; |
} |
base = 10; |
switch (c = fmt[i]) { |
/* |
* String and character conversions. |
*/ |
case 's': |
if ((retval = print_string(va_arg(ap, char *), |
width, precision, flags, ps)) < 0) { |
counter = -counter; |
goto out; |
}; |
counter += retval; |
j = i + 1; |
goto next_char; |
case 'c': |
c = va_arg(ap, unsigned int); |
retval = print_char(c, width, flags, ps); |
if (retval < 0) { |
counter = -counter; |
goto out; |
}; |
counter += retval; |
j = i + 1; |
goto next_char; |
/* |
* Integer values |
*/ |
case 'P': /* pointer */ |
flags |= __PRINTF_FLAG_BIGCHARS; |
case 'p': |
flags |= __PRINTF_FLAG_PREFIX; |
base = 16; |
qualifier = PrintfQualifierPointer; |
break; |
case 'b': |
base = 2; |
break; |
case 'o': |
base = 8; |
break; |
case 'd': |
case 'i': |
flags |= __PRINTF_FLAG_SIGNED; |
case 'u': |
break; |
case 'X': |
flags |= __PRINTF_FLAG_BIGCHARS; |
case 'x': |
base = 16; |
break; |
/* percentile itself */ |
case '%': |
j = i; |
goto next_char; |
/* |
* Bad formatting. |
*/ |
default: |
/* |
* Unknown format. Now, j is the index of '%' |
* so we will print whole bad format sequence. |
*/ |
goto next_char; |
} |
/* Print integers */ |
/* print number */ |
switch (qualifier) { |
case PrintfQualifierByte: |
size = sizeof(unsigned char); |
number = (uint64_t)va_arg(ap, unsigned int); |
break; |
case PrintfQualifierShort: |
size = sizeof(unsigned short); |
number = (uint64_t)va_arg(ap, unsigned int); |
break; |
case PrintfQualifierInt: |
size = sizeof(unsigned int); |
number = (uint64_t)va_arg(ap, unsigned int); |
break; |
case PrintfQualifierLong: |
size = sizeof(unsigned long); |
number = (uint64_t)va_arg(ap, unsigned long); |
break; |
case PrintfQualifierLongLong: |
size = sizeof(unsigned long long); |
number = (uint64_t)va_arg(ap, |
unsigned long long); |
break; |
case PrintfQualifierPointer: |
size = sizeof(void *); |
number = (uint64_t)(unsigned long)va_arg(ap, |
void *); |
break; |
case PrintfQualifierNative: |
size = sizeof(unative_t); |
number = (uint64_t)va_arg(ap, unative_t); |
break; |
default: /* Unknown qualifier */ |
counter = -counter; |
goto out; |
} |
if (flags & __PRINTF_FLAG_SIGNED) { |
if (number & (0x1 << (size * 8 - 1))) { |
flags |= __PRINTF_FLAG_NEGATIVE; |
if (size == sizeof(uint64_t)) { |
number = -((int64_t)number); |
} else { |
number = ~number; |
number &= |
~(0xFFFFFFFFFFFFFFFFll << |
(size * 8)); |
number++; |
} |
} |
} |
if ((retval = print_number(number, width, precision, |
base, flags, ps)) < 0) { |
counter = -counter; |
goto out; |
} |
counter += retval; |
j = i + 1; |
} |
next_char: |
++i; |
} |
if (i > j) { |
if ((retval = printf_putnchars(&fmt[j], (unative_t)(i - j), |
ps)) < 0) { /* error */ |
counter = -counter; |
goto out; |
} |
counter += retval; |
} |
out: |
return counter; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/printf/printf.c |
---|
0,0 → 1,53 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** @file |
*/ |
#include <print.h> |
int printf(const char *fmt, ...); |
int printf(const char *fmt, ...) |
{ |
int ret; |
va_list args; |
va_start(args, fmt); |
ret = vprintf(fmt, args); |
va_end(args); |
return ret; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/printf/snprintf.c |
---|
0,0 → 1,52 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** @file |
*/ |
#include <print.h> |
#include <printf/printf_core.h> |
int snprintf(char *str, size_t size, const char *fmt, ...) |
{ |
int ret; |
va_list args; |
va_start(args, fmt); |
ret = vsnprintf(str, size, fmt, args); |
va_end(args); |
return ret; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/printf/vprintf.c |
---|
0,0 → 1,75 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** @file |
*/ |
#include <print.h> |
#include <printf/printf_core.h> |
#include <putchar.h> |
#include <synch/spinlock.h> |
#include <arch/asm.h> |
SPINLOCK_INITIALIZE(printf_lock); /**< vprintf spinlock */ |
static int vprintf_write(const char *str, size_t count, void *unused) |
{ |
size_t i; |
for (i = 0; i < count; i++) |
putchar(str[i]); |
return i; |
} |
int puts(const char *s) |
{ |
size_t i; |
for (i = 0; s[i] != 0; i++) |
putchar(s[i]); |
return i; |
} |
int vprintf(const char *fmt, va_list ap) |
{ |
struct printf_spec ps = {(int(*)(void *, size_t, void *)) vprintf_write, NULL}; |
int irqpri = interrupts_disable(); |
spinlock_lock(&printf_lock); |
int ret = printf_core(fmt, &ps, ap); |
spinlock_unlock(&printf_lock); |
interrupts_restore(irqpri); |
return ret; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/printf/vsnprintf.c |
---|
0,0 → 1,102 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** @file |
*/ |
#include <print.h> |
#include <printf/printf_core.h> |
#include <memstr.h> |
struct vsnprintf_data { |
size_t size; /* total space for string */ |
size_t len; /* count of currently used characters */ |
char *string; /* destination string */ |
}; |
/** Write string to given buffer. |
* Write at most data->size characters including trailing zero. According to C99, snprintf() has to return number |
* of characters that would have been written if enough space had been available. Hence the return value is not |
* number of really printed characters but size of the input string. Number of really used characters |
* is stored in data->len. |
* @param str source string to print |
* @param count size of source string |
* @param data structure with destination string, counter of used space and total string size. |
* @return number of characters to print (not characters really printed!) |
*/ |
static int vsnprintf_write(const char *str, size_t count, struct vsnprintf_data *data) |
{ |
size_t i; |
i = data->size - data->len; |
if (i == 0) { |
return count; |
} |
if (i == 1) { |
/* We have only one free byte left in buffer => write there trailing zero */ |
data->string[data->size - 1] = 0; |
data->len = data->size; |
return count; |
} |
if (i <= count) { |
/* We have not enought space for whole string with the trailing zero => print only a part of string */ |
memcpy((void *)(data->string + data->len), (void *)str, i - 1); |
data->string[data->size - 1] = 0; |
data->len = data->size; |
return count; |
} |
/* Buffer is big enought to print whole string */ |
memcpy((void *)(data->string + data->len), (void *)str, count); |
data->len += count; |
/* Put trailing zero at end, but not count it into data->len so it could be rewritten next time */ |
data->string[data->len] = 0; |
return count; |
} |
int vsnprintf(char *str, size_t size, const char *fmt, va_list ap) |
{ |
struct vsnprintf_data data = {size, 0, str}; |
struct printf_spec ps = {(int(*)(void *, size_t, void *))vsnprintf_write, &data}; |
/* Print 0 at end of string - fix the case that nothing will be printed */ |
if (size > 0) |
str[0] = 0; |
/* vsnprintf_write ensures that str will be terminated by zero. */ |
return printf_core(fmt, &ps, ap); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/printf/vsprintf.c |
---|
0,0 → 1,43 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** @file |
*/ |
#include <print.h> |
int vsprintf(char *str, const char *fmt, va_list ap) |
{ |
return vsnprintf(str, (size_t) - 1, fmt, ap); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/printf/sprintf.c |
---|
0,0 → 1,51 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** @file |
*/ |
#include <print.h> |
int sprintf(char *str, const char *fmt, ...) |
{ |
int ret; |
va_list args; |
va_start(args, fmt); |
ret = vsprintf(str, fmt, args); |
va_end(args); |
return ret; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/lib/elf.c |
---|
0,0 → 1,252 |
/* |
* Copyright (c) 2006 Sergey Bondari |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** |
* @file |
* @brief Kernel ELF loader. |
*/ |
#include <lib/elf.h> |
#include <debug.h> |
#include <arch/types.h> |
#include <mm/as.h> |
#include <mm/frame.h> |
#include <mm/slab.h> |
#include <align.h> |
#include <memstr.h> |
#include <macros.h> |
#include <arch.h> |
static char *error_codes[] = { |
"no error", |
"invalid image", |
"address space error", |
"incompatible image", |
"unsupported image type", |
"irrecoverable error" |
}; |
static int segment_header(elf_segment_header_t *entry, elf_header_t *elf, |
as_t *as); |
static int section_header(elf_section_header_t *entry, elf_header_t *elf, |
as_t *as); |
static int load_segment(elf_segment_header_t *entry, elf_header_t *elf, |
as_t *as); |
/** ELF loader |
* |
* @param header Pointer to ELF header in memory |
* @param as Created and properly mapped address space |
* @return EE_OK on success |
*/ |
unsigned int elf_load(elf_header_t *header, as_t * as) |
{ |
int i, rc; |
/* Identify ELF */ |
if (header->e_ident[EI_MAG0] != ELFMAG0 || |
header->e_ident[EI_MAG1] != ELFMAG1 || |
header->e_ident[EI_MAG2] != ELFMAG2 || |
header->e_ident[EI_MAG3] != ELFMAG3) { |
return EE_INVALID; |
} |
/* Identify ELF compatibility */ |
if (header->e_ident[EI_DATA] != ELF_DATA_ENCODING || |
header->e_machine != ELF_MACHINE || |
header->e_ident[EI_VERSION] != EV_CURRENT || |
header->e_version != EV_CURRENT || |
header->e_ident[EI_CLASS] != ELF_CLASS) { |
return EE_INCOMPATIBLE; |
} |
if (header->e_phentsize != sizeof(elf_segment_header_t)) |
return EE_INCOMPATIBLE; |
if (header->e_shentsize != sizeof(elf_section_header_t)) |
return EE_INCOMPATIBLE; |
/* Check if the object type is supported. */ |
if (header->e_type != ET_EXEC) |
return EE_UNSUPPORTED; |
/* Walk through all segment headers and process them. */ |
for (i = 0; i < header->e_phnum; i++) { |
elf_segment_header_t *seghdr; |
seghdr = &((elf_segment_header_t *)(((uint8_t *) header) + |
header->e_phoff))[i]; |
rc = segment_header(seghdr, header, as); |
if (rc != EE_OK) |
return rc; |
} |
/* Inspect all section headers and proccess them. */ |
for (i = 0; i < header->e_shnum; i++) { |
elf_section_header_t *sechdr; |
sechdr = &((elf_section_header_t *)(((uint8_t *) header) + |
header->e_shoff))[i]; |
rc = section_header(sechdr, header, as); |
if (rc != EE_OK) |
return rc; |
} |
return EE_OK; |
} |
/** Print error message according to error code. |
* |
* @param rc Return code returned by elf_load(). |
* |
* @return NULL terminated description of error. |
*/ |
char *elf_error(unsigned int rc) |
{ |
ASSERT(rc < sizeof(error_codes) / sizeof(char *)); |
return error_codes[rc]; |
} |
/** Process segment header. |
* |
* @param entry Segment header. |
* @param elf ELF header. |
* @param as Address space into wich the ELF is being loaded. |
* |
* @return EE_OK on success, error code otherwise. |
*/ |
static int segment_header(elf_segment_header_t *entry, elf_header_t *elf, |
as_t *as) |
{ |
switch (entry->p_type) { |
case PT_NULL: |
case PT_PHDR: |
break; |
case PT_LOAD: |
return load_segment(entry, elf, as); |
break; |
case PT_DYNAMIC: |
case PT_INTERP: |
case PT_SHLIB: |
case PT_NOTE: |
case PT_LOPROC: |
case PT_HIPROC: |
default: |
return EE_UNSUPPORTED; |
break; |
} |
return EE_OK; |
} |
/** Load segment described by program header entry. |
* |
* @param entry Program header entry describing segment to be loaded. |
* @param elf ELF header. |
* @param as Address space into wich the ELF is being loaded. |
* |
* @return EE_OK on success, error code otherwise. |
*/ |
int load_segment(elf_segment_header_t *entry, elf_header_t *elf, as_t *as) |
{ |
as_area_t *a; |
int flags = 0; |
mem_backend_data_t backend_data; |
backend_data.elf = elf; |
backend_data.segment = entry; |
if (entry->p_align > 1) { |
if ((entry->p_offset % entry->p_align) != |
(entry->p_vaddr % entry->p_align)) { |
return EE_INVALID; |
} |
} |
if (entry->p_flags & PF_X) |
flags |= AS_AREA_EXEC; |
if (entry->p_flags & PF_W) |
flags |= AS_AREA_WRITE; |
if (entry->p_flags & PF_R) |
flags |= AS_AREA_READ; |
flags |= AS_AREA_CACHEABLE; |
/* |
* Check if the virtual address starts on page boundary. |
*/ |
if (ALIGN_UP(entry->p_vaddr, PAGE_SIZE) != entry->p_vaddr) |
return EE_UNSUPPORTED; |
a = as_area_create(as, flags, entry->p_memsz, entry->p_vaddr, |
AS_AREA_ATTR_NONE, &elf_backend, &backend_data); |
if (!a) |
return EE_MEMORY; |
/* |
* The segment will be mapped on demand by elf_page_fault(). |
*/ |
return EE_OK; |
} |
/** Process section header. |
* |
* @param entry Segment header. |
* @param elf ELF header. |
* @param as Address space into wich the ELF is being loaded. |
* |
* @return EE_OK on success, error code otherwise. |
*/ |
static int section_header(elf_section_header_t *entry, elf_header_t *elf, |
as_t *as) |
{ |
switch (entry->sh_type) { |
case SHT_PROGBITS: |
if (entry->sh_flags & SHF_TLS) { |
/* .tdata */ |
} |
break; |
case SHT_NOBITS: |
if (entry->sh_flags & SHF_TLS) { |
/* .tbss */ |
} |
break; |
default: |
break; |
} |
return EE_OK; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/lib/memstr.c |
---|
0,0 → 1,139 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** |
* @file |
* @brief Memory string operations. |
* |
* This file provides architecture independent functions |
* to manipulate blocks of memory. These functions |
* are optimized as much as generic functions of |
* this type can be. However, architectures are |
* free to provide even more optimized versions of these |
* functions. |
*/ |
#include <memstr.h> |
#include <arch/types.h> |
#include <align.h> |
/** Copy block of memory |
* |
* Copy cnt bytes from src address to dst address. |
* The copying is done word-by-word and then byte-by-byte. |
* The source and destination memory areas cannot overlap. |
* |
* @param src Origin address to copy from. |
* @param dst Origin address to copy to. |
* @param cnt Number of bytes to copy. |
* |
*/ |
void *_memcpy(void * dst, const void *src, size_t cnt) |
{ |
unsigned int i, j; |
if (ALIGN_UP((uintptr_t) src, sizeof(unative_t)) != (uintptr_t) src || |
ALIGN_UP((uintptr_t) dst, sizeof(unative_t)) != (uintptr_t) dst) { |
for (i = 0; i < cnt; i++) |
((uint8_t *) dst)[i] = ((uint8_t *) src)[i]; |
} else { |
for (i = 0; i < cnt/sizeof(unative_t); i++) |
((unative_t *) dst)[i] = ((unative_t *) src)[i]; |
for (j = 0; j < cnt%sizeof(unative_t); j++) |
((uint8_t *)(((unative_t *) dst) + i))[j] = ((uint8_t *)(((unative_t *) src) + i))[j]; |
} |
return (char *) src; |
} |
/** Fill block of memory |
* |
* Fill cnt bytes at dst address with the value x. |
* The filling is done byte-by-byte. |
* |
* @param dst Origin address to fill. |
* @param cnt Number of bytes to fill. |
* @param x Value to fill. |
* |
*/ |
void _memsetb(uintptr_t dst, size_t cnt, uint8_t x) |
{ |
unsigned int i; |
uint8_t *p = (uint8_t *) dst; |
for (i = 0; i < cnt; i++) |
p[i] = x; |
} |
/** Fill block of memory |
* |
* Fill cnt words at dst address with the value x. |
* The filling is done word-by-word. |
* |
* @param dst Origin address to fill. |
* @param cnt Number of words to fill. |
* @param x Value to fill. |
* |
*/ |
void _memsetw(uintptr_t dst, size_t cnt, uint16_t x) |
{ |
unsigned int i; |
uint16_t *p = (uint16_t *) dst; |
for (i = 0; i < cnt; i++) |
p[i] = x; |
} |
/** Copy string |
* |
* Copy string from src address to dst address. |
* The copying is done char-by-char until the null |
* character. The source and destination memory areas |
* cannot overlap. |
* |
* @param src Origin string to copy from. |
* @param dst Origin string to copy to. |
* |
*/ |
char *strcpy(char *dest, const char *src) |
{ |
char *orig = dest; |
while ((*(dest++) = *(src++))) |
; |
return orig; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/lib/sort.c |
---|
0,0 → 1,206 |
/* |
* Copyright (c) 2005 Sergey Bondari |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** |
* @file |
* @brief Sorting functions. |
* |
* This files contains functions implementing several sorting |
* algorithms (e.g. quick sort and bubble sort). |
*/ |
#include <mm/slab.h> |
#include <memstr.h> |
#include <sort.h> |
#include <panic.h> |
#define EBUFSIZE 32 |
void _qsort(void * data, count_t n, size_t e_size, int (* cmp) (void * a, void * b), void *tmp, void *pivot); |
void _bubblesort(void * data, count_t n, size_t e_size, int (* cmp) (void * a, void * b), void *slot); |
/** Quicksort wrapper |
* |
* This is only a wrapper that takes care of memory allocations for storing |
* the pivot and temporary elements for generic quicksort algorithm. |
* |
* This function _can_ sleep |
* |
* @param data Pointer to data to be sorted. |
* @param n Number of elements to be sorted. |
* @param e_size Size of one element. |
* @param cmp Comparator function. |
* |
*/ |
void qsort(void * data, count_t n, size_t e_size, int (* cmp) (void * a, void * b)) |
{ |
uint8_t buf_tmp[EBUFSIZE]; |
uint8_t buf_pivot[EBUFSIZE]; |
void * tmp = buf_tmp; |
void * pivot = buf_pivot; |
if (e_size > EBUFSIZE) { |
pivot = (void *) malloc(e_size, 0); |
tmp = (void *) malloc(e_size, 0); |
} |
_qsort(data, n, e_size, cmp, tmp, pivot); |
if (e_size > EBUFSIZE) { |
free(tmp); |
free(pivot); |
} |
} |
/** Quicksort |
* |
* Apply generic quicksort algorithm on supplied data, using pre-allocated buffers. |
* |
* @param data Pointer to data to be sorted. |
* @param n Number of elements to be sorted. |
* @param e_size Size of one element. |
* @param cmp Comparator function. |
* @param tmp Pointer to scratch memory buffer e_size bytes long. |
* @param pivot Pointer to scratch memory buffer e_size bytes long. |
* |
*/ |
void _qsort(void * data, count_t n, size_t e_size, int (* cmp) (void * a, void * b), void *tmp, void *pivot) |
{ |
if (n > 4) { |
unsigned int i = 0, j = n - 1; |
memcpy(pivot, data, e_size); |
while (1) { |
while ((cmp(data + i * e_size, pivot) < 0) && (i < n)) |
i++; |
while ((cmp(data + j * e_size, pivot) >= 0) && (j > 0)) |
j--; |
if (i < j) { |
memcpy(tmp, data + i * e_size, e_size); |
memcpy(data + i * e_size, data + j * e_size, e_size); |
memcpy(data + j * e_size, tmp, e_size); |
} else { |
break; |
} |
} |
_qsort(data, j + 1, e_size, cmp, tmp, pivot); |
_qsort(data + (j + 1) * e_size, n - j - 1, e_size, cmp, tmp, pivot); |
} else { |
_bubblesort(data, n, e_size, cmp, tmp); |
} |
} |
/** Bubblesort wrapper |
* |
* This is only a wrapper that takes care of memory allocation for storing |
* the slot element for generic bubblesort algorithm. |
* |
* @param data Pointer to data to be sorted. |
* @param n Number of elements to be sorted. |
* @param e_size Size of one element. |
* @param cmp Comparator function. |
* |
*/ |
void bubblesort(void * data, count_t n, size_t e_size, int (* cmp) (void * a, void * b)) |
{ |
uint8_t buf_slot[EBUFSIZE]; |
void * slot = buf_slot; |
if (e_size > EBUFSIZE) { |
slot = (void *) malloc(e_size, 0); |
} |
_bubblesort(data, n, e_size, cmp, slot); |
if (e_size > EBUFSIZE) { |
free(slot); |
} |
} |
/** Bubblesort |
* |
* Apply generic bubblesort algorithm on supplied data, using pre-allocated buffer. |
* |
* @param data Pointer to data to be sorted. |
* @param n Number of elements to be sorted. |
* @param e_size Size of one element. |
* @param cmp Comparator function. |
* @param slot Pointer to scratch memory buffer e_size bytes long. |
* |
*/ |
void _bubblesort(void * data, count_t n, size_t e_size, int (* cmp) (void * a, void * b), void *slot) |
{ |
bool done = false; |
void * p; |
while (!done) { |
done = true; |
for (p = data; p < data + e_size * (n - 1); p = p + e_size) { |
if (cmp(p, p + e_size) == 1) { |
memcpy(slot, p, e_size); |
memcpy(p, p + e_size, e_size); |
memcpy(p + e_size, slot, e_size); |
done = false; |
} |
} |
} |
} |
/* |
* Comparator returns 1 if a > b, 0 if a == b, -1 if a < b |
*/ |
int int_cmp(void * a, void * b) |
{ |
return (* (int *) a > * (int*)b) ? 1 : (*(int *)a < * (int *)b) ? -1 : 0; |
} |
int uint8_t_cmp(void * a, void * b) |
{ |
return (* (uint8_t *) a > * (uint8_t *)b) ? 1 : (*(uint8_t *)a < * (uint8_t *)b) ? -1 : 0; |
} |
int uint16_t_cmp(void * a, void * b) |
{ |
return (* (uint16_t *) a > * (uint16_t *)b) ? 1 : (*(uint16_t *)a < * (uint16_t *)b) ? -1 : 0; |
} |
int uint32_t_cmp(void * a, void * b) |
{ |
return (* (uint32_t *) a > * (uint32_t *)b) ? 1 : (*(uint32_t *)a < * (uint32_t *)b) ? -1 : 0; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/lib/func.c |
---|
0,0 → 1,251 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** |
* @file |
* @brief Miscellaneous functions. |
*/ |
#include <func.h> |
#include <print.h> |
#include <cpu.h> |
#include <arch/asm.h> |
#include <arch.h> |
#include <console/kconsole.h> |
atomic_t haltstate = {0}; /**< Halt flag */ |
/** Halt wrapper |
* |
* Set halt flag and halt the cpu. |
* |
*/ |
void halt() |
{ |
#ifdef CONFIG_DEBUG |
bool rundebugger = false; |
// TODO test_and_set not defined on all arches |
// if (!test_and_set(&haltstate)) |
if (!atomic_get(&haltstate)) { |
atomic_set(&haltstate, 1); |
rundebugger = true; |
} |
#else |
atomic_set(&haltstate, 1); |
#endif |
interrupts_disable(); |
#ifdef CONFIG_DEBUG |
if (rundebugger) { |
printf("\n"); |
kconsole("panic"); /* Run kconsole as a last resort to user */ |
} |
#endif |
if (CPU) |
printf("cpu%d: halted\n", CPU->id); |
else |
printf("cpu: halted\n"); |
cpu_halt(); |
} |
/** Return number of characters in a string. |
* |
* @param str NULL terminated string. |
* |
* @return Number of characters in str. |
*/ |
size_t strlen(const char *str) |
{ |
int i; |
for (i = 0; str[i]; i++) |
; |
return i; |
} |
/** Compare two NULL terminated strings |
* |
* Do a char-by-char comparison of two NULL terminated strings. |
* The strings are considered equal iff they consist of the same |
* characters on the minimum of their lengths. |
* |
* @param src First string to compare. |
* @param dst Second string to compare. |
* |
* @return 0 if the strings are equal, -1 if first is smaller, 1 if second smaller. |
* |
*/ |
int strcmp(const char *src, const char *dst) |
{ |
for (; *src && *dst; src++, dst++) { |
if (*src < *dst) |
return -1; |
if (*src > *dst) |
return 1; |
} |
if (*src == *dst) |
return 0; |
if (!*src) |
return -1; |
return 1; |
} |
/** Compare two NULL terminated strings |
* |
* Do a char-by-char comparison of two NULL terminated strings. |
* The strings are considered equal iff they consist of the same |
* characters on the minimum of their lengths and specified maximal |
* length. |
* |
* @param src First string to compare. |
* @param dst Second string to compare. |
* @param len Maximal length for comparison. |
* |
* @return 0 if the strings are equal, -1 if first is smaller, 1 if second smaller. |
* |
*/ |
int strncmp(const char *src, const char *dst, size_t len) |
{ |
unsigned int i; |
for (i = 0; (*src) && (*dst) && (i < len); src++, dst++, i++) { |
if (*src < *dst) |
return -1; |
if (*src > *dst) |
return 1; |
} |
if (i == len || *src == *dst) |
return 0; |
if (!*src) |
return -1; |
return 1; |
} |
/** Copy NULL terminated string. |
* |
* Copy at most 'len' characters from string 'src' to 'dest'. |
* If 'src' is shorter than 'len', '\0' is inserted behind the |
* last copied character. |
* |
* @param src Source string. |
* @param dest Destination buffer. |
* @param len Size of destination buffer. |
*/ |
void strncpy(char *dest, const char *src, size_t len) |
{ |
unsigned int i; |
for (i = 0; i < len; i++) { |
if (!(dest[i] = src[i])) |
return; |
} |
dest[i-1] = '\0'; |
} |
/** Convert ascii representation to unative_t |
* |
* Supports 0x for hexa & 0 for octal notation. |
* Does not check for overflows, does not support negative numbers |
* |
* @param text Textual representation of number |
* @return Converted number or 0 if no valid number ofund |
*/ |
unative_t atoi(const char *text) |
{ |
int base = 10; |
unative_t result = 0; |
if (text[0] == '0' && text[1] == 'x') { |
base = 16; |
text += 2; |
} else if (text[0] == '0') |
base = 8; |
while (*text) { |
if (base != 16 && \ |
((*text >= 'A' && *text <= 'F' ) |
|| (*text >='a' && *text <='f'))) |
break; |
if (base == 8 && *text >='8') |
break; |
if (*text >= '0' && *text <= '9') { |
result *= base; |
result += *text - '0'; |
} else if (*text >= 'A' && *text <= 'F') { |
result *= base; |
result += *text - 'A' + 10; |
} else if (*text >= 'a' && *text <= 'f') { |
result *= base; |
result += *text - 'a' + 10; |
} else |
break; |
text++; |
} |
return result; |
} |
void order(const uint64_t val, uint64_t *rv, char *suffix) |
{ |
if (val > 10000000000000000000ULL) { |
*rv = val / 1000000000000000000ULL; |
*suffix = 'Z'; |
} else if (val > 1000000000000000000ULL) { |
*rv = val / 1000000000000000ULL; |
*suffix = 'E'; |
} else if (val > 1000000000000000ULL) { |
*rv = val / 1000000000000ULL; |
*suffix = 'T'; |
} else if (val > 1000000000000ULL) { |
*rv = val / 1000000000ULL; |
*suffix = 'G'; |
} else if (val > 1000000000ULL) { |
*rv = val / 1000000ULL; |
*suffix = 'M'; |
} else if (val > 1000000ULL) { |
*rv = val / 1000ULL; |
*suffix = 'k'; |
} else { |
*rv = val; |
*suffix = ' '; |
} |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/lib/rd.c |
---|
0,0 → 1,109 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericmm |
* @{ |
*/ |
/** |
* @file |
* @brief RAM disk support. |
* |
* Support for RAM disk images. |
*/ |
#include <lib/rd.h> |
#include <arch/byteorder.h> |
#include <mm/frame.h> |
#include <sysinfo/sysinfo.h> |
#include <ddi/ddi.h> |
#include <print.h> |
#include <align.h> |
static parea_t rd_parea; /**< Physical memory area for rd. */ |
/** |
* RAM disk initialization routine. At this point, the RAM disk memory is shared |
* and information about the share is provided as sysinfo values to the userspace |
* tasks. |
*/ |
int init_rd(rd_header * header, size_t size) |
{ |
/* Identify RAM disk */ |
if ((header->magic[0] != RD_MAG0) || (header->magic[1] != RD_MAG1) || |
(header->magic[2] != RD_MAG2) || (header->magic[3] != RD_MAG3)) |
return RE_INVALID; |
/* Identify version */ |
if (header->version != RD_VERSION) |
return RE_UNSUPPORTED; |
uint32_t hsize; |
uint64_t dsize; |
switch (header->data_type) { |
case RD_DATA_LSB: |
hsize = uint32_t_le2host(header->header_size); |
dsize = uint64_t_le2host(header->data_size); |
break; |
case RD_DATA_MSB: |
hsize = uint32_t_be2host(header->header_size); |
dsize = uint64_t_be2host(header->data_size); |
break; |
default: |
return RE_UNSUPPORTED; |
} |
if ((hsize % FRAME_SIZE) || (dsize % FRAME_SIZE)) |
return RE_UNSUPPORTED; |
if (dsize % FRAME_SIZE) |
return RE_UNSUPPORTED; |
if (hsize > size) |
return RE_INVALID; |
if ((uint64_t) hsize + dsize > size) |
dsize = size - hsize; |
rd_parea.pbase = ALIGN_DOWN((uintptr_t) KA2PA((void *) header + hsize), FRAME_SIZE); |
rd_parea.vbase = (uintptr_t) ((void *) header + hsize); |
rd_parea.frames = SIZE2FRAMES(dsize); |
rd_parea.cacheable = true; |
ddi_parea_register(&rd_parea); |
sysinfo_set_item_val("rd", NULL, true); |
sysinfo_set_item_val("rd.header_size", NULL, hsize); |
sysinfo_set_item_val("rd.size", NULL, dsize); |
sysinfo_set_item_val("rd.address.physical", NULL, (unative_t) |
KA2PA((void *) header + hsize)); |
return RE_OK; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/lib/objc.c |
---|
0,0 → 1,60 |
/* |
* Copyright (c) 2007 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** |
* @file |
* @brief Objective C run-time environment. |
* |
* This file containts the (growing subset of) |
* Objective C run-time environment. The code currently |
* relies on the external libobjc library, but this |
* dependency will be removed eventually. |
*/ |
#include <lib/objc.h> |
@implementation base_t |
+ (id) new |
{ |
return class_create_instance(self); |
} |
- (id) dispose |
{ |
return object_dispose(self); |
} |
@end |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/lib/objc_ext.c |
---|
0,0 → 1,174 |
/* |
* Copyright (c) 2007 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** |
* @file |
* @brief Objective C bindings. |
* |
* This file provides architecture independent binding |
* functions which are needed to link with libobjc run-time |
* library. Many of the functions are just dummy. |
*/ |
#include <lib/objc_ext.h> |
#include <panic.h> |
#include <arch/memstr.h> |
#include <mm/slab.h> |
void *stderr; |
static unsigned short __ctype_b[384] = { |
0, 0, 0, 0, 0, 0, 0, 0, |
0, 0, 0, 0, 0, 0, 0, 0, |
0, 0, 0, 0, 0, 0, 0, 0, |
0, 0, 0, 0, 0, 0, 0, 0, |
0, 0, 0, 0, 0, 0, 0, 0, |
0, 0, 0, 0, 0, 0, 0, 0, |
0, 0, 0, 0, 0, 0, 0, 0, |
0, 0, 0, 0, 0, 0, 0, 0, |
0, 0, 0, 0, 0, 0, 0, 0, |
0, 0, 0, 0, 0, 0, 0, 0, |
0, 0, 0, 0, 0, 0, 0, 0, |
0, 0, 0, 0, 0, 0, 0, 0, |
0, 0, 0, 0, 0, 0, 0, 0, |
0, 0, 0, 0, 0, 0, 0, 0, |
0, 0, 0, 0, 0, 0, 0, 0, |
0, 0, 0, 0, 0, 0, 0, 0, |
2, 2, 2, 2, 2, 2, 2, 2, |
2, 8195, 8194, 8194, 8194, 8194, 2, 2, |
2, 2, 2, 2, 2, 2, 2, 2, |
2, 2, 2, 2, 2, 2, 2, 2, |
24577, 49156, 49156, 49156, 49156, 49156, 49156, 49156, |
49156, 49156, 49156, 49156, 49156, 49156, 49156, 49156, |
55304, 55304, 55304, 55304, 55304, 55304, 55304, 55304, |
55304, 55304, 49156, 49156, 49156, 49156, 49156, 49156, |
49156, 54536, 54536, 54536, 54536, 54536, 54536, 50440, |
50440, 50440, 50440, 50440, 50440, 50440, 50440, 50440, |
50440, 50440, 50440, 50440, 50440, 50440, 50440, 50440, |
50440, 50440, 50440, 49156, 49156, 49156, 49156, 49156, |
49156, 54792, 54792, 54792, 54792, 54792, 54792, 50696, |
50696, 50696, 50696, 50696, 50696, 50696, 50696, 50696, |
50696, 50696, 50696, 50696, 50696, 50696, 50696, 50696, |
50696, 50696, 50696, 49156, 49156, 49156, 49156, 2, |
0, 0, 0, 0, 0, 0, 0, 0, |
0, 0, 0, 0, 0, 0, 0, 0, |
0, 0, 0, 0, 0, 0, 0, 0, |
0, 0, 0, 0, 0, 0, 0, 0, |
0, 0, 0, 0, 0, 0, 0, 0, |
0, 0, 0, 0, 0, 0, 0, 0, |
0, 0, 0, 0, 0, 0, 0, 0, |
0, 0, 0, 0, 0, 0, 0, 0, |
0, 0, 0, 0, 0, 0, 0, 0, |
0, 0, 0, 0, 0, 0, 0, 0, |
0, 0, 0, 0, 0, 0, 0, 0, |
0, 0, 0, 0, 0, 0, 0, 0, |
0, 0, 0, 0, 0, 0, 0, 0, |
0, 0, 0, 0, 0, 0, 0, 0, |
0, 0, 0, 0, 0, 0, 0, 0, |
0, 0, 0, 0, 0, 0, 0, 0 |
}; |
static const unsigned short *__ctype_b_ptr = __ctype_b + 128; |
void __assert_fail(const char *assertion, const char *file, unsigned int line, const char *function) |
{ |
panic("Run-time assertion (%s:%d:%s) failed (%s)", file, line, function ? function : "", assertion); |
} |
void abort(void) |
{ |
panic("Run-time scheduled abort"); |
} |
void *fopen(const char *path, const char *mode) |
{ |
return NULL; |
} |
size_t fread(void *ptr, size_t size, size_t nmemb, void *stream) |
{ |
return 0; |
} |
size_t fwrite(const void *ptr, size_t size, size_t nmemb, void *stream) |
{ |
return 0; |
} |
int fflush(void *stream) |
{ |
return 0; |
} |
int feof(void *stream) |
{ |
return 1; |
} |
int fclose(void *stream) |
{ |
return 0; |
} |
int vfprintf(void *stream, const char *format, va_list ap) |
{ |
return 0; |
} |
int sscanf(const char *str, const char *format, ...) |
{ |
return 0; |
} |
const unsigned short **__ctype_b_loc(void) |
{ |
return &__ctype_b_ptr; |
} |
long int __strtol_internal(const char *__nptr, char **__endptr, int __base, int __group) |
{ |
return 0; |
} |
void *memset(void *s, int c, size_t n) |
{ |
memsetb((uintptr_t) s, n, c); |
return s; |
} |
void *calloc(size_t nmemb, size_t size) |
{ |
return malloc(nmemb * size, 0); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/mm/slab.c |
---|
0,0 → 1,940 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericmm |
* @{ |
*/ |
/** |
* @file |
* @brief Slab allocator. |
* |
* The slab allocator is closely modelled after OpenSolaris slab allocator. |
* @see http://www.usenix.org/events/usenix01/full_papers/bonwick/bonwick_html/ |
* |
* with the following exceptions: |
* @li empty slabs are deallocated immediately |
* (in Linux they are kept in linked list, in Solaris ???) |
* @li empty magazines are deallocated when not needed |
* (in Solaris they are held in linked list in slab cache) |
* |
* Following features are not currently supported but would be easy to do: |
* @li cache coloring |
* @li dynamic magazine growing (different magazine sizes are already |
* supported, but we would need to adjust allocation strategy) |
* |
* The slab allocator supports per-CPU caches ('magazines') to facilitate |
* good SMP scaling. |
* |
* When a new object is being allocated, it is first checked, if it is |
* available in a CPU-bound magazine. If it is not found there, it is |
* allocated from a CPU-shared slab - if a partially full one is found, |
* it is used, otherwise a new one is allocated. |
* |
* When an object is being deallocated, it is put to a CPU-bound magazine. |
* If there is no such magazine, a new one is allocated (if this fails, |
* the object is deallocated into slab). If the magazine is full, it is |
* put into cpu-shared list of magazines and a new one is allocated. |
* |
* The CPU-bound magazine is actually a pair of magazines in order to avoid |
* thrashing when somebody is allocating/deallocating 1 item at the magazine |
* size boundary. LIFO order is enforced, which should avoid fragmentation |
* as much as possible. |
* |
* Every cache contains list of full slabs and list of partially full slabs. |
* Empty slabs are immediately freed (thrashing will be avoided because |
* of magazines). |
* |
* The slab information structure is kept inside the data area, if possible. |
* The cache can be marked that it should not use magazines. This is used |
* only for slab related caches to avoid deadlocks and infinite recursion |
* (the slab allocator uses itself for allocating all it's control structures). |
* |
* The slab allocator allocates a lot of space and does not free it. When |
* the frame allocator fails to allocate a frame, it calls slab_reclaim(). |
* It tries 'light reclaim' first, then brutal reclaim. The light reclaim |
* releases slabs from cpu-shared magazine-list, until at least 1 slab |
* is deallocated in each cache (this algorithm should probably change). |
* The brutal reclaim removes all cached objects, even from CPU-bound |
* magazines. |
* |
* @todo |
* For better CPU-scaling the magazine allocation strategy should |
* be extended. Currently, if the cache does not have magazine, it asks |
* for non-cpu cached magazine cache to provide one. It might be feasible |
* to add cpu-cached magazine cache (which would allocate it's magazines |
* from non-cpu-cached mag. cache). This would provide a nice per-cpu |
* buffer. The other possibility is to use the per-cache |
* 'empty-magazine-list', which decreases competing for 1 per-system |
* magazine cache. |
* |
* @todo |
* it might be good to add granularity of locks even to slab level, |
* we could then try_spinlock over all partial slabs and thus improve |
* scalability even on slab level |
*/ |
#include <synch/spinlock.h> |
#include <mm/slab.h> |
#include <adt/list.h> |
#include <memstr.h> |
#include <align.h> |
#include <mm/frame.h> |
#include <config.h> |
#include <print.h> |
#include <arch.h> |
#include <panic.h> |
#include <debug.h> |
#include <bitops.h> |
#include <macros.h> |
SPINLOCK_INITIALIZE(slab_cache_lock); |
static LIST_INITIALIZE(slab_cache_list); |
/** Magazine cache */ |
static slab_cache_t mag_cache; |
/** Cache for cache descriptors */ |
static slab_cache_t slab_cache_cache; |
/** Cache for external slab descriptors |
* This time we want per-cpu cache, so do not make it static |
* - using slab for internal slab structures will not deadlock, |
* as all slab structures are 'small' - control structures of |
* their caches do not require further allocation |
*/ |
static slab_cache_t *slab_extern_cache; |
/** Caches for malloc */ |
static slab_cache_t *malloc_caches[SLAB_MAX_MALLOC_W - SLAB_MIN_MALLOC_W + 1]; |
char *malloc_names[] = { |
"malloc-16", |
"malloc-32", |
"malloc-64", |
"malloc-128", |
"malloc-256", |
"malloc-512", |
"malloc-1K", |
"malloc-2K", |
"malloc-4K", |
"malloc-8K", |
"malloc-16K", |
"malloc-32K", |
"malloc-64K", |
"malloc-128K", |
"malloc-256K" |
}; |
/** Slab descriptor */ |
typedef struct { |
slab_cache_t *cache; /**< Pointer to parent cache. */ |
link_t link; /**< List of full/partial slabs. */ |
void *start; /**< Start address of first available item. */ |
count_t available; /**< Count of available items in this slab. */ |
index_t nextavail; /**< The index of next available item. */ |
} slab_t; |
#ifdef CONFIG_DEBUG |
static int _slab_initialized = 0; |
#endif |
/**************************************/ |
/* Slab allocation functions */ |
/** |
* Allocate frames for slab space and initialize |
* |
*/ |
static slab_t * slab_space_alloc(slab_cache_t *cache, int flags) |
{ |
void *data; |
slab_t *slab; |
size_t fsize; |
unsigned int i; |
unsigned int zone = 0; |
data = frame_alloc_generic(cache->order, FRAME_KA | flags, &zone); |
if (!data) { |
return NULL; |
} |
if (! (cache->flags & SLAB_CACHE_SLINSIDE)) { |
slab = slab_alloc(slab_extern_cache, flags); |
if (!slab) { |
frame_free(KA2PA(data)); |
return NULL; |
} |
} else { |
fsize = (PAGE_SIZE << cache->order); |
slab = data + fsize - sizeof(*slab); |
} |
/* Fill in slab structures */ |
for (i = 0; i < ((unsigned int) 1 << cache->order); i++) |
frame_set_parent(ADDR2PFN(KA2PA(data)) + i, slab, zone); |
slab->start = data; |
slab->available = cache->objects; |
slab->nextavail = 0; |
slab->cache = cache; |
for (i = 0; i < cache->objects; i++) |
*((int *) (slab->start + i*cache->size)) = i+1; |
atomic_inc(&cache->allocated_slabs); |
return slab; |
} |
/** |
* Deallocate space associated with slab |
* |
* @return number of freed frames |
*/ |
static count_t slab_space_free(slab_cache_t *cache, slab_t *slab) |
{ |
frame_free(KA2PA(slab->start)); |
if (! (cache->flags & SLAB_CACHE_SLINSIDE)) |
slab_free(slab_extern_cache, slab); |
atomic_dec(&cache->allocated_slabs); |
return 1 << cache->order; |
} |
/** Map object to slab structure */ |
static slab_t * obj2slab(void *obj) |
{ |
return (slab_t *) frame_get_parent(ADDR2PFN(KA2PA(obj)), 0); |
} |
/**************************************/ |
/* Slab functions */ |
/** |
* Return object to slab and call a destructor |
* |
* @param slab If the caller knows directly slab of the object, otherwise NULL |
* |
* @return Number of freed pages |
*/ |
static count_t slab_obj_destroy(slab_cache_t *cache, void *obj, |
slab_t *slab) |
{ |
int freed = 0; |
if (!slab) |
slab = obj2slab(obj); |
ASSERT(slab->cache == cache); |
if (cache->destructor) |
freed = cache->destructor(obj); |
spinlock_lock(&cache->slablock); |
ASSERT(slab->available < cache->objects); |
*((int *)obj) = slab->nextavail; |
slab->nextavail = (obj - slab->start)/cache->size; |
slab->available++; |
/* Move it to correct list */ |
if (slab->available == cache->objects) { |
/* Free associated memory */ |
list_remove(&slab->link); |
spinlock_unlock(&cache->slablock); |
return freed + slab_space_free(cache, slab); |
} else if (slab->available == 1) { |
/* It was in full, move to partial */ |
list_remove(&slab->link); |
list_prepend(&slab->link, &cache->partial_slabs); |
} |
spinlock_unlock(&cache->slablock); |
return freed; |
} |
/** |
* Take new object from slab or create new if needed |
* |
* @return Object address or null |
*/ |
static void * slab_obj_create(slab_cache_t *cache, int flags) |
{ |
slab_t *slab; |
void *obj; |
spinlock_lock(&cache->slablock); |
if (list_empty(&cache->partial_slabs)) { |
/* Allow recursion and reclaiming |
* - this should work, as the slab control structures |
* are small and do not need to allocate with anything |
* other than frame_alloc when they are allocating, |
* that's why we should get recursion at most 1-level deep |
*/ |
spinlock_unlock(&cache->slablock); |
slab = slab_space_alloc(cache, flags); |
if (!slab) |
return NULL; |
spinlock_lock(&cache->slablock); |
} else { |
slab = list_get_instance(cache->partial_slabs.next, slab_t, link); |
list_remove(&slab->link); |
} |
obj = slab->start + slab->nextavail * cache->size; |
slab->nextavail = *((int *)obj); |
slab->available--; |
if (!slab->available) |
list_prepend(&slab->link, &cache->full_slabs); |
else |
list_prepend(&slab->link, &cache->partial_slabs); |
spinlock_unlock(&cache->slablock); |
if (cache->constructor && cache->constructor(obj, flags)) { |
/* Bad, bad, construction failed */ |
slab_obj_destroy(cache, obj, slab); |
return NULL; |
} |
return obj; |
} |
/**************************************/ |
/* CPU-Cache slab functions */ |
/** |
* Finds a full magazine in cache, takes it from list |
* and returns it |
* |
* @param first If true, return first, else last mag |
*/ |
static slab_magazine_t * get_mag_from_cache(slab_cache_t *cache, |
int first) |
{ |
slab_magazine_t *mag = NULL; |
link_t *cur; |
spinlock_lock(&cache->maglock); |
if (!list_empty(&cache->magazines)) { |
if (first) |
cur = cache->magazines.next; |
else |
cur = cache->magazines.prev; |
mag = list_get_instance(cur, slab_magazine_t, link); |
list_remove(&mag->link); |
atomic_dec(&cache->magazine_counter); |
} |
spinlock_unlock(&cache->maglock); |
return mag; |
} |
/** Prepend magazine to magazine list in cache */ |
static void put_mag_to_cache(slab_cache_t *cache, slab_magazine_t *mag) |
{ |
spinlock_lock(&cache->maglock); |
list_prepend(&mag->link, &cache->magazines); |
atomic_inc(&cache->magazine_counter); |
spinlock_unlock(&cache->maglock); |
} |
/** |
* Free all objects in magazine and free memory associated with magazine |
* |
* @return Number of freed pages |
*/ |
static count_t magazine_destroy(slab_cache_t *cache, |
slab_magazine_t *mag) |
{ |
unsigned int i; |
count_t frames = 0; |
for (i = 0; i < mag->busy; i++) { |
frames += slab_obj_destroy(cache, mag->objs[i], NULL); |
atomic_dec(&cache->cached_objs); |
} |
slab_free(&mag_cache, mag); |
return frames; |
} |
/** |
* Find full magazine, set it as current and return it |
* |
* Assume cpu_magazine lock is held |
*/ |
static slab_magazine_t * get_full_current_mag(slab_cache_t *cache) |
{ |
slab_magazine_t *cmag, *lastmag, *newmag; |
cmag = cache->mag_cache[CPU->id].current; |
lastmag = cache->mag_cache[CPU->id].last; |
if (cmag) { /* First try local CPU magazines */ |
if (cmag->busy) |
return cmag; |
if (lastmag && lastmag->busy) { |
cache->mag_cache[CPU->id].current = lastmag; |
cache->mag_cache[CPU->id].last = cmag; |
return lastmag; |
} |
} |
/* Local magazines are empty, import one from magazine list */ |
newmag = get_mag_from_cache(cache, 1); |
if (!newmag) |
return NULL; |
if (lastmag) |
magazine_destroy(cache, lastmag); |
cache->mag_cache[CPU->id].last = cmag; |
cache->mag_cache[CPU->id].current = newmag; |
return newmag; |
} |
/** |
* Try to find object in CPU-cache magazines |
* |
* @return Pointer to object or NULL if not available |
*/ |
static void * magazine_obj_get(slab_cache_t *cache) |
{ |
slab_magazine_t *mag; |
void *obj; |
if (!CPU) |
return NULL; |
spinlock_lock(&cache->mag_cache[CPU->id].lock); |
mag = get_full_current_mag(cache); |
if (!mag) { |
spinlock_unlock(&cache->mag_cache[CPU->id].lock); |
return NULL; |
} |
obj = mag->objs[--mag->busy]; |
spinlock_unlock(&cache->mag_cache[CPU->id].lock); |
atomic_dec(&cache->cached_objs); |
return obj; |
} |
/** |
* Assure that the current magazine is empty, return pointer to it, or NULL if |
* no empty magazine is available and cannot be allocated |
* |
* Assume mag_cache[CPU->id].lock is held |
* |
* We have 2 magazines bound to processor. |
* First try the current. |
* If full, try the last. |
* If full, put to magazines list. |
* allocate new, exchange last & current |
* |
*/ |
static slab_magazine_t * make_empty_current_mag(slab_cache_t *cache) |
{ |
slab_magazine_t *cmag,*lastmag,*newmag; |
cmag = cache->mag_cache[CPU->id].current; |
lastmag = cache->mag_cache[CPU->id].last; |
if (cmag) { |
if (cmag->busy < cmag->size) |
return cmag; |
if (lastmag && lastmag->busy < lastmag->size) { |
cache->mag_cache[CPU->id].last = cmag; |
cache->mag_cache[CPU->id].current = lastmag; |
return lastmag; |
} |
} |
/* current | last are full | nonexistent, allocate new */ |
/* We do not want to sleep just because of caching */ |
/* Especially we do not want reclaiming to start, as |
* this would deadlock */ |
newmag = slab_alloc(&mag_cache, FRAME_ATOMIC | FRAME_NO_RECLAIM); |
if (!newmag) |
return NULL; |
newmag->size = SLAB_MAG_SIZE; |
newmag->busy = 0; |
/* Flush last to magazine list */ |
if (lastmag) |
put_mag_to_cache(cache, lastmag); |
/* Move current as last, save new as current */ |
cache->mag_cache[CPU->id].last = cmag; |
cache->mag_cache[CPU->id].current = newmag; |
return newmag; |
} |
/** |
* Put object into CPU-cache magazine |
* |
* @return 0 - success, -1 - could not get memory |
*/ |
static int magazine_obj_put(slab_cache_t *cache, void *obj) |
{ |
slab_magazine_t *mag; |
if (!CPU) |
return -1; |
spinlock_lock(&cache->mag_cache[CPU->id].lock); |
mag = make_empty_current_mag(cache); |
if (!mag) { |
spinlock_unlock(&cache->mag_cache[CPU->id].lock); |
return -1; |
} |
mag->objs[mag->busy++] = obj; |
spinlock_unlock(&cache->mag_cache[CPU->id].lock); |
atomic_inc(&cache->cached_objs); |
return 0; |
} |
/**************************************/ |
/* Slab cache functions */ |
/** Return number of objects that fit in certain cache size */ |
static unsigned int comp_objects(slab_cache_t *cache) |
{ |
if (cache->flags & SLAB_CACHE_SLINSIDE) |
return ((PAGE_SIZE << cache->order) - sizeof(slab_t)) / cache->size; |
else |
return (PAGE_SIZE << cache->order) / cache->size; |
} |
/** Return wasted space in slab */ |
static unsigned int badness(slab_cache_t *cache) |
{ |
unsigned int objects; |
unsigned int ssize; |
objects = comp_objects(cache); |
ssize = PAGE_SIZE << cache->order; |
if (cache->flags & SLAB_CACHE_SLINSIDE) |
ssize -= sizeof(slab_t); |
return ssize - objects * cache->size; |
} |
/** |
* Initialize mag_cache structure in slab cache |
*/ |
static void make_magcache(slab_cache_t *cache) |
{ |
unsigned int i; |
ASSERT(_slab_initialized >= 2); |
cache->mag_cache = malloc(sizeof(slab_mag_cache_t)*config.cpu_count,0); |
for (i = 0; i < config.cpu_count; i++) { |
memsetb((uintptr_t)&cache->mag_cache[i], |
sizeof(cache->mag_cache[i]), 0); |
spinlock_initialize(&cache->mag_cache[i].lock, "slab_maglock_cpu"); |
} |
} |
/** Initialize allocated memory as a slab cache */ |
static void |
_slab_cache_create(slab_cache_t *cache, |
char *name, |
size_t size, |
size_t align, |
int (*constructor)(void *obj, int kmflag), |
int (*destructor)(void *obj), |
int flags) |
{ |
int pages; |
ipl_t ipl; |
memsetb((uintptr_t)cache, sizeof(*cache), 0); |
cache->name = name; |
if (align < sizeof(unative_t)) |
align = sizeof(unative_t); |
size = ALIGN_UP(size, align); |
cache->size = size; |
cache->constructor = constructor; |
cache->destructor = destructor; |
cache->flags = flags; |
list_initialize(&cache->full_slabs); |
list_initialize(&cache->partial_slabs); |
list_initialize(&cache->magazines); |
spinlock_initialize(&cache->slablock, "slab_lock"); |
spinlock_initialize(&cache->maglock, "slab_maglock"); |
if (! (cache->flags & SLAB_CACHE_NOMAGAZINE)) |
make_magcache(cache); |
/* Compute slab sizes, object counts in slabs etc. */ |
if (cache->size < SLAB_INSIDE_SIZE) |
cache->flags |= SLAB_CACHE_SLINSIDE; |
/* Minimum slab order */ |
pages = SIZE2FRAMES(cache->size); |
/* We need the 2^order >= pages */ |
if (pages == 1) |
cache->order = 0; |
else |
cache->order = fnzb(pages-1)+1; |
while (badness(cache) > SLAB_MAX_BADNESS(cache)) { |
cache->order += 1; |
} |
cache->objects = comp_objects(cache); |
/* If info fits in, put it inside */ |
if (badness(cache) > sizeof(slab_t)) |
cache->flags |= SLAB_CACHE_SLINSIDE; |
/* Add cache to cache list */ |
ipl = interrupts_disable(); |
spinlock_lock(&slab_cache_lock); |
list_append(&cache->link, &slab_cache_list); |
spinlock_unlock(&slab_cache_lock); |
interrupts_restore(ipl); |
} |
/** Create slab cache */ |
slab_cache_t * slab_cache_create(char *name, |
size_t size, |
size_t align, |
int (*constructor)(void *obj, int kmflag), |
int (*destructor)(void *obj), |
int flags) |
{ |
slab_cache_t *cache; |
cache = slab_alloc(&slab_cache_cache, 0); |
_slab_cache_create(cache, name, size, align, constructor, destructor, |
flags); |
return cache; |
} |
/** |
* Reclaim space occupied by objects that are already free |
* |
* @param flags If contains SLAB_RECLAIM_ALL, do aggressive freeing |
* @return Number of freed pages |
*/ |
static count_t _slab_reclaim(slab_cache_t *cache, int flags) |
{ |
unsigned int i; |
slab_magazine_t *mag; |
count_t frames = 0; |
int magcount; |
if (cache->flags & SLAB_CACHE_NOMAGAZINE) |
return 0; /* Nothing to do */ |
/* We count up to original magazine count to avoid |
* endless loop |
*/ |
magcount = atomic_get(&cache->magazine_counter); |
while (magcount-- && (mag=get_mag_from_cache(cache,0))) { |
frames += magazine_destroy(cache,mag); |
if (!(flags & SLAB_RECLAIM_ALL) && frames) |
break; |
} |
if (flags & SLAB_RECLAIM_ALL) { |
/* Free cpu-bound magazines */ |
/* Destroy CPU magazines */ |
for (i = 0; i < config.cpu_count; i++) { |
spinlock_lock(&cache->mag_cache[i].lock); |
mag = cache->mag_cache[i].current; |
if (mag) |
frames += magazine_destroy(cache, mag); |
cache->mag_cache[i].current = NULL; |
mag = cache->mag_cache[i].last; |
if (mag) |
frames += magazine_destroy(cache, mag); |
cache->mag_cache[i].last = NULL; |
spinlock_unlock(&cache->mag_cache[i].lock); |
} |
} |
return frames; |
} |
/** Check that there are no slabs and remove cache from system */ |
void slab_cache_destroy(slab_cache_t *cache) |
{ |
ipl_t ipl; |
/* First remove cache from link, so that we don't need |
* to disable interrupts later |
*/ |
ipl = interrupts_disable(); |
spinlock_lock(&slab_cache_lock); |
list_remove(&cache->link); |
spinlock_unlock(&slab_cache_lock); |
interrupts_restore(ipl); |
/* Do not lock anything, we assume the software is correct and |
* does not touch the cache when it decides to destroy it */ |
/* Destroy all magazines */ |
_slab_reclaim(cache, SLAB_RECLAIM_ALL); |
/* All slabs must be empty */ |
if (!list_empty(&cache->full_slabs) \ |
|| !list_empty(&cache->partial_slabs)) |
panic("Destroying cache that is not empty."); |
if (!(cache->flags & SLAB_CACHE_NOMAGAZINE)) |
free(cache->mag_cache); |
slab_free(&slab_cache_cache, cache); |
} |
/** Allocate new object from cache - if no flags given, always returns |
memory */ |
void * slab_alloc(slab_cache_t *cache, int flags) |
{ |
ipl_t ipl; |
void *result = NULL; |
/* Disable interrupts to avoid deadlocks with interrupt handlers */ |
ipl = interrupts_disable(); |
if (!(cache->flags & SLAB_CACHE_NOMAGAZINE)) { |
result = magazine_obj_get(cache); |
} |
if (!result) |
result = slab_obj_create(cache, flags); |
interrupts_restore(ipl); |
if (result) |
atomic_inc(&cache->allocated_objs); |
return result; |
} |
/** Return object to cache, use slab if known */ |
static void _slab_free(slab_cache_t *cache, void *obj, slab_t *slab) |
{ |
ipl_t ipl; |
ipl = interrupts_disable(); |
if ((cache->flags & SLAB_CACHE_NOMAGAZINE) \ |
|| magazine_obj_put(cache, obj)) { |
slab_obj_destroy(cache, obj, slab); |
} |
interrupts_restore(ipl); |
atomic_dec(&cache->allocated_objs); |
} |
/** Return slab object to cache */ |
void slab_free(slab_cache_t *cache, void *obj) |
{ |
_slab_free(cache, obj, NULL); |
} |
/* Go through all caches and reclaim what is possible */ |
count_t slab_reclaim(int flags) |
{ |
slab_cache_t *cache; |
link_t *cur; |
count_t frames = 0; |
spinlock_lock(&slab_cache_lock); |
/* TODO: Add assert, that interrupts are disabled, otherwise |
* memory allocation from interrupts can deadlock. |
*/ |
for (cur = slab_cache_list.next;cur!=&slab_cache_list; cur=cur->next) { |
cache = list_get_instance(cur, slab_cache_t, link); |
frames += _slab_reclaim(cache, flags); |
} |
spinlock_unlock(&slab_cache_lock); |
return frames; |
} |
/* Print list of slabs */ |
void slab_print_list(void) |
{ |
slab_cache_t *cache; |
link_t *cur; |
ipl_t ipl; |
ipl = interrupts_disable(); |
spinlock_lock(&slab_cache_lock); |
printf("slab name size pages obj/pg slabs cached allocated ctl\n"); |
printf("---------------- -------- ------ ------ ------ ------ --------- ---\n"); |
for (cur = slab_cache_list.next; cur != &slab_cache_list; cur = cur->next) { |
cache = list_get_instance(cur, slab_cache_t, link); |
printf("%-16s %8zd %6zd %6zd %6zd %6zd %9zd %-3s\n", cache->name, cache->size, (1 << cache->order), cache->objects, atomic_get(&cache->allocated_slabs), atomic_get(&cache->cached_objs), atomic_get(&cache->allocated_objs), cache->flags & SLAB_CACHE_SLINSIDE ? "in" : "out"); |
} |
spinlock_unlock(&slab_cache_lock); |
interrupts_restore(ipl); |
} |
void slab_cache_init(void) |
{ |
int i, size; |
/* Initialize magazine cache */ |
_slab_cache_create(&mag_cache, |
"slab_magazine", |
sizeof(slab_magazine_t)+SLAB_MAG_SIZE*sizeof(void*), |
sizeof(uintptr_t), |
NULL, NULL, |
SLAB_CACHE_NOMAGAZINE | SLAB_CACHE_SLINSIDE); |
/* Initialize slab_cache cache */ |
_slab_cache_create(&slab_cache_cache, |
"slab_cache", |
sizeof(slab_cache_cache), |
sizeof(uintptr_t), |
NULL, NULL, |
SLAB_CACHE_NOMAGAZINE | SLAB_CACHE_SLINSIDE); |
/* Initialize external slab cache */ |
slab_extern_cache = slab_cache_create("slab_extern", |
sizeof(slab_t), |
0, NULL, NULL, |
SLAB_CACHE_SLINSIDE | SLAB_CACHE_MAGDEFERRED); |
/* Initialize structures for malloc */ |
for (i=0, size=(1<<SLAB_MIN_MALLOC_W); |
i < (SLAB_MAX_MALLOC_W-SLAB_MIN_MALLOC_W+1); |
i++, size <<= 1) { |
malloc_caches[i] = slab_cache_create(malloc_names[i], |
size, 0, |
NULL,NULL, SLAB_CACHE_MAGDEFERRED); |
} |
#ifdef CONFIG_DEBUG |
_slab_initialized = 1; |
#endif |
} |
/** Enable cpu_cache |
* |
* Kernel calls this function, when it knows the real number of |
* processors. |
* Allocate slab for cpucache and enable it on all existing |
* slabs that are SLAB_CACHE_MAGDEFERRED |
*/ |
void slab_enable_cpucache(void) |
{ |
link_t *cur; |
slab_cache_t *s; |
#ifdef CONFIG_DEBUG |
_slab_initialized = 2; |
#endif |
spinlock_lock(&slab_cache_lock); |
for (cur=slab_cache_list.next; cur != &slab_cache_list;cur=cur->next){ |
s = list_get_instance(cur, slab_cache_t, link); |
if ((s->flags & SLAB_CACHE_MAGDEFERRED) != SLAB_CACHE_MAGDEFERRED) |
continue; |
make_magcache(s); |
s->flags &= ~SLAB_CACHE_MAGDEFERRED; |
} |
spinlock_unlock(&slab_cache_lock); |
} |
/**************************************/ |
/* kalloc/kfree functions */ |
void * malloc(unsigned int size, int flags) |
{ |
ASSERT(_slab_initialized); |
ASSERT(size && size <= (1 << SLAB_MAX_MALLOC_W)); |
if (size < (1 << SLAB_MIN_MALLOC_W)) |
size = (1 << SLAB_MIN_MALLOC_W); |
int idx = fnzb(size - 1) - SLAB_MIN_MALLOC_W + 1; |
return slab_alloc(malloc_caches[idx], flags); |
} |
void * realloc(void *ptr, unsigned int size, int flags) |
{ |
ASSERT(_slab_initialized); |
ASSERT(size <= (1 << SLAB_MAX_MALLOC_W)); |
void *new_ptr; |
if (size > 0) { |
if (size < (1 << SLAB_MIN_MALLOC_W)) |
size = (1 << SLAB_MIN_MALLOC_W); |
int idx = fnzb(size - 1) - SLAB_MIN_MALLOC_W + 1; |
new_ptr = slab_alloc(malloc_caches[idx], flags); |
} else |
new_ptr = NULL; |
if ((new_ptr != NULL) && (ptr != NULL)) { |
slab_t *slab = obj2slab(ptr); |
memcpy(new_ptr, ptr, min(size, slab->cache->size)); |
} |
if (ptr != NULL) |
free(ptr); |
return new_ptr; |
} |
void free(void *ptr) |
{ |
if (!ptr) |
return; |
slab_t *slab = obj2slab(ptr); |
_slab_free(slab->cache, ptr, slab); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/mm/tlb.c |
---|
0,0 → 1,190 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericmm |
* @{ |
*/ |
/** |
* @file |
* @brief Generic TLB shootdown algorithm. |
* |
* The algorithm implemented here is based on the CMU TLB shootdown |
* algorithm and is further simplified (e.g. all CPUs receive all TLB |
* shootdown messages). |
*/ |
#include <mm/tlb.h> |
#include <mm/asid.h> |
#include <arch/mm/tlb.h> |
#include <smp/ipi.h> |
#include <synch/spinlock.h> |
#include <atomic.h> |
#include <arch/interrupt.h> |
#include <config.h> |
#include <arch.h> |
#include <panic.h> |
#include <debug.h> |
#include <cpu.h> |
/** |
* This lock is used for synchronisation between sender and |
* recipients of TLB shootdown message. It must be acquired |
* before CPU structure lock. |
*/ |
SPINLOCK_INITIALIZE(tlblock); |
void tlb_init(void) |
{ |
tlb_arch_init(); |
} |
#ifdef CONFIG_SMP |
/** Send TLB shootdown message. |
* |
* This function attempts to deliver TLB shootdown message |
* to all other processors. |
* |
* This function must be called with interrupts disabled. |
* |
* @param type Type describing scope of shootdown. |
* @param asid Address space, if required by type. |
* @param page Virtual page address, if required by type. |
* @param count Number of pages, if required by type. |
*/ |
void tlb_shootdown_start(tlb_invalidate_type_t type, asid_t asid, |
uintptr_t page, count_t count) |
{ |
unsigned int i; |
CPU->tlb_active = 0; |
spinlock_lock(&tlblock); |
for (i = 0; i < config.cpu_count; i++) { |
cpu_t *cpu; |
if (i == CPU->id) |
continue; |
cpu = &cpus[i]; |
spinlock_lock(&cpu->lock); |
if (cpu->tlb_messages_count == TLB_MESSAGE_QUEUE_LEN) { |
/* |
* The message queue is full. |
* Erase the queue and store one TLB_INVL_ALL message. |
*/ |
cpu->tlb_messages_count = 1; |
cpu->tlb_messages[0].type = TLB_INVL_ALL; |
cpu->tlb_messages[0].asid = ASID_INVALID; |
cpu->tlb_messages[0].page = 0; |
cpu->tlb_messages[0].count = 0; |
} else { |
/* |
* Enqueue the message. |
*/ |
index_t idx = cpu->tlb_messages_count++; |
cpu->tlb_messages[idx].type = type; |
cpu->tlb_messages[idx].asid = asid; |
cpu->tlb_messages[idx].page = page; |
cpu->tlb_messages[idx].count = count; |
} |
spinlock_unlock(&cpu->lock); |
} |
tlb_shootdown_ipi_send(); |
busy_wait: |
for (i = 0; i < config.cpu_count; i++) |
if (cpus[i].tlb_active) |
goto busy_wait; |
} |
/** Finish TLB shootdown sequence. */ |
void tlb_shootdown_finalize(void) |
{ |
spinlock_unlock(&tlblock); |
CPU->tlb_active = 1; |
} |
void tlb_shootdown_ipi_send(void) |
{ |
ipi_broadcast(VECTOR_TLB_SHOOTDOWN_IPI); |
} |
/** Receive TLB shootdown message. */ |
void tlb_shootdown_ipi_recv(void) |
{ |
tlb_invalidate_type_t type; |
asid_t asid; |
uintptr_t page; |
count_t count; |
unsigned int i; |
ASSERT(CPU); |
CPU->tlb_active = 0; |
spinlock_lock(&tlblock); |
spinlock_unlock(&tlblock); |
spinlock_lock(&CPU->lock); |
ASSERT(CPU->tlb_messages_count <= TLB_MESSAGE_QUEUE_LEN); |
for (i = 0; i < CPU->tlb_messages_count; CPU->tlb_messages_count--) { |
type = CPU->tlb_messages[i].type; |
asid = CPU->tlb_messages[i].asid; |
page = CPU->tlb_messages[i].page; |
count = CPU->tlb_messages[i].count; |
switch (type) { |
case TLB_INVL_ALL: |
tlb_invalidate_all(); |
break; |
case TLB_INVL_ASID: |
tlb_invalidate_asid(asid); |
break; |
case TLB_INVL_PAGES: |
ASSERT(count); |
tlb_invalidate_pages(asid, page, count); |
break; |
default: |
panic("unknown type (%d)\n", type); |
break; |
} |
if (type == TLB_INVL_ALL) |
break; |
} |
spinlock_unlock(&CPU->lock); |
CPU->tlb_active = 1; |
} |
#endif /* CONFIG_SMP */ |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/mm/backend_anon.c |
---|
0,0 → 1,227 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericmm |
* @{ |
*/ |
/** |
* @file |
* @brief Backend for anonymous memory address space areas. |
* |
*/ |
#include <mm/as.h> |
#include <mm/page.h> |
#include <genarch/mm/page_pt.h> |
#include <genarch/mm/page_ht.h> |
#include <mm/frame.h> |
#include <mm/slab.h> |
#include <synch/mutex.h> |
#include <adt/list.h> |
#include <adt/btree.h> |
#include <errno.h> |
#include <arch/types.h> |
#include <align.h> |
#include <arch.h> |
#ifdef CONFIG_VIRT_IDX_DCACHE |
#include <arch/mm/cache.h> |
#endif |
static int anon_page_fault(as_area_t *area, uintptr_t addr, pf_access_t access); |
static void anon_frame_free(as_area_t *area, uintptr_t page, uintptr_t frame); |
static void anon_share(as_area_t *area); |
mem_backend_t anon_backend = { |
.page_fault = anon_page_fault, |
.frame_free = anon_frame_free, |
.share = anon_share |
}; |
/** Service a page fault in the anonymous memory address space area. |
* |
* The address space area and page tables must be already locked. |
* |
* @param area Pointer to the address space area. |
* @param addr Faulting virtual address. |
* @param access Access mode that caused the fault (i.e. read/write/exec). |
* |
* @return AS_PF_FAULT on failure (i.e. page fault) or AS_PF_OK on success (i.e. |
* serviced). |
*/ |
int anon_page_fault(as_area_t *area, uintptr_t addr, pf_access_t access) |
{ |
uintptr_t frame; |
bool dirty = false; |
if (!as_area_check_access(area, access)) |
return AS_PF_FAULT; |
if (area->sh_info) { |
btree_node_t *leaf; |
/* |
* The area is shared, chances are that the mapping can be found |
* in the pagemap of the address space area share info |
* structure. |
* In the case that the pagemap does not contain the respective |
* mapping, a new frame is allocated and the mapping is created. |
*/ |
mutex_lock(&area->sh_info->lock); |
frame = (uintptr_t) btree_search(&area->sh_info->pagemap, |
ALIGN_DOWN(addr, PAGE_SIZE) - area->base, &leaf); |
if (!frame) { |
bool allocate = true; |
unsigned int i; |
/* |
* Zero can be returned as a valid frame address. |
* Just a small workaround. |
*/ |
for (i = 0; i < leaf->keys; i++) { |
if (leaf->key[i] == |
ALIGN_DOWN(addr, PAGE_SIZE)) { |
allocate = false; |
break; |
} |
} |
if (allocate) { |
frame = (uintptr_t) frame_alloc(ONE_FRAME, 0); |
memsetb(PA2KA(frame), FRAME_SIZE, 0); |
dirty = true; |
/* |
* Insert the address of the newly allocated |
* frame to the pagemap. |
*/ |
btree_insert(&area->sh_info->pagemap, |
ALIGN_DOWN(addr, PAGE_SIZE) - area->base, |
(void *) frame, leaf); |
} |
} |
frame_reference_add(ADDR2PFN(frame)); |
mutex_unlock(&area->sh_info->lock); |
} else { |
/* |
* In general, there can be several reasons that |
* can have caused this fault. |
* |
* - non-existent mapping: the area is an anonymous |
* area (e.g. heap or stack) and so far has not been |
* allocated a frame for the faulting page |
* |
* - non-present mapping: another possibility, |
* currently not implemented, would be frame |
* reuse; when this becomes a possibility, |
* do not forget to distinguish between |
* the different causes |
*/ |
frame = (uintptr_t) frame_alloc(ONE_FRAME, 0); |
memsetb(PA2KA(frame), FRAME_SIZE, 0); |
dirty = true; |
} |
/* |
* Map 'page' to 'frame'. |
* Note that TLB shootdown is not attempted as only new information is |
* being inserted into page tables. |
*/ |
page_mapping_insert(AS, addr, frame, as_area_get_flags(area)); |
if (!used_space_insert(area, ALIGN_DOWN(addr, PAGE_SIZE), 1)) |
panic("Could not insert used space.\n"); |
return AS_PF_OK; |
} |
/** Free a frame that is backed by the anonymous memory backend. |
* |
* The address space area and page tables must be already locked. |
* |
* @param area Ignored. |
* @param page Virtual address of the page corresponding to the frame. |
* @param frame Frame to be released. |
*/ |
void anon_frame_free(as_area_t *area, uintptr_t page, uintptr_t frame) |
{ |
frame_free(frame); |
} |
/** Share the anonymous address space area. |
* |
* Sharing of anonymous area is done by duplicating its entire mapping |
* to the pagemap. Page faults will primarily search for frames there. |
* |
* The address space and address space area must be already locked. |
* |
* @param area Address space area to be shared. |
*/ |
void anon_share(as_area_t *area) |
{ |
link_t *cur; |
/* |
* Copy used portions of the area to sh_info's page map. |
*/ |
mutex_lock(&area->sh_info->lock); |
for (cur = area->used_space.leaf_head.next; |
cur != &area->used_space.leaf_head; cur = cur->next) { |
btree_node_t *node; |
unsigned int i; |
node = list_get_instance(cur, btree_node_t, leaf_link); |
for (i = 0; i < node->keys; i++) { |
uintptr_t base = node->key[i]; |
count_t count = (count_t) node->value[i]; |
unsigned int j; |
for (j = 0; j < count; j++) { |
pte_t *pte; |
page_table_lock(area->as, false); |
pte = page_mapping_find(area->as, |
base + j * PAGE_SIZE); |
ASSERT(pte && PTE_VALID(pte) && |
PTE_PRESENT(pte)); |
btree_insert(&area->sh_info->pagemap, |
(base + j * PAGE_SIZE) - area->base, |
(void *) PTE_GET_FRAME(pte), NULL); |
page_table_unlock(area->as, false); |
pfn_t pfn = ADDR2PFN(PTE_GET_FRAME(pte)); |
frame_reference_add(pfn); |
} |
} |
} |
mutex_unlock(&area->sh_info->lock); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/mm/as.c |
---|
0,0 → 1,1815 |
/* |
* Copyright (c) 2001-2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericmm |
* @{ |
*/ |
/** |
* @file |
* @brief Address space related functions. |
* |
* This file contains address space manipulation functions. |
* Roughly speaking, this is a higher-level client of |
* Virtual Address Translation (VAT) subsystem. |
* |
* Functionality provided by this file allows one to |
* create address spaces and create, resize and share |
* address space areas. |
* |
* @see page.c |
* |
*/ |
#include <mm/as.h> |
#include <arch/mm/as.h> |
#include <mm/page.h> |
#include <mm/frame.h> |
#include <mm/slab.h> |
#include <mm/tlb.h> |
#include <arch/mm/page.h> |
#include <genarch/mm/page_pt.h> |
#include <genarch/mm/page_ht.h> |
#include <mm/asid.h> |
#include <arch/mm/asid.h> |
#include <preemption.h> |
#include <synch/spinlock.h> |
#include <synch/mutex.h> |
#include <adt/list.h> |
#include <adt/btree.h> |
#include <proc/task.h> |
#include <proc/thread.h> |
#include <arch/asm.h> |
#include <panic.h> |
#include <debug.h> |
#include <print.h> |
#include <memstr.h> |
#include <macros.h> |
#include <arch.h> |
#include <errno.h> |
#include <config.h> |
#include <align.h> |
#include <arch/types.h> |
#include <syscall/copy.h> |
#include <arch/interrupt.h> |
#ifdef CONFIG_VIRT_IDX_DCACHE |
#include <arch/mm/cache.h> |
#endif /* CONFIG_VIRT_IDX_DCACHE */ |
#ifndef __OBJC__ |
/** |
* Each architecture decides what functions will be used to carry out |
* address space operations such as creating or locking page tables. |
*/ |
as_operations_t *as_operations = NULL; |
/** |
* Slab for as_t objects. |
*/ |
static slab_cache_t *as_slab; |
#endif |
/** |
* This lock serializes access to the ASID subsystem. |
* It protects: |
* - inactive_as_with_asid_head list |
* - as->asid for each as of the as_t type |
* - asids_allocated counter |
*/ |
SPINLOCK_INITIALIZE(asidlock); |
/** |
* This list contains address spaces that are not active on any |
* processor and that have valid ASID. |
*/ |
LIST_INITIALIZE(inactive_as_with_asid_head); |
/** Kernel address space. */ |
as_t *AS_KERNEL = NULL; |
static int area_flags_to_page_flags(int aflags); |
static as_area_t *find_area_and_lock(as_t *as, uintptr_t va); |
static bool check_area_conflicts(as_t *as, uintptr_t va, size_t size, |
as_area_t *avoid_area); |
static void sh_info_remove_reference(share_info_t *sh_info); |
#ifndef __OBJC__ |
static int as_constructor(void *obj, int flags) |
{ |
as_t *as = (as_t *) obj; |
int rc; |
link_initialize(&as->inactive_as_with_asid_link); |
mutex_initialize(&as->lock); |
rc = as_constructor_arch(as, flags); |
return rc; |
} |
static int as_destructor(void *obj) |
{ |
as_t *as = (as_t *) obj; |
return as_destructor_arch(as); |
} |
#endif |
/** Initialize address space subsystem. */ |
void as_init(void) |
{ |
as_arch_init(); |
#ifndef __OBJC__ |
as_slab = slab_cache_create("as_slab", sizeof(as_t), 0, |
as_constructor, as_destructor, SLAB_CACHE_MAGDEFERRED); |
#endif |
AS_KERNEL = as_create(FLAG_AS_KERNEL); |
if (!AS_KERNEL) |
panic("can't create kernel address space\n"); |
} |
/** Create address space. |
* |
* @param flags Flags that influence way in wich the address space is created. |
*/ |
as_t *as_create(int flags) |
{ |
as_t *as; |
#ifdef __OBJC__ |
as = [as_t new]; |
link_initialize(&as->inactive_as_with_asid_link); |
mutex_initialize(&as->lock); |
(void) as_constructor_arch(as, flags); |
#else |
as = (as_t *) slab_alloc(as_slab, 0); |
#endif |
(void) as_create_arch(as, 0); |
btree_create(&as->as_area_btree); |
if (flags & FLAG_AS_KERNEL) |
as->asid = ASID_KERNEL; |
else |
as->asid = ASID_INVALID; |
atomic_set(&as->refcount, 0); |
as->cpu_refcount = 0; |
#ifdef AS_PAGE_TABLE |
as->genarch.page_table = page_table_create(flags); |
#else |
page_table_create(flags); |
#endif |
return as; |
} |
/** Destroy adress space. |
* |
* When there are no tasks referencing this address space (i.e. its refcount is |
* zero), the address space can be destroyed. |
* |
* We know that we don't hold any spinlock. |
*/ |
void as_destroy(as_t *as) |
{ |
ipl_t ipl; |
bool cond; |
DEADLOCK_PROBE_INIT(p_asidlock); |
ASSERT(atomic_get(&as->refcount) == 0); |
/* |
* Since there is no reference to this area, |
* it is safe not to lock its mutex. |
*/ |
/* |
* We need to avoid deadlock between TLB shootdown and asidlock. |
* We therefore try to take asid conditionally and if we don't succeed, |
* we enable interrupts and try again. This is done while preemption is |
* disabled to prevent nested context switches. We also depend on the |
* fact that so far no spinlocks are held. |
*/ |
preemption_disable(); |
ipl = interrupts_read(); |
retry: |
interrupts_disable(); |
if (!spinlock_trylock(&asidlock)) { |
interrupts_enable(); |
DEADLOCK_PROBE(p_asidlock, DEADLOCK_THRESHOLD); |
goto retry; |
} |
preemption_enable(); /* Interrupts disabled, enable preemption */ |
if (as->asid != ASID_INVALID && as != AS_KERNEL) { |
if (as != AS && as->cpu_refcount == 0) |
list_remove(&as->inactive_as_with_asid_link); |
asid_put(as->asid); |
} |
spinlock_unlock(&asidlock); |
/* |
* Destroy address space areas of the address space. |
* The B+tree must be walked carefully because it is |
* also being destroyed. |
*/ |
for (cond = true; cond; ) { |
btree_node_t *node; |
ASSERT(!list_empty(&as->as_area_btree.leaf_head)); |
node = list_get_instance(as->as_area_btree.leaf_head.next, |
btree_node_t, leaf_link); |
if ((cond = node->keys)) { |
as_area_destroy(as, node->key[0]); |
} |
} |
btree_destroy(&as->as_area_btree); |
#ifdef AS_PAGE_TABLE |
page_table_destroy(as->genarch.page_table); |
#else |
page_table_destroy(NULL); |
#endif |
interrupts_restore(ipl); |
#ifdef __OBJC__ |
[as free]; |
#else |
slab_free(as_slab, as); |
#endif |
} |
/** Create address space area of common attributes. |
* |
* The created address space area is added to the target address space. |
* |
* @param as Target address space. |
* @param flags Flags of the area memory. |
* @param size Size of area. |
* @param base Base address of area. |
* @param attrs Attributes of the area. |
* @param backend Address space area backend. NULL if no backend is used. |
* @param backend_data NULL or a pointer to an array holding two void *. |
* |
* @return Address space area on success or NULL on failure. |
*/ |
as_area_t * |
as_area_create(as_t *as, int flags, size_t size, uintptr_t base, int attrs, |
mem_backend_t *backend, mem_backend_data_t *backend_data) |
{ |
ipl_t ipl; |
as_area_t *a; |
if (base % PAGE_SIZE) |
return NULL; |
if (!size) |
return NULL; |
/* Writeable executable areas are not supported. */ |
if ((flags & AS_AREA_EXEC) && (flags & AS_AREA_WRITE)) |
return NULL; |
ipl = interrupts_disable(); |
mutex_lock(&as->lock); |
if (!check_area_conflicts(as, base, size, NULL)) { |
mutex_unlock(&as->lock); |
interrupts_restore(ipl); |
return NULL; |
} |
a = (as_area_t *) malloc(sizeof(as_area_t), 0); |
mutex_initialize(&a->lock); |
a->as = as; |
a->flags = flags; |
a->attributes = attrs; |
a->pages = SIZE2FRAMES(size); |
a->base = base; |
a->sh_info = NULL; |
a->backend = backend; |
if (backend_data) |
a->backend_data = *backend_data; |
else |
memsetb((uintptr_t) &a->backend_data, sizeof(a->backend_data), |
0); |
btree_create(&a->used_space); |
btree_insert(&as->as_area_btree, base, (void *) a, NULL); |
mutex_unlock(&as->lock); |
interrupts_restore(ipl); |
return a; |
} |
/** Find address space area and change it. |
* |
* @param as Address space. |
* @param address Virtual address belonging to the area to be changed. Must be |
* page-aligned. |
* @param size New size of the virtual memory block starting at address. |
* @param flags Flags influencing the remap operation. Currently unused. |
* |
* @return Zero on success or a value from @ref errno.h otherwise. |
*/ |
int as_area_resize(as_t *as, uintptr_t address, size_t size, int flags) |
{ |
as_area_t *area; |
ipl_t ipl; |
size_t pages; |
ipl = interrupts_disable(); |
mutex_lock(&as->lock); |
/* |
* Locate the area. |
*/ |
area = find_area_and_lock(as, address); |
if (!area) { |
mutex_unlock(&as->lock); |
interrupts_restore(ipl); |
return ENOENT; |
} |
if (area->backend == &phys_backend) { |
/* |
* Remapping of address space areas associated |
* with memory mapped devices is not supported. |
*/ |
mutex_unlock(&area->lock); |
mutex_unlock(&as->lock); |
interrupts_restore(ipl); |
return ENOTSUP; |
} |
if (area->sh_info) { |
/* |
* Remapping of shared address space areas |
* is not supported. |
*/ |
mutex_unlock(&area->lock); |
mutex_unlock(&as->lock); |
interrupts_restore(ipl); |
return ENOTSUP; |
} |
pages = SIZE2FRAMES((address - area->base) + size); |
if (!pages) { |
/* |
* Zero size address space areas are not allowed. |
*/ |
mutex_unlock(&area->lock); |
mutex_unlock(&as->lock); |
interrupts_restore(ipl); |
return EPERM; |
} |
if (pages < area->pages) { |
bool cond; |
uintptr_t start_free = area->base + pages*PAGE_SIZE; |
/* |
* Shrinking the area. |
* No need to check for overlaps. |
*/ |
/* |
* Start TLB shootdown sequence. |
*/ |
tlb_shootdown_start(TLB_INVL_PAGES, AS->asid, area->base + |
pages * PAGE_SIZE, area->pages - pages); |
/* |
* Remove frames belonging to used space starting from |
* the highest addresses downwards until an overlap with |
* the resized address space area is found. Note that this |
* is also the right way to remove part of the used_space |
* B+tree leaf list. |
*/ |
for (cond = true; cond;) { |
btree_node_t *node; |
ASSERT(!list_empty(&area->used_space.leaf_head)); |
node = |
list_get_instance(area->used_space.leaf_head.prev, |
btree_node_t, leaf_link); |
if ((cond = (bool) node->keys)) { |
uintptr_t b = node->key[node->keys - 1]; |
count_t c = |
(count_t) node->value[node->keys - 1]; |
unsigned int i = 0; |
if (overlaps(b, c * PAGE_SIZE, area->base, |
pages * PAGE_SIZE)) { |
if (b + c * PAGE_SIZE <= start_free) { |
/* |
* The whole interval fits |
* completely in the resized |
* address space area. |
*/ |
break; |
} |
/* |
* Part of the interval corresponding |
* to b and c overlaps with the resized |
* address space area. |
*/ |
cond = false; /* we are almost done */ |
i = (start_free - b) >> PAGE_WIDTH; |
if (!used_space_remove(area, start_free, |
c - i)) |
panic("Could not remove used " |
"space.\n"); |
} else { |
/* |
* The interval of used space can be |
* completely removed. |
*/ |
if (!used_space_remove(area, b, c)) |
panic("Could not remove used " |
"space.\n"); |
} |
for (; i < c; i++) { |
pte_t *pte; |
page_table_lock(as, false); |
pte = page_mapping_find(as, b + |
i * PAGE_SIZE); |
ASSERT(pte && PTE_VALID(pte) && |
PTE_PRESENT(pte)); |
if (area->backend && |
area->backend->frame_free) { |
area->backend->frame_free(area, |
b + i * PAGE_SIZE, |
PTE_GET_FRAME(pte)); |
} |
page_mapping_remove(as, b + |
i * PAGE_SIZE); |
page_table_unlock(as, false); |
} |
} |
} |
/* |
* Finish TLB shootdown sequence. |
*/ |
tlb_invalidate_pages(as->asid, area->base + pages * PAGE_SIZE, |
area->pages - pages); |
/* |
* Invalidate software translation caches (e.g. TSB on sparc64). |
*/ |
as_invalidate_translation_cache(as, area->base + |
pages * PAGE_SIZE, area->pages - pages); |
tlb_shootdown_finalize(); |
} else { |
/* |
* Growing the area. |
* Check for overlaps with other address space areas. |
*/ |
if (!check_area_conflicts(as, address, pages * PAGE_SIZE, |
area)) { |
mutex_unlock(&area->lock); |
mutex_unlock(&as->lock); |
interrupts_restore(ipl); |
return EADDRNOTAVAIL; |
} |
} |
area->pages = pages; |
mutex_unlock(&area->lock); |
mutex_unlock(&as->lock); |
interrupts_restore(ipl); |
return 0; |
} |
/** Destroy address space area. |
* |
* @param as Address space. |
* @param address Address withing the area to be deleted. |
* |
* @return Zero on success or a value from @ref errno.h on failure. |
*/ |
int as_area_destroy(as_t *as, uintptr_t address) |
{ |
as_area_t *area; |
uintptr_t base; |
link_t *cur; |
ipl_t ipl; |
ipl = interrupts_disable(); |
mutex_lock(&as->lock); |
area = find_area_and_lock(as, address); |
if (!area) { |
mutex_unlock(&as->lock); |
interrupts_restore(ipl); |
return ENOENT; |
} |
base = area->base; |
/* |
* Start TLB shootdown sequence. |
*/ |
tlb_shootdown_start(TLB_INVL_PAGES, as->asid, area->base, area->pages); |
/* |
* Visit only the pages mapped by used_space B+tree. |
*/ |
for (cur = area->used_space.leaf_head.next; |
cur != &area->used_space.leaf_head; cur = cur->next) { |
btree_node_t *node; |
unsigned int i; |
node = list_get_instance(cur, btree_node_t, leaf_link); |
for (i = 0; i < node->keys; i++) { |
uintptr_t b = node->key[i]; |
count_t j; |
pte_t *pte; |
for (j = 0; j < (count_t) node->value[i]; j++) { |
page_table_lock(as, false); |
pte = page_mapping_find(as, b + j * PAGE_SIZE); |
ASSERT(pte && PTE_VALID(pte) && |
PTE_PRESENT(pte)); |
if (area->backend && |
area->backend->frame_free) { |
area->backend->frame_free(area, b + |
j * PAGE_SIZE, PTE_GET_FRAME(pte)); |
} |
page_mapping_remove(as, b + j * PAGE_SIZE); |
page_table_unlock(as, false); |
} |
} |
} |
/* |
* Finish TLB shootdown sequence. |
*/ |
tlb_invalidate_pages(as->asid, area->base, area->pages); |
/* |
* Invalidate potential software translation caches (e.g. TSB on |
* sparc64). |
*/ |
as_invalidate_translation_cache(as, area->base, area->pages); |
tlb_shootdown_finalize(); |
btree_destroy(&area->used_space); |
area->attributes |= AS_AREA_ATTR_PARTIAL; |
if (area->sh_info) |
sh_info_remove_reference(area->sh_info); |
mutex_unlock(&area->lock); |
/* |
* Remove the empty area from address space. |
*/ |
btree_remove(&as->as_area_btree, base, NULL); |
free(area); |
mutex_unlock(&as->lock); |
interrupts_restore(ipl); |
return 0; |
} |
/** Share address space area with another or the same address space. |
* |
* Address space area mapping is shared with a new address space area. |
* If the source address space area has not been shared so far, |
* a new sh_info is created. The new address space area simply gets the |
* sh_info of the source area. The process of duplicating the |
* mapping is done through the backend share function. |
* |
* @param src_as Pointer to source address space. |
* @param src_base Base address of the source address space area. |
* @param acc_size Expected size of the source area. |
* @param dst_as Pointer to destination address space. |
* @param dst_base Target base address. |
* @param dst_flags_mask Destination address space area flags mask. |
* |
* @return Zero on success or ENOENT if there is no such task or if there is no |
* such address space area, EPERM if there was a problem in accepting the area |
* or ENOMEM if there was a problem in allocating destination address space |
* area. ENOTSUP is returned if the address space area backend does not support |
* sharing. |
*/ |
int as_area_share(as_t *src_as, uintptr_t src_base, size_t acc_size, |
as_t *dst_as, uintptr_t dst_base, int dst_flags_mask) |
{ |
ipl_t ipl; |
int src_flags; |
size_t src_size; |
as_area_t *src_area, *dst_area; |
share_info_t *sh_info; |
mem_backend_t *src_backend; |
mem_backend_data_t src_backend_data; |
ipl = interrupts_disable(); |
mutex_lock(&src_as->lock); |
src_area = find_area_and_lock(src_as, src_base); |
if (!src_area) { |
/* |
* Could not find the source address space area. |
*/ |
mutex_unlock(&src_as->lock); |
interrupts_restore(ipl); |
return ENOENT; |
} |
if (!src_area->backend || !src_area->backend->share) { |
/* |
* There is no backend or the backend does not |
* know how to share the area. |
*/ |
mutex_unlock(&src_area->lock); |
mutex_unlock(&src_as->lock); |
interrupts_restore(ipl); |
return ENOTSUP; |
} |
src_size = src_area->pages * PAGE_SIZE; |
src_flags = src_area->flags; |
src_backend = src_area->backend; |
src_backend_data = src_area->backend_data; |
/* Share the cacheable flag from the original mapping */ |
if (src_flags & AS_AREA_CACHEABLE) |
dst_flags_mask |= AS_AREA_CACHEABLE; |
if (src_size != acc_size || |
(src_flags & dst_flags_mask) != dst_flags_mask) { |
mutex_unlock(&src_area->lock); |
mutex_unlock(&src_as->lock); |
interrupts_restore(ipl); |
return EPERM; |
} |
/* |
* Now we are committed to sharing the area. |
* First, prepare the area for sharing. |
* Then it will be safe to unlock it. |
*/ |
sh_info = src_area->sh_info; |
if (!sh_info) { |
sh_info = (share_info_t *) malloc(sizeof(share_info_t), 0); |
mutex_initialize(&sh_info->lock); |
sh_info->refcount = 2; |
btree_create(&sh_info->pagemap); |
src_area->sh_info = sh_info; |
/* |
* Call the backend to setup sharing. |
*/ |
src_area->backend->share(src_area); |
} else { |
mutex_lock(&sh_info->lock); |
sh_info->refcount++; |
mutex_unlock(&sh_info->lock); |
} |
mutex_unlock(&src_area->lock); |
mutex_unlock(&src_as->lock); |
/* |
* Create copy of the source address space area. |
* The destination area is created with AS_AREA_ATTR_PARTIAL |
* attribute set which prevents race condition with |
* preliminary as_page_fault() calls. |
* The flags of the source area are masked against dst_flags_mask |
* to support sharing in less privileged mode. |
*/ |
dst_area = as_area_create(dst_as, dst_flags_mask, src_size, dst_base, |
AS_AREA_ATTR_PARTIAL, src_backend, &src_backend_data); |
if (!dst_area) { |
/* |
* Destination address space area could not be created. |
*/ |
sh_info_remove_reference(sh_info); |
interrupts_restore(ipl); |
return ENOMEM; |
} |
/* |
* Now the destination address space area has been |
* fully initialized. Clear the AS_AREA_ATTR_PARTIAL |
* attribute and set the sh_info. |
*/ |
mutex_lock(&dst_as->lock); |
mutex_lock(&dst_area->lock); |
dst_area->attributes &= ~AS_AREA_ATTR_PARTIAL; |
dst_area->sh_info = sh_info; |
mutex_unlock(&dst_area->lock); |
mutex_unlock(&dst_as->lock); |
interrupts_restore(ipl); |
return 0; |
} |
/** Check access mode for address space area. |
* |
* The address space area must be locked prior to this call. |
* |
* @param area Address space area. |
* @param access Access mode. |
* |
* @return False if access violates area's permissions, true otherwise. |
*/ |
bool as_area_check_access(as_area_t *area, pf_access_t access) |
{ |
int flagmap[] = { |
[PF_ACCESS_READ] = AS_AREA_READ, |
[PF_ACCESS_WRITE] = AS_AREA_WRITE, |
[PF_ACCESS_EXEC] = AS_AREA_EXEC |
}; |
if (!(area->flags & flagmap[access])) |
return false; |
return true; |
} |
/** Handle page fault within the current address space. |
* |
* This is the high-level page fault handler. It decides |
* whether the page fault can be resolved by any backend |
* and if so, it invokes the backend to resolve the page |
* fault. |
* |
* Interrupts are assumed disabled. |
* |
* @param page Faulting page. |
* @param access Access mode that caused the fault (i.e. read/write/exec). |
* @param istate Pointer to interrupted state. |
* |
* @return AS_PF_FAULT on page fault, AS_PF_OK on success or AS_PF_DEFER if the |
* fault was caused by copy_to_uspace() or copy_from_uspace(). |
*/ |
int as_page_fault(uintptr_t page, pf_access_t access, istate_t *istate) |
{ |
pte_t *pte; |
as_area_t *area; |
if (!THREAD) |
return AS_PF_FAULT; |
ASSERT(AS); |
mutex_lock(&AS->lock); |
area = find_area_and_lock(AS, page); |
if (!area) { |
/* |
* No area contained mapping for 'page'. |
* Signal page fault to low-level handler. |
*/ |
mutex_unlock(&AS->lock); |
goto page_fault; |
} |
if (area->attributes & AS_AREA_ATTR_PARTIAL) { |
/* |
* The address space area is not fully initialized. |
* Avoid possible race by returning error. |
*/ |
mutex_unlock(&area->lock); |
mutex_unlock(&AS->lock); |
goto page_fault; |
} |
if (!area->backend || !area->backend->page_fault) { |
/* |
* The address space area is not backed by any backend |
* or the backend cannot handle page faults. |
*/ |
mutex_unlock(&area->lock); |
mutex_unlock(&AS->lock); |
goto page_fault; |
} |
page_table_lock(AS, false); |
/* |
* To avoid race condition between two page faults |
* on the same address, we need to make sure |
* the mapping has not been already inserted. |
*/ |
if ((pte = page_mapping_find(AS, page))) { |
if (PTE_PRESENT(pte)) { |
if (((access == PF_ACCESS_READ) && PTE_READABLE(pte)) || |
(access == PF_ACCESS_WRITE && PTE_WRITABLE(pte)) || |
(access == PF_ACCESS_EXEC && PTE_EXECUTABLE(pte))) { |
page_table_unlock(AS, false); |
mutex_unlock(&area->lock); |
mutex_unlock(&AS->lock); |
return AS_PF_OK; |
} |
} |
} |
/* |
* Resort to the backend page fault handler. |
*/ |
if (area->backend->page_fault(area, page, access) != AS_PF_OK) { |
page_table_unlock(AS, false); |
mutex_unlock(&area->lock); |
mutex_unlock(&AS->lock); |
goto page_fault; |
} |
page_table_unlock(AS, false); |
mutex_unlock(&area->lock); |
mutex_unlock(&AS->lock); |
return AS_PF_OK; |
page_fault: |
if (THREAD->in_copy_from_uspace) { |
THREAD->in_copy_from_uspace = false; |
istate_set_retaddr(istate, |
(uintptr_t) &memcpy_from_uspace_failover_address); |
} else if (THREAD->in_copy_to_uspace) { |
THREAD->in_copy_to_uspace = false; |
istate_set_retaddr(istate, |
(uintptr_t) &memcpy_to_uspace_failover_address); |
} else { |
return AS_PF_FAULT; |
} |
return AS_PF_DEFER; |
} |
/** Switch address spaces. |
* |
* Note that this function cannot sleep as it is essentially a part of |
* scheduling. Sleeping here would lead to deadlock on wakeup. Another |
* thing which is forbidden in this context is locking the address space. |
* |
* When this function is enetered, no spinlocks may be held. |
* |
* @param old Old address space or NULL. |
* @param new New address space. |
*/ |
void as_switch(as_t *old_as, as_t *new_as) |
{ |
DEADLOCK_PROBE_INIT(p_asidlock); |
preemption_disable(); |
retry: |
(void) interrupts_disable(); |
if (!spinlock_trylock(&asidlock)) { |
/* |
* Avoid deadlock with TLB shootdown. |
* We can enable interrupts here because |
* preemption is disabled. We should not be |
* holding any other lock. |
*/ |
(void) interrupts_enable(); |
DEADLOCK_PROBE(p_asidlock, DEADLOCK_THRESHOLD); |
goto retry; |
} |
preemption_enable(); |
/* |
* First, take care of the old address space. |
*/ |
if (old_as) { |
ASSERT(old_as->cpu_refcount); |
if((--old_as->cpu_refcount == 0) && (old_as != AS_KERNEL)) { |
/* |
* The old address space is no longer active on |
* any processor. It can be appended to the |
* list of inactive address spaces with assigned |
* ASID. |
*/ |
ASSERT(old_as->asid != ASID_INVALID); |
list_append(&old_as->inactive_as_with_asid_link, |
&inactive_as_with_asid_head); |
} |
/* |
* Perform architecture-specific tasks when the address space |
* is being removed from the CPU. |
*/ |
as_deinstall_arch(old_as); |
} |
/* |
* Second, prepare the new address space. |
*/ |
if ((new_as->cpu_refcount++ == 0) && (new_as != AS_KERNEL)) { |
if (new_as->asid != ASID_INVALID) |
list_remove(&new_as->inactive_as_with_asid_link); |
else |
new_as->asid = asid_get(); |
} |
#ifdef AS_PAGE_TABLE |
SET_PTL0_ADDRESS(new_as->genarch.page_table); |
#endif |
/* |
* Perform architecture-specific steps. |
* (e.g. write ASID to hardware register etc.) |
*/ |
as_install_arch(new_as); |
spinlock_unlock(&asidlock); |
AS = new_as; |
} |
/** Convert address space area flags to page flags. |
* |
* @param aflags Flags of some address space area. |
* |
* @return Flags to be passed to page_mapping_insert(). |
*/ |
int area_flags_to_page_flags(int aflags) |
{ |
int flags; |
flags = PAGE_USER | PAGE_PRESENT; |
if (aflags & AS_AREA_READ) |
flags |= PAGE_READ; |
if (aflags & AS_AREA_WRITE) |
flags |= PAGE_WRITE; |
if (aflags & AS_AREA_EXEC) |
flags |= PAGE_EXEC; |
if (aflags & AS_AREA_CACHEABLE) |
flags |= PAGE_CACHEABLE; |
return flags; |
} |
/** Compute flags for virtual address translation subsytem. |
* |
* The address space area must be locked. |
* Interrupts must be disabled. |
* |
* @param a Address space area. |
* |
* @return Flags to be used in page_mapping_insert(). |
*/ |
int as_area_get_flags(as_area_t *a) |
{ |
return area_flags_to_page_flags(a->flags); |
} |
/** Create page table. |
* |
* Depending on architecture, create either address space |
* private or global page table. |
* |
* @param flags Flags saying whether the page table is for kernel address space. |
* |
* @return First entry of the page table. |
*/ |
pte_t *page_table_create(int flags) |
{ |
#ifdef __OBJC__ |
return [as_t page_table_create: flags]; |
#else |
ASSERT(as_operations); |
ASSERT(as_operations->page_table_create); |
return as_operations->page_table_create(flags); |
#endif |
} |
/** Destroy page table. |
* |
* Destroy page table in architecture specific way. |
* |
* @param page_table Physical address of PTL0. |
*/ |
void page_table_destroy(pte_t *page_table) |
{ |
#ifdef __OBJC__ |
return [as_t page_table_destroy: page_table]; |
#else |
ASSERT(as_operations); |
ASSERT(as_operations->page_table_destroy); |
as_operations->page_table_destroy(page_table); |
#endif |
} |
/** Lock page table. |
* |
* This function should be called before any page_mapping_insert(), |
* page_mapping_remove() and page_mapping_find(). |
* |
* Locking order is such that address space areas must be locked |
* prior to this call. Address space can be locked prior to this |
* call in which case the lock argument is false. |
* |
* @param as Address space. |
* @param lock If false, do not attempt to lock as->lock. |
*/ |
void page_table_lock(as_t *as, bool lock) |
{ |
#ifdef __OBJC__ |
[as page_table_lock: lock]; |
#else |
ASSERT(as_operations); |
ASSERT(as_operations->page_table_lock); |
as_operations->page_table_lock(as, lock); |
#endif |
} |
/** Unlock page table. |
* |
* @param as Address space. |
* @param unlock If false, do not attempt to unlock as->lock. |
*/ |
void page_table_unlock(as_t *as, bool unlock) |
{ |
#ifdef __OBJC__ |
[as page_table_unlock: unlock]; |
#else |
ASSERT(as_operations); |
ASSERT(as_operations->page_table_unlock); |
as_operations->page_table_unlock(as, unlock); |
#endif |
} |
/** Find address space area and lock it. |
* |
* The address space must be locked and interrupts must be disabled. |
* |
* @param as Address space. |
* @param va Virtual address. |
* |
* @return Locked address space area containing va on success or NULL on |
* failure. |
*/ |
as_area_t *find_area_and_lock(as_t *as, uintptr_t va) |
{ |
as_area_t *a; |
btree_node_t *leaf, *lnode; |
unsigned int i; |
a = (as_area_t *) btree_search(&as->as_area_btree, va, &leaf); |
if (a) { |
/* va is the base address of an address space area */ |
mutex_lock(&a->lock); |
return a; |
} |
/* |
* Search the leaf node and the righmost record of its left neighbour |
* to find out whether this is a miss or va belongs to an address |
* space area found there. |
*/ |
/* First, search the leaf node itself. */ |
for (i = 0; i < leaf->keys; i++) { |
a = (as_area_t *) leaf->value[i]; |
mutex_lock(&a->lock); |
if ((a->base <= va) && (va < a->base + a->pages * PAGE_SIZE)) { |
return a; |
} |
mutex_unlock(&a->lock); |
} |
/* |
* Second, locate the left neighbour and test its last record. |
* Because of its position in the B+tree, it must have base < va. |
*/ |
lnode = btree_leaf_node_left_neighbour(&as->as_area_btree, leaf); |
if (lnode) { |
a = (as_area_t *) lnode->value[lnode->keys - 1]; |
mutex_lock(&a->lock); |
if (va < a->base + a->pages * PAGE_SIZE) { |
return a; |
} |
mutex_unlock(&a->lock); |
} |
return NULL; |
} |
/** Check area conflicts with other areas. |
* |
* The address space must be locked and interrupts must be disabled. |
* |
* @param as Address space. |
* @param va Starting virtual address of the area being tested. |
* @param size Size of the area being tested. |
* @param avoid_area Do not touch this area. |
* |
* @return True if there is no conflict, false otherwise. |
*/ |
bool check_area_conflicts(as_t *as, uintptr_t va, size_t size, |
as_area_t *avoid_area) |
{ |
as_area_t *a; |
btree_node_t *leaf, *node; |
unsigned int i; |
/* |
* We don't want any area to have conflicts with NULL page. |
*/ |
if (overlaps(va, size, NULL, PAGE_SIZE)) |
return false; |
/* |
* The leaf node is found in O(log n), where n is proportional to |
* the number of address space areas belonging to as. |
* The check for conflicts is then attempted on the rightmost |
* record in the left neighbour, the leftmost record in the right |
* neighbour and all records in the leaf node itself. |
*/ |
if ((a = (as_area_t *) btree_search(&as->as_area_btree, va, &leaf))) { |
if (a != avoid_area) |
return false; |
} |
/* First, check the two border cases. */ |
if ((node = btree_leaf_node_left_neighbour(&as->as_area_btree, leaf))) { |
a = (as_area_t *) node->value[node->keys - 1]; |
mutex_lock(&a->lock); |
if (overlaps(va, size, a->base, a->pages * PAGE_SIZE)) { |
mutex_unlock(&a->lock); |
return false; |
} |
mutex_unlock(&a->lock); |
} |
node = btree_leaf_node_right_neighbour(&as->as_area_btree, leaf); |
if (node) { |
a = (as_area_t *) node->value[0]; |
mutex_lock(&a->lock); |
if (overlaps(va, size, a->base, a->pages * PAGE_SIZE)) { |
mutex_unlock(&a->lock); |
return false; |
} |
mutex_unlock(&a->lock); |
} |
/* Second, check the leaf node. */ |
for (i = 0; i < leaf->keys; i++) { |
a = (as_area_t *) leaf->value[i]; |
if (a == avoid_area) |
continue; |
mutex_lock(&a->lock); |
if (overlaps(va, size, a->base, a->pages * PAGE_SIZE)) { |
mutex_unlock(&a->lock); |
return false; |
} |
mutex_unlock(&a->lock); |
} |
/* |
* So far, the area does not conflict with other areas. |
* Check if it doesn't conflict with kernel address space. |
*/ |
if (!KERNEL_ADDRESS_SPACE_SHADOWED) { |
return !overlaps(va, size, |
KERNEL_ADDRESS_SPACE_START, |
KERNEL_ADDRESS_SPACE_END - KERNEL_ADDRESS_SPACE_START); |
} |
return true; |
} |
/** Return size of the address space area with given base. |
* |
* @param base Arbitrary address insede the address space area. |
* |
* @return Size of the address space area in bytes or zero if it |
* does not exist. |
*/ |
size_t as_area_get_size(uintptr_t base) |
{ |
ipl_t ipl; |
as_area_t *src_area; |
size_t size; |
ipl = interrupts_disable(); |
src_area = find_area_and_lock(AS, base); |
if (src_area){ |
size = src_area->pages * PAGE_SIZE; |
mutex_unlock(&src_area->lock); |
} else { |
size = 0; |
} |
interrupts_restore(ipl); |
return size; |
} |
/** Mark portion of address space area as used. |
* |
* The address space area must be already locked. |
* |
* @param a Address space area. |
* @param page First page to be marked. |
* @param count Number of page to be marked. |
* |
* @return 0 on failure and 1 on success. |
*/ |
int used_space_insert(as_area_t *a, uintptr_t page, count_t count) |
{ |
btree_node_t *leaf, *node; |
count_t pages; |
unsigned int i; |
ASSERT(page == ALIGN_DOWN(page, PAGE_SIZE)); |
ASSERT(count); |
pages = (count_t) btree_search(&a->used_space, page, &leaf); |
if (pages) { |
/* |
* We hit the beginning of some used space. |
*/ |
return 0; |
} |
if (!leaf->keys) { |
btree_insert(&a->used_space, page, (void *) count, leaf); |
return 1; |
} |
node = btree_leaf_node_left_neighbour(&a->used_space, leaf); |
if (node) { |
uintptr_t left_pg = node->key[node->keys - 1]; |
uintptr_t right_pg = leaf->key[0]; |
count_t left_cnt = (count_t) node->value[node->keys - 1]; |
count_t right_cnt = (count_t) leaf->value[0]; |
/* |
* Examine the possibility that the interval fits |
* somewhere between the rightmost interval of |
* the left neigbour and the first interval of the leaf. |
*/ |
if (page >= right_pg) { |
/* Do nothing. */ |
} else if (overlaps(page, count * PAGE_SIZE, left_pg, |
left_cnt * PAGE_SIZE)) { |
/* The interval intersects with the left interval. */ |
return 0; |
} else if (overlaps(page, count * PAGE_SIZE, right_pg, |
right_cnt * PAGE_SIZE)) { |
/* The interval intersects with the right interval. */ |
return 0; |
} else if ((page == left_pg + left_cnt * PAGE_SIZE) && |
(page + count * PAGE_SIZE == right_pg)) { |
/* |
* The interval can be added by merging the two already |
* present intervals. |
*/ |
node->value[node->keys - 1] += count + right_cnt; |
btree_remove(&a->used_space, right_pg, leaf); |
return 1; |
} else if (page == left_pg + left_cnt * PAGE_SIZE) { |
/* |
* The interval can be added by simply growing the left |
* interval. |
*/ |
node->value[node->keys - 1] += count; |
return 1; |
} else if (page + count * PAGE_SIZE == right_pg) { |
/* |
* The interval can be addded by simply moving base of |
* the right interval down and increasing its size |
* accordingly. |
*/ |
leaf->value[0] += count; |
leaf->key[0] = page; |
return 1; |
} else { |
/* |
* The interval is between both neigbouring intervals, |
* but cannot be merged with any of them. |
*/ |
btree_insert(&a->used_space, page, (void *) count, |
leaf); |
return 1; |
} |
} else if (page < leaf->key[0]) { |
uintptr_t right_pg = leaf->key[0]; |
count_t right_cnt = (count_t) leaf->value[0]; |
/* |
* Investigate the border case in which the left neighbour does |
* not exist but the interval fits from the left. |
*/ |
if (overlaps(page, count * PAGE_SIZE, right_pg, |
right_cnt * PAGE_SIZE)) { |
/* The interval intersects with the right interval. */ |
return 0; |
} else if (page + count * PAGE_SIZE == right_pg) { |
/* |
* The interval can be added by moving the base of the |
* right interval down and increasing its size |
* accordingly. |
*/ |
leaf->key[0] = page; |
leaf->value[0] += count; |
return 1; |
} else { |
/* |
* The interval doesn't adjoin with the right interval. |
* It must be added individually. |
*/ |
btree_insert(&a->used_space, page, (void *) count, |
leaf); |
return 1; |
} |
} |
node = btree_leaf_node_right_neighbour(&a->used_space, leaf); |
if (node) { |
uintptr_t left_pg = leaf->key[leaf->keys - 1]; |
uintptr_t right_pg = node->key[0]; |
count_t left_cnt = (count_t) leaf->value[leaf->keys - 1]; |
count_t right_cnt = (count_t) node->value[0]; |
/* |
* Examine the possibility that the interval fits |
* somewhere between the leftmost interval of |
* the right neigbour and the last interval of the leaf. |
*/ |
if (page < left_pg) { |
/* Do nothing. */ |
} else if (overlaps(page, count * PAGE_SIZE, left_pg, |
left_cnt * PAGE_SIZE)) { |
/* The interval intersects with the left interval. */ |
return 0; |
} else if (overlaps(page, count * PAGE_SIZE, right_pg, |
right_cnt * PAGE_SIZE)) { |
/* The interval intersects with the right interval. */ |
return 0; |
} else if ((page == left_pg + left_cnt * PAGE_SIZE) && |
(page + count * PAGE_SIZE == right_pg)) { |
/* |
* The interval can be added by merging the two already |
* present intervals. |
* */ |
leaf->value[leaf->keys - 1] += count + right_cnt; |
btree_remove(&a->used_space, right_pg, node); |
return 1; |
} else if (page == left_pg + left_cnt * PAGE_SIZE) { |
/* |
* The interval can be added by simply growing the left |
* interval. |
* */ |
leaf->value[leaf->keys - 1] += count; |
return 1; |
} else if (page + count * PAGE_SIZE == right_pg) { |
/* |
* The interval can be addded by simply moving base of |
* the right interval down and increasing its size |
* accordingly. |
*/ |
node->value[0] += count; |
node->key[0] = page; |
return 1; |
} else { |
/* |
* The interval is between both neigbouring intervals, |
* but cannot be merged with any of them. |
*/ |
btree_insert(&a->used_space, page, (void *) count, |
leaf); |
return 1; |
} |
} else if (page >= leaf->key[leaf->keys - 1]) { |
uintptr_t left_pg = leaf->key[leaf->keys - 1]; |
count_t left_cnt = (count_t) leaf->value[leaf->keys - 1]; |
/* |
* Investigate the border case in which the right neighbour |
* does not exist but the interval fits from the right. |
*/ |
if (overlaps(page, count * PAGE_SIZE, left_pg, |
left_cnt * PAGE_SIZE)) { |
/* The interval intersects with the left interval. */ |
return 0; |
} else if (left_pg + left_cnt * PAGE_SIZE == page) { |
/* |
* The interval can be added by growing the left |
* interval. |
*/ |
leaf->value[leaf->keys - 1] += count; |
return 1; |
} else { |
/* |
* The interval doesn't adjoin with the left interval. |
* It must be added individually. |
*/ |
btree_insert(&a->used_space, page, (void *) count, |
leaf); |
return 1; |
} |
} |
/* |
* Note that if the algorithm made it thus far, the interval can fit |
* only between two other intervals of the leaf. The two border cases |
* were already resolved. |
*/ |
for (i = 1; i < leaf->keys; i++) { |
if (page < leaf->key[i]) { |
uintptr_t left_pg = leaf->key[i - 1]; |
uintptr_t right_pg = leaf->key[i]; |
count_t left_cnt = (count_t) leaf->value[i - 1]; |
count_t right_cnt = (count_t) leaf->value[i]; |
/* |
* The interval fits between left_pg and right_pg. |
*/ |
if (overlaps(page, count * PAGE_SIZE, left_pg, |
left_cnt * PAGE_SIZE)) { |
/* |
* The interval intersects with the left |
* interval. |
*/ |
return 0; |
} else if (overlaps(page, count * PAGE_SIZE, right_pg, |
right_cnt * PAGE_SIZE)) { |
/* |
* The interval intersects with the right |
* interval. |
*/ |
return 0; |
} else if ((page == left_pg + left_cnt * PAGE_SIZE) && |
(page + count * PAGE_SIZE == right_pg)) { |
/* |
* The interval can be added by merging the two |
* already present intervals. |
*/ |
leaf->value[i - 1] += count + right_cnt; |
btree_remove(&a->used_space, right_pg, leaf); |
return 1; |
} else if (page == left_pg + left_cnt * PAGE_SIZE) { |
/* |
* The interval can be added by simply growing |
* the left interval. |
*/ |
leaf->value[i - 1] += count; |
return 1; |
} else if (page + count * PAGE_SIZE == right_pg) { |
/* |
* The interval can be addded by simply moving |
* base of the right interval down and |
* increasing its size accordingly. |
*/ |
leaf->value[i] += count; |
leaf->key[i] = page; |
return 1; |
} else { |
/* |
* The interval is between both neigbouring |
* intervals, but cannot be merged with any of |
* them. |
*/ |
btree_insert(&a->used_space, page, |
(void *) count, leaf); |
return 1; |
} |
} |
} |
panic("Inconsistency detected while adding %d pages of used space at " |
"%p.\n", count, page); |
} |
/** Mark portion of address space area as unused. |
* |
* The address space area must be already locked. |
* |
* @param a Address space area. |
* @param page First page to be marked. |
* @param count Number of page to be marked. |
* |
* @return 0 on failure and 1 on success. |
*/ |
int used_space_remove(as_area_t *a, uintptr_t page, count_t count) |
{ |
btree_node_t *leaf, *node; |
count_t pages; |
unsigned int i; |
ASSERT(page == ALIGN_DOWN(page, PAGE_SIZE)); |
ASSERT(count); |
pages = (count_t) btree_search(&a->used_space, page, &leaf); |
if (pages) { |
/* |
* We are lucky, page is the beginning of some interval. |
*/ |
if (count > pages) { |
return 0; |
} else if (count == pages) { |
btree_remove(&a->used_space, page, leaf); |
return 1; |
} else { |
/* |
* Find the respective interval. |
* Decrease its size and relocate its start address. |
*/ |
for (i = 0; i < leaf->keys; i++) { |
if (leaf->key[i] == page) { |
leaf->key[i] += count * PAGE_SIZE; |
leaf->value[i] -= count; |
return 1; |
} |
} |
goto error; |
} |
} |
node = btree_leaf_node_left_neighbour(&a->used_space, leaf); |
if (node && page < leaf->key[0]) { |
uintptr_t left_pg = node->key[node->keys - 1]; |
count_t left_cnt = (count_t) node->value[node->keys - 1]; |
if (overlaps(left_pg, left_cnt * PAGE_SIZE, page, |
count * PAGE_SIZE)) { |
if (page + count * PAGE_SIZE == |
left_pg + left_cnt * PAGE_SIZE) { |
/* |
* The interval is contained in the rightmost |
* interval of the left neighbour and can be |
* removed by updating the size of the bigger |
* interval. |
*/ |
node->value[node->keys - 1] -= count; |
return 1; |
} else if (page + count * PAGE_SIZE < |
left_pg + left_cnt*PAGE_SIZE) { |
count_t new_cnt; |
/* |
* The interval is contained in the rightmost |
* interval of the left neighbour but its |
* removal requires both updating the size of |
* the original interval and also inserting a |
* new interval. |
*/ |
new_cnt = ((left_pg + left_cnt * PAGE_SIZE) - |
(page + count*PAGE_SIZE)) >> PAGE_WIDTH; |
node->value[node->keys - 1] -= count + new_cnt; |
btree_insert(&a->used_space, page + |
count * PAGE_SIZE, (void *) new_cnt, leaf); |
return 1; |
} |
} |
return 0; |
} else if (page < leaf->key[0]) { |
return 0; |
} |
if (page > leaf->key[leaf->keys - 1]) { |
uintptr_t left_pg = leaf->key[leaf->keys - 1]; |
count_t left_cnt = (count_t) leaf->value[leaf->keys - 1]; |
if (overlaps(left_pg, left_cnt * PAGE_SIZE, page, |
count * PAGE_SIZE)) { |
if (page + count * PAGE_SIZE == |
left_pg + left_cnt * PAGE_SIZE) { |
/* |
* The interval is contained in the rightmost |
* interval of the leaf and can be removed by |
* updating the size of the bigger interval. |
*/ |
leaf->value[leaf->keys - 1] -= count; |
return 1; |
} else if (page + count * PAGE_SIZE < left_pg + |
left_cnt * PAGE_SIZE) { |
count_t new_cnt; |
/* |
* The interval is contained in the rightmost |
* interval of the leaf but its removal |
* requires both updating the size of the |
* original interval and also inserting a new |
* interval. |
*/ |
new_cnt = ((left_pg + left_cnt * PAGE_SIZE) - |
(page + count * PAGE_SIZE)) >> PAGE_WIDTH; |
leaf->value[leaf->keys - 1] -= count + new_cnt; |
btree_insert(&a->used_space, page + |
count * PAGE_SIZE, (void *) new_cnt, leaf); |
return 1; |
} |
} |
return 0; |
} |
/* |
* The border cases have been already resolved. |
* Now the interval can be only between intervals of the leaf. |
*/ |
for (i = 1; i < leaf->keys - 1; i++) { |
if (page < leaf->key[i]) { |
uintptr_t left_pg = leaf->key[i - 1]; |
count_t left_cnt = (count_t) leaf->value[i - 1]; |
/* |
* Now the interval is between intervals corresponding |
* to (i - 1) and i. |
*/ |
if (overlaps(left_pg, left_cnt * PAGE_SIZE, page, |
count * PAGE_SIZE)) { |
if (page + count * PAGE_SIZE == |
left_pg + left_cnt*PAGE_SIZE) { |
/* |
* The interval is contained in the |
* interval (i - 1) of the leaf and can |
* be removed by updating the size of |
* the bigger interval. |
*/ |
leaf->value[i - 1] -= count; |
return 1; |
} else if (page + count * PAGE_SIZE < |
left_pg + left_cnt * PAGE_SIZE) { |
count_t new_cnt; |
/* |
* The interval is contained in the |
* interval (i - 1) of the leaf but its |
* removal requires both updating the |
* size of the original interval and |
* also inserting a new interval. |
*/ |
new_cnt = ((left_pg + |
left_cnt * PAGE_SIZE) - |
(page + count * PAGE_SIZE)) >> |
PAGE_WIDTH; |
leaf->value[i - 1] -= count + new_cnt; |
btree_insert(&a->used_space, page + |
count * PAGE_SIZE, (void *) new_cnt, |
leaf); |
return 1; |
} |
} |
return 0; |
} |
} |
error: |
panic("Inconsistency detected while removing %d pages of used space " |
"from %p.\n", count, page); |
} |
/** Remove reference to address space area share info. |
* |
* If the reference count drops to 0, the sh_info is deallocated. |
* |
* @param sh_info Pointer to address space area share info. |
*/ |
void sh_info_remove_reference(share_info_t *sh_info) |
{ |
bool dealloc = false; |
mutex_lock(&sh_info->lock); |
ASSERT(sh_info->refcount); |
if (--sh_info->refcount == 0) { |
dealloc = true; |
link_t *cur; |
/* |
* Now walk carefully the pagemap B+tree and free/remove |
* reference from all frames found there. |
*/ |
for (cur = sh_info->pagemap.leaf_head.next; |
cur != &sh_info->pagemap.leaf_head; cur = cur->next) { |
btree_node_t *node; |
unsigned int i; |
node = list_get_instance(cur, btree_node_t, leaf_link); |
for (i = 0; i < node->keys; i++) |
frame_free((uintptr_t) node->value[i]); |
} |
} |
mutex_unlock(&sh_info->lock); |
if (dealloc) { |
btree_destroy(&sh_info->pagemap); |
free(sh_info); |
} |
} |
/* |
* Address space related syscalls. |
*/ |
/** Wrapper for as_area_create(). */ |
unative_t sys_as_area_create(uintptr_t address, size_t size, int flags) |
{ |
if (as_area_create(AS, flags | AS_AREA_CACHEABLE, size, address, |
AS_AREA_ATTR_NONE, &anon_backend, NULL)) |
return (unative_t) address; |
else |
return (unative_t) -1; |
} |
/** Wrapper for as_area_resize(). */ |
unative_t sys_as_area_resize(uintptr_t address, size_t size, int flags) |
{ |
return (unative_t) as_area_resize(AS, address, size, 0); |
} |
/** Wrapper for as_area_destroy(). */ |
unative_t sys_as_area_destroy(uintptr_t address) |
{ |
return (unative_t) as_area_destroy(AS, address); |
} |
/** Print out information about address space. |
* |
* @param as Address space. |
*/ |
void as_print(as_t *as) |
{ |
ipl_t ipl; |
ipl = interrupts_disable(); |
mutex_lock(&as->lock); |
/* print out info about address space areas */ |
link_t *cur; |
for (cur = as->as_area_btree.leaf_head.next; |
cur != &as->as_area_btree.leaf_head; cur = cur->next) { |
btree_node_t *node; |
node = list_get_instance(cur, btree_node_t, leaf_link); |
unsigned int i; |
for (i = 0; i < node->keys; i++) { |
as_area_t *area = node->value[i]; |
mutex_lock(&area->lock); |
printf("as_area: %p, base=%p, pages=%d (%p - %p)\n", |
area, area->base, area->pages, area->base, |
area->base + area->pages*PAGE_SIZE); |
mutex_unlock(&area->lock); |
} |
} |
mutex_unlock(&as->lock); |
interrupts_restore(ipl); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/mm/frame.c |
---|
0,0 → 1,1232 |
/* |
* Copyright (c) 2001-2005 Jakub Jermar |
* Copyright (c) 2005 Sergey Bondari |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericmm |
* @{ |
*/ |
/** |
* @file |
* @brief Physical frame allocator. |
* |
* This file contains the physical frame allocator and memory zone management. |
* The frame allocator is built on top of the buddy allocator. |
* |
* @see buddy.c |
*/ |
/* |
* Locking order |
* |
* In order to access particular zone, the process must first lock |
* the zones.lock, then lock the zone and then unlock the zones.lock. |
* This insures, that we can fiddle with the zones in runtime without |
* affecting the processes. |
* |
*/ |
#include <arch/types.h> |
#include <mm/frame.h> |
#include <mm/as.h> |
#include <panic.h> |
#include <debug.h> |
#include <adt/list.h> |
#include <synch/spinlock.h> |
#include <arch/asm.h> |
#include <arch.h> |
#include <print.h> |
#include <align.h> |
#include <mm/slab.h> |
#include <bitops.h> |
#include <macros.h> |
#include <config.h> |
typedef struct { |
count_t refcount; /**< tracking of shared frames */ |
uint8_t buddy_order; /**< buddy system block order */ |
link_t buddy_link; /**< link to the next free block inside one |
order */ |
void *parent; /**< If allocated by slab, this points there */ |
} frame_t; |
typedef struct { |
SPINLOCK_DECLARE(lock); /**< this lock protects everything below */ |
pfn_t base; /**< frame_no of the first frame in the frames |
array */ |
count_t count; /**< Size of zone */ |
frame_t *frames; /**< array of frame_t structures in this |
zone */ |
count_t free_count; /**< number of free frame_t structures */ |
count_t busy_count; /**< number of busy frame_t structures */ |
buddy_system_t *buddy_system; /**< buddy system for the zone */ |
int flags; |
} zone_t; |
/* |
* The zoneinfo.lock must be locked when accessing zoneinfo structure. |
* Some of the attributes in zone_t structures are 'read-only' |
*/ |
typedef struct { |
SPINLOCK_DECLARE(lock); |
unsigned int count; |
zone_t *info[ZONES_MAX]; |
} zones_t; |
static zones_t zones; |
/********************/ |
/* Helper functions */ |
/********************/ |
static inline index_t frame_index(zone_t *zone, frame_t *frame) |
{ |
return (index_t) (frame - zone->frames); |
} |
static inline index_t frame_index_abs(zone_t *zone, frame_t *frame) |
{ |
return (index_t) (frame - zone->frames) + zone->base; |
} |
static inline int frame_index_valid(zone_t *zone, index_t index) |
{ |
return (index < zone->count); |
} |
/** Compute pfn_t from frame_t pointer & zone pointer */ |
static index_t make_frame_index(zone_t *zone, frame_t *frame) |
{ |
return (frame - zone->frames); |
} |
/** Initialize frame structure |
* |
* Initialize frame structure. |
* |
* @param frame Frame structure to be initialized. |
*/ |
static void frame_initialize(frame_t *frame) |
{ |
frame->refcount = 1; |
frame->buddy_order = 0; |
} |
/**********************/ |
/* Zoneinfo functions */ |
/**********************/ |
/** |
* Insert-sort zone into zones list |
* |
* @param newzone New zone to be inserted into zone list |
* @return zone number on success, -1 on error |
*/ |
static int zones_add_zone(zone_t *newzone) |
{ |
unsigned int i, j; |
ipl_t ipl; |
zone_t *z; |
ipl = interrupts_disable(); |
spinlock_lock(&zones.lock); |
/* Try to merge */ |
if (zones.count + 1 == ZONES_MAX) { |
printf("Maximum zone count %u exceeded!\n", ZONES_MAX); |
spinlock_unlock(&zones.lock); |
interrupts_restore(ipl); |
return -1; |
} |
for (i = 0; i < zones.count; i++) { |
/* Check for overflow */ |
z = zones.info[i]; |
if (overlaps(newzone->base, newzone->count, z->base, z->count)) { |
printf("Zones overlap!\n"); |
return -1; |
} |
if (newzone->base < z->base) |
break; |
} |
/* Move other zones up */ |
for (j = i; j < zones.count; j++) |
zones.info[j + 1] = zones.info[j]; |
zones.info[i] = newzone; |
zones.count++; |
spinlock_unlock(&zones.lock); |
interrupts_restore(ipl); |
return i; |
} |
/** |
* Try to find a zone where can we find the frame |
* |
* Assume interrupts are disabled. |
* |
* @param frame Frame number contained in zone |
* @param pzone If not null, it is used as zone hint. Zone index |
* is filled into the variable on success. |
* @return Pointer to locked zone containing frame |
*/ |
static zone_t * find_zone_and_lock(pfn_t frame, unsigned int *pzone) |
{ |
unsigned int i; |
unsigned int hint = pzone ? *pzone : 0; |
zone_t *z; |
spinlock_lock(&zones.lock); |
if (hint >= zones.count) |
hint = 0; |
i = hint; |
do { |
z = zones.info[i]; |
spinlock_lock(&z->lock); |
if (z->base <= frame && z->base + z->count > frame) { |
/* Unlock the global lock */ |
spinlock_unlock(&zones.lock); |
if (pzone) |
*pzone = i; |
return z; |
} |
spinlock_unlock(&z->lock); |
i++; |
if (i >= zones.count) |
i = 0; |
} while(i != hint); |
spinlock_unlock(&zones.lock); |
return NULL; |
} |
/** @return True if zone can allocate specified order */ |
static int zone_can_alloc(zone_t *z, uint8_t order) |
{ |
return buddy_system_can_alloc(z->buddy_system, order); |
} |
/** Find and lock zone that can allocate order frames. |
* |
* Assume interrupts are disabled. |
* |
* @param order Size (2^order) of free space we are trying to find |
* @param pzone Pointer to preferred zone or NULL, on return contains zone |
* number |
*/ |
static zone_t * find_free_zone_and_lock(uint8_t order, unsigned int *pzone) |
{ |
unsigned int i; |
zone_t *z; |
unsigned int hint = pzone ? *pzone : 0; |
spinlock_lock(&zones.lock); |
if (hint >= zones.count) |
hint = 0; |
i = hint; |
do { |
z = zones.info[i]; |
spinlock_lock(&z->lock); |
/* Check if the zone has 2^order frames area available */ |
if (zone_can_alloc(z, order)) { |
spinlock_unlock(&zones.lock); |
if (pzone) |
*pzone = i; |
return z; |
} |
spinlock_unlock(&z->lock); |
if (++i >= zones.count) |
i = 0; |
} while(i != hint); |
spinlock_unlock(&zones.lock); |
return NULL; |
} |
/**************************/ |
/* Buddy system functions */ |
/**************************/ |
/** Buddy system find_block implementation |
* |
* Find block that is parent of current list. |
* That means go to lower addresses, until such block is found |
* |
* @param order - Order of parent must be different then this parameter!! |
*/ |
static link_t *zone_buddy_find_block(buddy_system_t *b, link_t *child, |
uint8_t order) |
{ |
frame_t *frame; |
zone_t *zone; |
index_t index; |
frame = list_get_instance(child, frame_t, buddy_link); |
zone = (zone_t *) b->data; |
index = frame_index(zone, frame); |
do { |
if (zone->frames[index].buddy_order != order) { |
return &zone->frames[index].buddy_link; |
} |
} while(index-- > 0); |
return NULL; |
} |
static void zone_buddy_print_id(buddy_system_t *b, link_t *block) |
{ |
frame_t *frame; |
zone_t *zone; |
index_t index; |
frame = list_get_instance(block, frame_t, buddy_link); |
zone = (zone_t *) b->data; |
index = frame_index(zone, frame); |
printf("%zd", index); |
} |
/** Buddy system find_buddy implementation |
* |
* @param b Buddy system. |
* @param block Block for which buddy should be found |
* |
* @return Buddy for given block if found |
*/ |
static link_t *zone_buddy_find_buddy(buddy_system_t *b, link_t *block) |
{ |
frame_t *frame; |
zone_t *zone; |
index_t index; |
bool is_left, is_right; |
frame = list_get_instance(block, frame_t, buddy_link); |
zone = (zone_t *) b->data; |
ASSERT(IS_BUDDY_ORDER_OK(frame_index_abs(zone, frame), |
frame->buddy_order)); |
is_left = IS_BUDDY_LEFT_BLOCK_ABS(zone, frame); |
is_right = IS_BUDDY_RIGHT_BLOCK_ABS(zone, frame); |
ASSERT(is_left ^ is_right); |
if (is_left) { |
index = (frame_index(zone, frame)) + (1 << frame->buddy_order); |
} else { /* if (is_right) */ |
index = (frame_index(zone, frame)) - (1 << frame->buddy_order); |
} |
if (frame_index_valid(zone, index)) { |
if (zone->frames[index].buddy_order == frame->buddy_order && |
zone->frames[index].refcount == 0) { |
return &zone->frames[index].buddy_link; |
} |
} |
return NULL; |
} |
/** Buddy system bisect implementation |
* |
* @param b Buddy system. |
* @param block Block to bisect |
* |
* @return right block |
*/ |
static link_t * zone_buddy_bisect(buddy_system_t *b, link_t *block) { |
frame_t *frame_l, *frame_r; |
frame_l = list_get_instance(block, frame_t, buddy_link); |
frame_r = (frame_l + (1 << (frame_l->buddy_order - 1))); |
return &frame_r->buddy_link; |
} |
/** Buddy system coalesce implementation |
* |
* @param b Buddy system. |
* @param block_1 First block |
* @param block_2 First block's buddy |
* |
* @return Coalesced block (actually block that represents lower address) |
*/ |
static link_t *zone_buddy_coalesce(buddy_system_t *b, link_t *block_1, |
link_t *block_2) |
{ |
frame_t *frame1, *frame2; |
frame1 = list_get_instance(block_1, frame_t, buddy_link); |
frame2 = list_get_instance(block_2, frame_t, buddy_link); |
return frame1 < frame2 ? block_1 : block_2; |
} |
/** Buddy system set_order implementation |
* |
* @param b Buddy system. |
* @param block Buddy system block |
* @param order Order to set |
*/ |
static void zone_buddy_set_order(buddy_system_t *b, link_t *block, |
uint8_t order) { |
frame_t *frame; |
frame = list_get_instance(block, frame_t, buddy_link); |
frame->buddy_order = order; |
} |
/** Buddy system get_order implementation |
* |
* @param b Buddy system. |
* @param block Buddy system block |
* |
* @return Order of block |
*/ |
static uint8_t zone_buddy_get_order(buddy_system_t *b, link_t *block) { |
frame_t *frame; |
frame = list_get_instance(block, frame_t, buddy_link); |
return frame->buddy_order; |
} |
/** Buddy system mark_busy implementation |
* |
* @param b Buddy system |
* @param block Buddy system block |
* |
*/ |
static void zone_buddy_mark_busy(buddy_system_t *b, link_t * block) { |
frame_t * frame; |
frame = list_get_instance(block, frame_t, buddy_link); |
frame->refcount = 1; |
} |
/** Buddy system mark_available implementation |
* |
* @param b Buddy system |
* @param block Buddy system block |
* |
*/ |
static void zone_buddy_mark_available(buddy_system_t *b, link_t *block) { |
frame_t *frame; |
frame = list_get_instance(block, frame_t, buddy_link); |
frame->refcount = 0; |
} |
static buddy_system_operations_t zone_buddy_system_operations = { |
.find_buddy = zone_buddy_find_buddy, |
.bisect = zone_buddy_bisect, |
.coalesce = zone_buddy_coalesce, |
.set_order = zone_buddy_set_order, |
.get_order = zone_buddy_get_order, |
.mark_busy = zone_buddy_mark_busy, |
.mark_available = zone_buddy_mark_available, |
.find_block = zone_buddy_find_block, |
.print_id = zone_buddy_print_id |
}; |
/******************/ |
/* Zone functions */ |
/******************/ |
/** Allocate frame in particular zone |
* |
* Assume zone is locked |
* Panics if allocation is impossible. |
* |
* @param zone Zone to allocate from. |
* @param order Allocate exactly 2^order frames. |
* |
* @return Frame index in zone |
* |
*/ |
static pfn_t zone_frame_alloc(zone_t *zone, uint8_t order) |
{ |
pfn_t v; |
link_t *tmp; |
frame_t *frame; |
/* Allocate frames from zone buddy system */ |
tmp = buddy_system_alloc(zone->buddy_system, order); |
ASSERT(tmp); |
/* Update zone information. */ |
zone->free_count -= (1 << order); |
zone->busy_count += (1 << order); |
/* Frame will be actually a first frame of the block. */ |
frame = list_get_instance(tmp, frame_t, buddy_link); |
/* get frame address */ |
v = make_frame_index(zone, frame); |
return v; |
} |
/** Free frame from zone |
* |
* Assume zone is locked |
* |
* @param zone Pointer to zone from which the frame is to be freed |
* @param frame_idx Frame index relative to zone |
*/ |
static void zone_frame_free(zone_t *zone, index_t frame_idx) |
{ |
frame_t *frame; |
uint8_t order; |
frame = &zone->frames[frame_idx]; |
/* remember frame order */ |
order = frame->buddy_order; |
ASSERT(frame->refcount); |
if (!--frame->refcount) { |
buddy_system_free(zone->buddy_system, &frame->buddy_link); |
/* Update zone information. */ |
zone->free_count += (1 << order); |
zone->busy_count -= (1 << order); |
} |
} |
/** Return frame from zone */ |
static frame_t * zone_get_frame(zone_t *zone, index_t frame_idx) |
{ |
ASSERT(frame_idx < zone->count); |
return &zone->frames[frame_idx]; |
} |
/** Mark frame in zone unavailable to allocation */ |
static void zone_mark_unavailable(zone_t *zone, index_t frame_idx) |
{ |
frame_t *frame; |
link_t *link; |
frame = zone_get_frame(zone, frame_idx); |
if (frame->refcount) |
return; |
link = buddy_system_alloc_block(zone->buddy_system, |
&frame->buddy_link); |
ASSERT(link); |
zone->free_count--; |
} |
/** |
* Join 2 zones |
* |
* Expect zone_t *z to point to space at least zone_conf_size large |
* |
* Assume z1 & z2 are locked |
* |
* @param z Target zone structure pointer |
* @param z1 Zone to merge |
* @param z2 Zone to merge |
*/ |
static void _zone_merge(zone_t *z, zone_t *z1, zone_t *z2) |
{ |
uint8_t max_order; |
unsigned int i; |
int z2idx; |
pfn_t frame_idx; |
frame_t *frame; |
ASSERT(!overlaps(z1->base, z1->count, z2->base, z2->count)); |
ASSERT(z1->base < z2->base); |
spinlock_initialize(&z->lock, "zone_lock"); |
z->base = z1->base; |
z->count = z2->base + z2->count - z1->base; |
z->flags = z1->flags & z2->flags; |
z->free_count = z1->free_count + z2->free_count; |
z->busy_count = z1->busy_count + z2->busy_count; |
max_order = fnzb(z->count); |
z->buddy_system = (buddy_system_t *) &z[1]; |
buddy_system_create(z->buddy_system, max_order, |
&zone_buddy_system_operations, (void *) z); |
z->frames = (frame_t *)((uint8_t *) z->buddy_system + |
buddy_conf_size(max_order)); |
for (i = 0; i < z->count; i++) { |
/* This marks all frames busy */ |
frame_initialize(&z->frames[i]); |
} |
/* Copy frames from both zones to preserve full frame orders, |
* parents etc. Set all free frames with refcount=0 to 1, because |
* we add all free frames to buddy allocator later again, clear |
* order to 0. Don't set busy frames with refcount=0, as they |
* will not be reallocated during merge and it would make later |
* problems with allocation/free. |
*/ |
for (i = 0; i < z1->count; i++) |
z->frames[i] = z1->frames[i]; |
for (i = 0; i < z2->count; i++) { |
z2idx = i + (z2->base - z1->base); |
z->frames[z2idx] = z2->frames[i]; |
} |
i = 0; |
while (i < z->count) { |
if (z->frames[i].refcount) { |
/* skip busy frames */ |
i += 1 << z->frames[i].buddy_order; |
} else { /* Free frames, set refcount=1 */ |
/* All free frames have refcount=0, we need not |
* to check the order */ |
z->frames[i].refcount = 1; |
z->frames[i].buddy_order = 0; |
i++; |
} |
} |
/* Add free blocks from the 2 original zones */ |
while (zone_can_alloc(z1, 0)) { |
frame_idx = zone_frame_alloc(z1, 0); |
frame = &z->frames[frame_idx]; |
frame->refcount = 0; |
buddy_system_free(z->buddy_system, &frame->buddy_link); |
} |
while (zone_can_alloc(z2, 0)) { |
frame_idx = zone_frame_alloc(z2, 0); |
frame = &z->frames[frame_idx + (z2->base - z1->base)]; |
frame->refcount = 0; |
buddy_system_free(z->buddy_system, &frame->buddy_link); |
} |
} |
/** Return old configuration frames into the zone |
* |
* We have several cases |
* - the conf. data is outside of zone -> exit, shall we call frame_free?? |
* - the conf. data was created by zone_create or |
* updated with reduce_region -> free every frame |
* |
* @param newzone The actual zone where freeing should occur |
* @param oldzone Pointer to old zone configuration data that should |
* be freed from new zone |
*/ |
static void return_config_frames(zone_t *newzone, zone_t *oldzone) |
{ |
pfn_t pfn; |
frame_t *frame; |
count_t cframes; |
unsigned int i; |
pfn = ADDR2PFN((uintptr_t)KA2PA(oldzone)); |
cframes = SIZE2FRAMES(zone_conf_size(oldzone->count)); |
if (pfn < newzone->base || pfn >= newzone->base + newzone->count) |
return; |
frame = &newzone->frames[pfn - newzone->base]; |
ASSERT(!frame->buddy_order); |
for (i = 0; i < cframes; i++) { |
newzone->busy_count++; |
zone_frame_free(newzone, pfn+i-newzone->base); |
} |
} |
/** Reduce allocated block to count of order 0 frames |
* |
* The allocated block need 2^order frames of space. Reduce all frames |
* in block to order 0 and free the unneeded frames. This means, that |
* when freeing the previously allocated block starting with frame_idx, |
* you have to free every frame. |
* |
* @param zone |
* @param frame_idx Index to block |
* @param count Allocated space in block |
*/ |
static void zone_reduce_region(zone_t *zone, pfn_t frame_idx, count_t count) |
{ |
count_t i; |
uint8_t order; |
frame_t *frame; |
ASSERT(frame_idx + count < zone->count); |
order = zone->frames[frame_idx].buddy_order; |
ASSERT((count_t) (1 << order) >= count); |
/* Reduce all blocks to order 0 */ |
for (i = 0; i < (count_t) (1 << order); i++) { |
frame = &zone->frames[i + frame_idx]; |
frame->buddy_order = 0; |
if (!frame->refcount) |
frame->refcount = 1; |
ASSERT(frame->refcount == 1); |
} |
/* Free unneeded frames */ |
for (i = count; i < (count_t) (1 << order); i++) { |
zone_frame_free(zone, i + frame_idx); |
} |
} |
/** Merge zones z1 and z2 |
* |
* - the zones must be 2 zones with no zone existing in between, |
* which means that z2 = z1+1 |
* |
* - When you create a new zone, the frame allocator configuration does |
* not to be 2^order size. Once the allocator is running it is no longer |
* possible, merged configuration data occupies more space :-/ |
*/ |
void zone_merge(unsigned int z1, unsigned int z2) |
{ |
ipl_t ipl; |
zone_t *zone1, *zone2, *newzone; |
unsigned int cframes; |
uint8_t order; |
unsigned int i; |
pfn_t pfn; |
ipl = interrupts_disable(); |
spinlock_lock(&zones.lock); |
if ((z1 >= zones.count) || (z2 >= zones.count)) |
goto errout; |
/* We can join only 2 zones with none existing inbetween */ |
if (z2-z1 != 1) |
goto errout; |
zone1 = zones.info[z1]; |
zone2 = zones.info[z2]; |
spinlock_lock(&zone1->lock); |
spinlock_lock(&zone2->lock); |
cframes = SIZE2FRAMES(zone_conf_size(zone2->base + zone2->count - |
zone1->base)); |
if (cframes == 1) |
order = 0; |
else |
order = fnzb(cframes - 1) + 1; |
/* Allocate zonedata inside one of the zones */ |
if (zone_can_alloc(zone1, order)) |
pfn = zone1->base + zone_frame_alloc(zone1, order); |
else if (zone_can_alloc(zone2, order)) |
pfn = zone2->base + zone_frame_alloc(zone2, order); |
else |
goto errout2; |
newzone = (zone_t *) PA2KA(PFN2ADDR(pfn)); |
_zone_merge(newzone, zone1, zone2); |
/* Free unneeded config frames */ |
zone_reduce_region(newzone, pfn - newzone->base, cframes); |
/* Subtract zone information from busy frames */ |
newzone->busy_count -= cframes; |
/* Replace existing zones in zoneinfo list */ |
zones.info[z1] = newzone; |
for (i = z2 + 1; i < zones.count; i++) |
zones.info[i - 1] = zones.info[i]; |
zones.count--; |
/* Free old zone information */ |
return_config_frames(newzone, zone1); |
return_config_frames(newzone, zone2); |
errout2: |
/* Nobody is allowed to enter to zone, so we are safe |
* to touch the spinlocks last time */ |
spinlock_unlock(&zone1->lock); |
spinlock_unlock(&zone2->lock); |
errout: |
spinlock_unlock(&zones.lock); |
interrupts_restore(ipl); |
} |
/** |
* Merge all zones into one big zone |
* |
* It is reasonable to do this on systems whose bios reports parts in chunks, |
* so that we could have 1 zone (it's faster). |
*/ |
void zone_merge_all(void) |
{ |
int count = zones.count; |
while (zones.count > 1 && --count) { |
zone_merge(0,1); |
break; |
} |
} |
/** Create frame zone |
* |
* Create new frame zone. |
* |
* @param start Physical address of the first frame within the zone. |
* @param count Count of frames in zone |
* @param z Address of configuration information of zone |
* @param flags Zone flags. |
* |
* @return Initialized zone. |
*/ |
static void zone_construct(pfn_t start, count_t count, zone_t *z, int flags) |
{ |
unsigned int i; |
uint8_t max_order; |
spinlock_initialize(&z->lock, "zone_lock"); |
z->base = start; |
z->count = count; |
z->flags = flags; |
z->free_count = count; |
z->busy_count = 0; |
/* |
* Compute order for buddy system, initialize |
*/ |
max_order = fnzb(count); |
z->buddy_system = (buddy_system_t *)&z[1]; |
buddy_system_create(z->buddy_system, max_order, |
&zone_buddy_system_operations, |
(void *) z); |
/* Allocate frames _after_ the conframe */ |
/* Check sizes */ |
z->frames = (frame_t *)((uint8_t *) z->buddy_system + |
buddy_conf_size(max_order)); |
for (i = 0; i < count; i++) { |
frame_initialize(&z->frames[i]); |
} |
/* Stuffing frames */ |
for (i = 0; i < count; i++) { |
z->frames[i].refcount = 0; |
buddy_system_free(z->buddy_system, &z->frames[i].buddy_link); |
} |
} |
/** Compute configuration data size for zone |
* |
* @param count Size of zone in frames |
* @return Size of zone configuration info (in bytes) |
*/ |
uintptr_t zone_conf_size(count_t count) |
{ |
int size = sizeof(zone_t) + count*sizeof(frame_t); |
int max_order; |
max_order = fnzb(count); |
size += buddy_conf_size(max_order); |
return size; |
} |
/** Create and add zone to system |
* |
* @param start First frame number (absolute) |
* @param count Size of zone in frames |
* @param confframe Where configuration frames are supposed to be. |
* Automatically checks, that we will not disturb the |
* kernel and possibly init. |
* If confframe is given _outside_ this zone, it is expected, |
* that the area is already marked BUSY and big enough |
* to contain zone_conf_size() amount of data. |
* If the confframe is inside the area, the zone free frame |
* information is modified not to include it. |
* |
* @return Zone number or -1 on error |
*/ |
int zone_create(pfn_t start, count_t count, pfn_t confframe, int flags) |
{ |
zone_t *z; |
uintptr_t addr; |
count_t confcount; |
unsigned int i; |
int znum; |
/* Theoretically we could have here 0, practically make sure |
* nobody tries to do that. If some platform requires, remove |
* the assert |
*/ |
ASSERT(confframe); |
/* If conframe is supposed to be inside our zone, then make sure |
* it does not span kernel & init |
*/ |
confcount = SIZE2FRAMES(zone_conf_size(count)); |
if (confframe >= start && confframe < start+count) { |
for (;confframe < start + count; confframe++) { |
addr = PFN2ADDR(confframe); |
if (overlaps(addr, PFN2ADDR(confcount), |
KA2PA(config.base), config.kernel_size)) |
continue; |
if (overlaps(addr, PFN2ADDR(confcount), |
KA2PA(config.stack_base), config.stack_size)) |
continue; |
bool overlap = false; |
count_t i; |
for (i = 0; i < init.cnt; i++) |
if (overlaps(addr, PFN2ADDR(confcount), |
KA2PA(init.tasks[i].addr), |
init.tasks[i].size)) { |
overlap = true; |
break; |
} |
if (overlap) |
continue; |
break; |
} |
if (confframe >= start + count) |
panic("Cannot find configuration data for zone."); |
} |
z = (zone_t *) PA2KA(PFN2ADDR(confframe)); |
zone_construct(start, count, z, flags); |
znum = zones_add_zone(z); |
if (znum == -1) |
return -1; |
/* If confdata in zone, mark as unavailable */ |
if (confframe >= start && confframe < start + count) |
for (i = confframe; i < confframe + confcount; i++) { |
zone_mark_unavailable(z, i - z->base); |
} |
return znum; |
} |
/***************************************/ |
/* Frame functions */ |
/** Set parent of frame */ |
void frame_set_parent(pfn_t pfn, void *data, unsigned int hint) |
{ |
zone_t *zone = find_zone_and_lock(pfn, &hint); |
ASSERT(zone); |
zone_get_frame(zone, pfn-zone->base)->parent = data; |
spinlock_unlock(&zone->lock); |
} |
void *frame_get_parent(pfn_t pfn, unsigned int hint) |
{ |
zone_t *zone = find_zone_and_lock(pfn, &hint); |
void *res; |
ASSERT(zone); |
res = zone_get_frame(zone, pfn - zone->base)->parent; |
spinlock_unlock(&zone->lock); |
return res; |
} |
/** Allocate power-of-two frames of physical memory. |
* |
* @param order Allocate exactly 2^order frames. |
* @param flags Flags for host zone selection and address processing. |
* @param pzone Preferred zone |
* |
* @return Physical address of the allocated frame. |
* |
*/ |
void * frame_alloc_generic(uint8_t order, int flags, unsigned int *pzone) |
{ |
ipl_t ipl; |
int freed; |
pfn_t v; |
zone_t *zone; |
loop: |
ipl = interrupts_disable(); |
/* |
* First, find suitable frame zone. |
*/ |
zone = find_free_zone_and_lock(order, pzone); |
/* If no memory, reclaim some slab memory, |
if it does not help, reclaim all */ |
if (!zone && !(flags & FRAME_NO_RECLAIM)) { |
freed = slab_reclaim(0); |
if (freed) |
zone = find_free_zone_and_lock(order, pzone); |
if (!zone) { |
freed = slab_reclaim(SLAB_RECLAIM_ALL); |
if (freed) |
zone = find_free_zone_and_lock(order, pzone); |
} |
} |
if (!zone) { |
/* |
* TODO: Sleep until frames are available again. |
*/ |
interrupts_restore(ipl); |
if (flags & FRAME_ATOMIC) |
return 0; |
panic("Sleep not implemented.\n"); |
goto loop; |
} |
v = zone_frame_alloc(zone, order); |
v += zone->base; |
spinlock_unlock(&zone->lock); |
interrupts_restore(ipl); |
if (flags & FRAME_KA) |
return (void *)PA2KA(PFN2ADDR(v)); |
return (void *)PFN2ADDR(v); |
} |
/** Free a frame. |
* |
* Find respective frame structure for supplied physical frame address. |
* Decrement frame reference count. |
* If it drops to zero, move the frame structure to free list. |
* |
* @param Frame Physical Address of of the frame to be freed. |
*/ |
void frame_free(uintptr_t frame) |
{ |
ipl_t ipl; |
zone_t *zone; |
pfn_t pfn = ADDR2PFN(frame); |
ipl = interrupts_disable(); |
/* |
* First, find host frame zone for addr. |
*/ |
zone = find_zone_and_lock(pfn,NULL); |
ASSERT(zone); |
zone_frame_free(zone, pfn-zone->base); |
spinlock_unlock(&zone->lock); |
interrupts_restore(ipl); |
} |
/** Add reference to frame. |
* |
* Find respective frame structure for supplied PFN and |
* increment frame reference count. |
* |
* @param pfn Frame number of the frame to be freed. |
*/ |
void frame_reference_add(pfn_t pfn) |
{ |
ipl_t ipl; |
zone_t *zone; |
frame_t *frame; |
ipl = interrupts_disable(); |
/* |
* First, find host frame zone for addr. |
*/ |
zone = find_zone_and_lock(pfn,NULL); |
ASSERT(zone); |
frame = &zone->frames[pfn-zone->base]; |
frame->refcount++; |
spinlock_unlock(&zone->lock); |
interrupts_restore(ipl); |
} |
/** Mark given range unavailable in frame zones */ |
void frame_mark_unavailable(pfn_t start, count_t count) |
{ |
unsigned int i; |
zone_t *zone; |
unsigned int prefzone = 0; |
for (i = 0; i < count; i++) { |
zone = find_zone_and_lock(start + i, &prefzone); |
if (!zone) /* PFN not found */ |
continue; |
zone_mark_unavailable(zone, start + i - zone->base); |
spinlock_unlock(&zone->lock); |
} |
} |
/** Initialize physical memory management |
* |
* Initialize physical memory managemnt. |
*/ |
void frame_init(void) |
{ |
if (config.cpu_active == 1) { |
zones.count = 0; |
spinlock_initialize(&zones.lock, "zones.lock"); |
} |
/* Tell the architecture to create some memory */ |
frame_arch_init(); |
if (config.cpu_active == 1) { |
frame_mark_unavailable(ADDR2PFN(KA2PA(config.base)), |
SIZE2FRAMES(config.kernel_size)); |
frame_mark_unavailable(ADDR2PFN(KA2PA(config.stack_base)), |
SIZE2FRAMES(config.stack_size)); |
count_t i; |
for (i = 0; i < init.cnt; i++) { |
pfn_t pfn = ADDR2PFN(KA2PA(init.tasks[i].addr)); |
frame_mark_unavailable(pfn, |
SIZE2FRAMES(init.tasks[i].size)); |
} |
if (ballocs.size) |
frame_mark_unavailable(ADDR2PFN(KA2PA(ballocs.base)), |
SIZE2FRAMES(ballocs.size)); |
/* Black list first frame, as allocating NULL would |
* fail in some places */ |
frame_mark_unavailable(0, 1); |
} |
} |
/** Return total size of all zones |
* |
*/ |
uint64_t zone_total_size(void) { |
zone_t *zone = NULL; |
unsigned int i; |
ipl_t ipl; |
uint64_t total = 0; |
ipl = interrupts_disable(); |
spinlock_lock(&zones.lock); |
for (i = 0; i < zones.count; i++) { |
zone = zones.info[i]; |
spinlock_lock(&zone->lock); |
total += (uint64_t) FRAMES2SIZE(zone->count); |
spinlock_unlock(&zone->lock); |
} |
spinlock_unlock(&zones.lock); |
interrupts_restore(ipl); |
return total; |
} |
/** Prints list of zones |
* |
*/ |
void zone_print_list(void) { |
zone_t *zone = NULL; |
unsigned int i; |
ipl_t ipl; |
ipl = interrupts_disable(); |
spinlock_lock(&zones.lock); |
if (sizeof(void *) == 4) { |
printf("# base address free frames busy frames\n"); |
printf("-- ------------ ------------ ------------\n"); |
} else { |
printf("# base address free frames busy frames\n"); |
printf("-- -------------------- ------------ ------------\n"); |
} |
for (i = 0; i < zones.count; i++) { |
zone = zones.info[i]; |
spinlock_lock(&zone->lock); |
if (sizeof(void *) == 4) |
printf("%-2d %#10zx %12zd %12zd\n", i, PFN2ADDR(zone->base), |
zone->free_count, zone->busy_count); |
else |
printf("%-2d %#18zx %12zd %12zd\n", i, PFN2ADDR(zone->base), |
zone->free_count, zone->busy_count); |
spinlock_unlock(&zone->lock); |
} |
spinlock_unlock(&zones.lock); |
interrupts_restore(ipl); |
} |
/** Prints zone details. |
* |
* @param num Zone base address or zone number. |
*/ |
void zone_print_one(unsigned int num) { |
zone_t *zone = NULL; |
ipl_t ipl; |
unsigned int i; |
ipl = interrupts_disable(); |
spinlock_lock(&zones.lock); |
for (i = 0; i < zones.count; i++) { |
if ((i == num) || (PFN2ADDR(zones.info[i]->base) == num)) { |
zone = zones.info[i]; |
break; |
} |
} |
if (!zone) { |
printf("Zone not found.\n"); |
goto out; |
} |
spinlock_lock(&zone->lock); |
printf("Memory zone information\n"); |
printf("Zone base address: %#.*p\n", sizeof(uintptr_t) * 2, |
PFN2ADDR(zone->base)); |
printf("Zone size: %zd frames (%zd KB)\n", zone->count, |
SIZE2KB(FRAMES2SIZE(zone->count))); |
printf("Allocated space: %zd frames (%zd KB)\n", zone->busy_count, |
SIZE2KB(FRAMES2SIZE(zone->busy_count))); |
printf("Available space: %zd frames (%zd KB)\n", zone->free_count, |
SIZE2KB(FRAMES2SIZE(zone->free_count))); |
buddy_system_structure_print(zone->buddy_system, FRAME_SIZE); |
spinlock_unlock(&zone->lock); |
out: |
spinlock_unlock(&zones.lock); |
interrupts_restore(ipl); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/mm/backend_elf.c |
---|
0,0 → 1,342 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericmm |
* @{ |
*/ |
/** |
* @file |
* @brief Backend for address space areas backed by an ELF image. |
*/ |
#include <lib/elf.h> |
#include <debug.h> |
#include <arch/types.h> |
#include <mm/as.h> |
#include <mm/frame.h> |
#include <mm/slab.h> |
#include <mm/page.h> |
#include <genarch/mm/page_pt.h> |
#include <genarch/mm/page_ht.h> |
#include <align.h> |
#include <memstr.h> |
#include <macros.h> |
#include <arch.h> |
#ifdef CONFIG_VIRT_IDX_DCACHE |
#include <arch/mm/cache.h> |
#endif |
static int elf_page_fault(as_area_t *area, uintptr_t addr, pf_access_t access); |
static void elf_frame_free(as_area_t *area, uintptr_t page, uintptr_t frame); |
static void elf_share(as_area_t *area); |
mem_backend_t elf_backend = { |
.page_fault = elf_page_fault, |
.frame_free = elf_frame_free, |
.share = elf_share |
}; |
/** Service a page fault in the ELF backend address space area. |
* |
* The address space area and page tables must be already locked. |
* |
* @param area Pointer to the address space area. |
* @param addr Faulting virtual address. |
* @param access Access mode that caused the fault (i.e. read/write/exec). |
* |
* @return AS_PF_FAULT on failure (i.e. page fault) or AS_PF_OK on success (i.e. |
* serviced). |
*/ |
int elf_page_fault(as_area_t *area, uintptr_t addr, pf_access_t access) |
{ |
elf_header_t *elf = area->backend_data.elf; |
elf_segment_header_t *entry = area->backend_data.segment; |
btree_node_t *leaf; |
uintptr_t base, frame; |
index_t i; |
bool dirty = false; |
if (!as_area_check_access(area, access)) |
return AS_PF_FAULT; |
ASSERT((addr >= entry->p_vaddr) && |
(addr < entry->p_vaddr + entry->p_memsz)); |
i = (addr - entry->p_vaddr) >> PAGE_WIDTH; |
base = (uintptr_t) (((void *) elf) + entry->p_offset); |
ASSERT(ALIGN_UP(base, FRAME_SIZE) == base); |
if (area->sh_info) { |
bool found = false; |
/* |
* The address space area is shared. |
*/ |
mutex_lock(&area->sh_info->lock); |
frame = (uintptr_t) btree_search(&area->sh_info->pagemap, |
ALIGN_DOWN(addr, PAGE_SIZE) - area->base, &leaf); |
if (!frame) { |
unsigned int i; |
/* |
* Workaround for valid NULL address. |
*/ |
for (i = 0; i < leaf->keys; i++) { |
if (leaf->key[i] == |
ALIGN_DOWN(addr, PAGE_SIZE)) { |
found = true; |
break; |
} |
} |
} |
if (frame || found) { |
frame_reference_add(ADDR2PFN(frame)); |
page_mapping_insert(AS, addr, frame, |
as_area_get_flags(area)); |
if (!used_space_insert(area, |
ALIGN_DOWN(addr, PAGE_SIZE), 1)) |
panic("Could not insert used space.\n"); |
mutex_unlock(&area->sh_info->lock); |
return AS_PF_OK; |
} |
} |
/* |
* The area is either not shared or the pagemap does not contain the |
* mapping. |
*/ |
if (ALIGN_DOWN(addr, PAGE_SIZE) + PAGE_SIZE < |
entry->p_vaddr + entry->p_filesz) { |
/* |
* Initialized portion of the segment. The memory is backed |
* directly by the content of the ELF image. Pages are |
* only copied if the segment is writable so that there |
* can be more instantions of the same memory ELF image |
* used at a time. Note that this could be later done |
* as COW. |
*/ |
if (entry->p_flags & PF_W) { |
frame = (uintptr_t)frame_alloc(ONE_FRAME, 0); |
memcpy((void *) PA2KA(frame), |
(void *) (base + i * FRAME_SIZE), FRAME_SIZE); |
dirty = true; |
if (area->sh_info) { |
frame_reference_add(ADDR2PFN(frame)); |
btree_insert(&area->sh_info->pagemap, |
ALIGN_DOWN(addr, PAGE_SIZE) - area->base, |
(void *) frame, leaf); |
} |
} else { |
frame = KA2PA(base + i*FRAME_SIZE); |
} |
} else if (ALIGN_DOWN(addr, PAGE_SIZE) >= |
ALIGN_UP(entry->p_vaddr + entry->p_filesz, PAGE_SIZE)) { |
/* |
* This is the uninitialized portion of the segment. |
* It is not physically present in the ELF image. |
* To resolve the situation, a frame must be allocated |
* and cleared. |
*/ |
frame = (uintptr_t)frame_alloc(ONE_FRAME, 0); |
memsetb(PA2KA(frame), FRAME_SIZE, 0); |
dirty = true; |
if (area->sh_info) { |
frame_reference_add(ADDR2PFN(frame)); |
btree_insert(&area->sh_info->pagemap, |
ALIGN_DOWN(addr, PAGE_SIZE) - area->base, |
(void *) frame, leaf); |
} |
} else { |
size_t size; |
/* |
* The mixed case. |
* The lower part is backed by the ELF image and |
* the upper part is anonymous memory. |
*/ |
size = entry->p_filesz - (i<<PAGE_WIDTH); |
frame = (uintptr_t)frame_alloc(ONE_FRAME, 0); |
memsetb(PA2KA(frame) + size, FRAME_SIZE - size, 0); |
memcpy((void *) PA2KA(frame), (void *) (base + i * FRAME_SIZE), |
size); |
dirty = true; |
if (area->sh_info) { |
frame_reference_add(ADDR2PFN(frame)); |
btree_insert(&area->sh_info->pagemap, |
ALIGN_DOWN(addr, PAGE_SIZE) - area->base, |
(void *) frame, leaf); |
} |
} |
if (area->sh_info) |
mutex_unlock(&area->sh_info->lock); |
page_mapping_insert(AS, addr, frame, as_area_get_flags(area)); |
if (!used_space_insert(area, ALIGN_DOWN(addr, PAGE_SIZE), 1)) |
panic("Could not insert used space.\n"); |
return AS_PF_OK; |
} |
/** Free a frame that is backed by the ELF backend. |
* |
* The address space area and page tables must be already locked. |
* |
* @param area Pointer to the address space area. |
* @param page Page that is mapped to frame. Must be aligned to PAGE_SIZE. |
* @param frame Frame to be released. |
* |
*/ |
void elf_frame_free(as_area_t *area, uintptr_t page, uintptr_t frame) |
{ |
elf_header_t *elf = area->backend_data.elf; |
elf_segment_header_t *entry = area->backend_data.segment; |
uintptr_t base; |
index_t i; |
ASSERT((page >= entry->p_vaddr) && |
(page < entry->p_vaddr + entry->p_memsz)); |
i = (page - entry->p_vaddr) >> PAGE_WIDTH; |
base = (uintptr_t) (((void *) elf) + entry->p_offset); |
ASSERT(ALIGN_UP(base, FRAME_SIZE) == base); |
if (page + PAGE_SIZE < |
ALIGN_UP(entry->p_vaddr + entry->p_filesz, PAGE_SIZE)) { |
if (entry->p_flags & PF_W) { |
/* |
* Free the frame with the copy of writable segment |
* data. |
*/ |
frame_free(frame); |
} |
} else { |
/* |
* The frame is either anonymous memory or the mixed case (i.e. |
* lower part is backed by the ELF image and the upper is |
* anonymous). In any case, a frame needs to be freed. |
*/ |
frame_free(frame); |
} |
} |
/** Share ELF image backed address space area. |
* |
* If the area is writable, then all mapped pages are duplicated in the pagemap. |
* Otherwise only portions of the area that are not backed by the ELF image |
* are put into the pagemap. |
* |
* The address space and address space area must be locked prior to the call. |
* |
* @param area Address space area. |
*/ |
void elf_share(as_area_t *area) |
{ |
elf_segment_header_t *entry = area->backend_data.segment; |
link_t *cur; |
btree_node_t *leaf, *node; |
uintptr_t start_anon = entry->p_vaddr + entry->p_filesz; |
/* |
* Find the node in which to start linear search. |
*/ |
if (area->flags & AS_AREA_WRITE) { |
node = list_get_instance(area->used_space.leaf_head.next, |
btree_node_t, leaf_link); |
} else { |
(void) btree_search(&area->sh_info->pagemap, start_anon, &leaf); |
node = btree_leaf_node_left_neighbour(&area->sh_info->pagemap, |
leaf); |
if (!node) |
node = leaf; |
} |
/* |
* Copy used anonymous portions of the area to sh_info's page map. |
*/ |
mutex_lock(&area->sh_info->lock); |
for (cur = &node->leaf_link; cur != &area->used_space.leaf_head; |
cur = cur->next) { |
unsigned int i; |
node = list_get_instance(cur, btree_node_t, leaf_link); |
for (i = 0; i < node->keys; i++) { |
uintptr_t base = node->key[i]; |
count_t count = (count_t) node->value[i]; |
unsigned int j; |
/* |
* Skip read-only areas of used space that are backed |
* by the ELF image. |
*/ |
if (!(area->flags & AS_AREA_WRITE)) |
if (base + count * PAGE_SIZE <= start_anon) |
continue; |
for (j = 0; j < count; j++) { |
pte_t *pte; |
/* |
* Skip read-only pages that are backed by the |
* ELF image. |
*/ |
if (!(area->flags & AS_AREA_WRITE)) |
if (base + (j + 1) * PAGE_SIZE <= |
start_anon) |
continue; |
page_table_lock(area->as, false); |
pte = page_mapping_find(area->as, |
base + j * PAGE_SIZE); |
ASSERT(pte && PTE_VALID(pte) && |
PTE_PRESENT(pte)); |
btree_insert(&area->sh_info->pagemap, |
(base + j * PAGE_SIZE) - area->base, |
(void *) PTE_GET_FRAME(pte), NULL); |
page_table_unlock(area->as, false); |
pfn_t pfn = ADDR2PFN(PTE_GET_FRAME(pte)); |
frame_reference_add(pfn); |
} |
} |
} |
mutex_unlock(&area->sh_info->lock); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/mm/page.c |
---|
0,0 → 1,142 |
/* |
* Copyright (c) 2001-2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericmm |
* @{ |
*/ |
/** |
* @file |
* @brief Virtual Address Translation subsystem. |
* |
* This file contains code for creating, destroying and searching |
* mappings between virtual addresses and physical addresses. |
* Functions here are mere wrappers that call the real implementation. |
* They however, define the single interface. |
*/ |
#include <mm/page.h> |
#include <arch/mm/page.h> |
#include <arch/mm/asid.h> |
#include <mm/as.h> |
#include <mm/frame.h> |
#include <arch/types.h> |
#include <arch/asm.h> |
#include <memstr.h> |
#include <debug.h> |
#include <arch.h> |
/** Virtual operations for page subsystem. */ |
page_mapping_operations_t *page_mapping_operations = NULL; |
void page_init(void) |
{ |
page_arch_init(); |
} |
/** Map memory structure |
* |
* Identity-map memory structure |
* considering possible crossings |
* of page boundaries. |
* |
* @param s Address of the structure. |
* @param size Size of the structure. |
*/ |
void map_structure(uintptr_t s, size_t size) |
{ |
int i, cnt, length; |
length = size + (s - (s & ~(PAGE_SIZE - 1))); |
cnt = length / PAGE_SIZE + (length % PAGE_SIZE > 0); |
for (i = 0; i < cnt; i++) |
page_mapping_insert(AS_KERNEL, s + i * PAGE_SIZE, s + i * PAGE_SIZE, PAGE_NOT_CACHEABLE | PAGE_WRITE); |
} |
/** Insert mapping of page to frame. |
* |
* Map virtual address page to physical address frame |
* using flags. Allocate and setup any missing page tables. |
* |
* The page table must be locked and interrupts must be disabled. |
* |
* @param as Address space to wich page belongs. |
* @param page Virtual address of the page to be mapped. |
* @param frame Physical address of memory frame to which the mapping is done. |
* @param flags Flags to be used for mapping. |
*/ |
void page_mapping_insert(as_t *as, uintptr_t page, uintptr_t frame, int flags) |
{ |
ASSERT(page_mapping_operations); |
ASSERT(page_mapping_operations->mapping_insert); |
page_mapping_operations->mapping_insert(as, page, frame, flags); |
} |
/** Remove mapping of page. |
* |
* Remove any mapping of page within address space as. |
* TLB shootdown should follow in order to make effects of |
* this call visible. |
* |
* The page table must be locked and interrupts must be disabled. |
* |
* @param as Address space to wich page belongs. |
* @param page Virtual address of the page to be demapped. |
*/ |
void page_mapping_remove(as_t *as, uintptr_t page) |
{ |
ASSERT(page_mapping_operations); |
ASSERT(page_mapping_operations->mapping_remove); |
page_mapping_operations->mapping_remove(as, page); |
} |
/** Find mapping for virtual page |
* |
* Find mapping for virtual page. |
* |
* The page table must be locked and interrupts must be disabled. |
* |
* @param as Address space to wich page belongs. |
* @param page Virtual page. |
* |
* @return NULL if there is no such mapping; requested mapping otherwise. |
*/ |
pte_t *page_mapping_find(as_t *as, uintptr_t page) |
{ |
ASSERT(page_mapping_operations); |
ASSERT(page_mapping_operations->mapping_find); |
return page_mapping_operations->mapping_find(as, page); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/mm/backend_phys.c |
---|
0,0 → 1,97 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericmm |
* @{ |
*/ |
/** |
* @file |
* @brief Backend for address space areas backed by continuous physical |
* memory. |
*/ |
#include <debug.h> |
#include <arch/types.h> |
#include <mm/as.h> |
#include <mm/frame.h> |
#include <mm/slab.h> |
#include <memstr.h> |
#include <macros.h> |
#include <arch.h> |
#include <align.h> |
static int phys_page_fault(as_area_t *area, uintptr_t addr, pf_access_t access); |
static void phys_share(as_area_t *area); |
mem_backend_t phys_backend = { |
.page_fault = phys_page_fault, |
.frame_free = NULL, |
.share = phys_share |
}; |
/** Service a page fault in the address space area backed by physical memory. |
* |
* The address space area and page tables must be already locked. |
* |
* @param area Pointer to the address space area. |
* @param addr Faulting virtual address. |
* @param access Access mode that caused the fault (i.e. read/write/exec). |
* |
* @return AS_PF_FAULT on failure (i.e. page fault) or AS_PF_OK on success (i.e. |
* serviced). |
*/ |
int phys_page_fault(as_area_t *area, uintptr_t addr, pf_access_t access) |
{ |
uintptr_t base = area->backend_data.base; |
if (!as_area_check_access(area, access)) |
return AS_PF_FAULT; |
ASSERT(addr - area->base < area->backend_data.frames * FRAME_SIZE); |
page_mapping_insert(AS, addr, base + (addr - area->base), |
as_area_get_flags(area)); |
if (!used_space_insert(area, ALIGN_DOWN(addr, PAGE_SIZE), 1)) |
panic("Could not insert used space.\n"); |
return AS_PF_OK; |
} |
/** Share address space area backed by physical memory. |
* |
* Do actually nothing as sharing of address space areas |
* that are backed up by physical memory is very easy. |
* Note that the function must be defined so that |
* as_area_share() will succeed. |
*/ |
void phys_share(as_area_t *area) |
{ |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/mm/buddy.c |
---|
0,0 → 1,323 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericmm |
* @{ |
*/ |
/** |
* @file |
* @brief Buddy allocator framework. |
* |
* This file contains buddy system allocator framework. |
* Specialized functions are needed for this abstract framework |
* to be useful. |
*/ |
#include <mm/buddy.h> |
#include <mm/frame.h> |
#include <arch/types.h> |
#include <debug.h> |
#include <print.h> |
/** Return size needed for the buddy configuration data */ |
size_t buddy_conf_size(int max_order) |
{ |
return sizeof(buddy_system_t) + (max_order + 1) * sizeof(link_t); |
} |
/** Create buddy system |
* |
* Allocate memory for and initialize new buddy system. |
* |
* @param b Preallocated buddy system control data. |
* @param max_order The biggest allocable size will be 2^max_order. |
* @param op Operations for new buddy system. |
* @param data Pointer to be used by implementation. |
* |
* @return New buddy system. |
*/ |
void buddy_system_create(buddy_system_t *b, |
uint8_t max_order, |
buddy_system_operations_t *op, |
void *data) |
{ |
int i; |
ASSERT(max_order < BUDDY_SYSTEM_INNER_BLOCK); |
ASSERT(op->find_buddy); |
ASSERT(op->set_order); |
ASSERT(op->get_order); |
ASSERT(op->bisect); |
ASSERT(op->coalesce); |
ASSERT(op->mark_busy); |
/* |
* Use memory after our own structure |
*/ |
b->order = (link_t *) (&b[1]); |
for (i = 0; i <= max_order; i++) |
list_initialize(&b->order[i]); |
b->max_order = max_order; |
b->op = op; |
b->data = data; |
} |
/** Check if buddy system can allocate block |
* |
* @param b Buddy system pointer |
* @param i Size of the block (2^i) |
* |
* @return True if block can be allocated |
*/ |
bool buddy_system_can_alloc(buddy_system_t *b, uint8_t i) { |
uint8_t k; |
/* |
* If requested block is greater then maximal block |
* we know immediatly that we cannot satisfy the request. |
*/ |
if (i > b->max_order) return false; |
/* |
* Check if any bigger or equal order has free elements |
*/ |
for (k=i; k <= b->max_order; k++) { |
if (!list_empty(&b->order[k])) { |
return true; |
} |
} |
return false; |
} |
/** Allocate PARTICULAR block from buddy system |
* |
* @ return Block of data or NULL if no such block was found |
*/ |
link_t *buddy_system_alloc_block(buddy_system_t *b, link_t *block) |
{ |
link_t *left,*right, *tmp; |
uint8_t order; |
left = b->op->find_block(b, block, BUDDY_SYSTEM_INNER_BLOCK); |
ASSERT(left); |
list_remove(left); |
while (1) { |
if (! b->op->get_order(b,left)) { |
b->op->mark_busy(b, left); |
return left; |
} |
order = b->op->get_order(b, left); |
right = b->op->bisect(b, left); |
b->op->set_order(b, left, order-1); |
b->op->set_order(b, right, order-1); |
tmp = b->op->find_block(b, block, BUDDY_SYSTEM_INNER_BLOCK); |
if (tmp == right) { |
right = left; |
left = tmp; |
} |
ASSERT(tmp == left); |
b->op->mark_busy(b, left); |
buddy_system_free(b, right); |
b->op->mark_available(b, left); |
} |
} |
/** Allocate block from buddy system. |
* |
* @param b Buddy system pointer. |
* @param i Returned block will be 2^i big. |
* |
* @return Block of data represented by link_t. |
*/ |
link_t *buddy_system_alloc(buddy_system_t *b, uint8_t i) |
{ |
link_t *res, *hlp; |
ASSERT(i <= b->max_order); |
/* |
* If the list of order i is not empty, |
* the request can be immediatelly satisfied. |
*/ |
if (!list_empty(&b->order[i])) { |
res = b->order[i].next; |
list_remove(res); |
b->op->mark_busy(b, res); |
return res; |
} |
/* |
* If order i is already the maximal order, |
* the request cannot be satisfied. |
*/ |
if (i == b->max_order) |
return NULL; |
/* |
* Try to recursively satisfy the request from higher order lists. |
*/ |
hlp = buddy_system_alloc(b, i + 1); |
/* |
* The request could not be satisfied |
* from higher order lists. |
*/ |
if (!hlp) |
return NULL; |
res = hlp; |
/* |
* Bisect the block and set order of both of its parts to i. |
*/ |
hlp = b->op->bisect(b, res); |
b->op->set_order(b, res, i); |
b->op->set_order(b, hlp, i); |
/* |
* Return the other half to buddy system. Mark the first part |
* full, so that it won't coalesce again. |
*/ |
b->op->mark_busy(b, res); |
buddy_system_free(b, hlp); |
return res; |
} |
/** Return block to buddy system. |
* |
* @param b Buddy system pointer. |
* @param block Block to return. |
*/ |
void buddy_system_free(buddy_system_t *b, link_t *block) |
{ |
link_t *buddy, *hlp; |
uint8_t i; |
/* |
* Determine block's order. |
*/ |
i = b->op->get_order(b, block); |
ASSERT(i <= b->max_order); |
if (i != b->max_order) { |
/* |
* See if there is any buddy in the list of order i. |
*/ |
buddy = b->op->find_buddy(b, block); |
if (buddy) { |
ASSERT(b->op->get_order(b, buddy) == i); |
/* |
* Remove buddy from the list of order i. |
*/ |
list_remove(buddy); |
/* |
* Invalidate order of both block and buddy. |
*/ |
b->op->set_order(b, block, BUDDY_SYSTEM_INNER_BLOCK); |
b->op->set_order(b, buddy, BUDDY_SYSTEM_INNER_BLOCK); |
/* |
* Coalesce block and buddy into one block. |
*/ |
hlp = b->op->coalesce(b, block, buddy); |
/* |
* Set order of the coalesced block to i + 1. |
*/ |
b->op->set_order(b, hlp, i + 1); |
/* |
* Recursively add the coalesced block to the list of order i + 1. |
*/ |
buddy_system_free(b, hlp); |
return; |
} |
} |
/* |
* Insert block into the list of order i. |
*/ |
list_append(block, &b->order[i]); |
} |
/** Prints out structure of buddy system |
* |
* @param b Pointer to buddy system |
* @param elem_size Element size |
*/ |
void buddy_system_structure_print(buddy_system_t *b, size_t elem_size) { |
index_t i; |
count_t cnt, elem_count = 0, block_count = 0; |
link_t * cur; |
printf("Order\tBlocks\tSize \tBlock size\tElems per block\n"); |
printf("-----\t------\t--------\t----------\t---------------\n"); |
for (i=0;i <= b->max_order; i++) { |
cnt = 0; |
if (!list_empty(&b->order[i])) { |
for (cur = b->order[i].next; cur != &b->order[i]; cur = cur->next) |
cnt++; |
} |
printf("#%zd\t%5zd\t%7zdK\t%8zdK\t%6zd\t", i, cnt, (cnt * (1 << i) * elem_size) >> 10, ((1 << i) * elem_size) >> 10, 1 << i); |
if (!list_empty(&b->order[i])) { |
for (cur = b->order[i].next; cur != &b->order[i]; cur = cur->next) { |
b->op->print_id(b, cur); |
printf(" "); |
} |
} |
printf("\n"); |
block_count += cnt; |
elem_count += (1 << i) * cnt; |
} |
printf("-----\t------\t--------\t----------\t---------------\n"); |
printf("Buddy system contains %zd free elements (%zd blocks)\n" , elem_count, block_count); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/ipc/sysipc.c |
---|
0,0 → 1,866 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericipc |
* @{ |
*/ |
/** @file |
*/ |
#include <arch.h> |
#include <proc/task.h> |
#include <proc/thread.h> |
#include <errno.h> |
#include <memstr.h> |
#include <debug.h> |
#include <ipc/ipc.h> |
#include <ipc/sysipc.h> |
#include <ipc/irq.h> |
#include <ipc/ipcrsc.h> |
#include <arch/interrupt.h> |
#include <print.h> |
#include <syscall/copy.h> |
#include <security/cap.h> |
#include <mm/as.h> |
#include <print.h> |
/** |
* Maximum buffer size allowed for IPC_M_DATA_WRITE and IPC_M_DATA_READ |
* requests. |
*/ |
#define DATA_XFER_LIMIT (64 * 1024) |
#define GET_CHECK_PHONE(phone, phoneid, err) \ |
{ \ |
if (phoneid > IPC_MAX_PHONES) { \ |
err; \ |
} \ |
phone = &TASK->phones[phoneid]; \ |
} |
#define STRUCT_TO_USPACE(dst, src) copy_to_uspace(dst, src, sizeof(*(src))) |
/** Decide if the method is a system method. |
* |
* @param method Method to be decided. |
* |
* @return Return 1 if the method is a system method. |
* Otherwise return 0. |
*/ |
static inline int method_is_system(unative_t method) |
{ |
if (method <= IPC_M_LAST_SYSTEM) |
return 1; |
return 0; |
} |
/** Decide if the message with this method is forwardable. |
* |
* - some system messages may be forwarded, for some of them |
* it is useless |
* |
* @param method Method to be decided. |
* |
* @return Return 1 if the method is forwardable. |
* Otherwise return 0. |
*/ |
static inline int method_is_forwardable(unative_t method) |
{ |
switch (method) { |
case IPC_M_PHONE_HUNGUP: |
/* This message is meant only for the original recipient. */ |
return 0; |
default: |
return 1; |
} |
} |
/** Decide if the message with this method is immutable on forward. |
* |
* - some system messages may be forwarded but their content cannot be altered |
* |
* @param method Method to be decided. |
* |
* @return Return 1 if the method is immutable on forward. |
* Otherwise return 0. |
*/ |
static inline int method_is_immutable(unative_t method) |
{ |
switch (method) { |
case IPC_M_SHARE_OUT: |
case IPC_M_SHARE_IN: |
case IPC_M_DATA_WRITE: |
case IPC_M_DATA_READ: |
return 1; |
break; |
default: |
return 0; |
} |
} |
/*********************************************************************** |
* Functions that preprocess answer before sending it to the recepient. |
***********************************************************************/ |
/** Decide if the caller (e.g. ipc_answer()) should save the old call contents |
* for answer_preprocess(). |
* |
* @param call Call structure to be decided. |
* |
* @return Return 1 if the old call contents should be saved. |
* Return 0 otherwise. |
*/ |
static inline int answer_need_old(call_t *call) |
{ |
switch (IPC_GET_METHOD(call->data)) { |
case IPC_M_CONNECT_TO_ME: |
case IPC_M_CONNECT_ME_TO: |
case IPC_M_SHARE_OUT: |
case IPC_M_SHARE_IN: |
case IPC_M_DATA_WRITE: |
case IPC_M_DATA_READ: |
return 1; |
default: |
return 0; |
} |
} |
/** Interpret process answer as control information. |
* |
* This function is called directly after sys_ipc_answer(). |
* |
* @param answer Call structure with the answer. |
* @param olddata Saved data of the request. |
* |
* @return Return 0 on success or an error code. |
*/ |
static inline int answer_preprocess(call_t *answer, ipc_data_t *olddata) |
{ |
int phoneid; |
if ((native_t) IPC_GET_RETVAL(answer->data) == EHANGUP) { |
/* In case of forward, hangup the forwared phone, |
* not the originator |
*/ |
spinlock_lock(&answer->data.phone->lock); |
spinlock_lock(&TASK->answerbox.lock); |
if (answer->data.phone->state == IPC_PHONE_CONNECTED) { |
list_remove(&answer->data.phone->link); |
answer->data.phone->state = IPC_PHONE_SLAMMED; |
} |
spinlock_unlock(&TASK->answerbox.lock); |
spinlock_unlock(&answer->data.phone->lock); |
} |
if (!olddata) |
return 0; |
if (IPC_GET_METHOD(*olddata) == IPC_M_CONNECT_TO_ME) { |
phoneid = IPC_GET_ARG5(*olddata); |
if (IPC_GET_RETVAL(answer->data)) { |
/* The connection was not accepted */ |
phone_dealloc(phoneid); |
} else { |
/* The connection was accepted */ |
phone_connect(phoneid, &answer->sender->answerbox); |
/* Set 'phone hash' as arg5 of response */ |
IPC_SET_ARG5(answer->data, |
(unative_t) &TASK->phones[phoneid]); |
} |
} else if (IPC_GET_METHOD(*olddata) == IPC_M_CONNECT_ME_TO) { |
/* If the users accepted call, connect */ |
if (!IPC_GET_RETVAL(answer->data)) { |
ipc_phone_connect((phone_t *) IPC_GET_ARG5(*olddata), |
&TASK->answerbox); |
} |
} else if (IPC_GET_METHOD(*olddata) == IPC_M_SHARE_OUT) { |
if (!IPC_GET_RETVAL(answer->data)) { |
/* Accepted, handle as_area receipt */ |
ipl_t ipl; |
int rc; |
as_t *as; |
ipl = interrupts_disable(); |
spinlock_lock(&answer->sender->lock); |
as = answer->sender->as; |
spinlock_unlock(&answer->sender->lock); |
interrupts_restore(ipl); |
rc = as_area_share(as, IPC_GET_ARG1(*olddata), |
IPC_GET_ARG2(*olddata), AS, |
IPC_GET_ARG1(answer->data), IPC_GET_ARG3(*olddata)); |
IPC_SET_RETVAL(answer->data, rc); |
return rc; |
} |
} else if (IPC_GET_METHOD(*olddata) == IPC_M_SHARE_IN) { |
if (!IPC_GET_RETVAL(answer->data)) { |
ipl_t ipl; |
as_t *as; |
int rc; |
ipl = interrupts_disable(); |
spinlock_lock(&answer->sender->lock); |
as = answer->sender->as; |
spinlock_unlock(&answer->sender->lock); |
interrupts_restore(ipl); |
rc = as_area_share(AS, IPC_GET_ARG1(answer->data), |
IPC_GET_ARG2(*olddata), as, IPC_GET_ARG1(*olddata), |
IPC_GET_ARG2(answer->data)); |
IPC_SET_RETVAL(answer->data, rc); |
} |
} else if (IPC_GET_METHOD(*olddata) == IPC_M_DATA_READ) { |
ASSERT(!answer->buffer); |
if (!IPC_GET_RETVAL(answer->data)) { |
/* The recipient agreed to send data. */ |
uintptr_t src = IPC_GET_ARG1(answer->data); |
uintptr_t dst = IPC_GET_ARG1(*olddata); |
size_t max_size = IPC_GET_ARG2(*olddata); |
size_t size = IPC_GET_ARG2(answer->data); |
if (size <= max_size) { |
/* |
* Copy the destination VA so that this piece of |
* information is not lost. |
*/ |
IPC_SET_ARG1(answer->data, dst); |
answer->buffer = malloc(size, 0); |
int rc = copy_from_uspace(answer->buffer, |
(void *) src, size); |
if (rc) { |
IPC_SET_RETVAL(answer->data, rc); |
free(answer->buffer); |
answer->buffer = NULL; |
} |
} else { |
IPC_SET_RETVAL(answer->data, ELIMIT); |
} |
} |
} else if (IPC_GET_METHOD(*olddata) == IPC_M_DATA_WRITE) { |
ASSERT(answer->buffer); |
if (!IPC_GET_RETVAL(answer->data)) { |
/* The recipient agreed to receive data. */ |
int rc; |
uintptr_t dst; |
uintptr_t size; |
uintptr_t max_size; |
dst = IPC_GET_ARG1(answer->data); |
size = IPC_GET_ARG2(answer->data); |
max_size = IPC_GET_ARG2(*olddata); |
if (size <= max_size) { |
rc = copy_to_uspace((void *) dst, |
answer->buffer, size); |
if (rc) |
IPC_SET_RETVAL(answer->data, rc); |
} else { |
IPC_SET_RETVAL(answer->data, ELIMIT); |
} |
} |
free(answer->buffer); |
answer->buffer = NULL; |
} |
return 0; |
} |
/** Called before the request is sent. |
* |
* @param call Call structure with the request. |
* |
* @return Return 0 on success, ELIMIT or EPERM on error. |
*/ |
static int request_preprocess(call_t *call) |
{ |
int newphid; |
size_t size; |
uintptr_t src; |
int rc; |
switch (IPC_GET_METHOD(call->data)) { |
case IPC_M_CONNECT_ME_TO: |
newphid = phone_alloc(); |
if (newphid < 0) |
return ELIMIT; |
/* Set arg5 for server */ |
IPC_SET_ARG5(call->data, (unative_t) &TASK->phones[newphid]); |
call->flags |= IPC_CALL_CONN_ME_TO; |
call->priv = newphid; |
break; |
case IPC_M_SHARE_OUT: |
size = as_area_get_size(IPC_GET_ARG1(call->data)); |
if (!size) |
return EPERM; |
IPC_SET_ARG2(call->data, size); |
break; |
case IPC_M_DATA_READ: |
size = IPC_GET_ARG2(call->data); |
if ((size <= 0 || (size > DATA_XFER_LIMIT))) |
return ELIMIT; |
break; |
case IPC_M_DATA_WRITE: |
src = IPC_GET_ARG1(call->data); |
size = IPC_GET_ARG2(call->data); |
if ((size <= 0) || (size > DATA_XFER_LIMIT)) |
return ELIMIT; |
call->buffer = (uint8_t *) malloc(size, 0); |
rc = copy_from_uspace(call->buffer, (void *) src, size); |
if (rc != 0) { |
free(call->buffer); |
return rc; |
} |
break; |
default: |
break; |
} |
return 0; |
} |
/******************************************************************************* |
* Functions called to process received call/answer before passing it to uspace. |
*******************************************************************************/ |
/** Do basic kernel processing of received call answer. |
* |
* @param call Call structure with the answer. |
*/ |
static void process_answer(call_t *call) |
{ |
if (((native_t) IPC_GET_RETVAL(call->data) == EHANGUP) && |
(call->flags & IPC_CALL_FORWARDED)) |
IPC_SET_RETVAL(call->data, EFORWARD); |
if (call->flags & IPC_CALL_CONN_ME_TO) { |
if (IPC_GET_RETVAL(call->data)) |
phone_dealloc(call->priv); |
else |
IPC_SET_ARG5(call->data, call->priv); |
} |
if (call->buffer) { |
/* This must be an affirmative answer to IPC_M_DATA_READ. */ |
uintptr_t dst = IPC_GET_ARG1(call->data); |
size_t size = IPC_GET_ARG2(call->data); |
int rc = copy_to_uspace((void *) dst, call->buffer, size); |
if (rc) |
IPC_SET_RETVAL(call->data, rc); |
free(call->buffer); |
call->buffer = NULL; |
} |
} |
/** Do basic kernel processing of received call request. |
* |
* @param box Destination answerbox structure. |
* @param call Call structure with the request. |
* |
* @return Return 0 if the call should be passed to userspace. |
* Return -1 if the call should be ignored. |
*/ |
static int process_request(answerbox_t *box, call_t *call) |
{ |
int phoneid; |
if (IPC_GET_METHOD(call->data) == IPC_M_CONNECT_TO_ME) { |
phoneid = phone_alloc(); |
if (phoneid < 0) { /* Failed to allocate phone */ |
IPC_SET_RETVAL(call->data, ELIMIT); |
ipc_answer(box, call); |
return -1; |
} |
IPC_SET_ARG5(call->data, phoneid); |
} |
return 0; |
} |
/** Make a fast call over IPC, wait for reply and return to user. |
* |
* This function can handle only three arguments of payload, but is faster than |
* the generic function (i.e. sys_ipc_call_sync_slow()). |
* |
* @param phoneid Phone handle for the call. |
* @param method Method of the call. |
* @param arg1 Service-defined payload argument. |
* @param arg2 Service-defined payload argument. |
* @param arg3 Service-defined payload argument. |
* @param data Address of userspace structure where the reply call will |
* be stored. |
* |
* @return Returns 0 on success. |
* Return ENOENT if there is no such phone handle. |
*/ |
unative_t sys_ipc_call_sync_fast(unative_t phoneid, unative_t method, |
unative_t arg1, unative_t arg2, unative_t arg3, ipc_data_t *data) |
{ |
call_t call; |
phone_t *phone; |
int res; |
int rc; |
GET_CHECK_PHONE(phone, phoneid, return ENOENT); |
ipc_call_static_init(&call); |
IPC_SET_METHOD(call.data, method); |
IPC_SET_ARG1(call.data, arg1); |
IPC_SET_ARG2(call.data, arg2); |
IPC_SET_ARG3(call.data, arg3); |
/* |
* To achieve deterministic behavior, zero out arguments that are beyond |
* the limits of the fast version. |
*/ |
IPC_SET_ARG4(call.data, 0); |
IPC_SET_ARG5(call.data, 0); |
if (!(res = request_preprocess(&call))) { |
ipc_call_sync(phone, &call); |
process_answer(&call); |
} else { |
IPC_SET_RETVAL(call.data, res); |
} |
rc = STRUCT_TO_USPACE(&data->args, &call.data.args); |
if (rc != 0) |
return rc; |
return 0; |
} |
/** Make a synchronous IPC call allowing to transmit the entire payload. |
* |
* @param phoneid Phone handle for the call. |
* @param question Userspace address of call data with the request. |
* @param reply Userspace address of call data where to store the |
* answer. |
* |
* @return Zero on success or an error code. |
*/ |
unative_t sys_ipc_call_sync_slow(unative_t phoneid, ipc_data_t *question, |
ipc_data_t *reply) |
{ |
call_t call; |
phone_t *phone; |
int res; |
int rc; |
ipc_call_static_init(&call); |
rc = copy_from_uspace(&call.data.args, &question->args, |
sizeof(call.data.args)); |
if (rc != 0) |
return (unative_t) rc; |
GET_CHECK_PHONE(phone, phoneid, return ENOENT); |
if (!(res = request_preprocess(&call))) { |
ipc_call_sync(phone, &call); |
process_answer(&call); |
} else |
IPC_SET_RETVAL(call.data, res); |
rc = STRUCT_TO_USPACE(&reply->args, &call.data.args); |
if (rc != 0) |
return rc; |
return 0; |
} |
/** Check that the task did not exceed the allowed limit of asynchronous calls. |
* |
* @return Return 0 if limit not reached or -1 if limit exceeded. |
*/ |
static int check_call_limit(void) |
{ |
if (atomic_preinc(&TASK->active_calls) > IPC_MAX_ASYNC_CALLS) { |
atomic_dec(&TASK->active_calls); |
return -1; |
} |
return 0; |
} |
/** Make a fast asynchronous call over IPC. |
* |
* This function can only handle four arguments of payload, but is faster than |
* the generic function sys_ipc_call_async_slow(). |
* |
* @param phoneid Phone handle for the call. |
* @param method Method of the call. |
* @param arg1 Service-defined payload argument. |
* @param arg2 Service-defined payload argument. |
* @param arg3 Service-defined payload argument. |
* @param arg4 Service-defined payload argument. |
* |
* @return Return call hash on success. |
* Return IPC_CALLRET_FATAL in case of a fatal error and |
* IPC_CALLRET_TEMPORARY if there are too many pending |
* asynchronous requests; answers should be handled first. |
*/ |
unative_t sys_ipc_call_async_fast(unative_t phoneid, unative_t method, |
unative_t arg1, unative_t arg2, unative_t arg3, unative_t arg4) |
{ |
call_t *call; |
phone_t *phone; |
int res; |
if (check_call_limit()) |
return IPC_CALLRET_TEMPORARY; |
GET_CHECK_PHONE(phone, phoneid, return IPC_CALLRET_FATAL); |
call = ipc_call_alloc(0); |
IPC_SET_METHOD(call->data, method); |
IPC_SET_ARG1(call->data, arg1); |
IPC_SET_ARG2(call->data, arg2); |
IPC_SET_ARG3(call->data, arg3); |
IPC_SET_ARG4(call->data, arg4); |
/* |
* To achieve deterministic behavior, zero out arguments that are beyond |
* the limits of the fast version. |
*/ |
IPC_SET_ARG5(call->data, 0); |
if (!(res = request_preprocess(call))) |
ipc_call(phone, call); |
else |
ipc_backsend_err(phone, call, res); |
return (unative_t) call; |
} |
/** Make an asynchronous IPC call allowing to transmit the entire payload. |
* |
* @param phoneid Phone handle for the call. |
* @param data Userspace address of call data with the request. |
* |
* @return See sys_ipc_call_async_fast(). |
*/ |
unative_t sys_ipc_call_async_slow(unative_t phoneid, ipc_data_t *data) |
{ |
call_t *call; |
phone_t *phone; |
int res; |
int rc; |
if (check_call_limit()) |
return IPC_CALLRET_TEMPORARY; |
GET_CHECK_PHONE(phone, phoneid, return IPC_CALLRET_FATAL); |
call = ipc_call_alloc(0); |
rc = copy_from_uspace(&call->data.args, &data->args, |
sizeof(call->data.args)); |
if (rc != 0) { |
ipc_call_free(call); |
return (unative_t) rc; |
} |
if (!(res = request_preprocess(call))) |
ipc_call(phone, call); |
else |
ipc_backsend_err(phone, call, res); |
return (unative_t) call; |
} |
/** Forward a received call to another destination. |
* |
* @param callid Hash of the call to forward. |
* @param phoneid Phone handle to use for forwarding. |
* @param method New method to use for the forwarded call. |
* @param arg1 New value of the first argument for the forwarded call. |
* @param arg2 New value of the second argument for the forwarded call. |
* @param mode Flags that specify mode of the forward operation. |
* |
* @return Return 0 on succes, otherwise return an error code. |
* |
* In case the original method is a system method, ARG1, ARG2 and ARG3 are |
* overwritten in the forwarded message with the new method and the new arg1 and |
* arg2, respectively. Otherwise the METHOD, ARG1 and ARG2 are rewritten with |
* the new method, arg1 and arg2, respectively. Also note there is a set of |
* immutable methods, for which the new method and argument is not set and |
* these values are ignored. |
* |
* Warning: When implementing support for changing additional payload |
* arguments, make sure that ARG5 is not rewritten for certain |
* system IPC |
*/ |
unative_t sys_ipc_forward_fast(unative_t callid, unative_t phoneid, |
unative_t method, unative_t arg1, unative_t arg2, int mode) |
{ |
call_t *call; |
phone_t *phone; |
call = get_call(callid); |
if (!call) |
return ENOENT; |
call->flags |= IPC_CALL_FORWARDED; |
GET_CHECK_PHONE(phone, phoneid, { |
IPC_SET_RETVAL(call->data, EFORWARD); |
ipc_answer(&TASK->answerbox, call); |
return ENOENT; |
}); |
if (!method_is_forwardable(IPC_GET_METHOD(call->data))) { |
IPC_SET_RETVAL(call->data, EFORWARD); |
ipc_answer(&TASK->answerbox, call); |
return EPERM; |
} |
/* |
* Userspace is not allowed to change method of system methods on |
* forward, allow changing ARG1, ARG2 and ARG3 by means of method, |
* arg1 and arg2. |
* If the method is immutable, don't change anything. |
*/ |
if (!method_is_immutable(IPC_GET_METHOD(call->data))) { |
if (method_is_system(IPC_GET_METHOD(call->data))) { |
if (IPC_GET_METHOD(call->data) == IPC_M_CONNECT_TO_ME) |
phone_dealloc(IPC_GET_ARG5(call->data)); |
IPC_SET_ARG1(call->data, method); |
IPC_SET_ARG2(call->data, arg1); |
IPC_SET_ARG3(call->data, arg2); |
} else { |
IPC_SET_METHOD(call->data, method); |
IPC_SET_ARG1(call->data, arg1); |
IPC_SET_ARG2(call->data, arg2); |
} |
} |
return ipc_forward(call, phone, &TASK->answerbox, mode); |
} |
/** Answer an IPC call - fast version. |
* |
* This function can handle only two return arguments of payload, but is faster |
* than the generic sys_ipc_answer(). |
* |
* @param callid Hash of the call to be answered. |
* @param retval Return value of the answer. |
* @param arg1 Service-defined return value. |
* @param arg2 Service-defined return value. |
* @param arg3 Service-defined return value. |
* @param arg4 Service-defined return value. |
* |
* @return Return 0 on success, otherwise return an error code. |
*/ |
unative_t sys_ipc_answer_fast(unative_t callid, unative_t retval, |
unative_t arg1, unative_t arg2, unative_t arg3, unative_t arg4) |
{ |
call_t *call; |
ipc_data_t saved_data; |
int saveddata = 0; |
int rc; |
/* Do not answer notification callids */ |
if (callid & IPC_CALLID_NOTIFICATION) |
return 0; |
call = get_call(callid); |
if (!call) |
return ENOENT; |
if (answer_need_old(call)) { |
memcpy(&saved_data, &call->data, sizeof(call->data)); |
saveddata = 1; |
} |
IPC_SET_RETVAL(call->data, retval); |
IPC_SET_ARG1(call->data, arg1); |
IPC_SET_ARG2(call->data, arg2); |
IPC_SET_ARG3(call->data, arg3); |
IPC_SET_ARG4(call->data, arg4); |
/* |
* To achieve deterministic behavior, zero out arguments that are beyond |
* the limits of the fast version. |
*/ |
IPC_SET_ARG5(call->data, 0); |
rc = answer_preprocess(call, saveddata ? &saved_data : NULL); |
ipc_answer(&TASK->answerbox, call); |
return rc; |
} |
/** Answer an IPC call. |
* |
* @param callid Hash of the call to be answered. |
* @param data Userspace address of call data with the answer. |
* |
* @return Return 0 on success, otherwise return an error code. |
*/ |
unative_t sys_ipc_answer_slow(unative_t callid, ipc_data_t *data) |
{ |
call_t *call; |
ipc_data_t saved_data; |
int saveddata = 0; |
int rc; |
/* Do not answer notification callids */ |
if (callid & IPC_CALLID_NOTIFICATION) |
return 0; |
call = get_call(callid); |
if (!call) |
return ENOENT; |
if (answer_need_old(call)) { |
memcpy(&saved_data, &call->data, sizeof(call->data)); |
saveddata = 1; |
} |
rc = copy_from_uspace(&call->data.args, &data->args, |
sizeof(call->data.args)); |
if (rc != 0) |
return rc; |
rc = answer_preprocess(call, saveddata ? &saved_data : NULL); |
ipc_answer(&TASK->answerbox, call); |
return rc; |
} |
/** Hang up a phone. |
* |
* @param Phone handle of the phone to be hung up. |
* |
* @return Return 0 on success or an error code. |
*/ |
unative_t sys_ipc_hangup(int phoneid) |
{ |
phone_t *phone; |
GET_CHECK_PHONE(phone, phoneid, return ENOENT); |
if (ipc_phone_hangup(phone)) |
return -1; |
return 0; |
} |
/** Wait for an incoming IPC call or an answer. |
* |
* @param calldata Pointer to buffer where the call/answer data is stored. |
* @param usec Timeout. See waitq_sleep_timeout() for explanation. |
* @param flags Select mode of sleep operation. See waitq_sleep_timeout() |
* for explanation. |
* |
* @return Hash of the call. |
* If IPC_CALLID_NOTIFICATION bit is set in the hash, the |
* call is a notification. IPC_CALLID_ANSWERED denotes an |
* answer. |
*/ |
unative_t sys_ipc_wait_for_call(ipc_data_t *calldata, uint32_t usec, int flags) |
{ |
call_t *call; |
restart: |
call = ipc_wait_for_call(&TASK->answerbox, usec, |
flags | SYNCH_FLAGS_INTERRUPTIBLE); |
if (!call) |
return 0; |
if (call->flags & IPC_CALL_NOTIF) { |
ASSERT(! (call->flags & IPC_CALL_STATIC_ALLOC)); |
/* Set in_phone_hash to the interrupt counter */ |
call->data.phone = (void *) call->priv; |
STRUCT_TO_USPACE(calldata, &call->data); |
ipc_call_free(call); |
return ((unative_t) call) | IPC_CALLID_NOTIFICATION; |
} |
if (call->flags & IPC_CALL_ANSWERED) { |
process_answer(call); |
ASSERT(! (call->flags & IPC_CALL_STATIC_ALLOC)); |
atomic_dec(&TASK->active_calls); |
if (call->flags & IPC_CALL_DISCARD_ANSWER) { |
ipc_call_free(call); |
goto restart; |
} |
STRUCT_TO_USPACE(&calldata->args, &call->data.args); |
ipc_call_free(call); |
return ((unative_t) call) | IPC_CALLID_ANSWERED; |
} |
if (process_request(&TASK->answerbox, call)) |
goto restart; |
/* Include phone address('id') of the caller in the request, |
* copy whole call->data, not only call->data.args */ |
if (STRUCT_TO_USPACE(calldata, &call->data)) { |
return 0; |
} |
return (unative_t)call; |
} |
/** Connect an IRQ handler to a task. |
* |
* @param inr IRQ number. |
* @param devno Device number. |
* @param method Method to be associated with the notification. |
* @param ucode Uspace pointer to the top-half pseudocode. |
* |
* @return EPERM or a return code returned by ipc_irq_register(). |
*/ |
unative_t sys_ipc_register_irq(inr_t inr, devno_t devno, unative_t method, |
irq_code_t *ucode) |
{ |
if (!(cap_get(TASK) & CAP_IRQ_REG)) |
return EPERM; |
return ipc_irq_register(&TASK->answerbox, inr, devno, method, ucode); |
} |
/** Disconnect an IRQ handler from a task. |
* |
* @param inr IRQ number. |
* @param devno Device number. |
* |
* @return Zero on success or EPERM on error.. |
*/ |
unative_t sys_ipc_unregister_irq(inr_t inr, devno_t devno) |
{ |
if (!(cap_get(TASK) & CAP_IRQ_REG)) |
return EPERM; |
ipc_irq_unregister(&TASK->answerbox, inr, devno); |
return 0; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/ipc/irq.c |
---|
0,0 → 1,405 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericipc |
* @{ |
*/ |
/** |
* @file |
* @brief IRQ notification framework. |
* |
* This framework allows applications to register to receive a notification |
* when interrupt is detected. The application may provide a simple 'top-half' |
* handler as part of its registration, which can perform simple operations |
* (read/write port/memory, add information to notification ipc message). |
* |
* The structure of a notification message is as follows: |
* - METHOD: method as registered by the SYS_IPC_REGISTER_IRQ syscall |
* - ARG1: payload modified by a 'top-half' handler |
* - ARG2: payload modified by a 'top-half' handler |
* - ARG3: payload modified by a 'top-half' handler |
* - in_phone_hash: interrupt counter (may be needed to assure correct order |
* in multithreaded drivers) |
*/ |
#include <arch.h> |
#include <mm/slab.h> |
#include <errno.h> |
#include <ddi/irq.h> |
#include <ipc/ipc.h> |
#include <ipc/irq.h> |
#include <syscall/copy.h> |
#include <console/console.h> |
#include <print.h> |
/** Execute code associated with IRQ notification. |
* |
* @param call Notification call. |
* @param code Top-half pseudocode. |
*/ |
static void code_execute(call_t *call, irq_code_t *code) |
{ |
unsigned int i; |
unative_t dstval = 0; |
if (!code) |
return; |
for (i = 0; i < code->cmdcount; i++) { |
switch (code->cmds[i].cmd) { |
case CMD_MEM_READ_1: |
dstval = *((uint8_t *) code->cmds[i].addr); |
break; |
case CMD_MEM_READ_2: |
dstval = *((uint16_t *) code->cmds[i].addr); |
break; |
case CMD_MEM_READ_4: |
dstval = *((uint32_t *) code->cmds[i].addr); |
break; |
case CMD_MEM_READ_8: |
dstval = *((uint64_t *) code->cmds[i].addr); |
break; |
case CMD_MEM_WRITE_1: |
*((uint8_t *) code->cmds[i].addr) = code->cmds[i].value; |
break; |
case CMD_MEM_WRITE_2: |
*((uint16_t *) code->cmds[i].addr) = |
code->cmds[i].value; |
break; |
case CMD_MEM_WRITE_4: |
*((uint32_t *) code->cmds[i].addr) = |
code->cmds[i].value; |
break; |
case CMD_MEM_WRITE_8: |
*((uint64_t *) code->cmds[i].addr) = |
code->cmds[i].value; |
break; |
#if defined(ia32) || defined(amd64) |
case CMD_PORT_READ_1: |
dstval = inb((long) code->cmds[i].addr); |
break; |
case CMD_PORT_WRITE_1: |
outb((long) code->cmds[i].addr, code->cmds[i].value); |
break; |
#endif |
#if defined(ia64) && defined(SKI) |
case CMD_IA64_GETCHAR: |
dstval = _getc(&ski_uconsole); |
break; |
#endif |
#if defined(ppc32) |
case CMD_PPC32_GETCHAR: |
dstval = cuda_get_scancode(); |
break; |
#endif |
default: |
break; |
} |
if (code->cmds[i].dstarg && code->cmds[i].dstarg < |
IPC_CALL_LEN) { |
call->data.args[code->cmds[i].dstarg] = dstval; |
} |
} |
} |
/** Free top-half pseudocode. |
* |
* @param code Pointer to the top-half pseudocode. |
*/ |
static void code_free(irq_code_t *code) |
{ |
if (code) { |
free(code->cmds); |
free(code); |
} |
} |
/** Copy top-half pseudocode from userspace into the kernel. |
* |
* @param ucode Userspace address of the top-half pseudocode. |
* |
* @return Kernel address of the copied pseudocode. |
*/ |
static irq_code_t *code_from_uspace(irq_code_t *ucode) |
{ |
irq_code_t *code; |
irq_cmd_t *ucmds; |
int rc; |
code = malloc(sizeof(*code), 0); |
rc = copy_from_uspace(code, ucode, sizeof(*code)); |
if (rc != 0) { |
free(code); |
return NULL; |
} |
if (code->cmdcount > IRQ_MAX_PROG_SIZE) { |
free(code); |
return NULL; |
} |
ucmds = code->cmds; |
code->cmds = malloc(sizeof(code->cmds[0]) * code->cmdcount, 0); |
rc = copy_from_uspace(code->cmds, ucmds, |
sizeof(code->cmds[0]) * code->cmdcount); |
if (rc != 0) { |
free(code->cmds); |
free(code); |
return NULL; |
} |
return code; |
} |
/** Unregister task from IRQ notification. |
* |
* @param box Answerbox associated with the notification. |
* @param inr IRQ number. |
* @param devno Device number. |
*/ |
void ipc_irq_unregister(answerbox_t *box, inr_t inr, devno_t devno) |
{ |
ipl_t ipl; |
irq_t *irq; |
ipl = interrupts_disable(); |
irq = irq_find_and_lock(inr, devno); |
if (irq) { |
if (irq->notif_cfg.answerbox == box) { |
code_free(irq->notif_cfg.code); |
irq->notif_cfg.notify = false; |
irq->notif_cfg.answerbox = NULL; |
irq->notif_cfg.code = NULL; |
irq->notif_cfg.method = 0; |
irq->notif_cfg.counter = 0; |
spinlock_lock(&box->irq_lock); |
list_remove(&irq->notif_cfg.link); |
spinlock_unlock(&box->irq_lock); |
spinlock_unlock(&irq->lock); |
} |
} |
interrupts_restore(ipl); |
} |
/** Register an answerbox as a receiving end for IRQ notifications. |
* |
* @param box Receiving answerbox. |
* @param inr IRQ number. |
* @param devno Device number. |
* @param method Method to be associated with the notification. |
* @param ucode Uspace pointer to top-half pseudocode. |
* |
* @return EBADMEM, ENOENT or EEXISTS on failure or 0 on success. |
*/ |
int ipc_irq_register(answerbox_t *box, inr_t inr, devno_t devno, |
unative_t method, irq_code_t *ucode) |
{ |
ipl_t ipl; |
irq_code_t *code; |
irq_t *irq; |
if (ucode) { |
code = code_from_uspace(ucode); |
if (!code) |
return EBADMEM; |
} else { |
code = NULL; |
} |
ipl = interrupts_disable(); |
irq = irq_find_and_lock(inr, devno); |
if (!irq) { |
interrupts_restore(ipl); |
code_free(code); |
return ENOENT; |
} |
if (irq->notif_cfg.answerbox) { |
spinlock_unlock(&irq->lock); |
interrupts_restore(ipl); |
code_free(code); |
return EEXISTS; |
} |
irq->notif_cfg.notify = true; |
irq->notif_cfg.answerbox = box; |
irq->notif_cfg.method = method; |
irq->notif_cfg.code = code; |
irq->notif_cfg.counter = 0; |
spinlock_lock(&box->irq_lock); |
list_append(&irq->notif_cfg.link, &box->irq_head); |
spinlock_unlock(&box->irq_lock); |
spinlock_unlock(&irq->lock); |
interrupts_restore(ipl); |
return 0; |
} |
/** Add a call to the proper answerbox queue. |
* |
* Assume irq->lock is locked. |
* |
* @param irq IRQ structure referencing the target answerbox. |
* @param call IRQ notification call. |
*/ |
static void send_call(irq_t *irq, call_t *call) |
{ |
spinlock_lock(&irq->notif_cfg.answerbox->irq_lock); |
list_append(&call->link, &irq->notif_cfg.answerbox->irq_notifs); |
spinlock_unlock(&irq->notif_cfg.answerbox->irq_lock); |
waitq_wakeup(&irq->notif_cfg.answerbox->wq, WAKEUP_FIRST); |
} |
/** Send notification message. |
* |
* @param irq IRQ structure. |
* @param a1 Driver-specific payload argument. |
* @param a2 Driver-specific payload argument. |
* @param a3 Driver-specific payload argument. |
* @param a4 Driver-specific payload argument. |
* @param a5 Driver-specific payload argument. |
*/ |
void ipc_irq_send_msg(irq_t *irq, unative_t a1, unative_t a2, unative_t a3, |
unative_t a4, unative_t a5) |
{ |
call_t *call; |
spinlock_lock(&irq->lock); |
if (irq->notif_cfg.answerbox) { |
call = ipc_call_alloc(FRAME_ATOMIC); |
if (!call) { |
spinlock_unlock(&irq->lock); |
return; |
} |
call->flags |= IPC_CALL_NOTIF; |
IPC_SET_METHOD(call->data, irq->notif_cfg.method); |
IPC_SET_ARG1(call->data, a1); |
IPC_SET_ARG2(call->data, a2); |
IPC_SET_ARG3(call->data, a3); |
IPC_SET_ARG4(call->data, a4); |
IPC_SET_ARG5(call->data, a5); |
/* Put a counter to the message */ |
call->priv = ++irq->notif_cfg.counter; |
send_call(irq, call); |
} |
spinlock_unlock(&irq->lock); |
} |
/** Notify a task that an IRQ had occurred. |
* |
* We expect interrupts to be disabled and the irq->lock already held. |
* |
* @param irq IRQ structure. |
*/ |
void ipc_irq_send_notif(irq_t *irq) |
{ |
call_t *call; |
ASSERT(irq); |
if (irq->notif_cfg.answerbox) { |
call = ipc_call_alloc(FRAME_ATOMIC); |
if (!call) { |
return; |
} |
call->flags |= IPC_CALL_NOTIF; |
/* Put a counter to the message */ |
call->priv = ++irq->notif_cfg.counter; |
/* Set up args */ |
IPC_SET_METHOD(call->data, irq->notif_cfg.method); |
/* Execute code to handle irq */ |
code_execute(call, irq->notif_cfg.code); |
send_call(irq, call); |
} |
} |
/** Disconnect all IRQ notifications from an answerbox. |
* |
* This function is effective because the answerbox contains |
* list of all irq_t structures that are registered to |
* send notifications to it. |
* |
* @param box Answerbox for which we want to carry out the cleanup. |
*/ |
void ipc_irq_cleanup(answerbox_t *box) |
{ |
ipl_t ipl; |
loop: |
ipl = interrupts_disable(); |
spinlock_lock(&box->irq_lock); |
while (box->irq_head.next != &box->irq_head) { |
link_t *cur = box->irq_head.next; |
irq_t *irq; |
DEADLOCK_PROBE_INIT(p_irqlock); |
irq = list_get_instance(cur, irq_t, notif_cfg.link); |
if (!spinlock_trylock(&irq->lock)) { |
/* |
* Avoid deadlock by trying again. |
*/ |
spinlock_unlock(&box->irq_lock); |
interrupts_restore(ipl); |
DEADLOCK_PROBE(p_irqlock, DEADLOCK_THRESHOLD); |
goto loop; |
} |
ASSERT(irq->notif_cfg.answerbox == box); |
list_remove(&irq->notif_cfg.link); |
/* |
* Don't forget to free any top-half pseudocode. |
*/ |
code_free(irq->notif_cfg.code); |
irq->notif_cfg.notify = false; |
irq->notif_cfg.answerbox = NULL; |
irq->notif_cfg.code = NULL; |
irq->notif_cfg.method = 0; |
irq->notif_cfg.counter = 0; |
spinlock_unlock(&irq->lock); |
} |
spinlock_unlock(&box->irq_lock); |
interrupts_restore(ipl); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/ipc/ipc.c |
---|
0,0 → 1,609 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericipc |
* @{ |
*/ |
/** @file |
*/ |
/* Lock ordering |
* |
* First the answerbox, then the phone. |
*/ |
#include <synch/spinlock.h> |
#include <synch/waitq.h> |
#include <synch/synch.h> |
#include <ipc/ipc.h> |
#include <errno.h> |
#include <mm/slab.h> |
#include <arch.h> |
#include <proc/task.h> |
#include <memstr.h> |
#include <debug.h> |
#include <print.h> |
#include <proc/thread.h> |
#include <arch/interrupt.h> |
#include <ipc/irq.h> |
/** Open channel that is assigned automatically to new tasks */ |
answerbox_t *ipc_phone_0 = NULL; |
static slab_cache_t *ipc_call_slab; |
/** Initialize a call structure. |
* |
* @param call Call structure to be initialized. |
*/ |
static void _ipc_call_init(call_t *call) |
{ |
memsetb((uintptr_t) call, sizeof(*call), 0); |
call->callerbox = &TASK->answerbox; |
call->sender = TASK; |
call->buffer = NULL; |
} |
/** Allocate and initialize a call structure. |
* |
* The call is initialized, so that the reply will be directed to |
* TASK->answerbox. |
* |
* @param flags Parameters for slab_alloc (e.g FRAME_ATOMIC). |
* |
* @return If flags permit it, return NULL, or initialized kernel |
* call structure. |
*/ |
call_t *ipc_call_alloc(int flags) |
{ |
call_t *call; |
call = slab_alloc(ipc_call_slab, flags); |
_ipc_call_init(call); |
return call; |
} |
/** Initialize a statically allocated call structure. |
* |
* @param call Statically allocated kernel call structure to be |
* initialized. |
*/ |
void ipc_call_static_init(call_t *call) |
{ |
_ipc_call_init(call); |
call->flags |= IPC_CALL_STATIC_ALLOC; |
} |
/** Deallocate a call structure. |
* |
* @param call Call structure to be freed. |
*/ |
void ipc_call_free(call_t *call) |
{ |
ASSERT(!(call->flags & IPC_CALL_STATIC_ALLOC)); |
/* Check to see if we have data in the IPC_M_DATA_SEND buffer. */ |
if (call->buffer) |
free(call->buffer); |
slab_free(ipc_call_slab, call); |
} |
/** Initialize an answerbox structure. |
* |
* @param box Answerbox structure to be initialized. |
*/ |
void ipc_answerbox_init(answerbox_t *box) |
{ |
spinlock_initialize(&box->lock, "ipc_box_lock"); |
spinlock_initialize(&box->irq_lock, "ipc_box_irqlock"); |
waitq_initialize(&box->wq); |
list_initialize(&box->connected_phones); |
list_initialize(&box->calls); |
list_initialize(&box->dispatched_calls); |
list_initialize(&box->answers); |
list_initialize(&box->irq_notifs); |
list_initialize(&box->irq_head); |
box->task = TASK; |
} |
/** Connect a phone to an answerbox. |
* |
* @param phone Initialized phone structure. |
* @param box Initialized answerbox structure. |
*/ |
void ipc_phone_connect(phone_t *phone, answerbox_t *box) |
{ |
spinlock_lock(&phone->lock); |
phone->state = IPC_PHONE_CONNECTED; |
phone->callee = box; |
spinlock_lock(&box->lock); |
list_append(&phone->link, &box->connected_phones); |
spinlock_unlock(&box->lock); |
spinlock_unlock(&phone->lock); |
} |
/** Initialize a phone structure. |
* |
* @param phone Phone structure to be initialized. |
*/ |
void ipc_phone_init(phone_t *phone) |
{ |
spinlock_initialize(&phone->lock, "phone_lock"); |
phone->callee = NULL; |
phone->state = IPC_PHONE_FREE; |
atomic_set(&phone->active_calls, 0); |
} |
/** Helper function to facilitate synchronous calls. |
* |
* @param phone Destination kernel phone structure. |
* @param request Call structure with request. |
*/ |
void ipc_call_sync(phone_t *phone, call_t *request) |
{ |
answerbox_t sync_box; |
ipc_answerbox_init(&sync_box); |
/* We will receive data in a special box. */ |
request->callerbox = &sync_box; |
ipc_call(phone, request); |
ipc_wait_for_call(&sync_box, SYNCH_NO_TIMEOUT, SYNCH_FLAGS_NONE); |
} |
/** Answer a message which was not dispatched and is not listed in any queue. |
* |
* @param call Call structure to be answered. |
*/ |
static void _ipc_answer_free_call(call_t *call) |
{ |
answerbox_t *callerbox = call->callerbox; |
call->flags |= IPC_CALL_ANSWERED; |
spinlock_lock(&callerbox->lock); |
list_append(&call->link, &callerbox->answers); |
spinlock_unlock(&callerbox->lock); |
waitq_wakeup(&callerbox->wq, WAKEUP_FIRST); |
} |
/** Answer a message which is in a callee queue. |
* |
* @param box Answerbox that is answering the message. |
* @param call Modified request that is being sent back. |
*/ |
void ipc_answer(answerbox_t *box, call_t *call) |
{ |
/* Remove from active box */ |
spinlock_lock(&box->lock); |
list_remove(&call->link); |
spinlock_unlock(&box->lock); |
/* Send back answer */ |
_ipc_answer_free_call(call); |
} |
/** Simulate sending back a message. |
* |
* Most errors are better handled by forming a normal backward |
* message and sending it as a normal answer. |
* |
* @param phone Phone structure the call should appear to come from. |
* @param call Call structure to be answered. |
* @param err Return value to be used for the answer. |
*/ |
void ipc_backsend_err(phone_t *phone, call_t *call, unative_t err) |
{ |
call->data.phone = phone; |
atomic_inc(&phone->active_calls); |
IPC_SET_RETVAL(call->data, err); |
_ipc_answer_free_call(call); |
} |
/** Unsafe unchecking version of ipc_call. |
* |
* @param phone Phone structure the call comes from. |
* @param box Destination answerbox structure. |
* @param call Call structure with request. |
*/ |
static void _ipc_call(phone_t *phone, answerbox_t *box, call_t *call) |
{ |
if (!(call->flags & IPC_CALL_FORWARDED)) { |
atomic_inc(&phone->active_calls); |
call->data.phone = phone; |
} |
spinlock_lock(&box->lock); |
list_append(&call->link, &box->calls); |
spinlock_unlock(&box->lock); |
waitq_wakeup(&box->wq, WAKEUP_FIRST); |
} |
/** Send an asynchronous request using a phone to an answerbox. |
* |
* @param phone Phone structure the call comes from and which is |
* connected to the destination answerbox. |
* @param call Call structure with request. |
* |
* @return Return 0 on success, ENOENT on error. |
*/ |
int ipc_call(phone_t *phone, call_t *call) |
{ |
answerbox_t *box; |
spinlock_lock(&phone->lock); |
if (phone->state != IPC_PHONE_CONNECTED) { |
spinlock_unlock(&phone->lock); |
if (call->flags & IPC_CALL_FORWARDED) { |
IPC_SET_RETVAL(call->data, EFORWARD); |
_ipc_answer_free_call(call); |
} else { |
if (phone->state == IPC_PHONE_HUNGUP) |
ipc_backsend_err(phone, call, EHANGUP); |
else |
ipc_backsend_err(phone, call, ENOENT); |
} |
return ENOENT; |
} |
box = phone->callee; |
_ipc_call(phone, box, call); |
spinlock_unlock(&phone->lock); |
return 0; |
} |
/** Disconnect phone from answerbox. |
* |
* This call leaves the phone in the HUNGUP state. The change to 'free' is done |
* lazily later. |
* |
* @param phone Phone structure to be hung up. |
* |
* @return Return 0 if the phone is disconnected. |
* Return -1 if the phone was already disconnected. |
*/ |
int ipc_phone_hangup(phone_t *phone) |
{ |
answerbox_t *box; |
call_t *call; |
spinlock_lock(&phone->lock); |
if (phone->state == IPC_PHONE_FREE || |
phone->state == IPC_PHONE_HUNGUP || |
phone->state == IPC_PHONE_CONNECTING) { |
spinlock_unlock(&phone->lock); |
return -1; |
} |
box = phone->callee; |
if (phone->state != IPC_PHONE_SLAMMED) { |
/* Remove myself from answerbox */ |
spinlock_lock(&box->lock); |
list_remove(&phone->link); |
spinlock_unlock(&box->lock); |
if (phone->state != IPC_PHONE_SLAMMED) { |
call = ipc_call_alloc(0); |
IPC_SET_METHOD(call->data, IPC_M_PHONE_HUNGUP); |
call->flags |= IPC_CALL_DISCARD_ANSWER; |
_ipc_call(phone, box, call); |
} |
} |
phone->state = IPC_PHONE_HUNGUP; |
spinlock_unlock(&phone->lock); |
return 0; |
} |
/** Forwards call from one answerbox to another one. |
* |
* @param call Call structure to be redirected. |
* @param newphone Phone structure to target answerbox. |
* @param oldbox Old answerbox structure. |
* @param mode Flags that specify mode of the forward operation. |
* |
* @return Return 0 if forwarding succeeded or an error code if |
* there was error. |
* |
* The return value serves only as an information for the forwarder, |
* the original caller is notified automatically with EFORWARD. |
*/ |
int ipc_forward(call_t *call, phone_t *newphone, answerbox_t *oldbox, int mode) |
{ |
spinlock_lock(&oldbox->lock); |
list_remove(&call->link); |
spinlock_unlock(&oldbox->lock); |
if (mode & IPC_FF_ROUTE_FROM_ME) |
call->data.phone = newphone; |
return ipc_call(newphone, call); |
} |
/** Wait for a phone call. |
* |
* @param box Answerbox expecting the call. |
* @param usec Timeout in microseconds. See documentation for |
* waitq_sleep_timeout() for decription of its special |
* meaning. |
* @param flags Select mode of sleep operation. See documentation for |
* waitq_sleep_timeout() for description of its special |
* meaning. |
* @return Recived call structure or NULL. |
* |
* To distinguish between a call and an answer, have a look at call->flags. |
*/ |
call_t *ipc_wait_for_call(answerbox_t *box, uint32_t usec, int flags) |
{ |
call_t *request; |
ipl_t ipl; |
int rc; |
restart: |
rc = waitq_sleep_timeout(&box->wq, usec, flags); |
if (SYNCH_FAILED(rc)) |
return NULL; |
spinlock_lock(&box->lock); |
if (!list_empty(&box->irq_notifs)) { |
ipl = interrupts_disable(); |
spinlock_lock(&box->irq_lock); |
request = list_get_instance(box->irq_notifs.next, call_t, link); |
list_remove(&request->link); |
spinlock_unlock(&box->irq_lock); |
interrupts_restore(ipl); |
} else if (!list_empty(&box->answers)) { |
/* Handle asynchronous answers */ |
request = list_get_instance(box->answers.next, call_t, link); |
list_remove(&request->link); |
atomic_dec(&request->data.phone->active_calls); |
} else if (!list_empty(&box->calls)) { |
/* Handle requests */ |
request = list_get_instance(box->calls.next, call_t, link); |
list_remove(&request->link); |
/* Append request to dispatch queue */ |
list_append(&request->link, &box->dispatched_calls); |
} else { |
/* This can happen regularly after ipc_cleanup */ |
spinlock_unlock(&box->lock); |
goto restart; |
} |
spinlock_unlock(&box->lock); |
return request; |
} |
/** Answer all calls from list with EHANGUP answer. |
* |
* @param lst Head of the list to be cleaned up. |
*/ |
static void ipc_cleanup_call_list(link_t *lst) |
{ |
call_t *call; |
while (!list_empty(lst)) { |
call = list_get_instance(lst->next, call_t, link); |
if (call->buffer) |
free(call->buffer); |
list_remove(&call->link); |
IPC_SET_RETVAL(call->data, EHANGUP); |
_ipc_answer_free_call(call); |
} |
} |
/** Cleans up all IPC communication of the current task. |
* |
* Note: ipc_hangup sets returning answerbox to TASK->answerbox, you |
* have to change it as well if you want to cleanup other tasks than TASK. |
*/ |
void ipc_cleanup(void) |
{ |
int i; |
call_t *call; |
phone_t *phone; |
DEADLOCK_PROBE_INIT(p_phonelck); |
/* Disconnect all our phones ('ipc_phone_hangup') */ |
for (i = 0; i < IPC_MAX_PHONES; i++) |
ipc_phone_hangup(&TASK->phones[i]); |
/* Disconnect all connected irqs */ |
ipc_irq_cleanup(&TASK->answerbox); |
/* Disconnect all phones connected to our answerbox */ |
restart_phones: |
spinlock_lock(&TASK->answerbox.lock); |
while (!list_empty(&TASK->answerbox.connected_phones)) { |
phone = list_get_instance(TASK->answerbox.connected_phones.next, |
phone_t, link); |
if (!spinlock_trylock(&phone->lock)) { |
spinlock_unlock(&TASK->answerbox.lock); |
DEADLOCK_PROBE(p_phonelck, DEADLOCK_THRESHOLD); |
goto restart_phones; |
} |
/* Disconnect phone */ |
ASSERT(phone->state == IPC_PHONE_CONNECTED); |
phone->state = IPC_PHONE_SLAMMED; |
list_remove(&phone->link); |
spinlock_unlock(&phone->lock); |
} |
/* Answer all messages in 'calls' and 'dispatched_calls' queues */ |
ipc_cleanup_call_list(&TASK->answerbox.dispatched_calls); |
ipc_cleanup_call_list(&TASK->answerbox.calls); |
spinlock_unlock(&TASK->answerbox.lock); |
/* Wait for all async answers to arrive */ |
while (1) { |
/* Go through all phones, until all are FREE... */ |
/* Locking not needed, no one else should modify |
* it, when we are in cleanup */ |
for (i = 0; i < IPC_MAX_PHONES; i++) { |
if (TASK->phones[i].state == IPC_PHONE_HUNGUP && |
atomic_get(&TASK->phones[i].active_calls) == 0) |
TASK->phones[i].state = IPC_PHONE_FREE; |
/* Just for sure, we might have had some |
* IPC_PHONE_CONNECTING phones */ |
if (TASK->phones[i].state == IPC_PHONE_CONNECTED) |
ipc_phone_hangup(&TASK->phones[i]); |
/* If the hangup succeeded, it has sent a HANGUP |
* message, the IPC is now in HUNGUP state, we |
* wait for the reply to come */ |
if (TASK->phones[i].state != IPC_PHONE_FREE) |
break; |
} |
/* Voila, got into cleanup */ |
if (i == IPC_MAX_PHONES) |
break; |
call = ipc_wait_for_call(&TASK->answerbox, SYNCH_NO_TIMEOUT, |
SYNCH_FLAGS_NONE); |
ASSERT((call->flags & IPC_CALL_ANSWERED) || |
(call->flags & IPC_CALL_NOTIF)); |
ASSERT(!(call->flags & IPC_CALL_STATIC_ALLOC)); |
atomic_dec(&TASK->active_calls); |
ipc_call_free(call); |
} |
} |
/** Initilize IPC subsystem */ |
void ipc_init(void) |
{ |
ipc_call_slab = slab_cache_create("ipc_call", sizeof(call_t), 0, NULL, |
NULL, 0); |
} |
/** List answerbox contents. |
* |
* @param taskid Task ID. |
*/ |
void ipc_print_task(task_id_t taskid) |
{ |
task_t *task; |
int i; |
call_t *call; |
link_t *tmp; |
spinlock_lock(&tasks_lock); |
task = task_find_by_id(taskid); |
if (task) |
spinlock_lock(&task->lock); |
spinlock_unlock(&tasks_lock); |
if (!task) |
return; |
/* Print opened phones & details */ |
printf("PHONE:\n"); |
for (i = 0; i < IPC_MAX_PHONES; i++) { |
spinlock_lock(&task->phones[i].lock); |
if (task->phones[i].state != IPC_PHONE_FREE) { |
printf("%d: ", i); |
switch (task->phones[i].state) { |
case IPC_PHONE_CONNECTING: |
printf("connecting "); |
break; |
case IPC_PHONE_CONNECTED: |
printf("connected to: %p ", |
task->phones[i].callee); |
break; |
case IPC_PHONE_SLAMMED: |
printf("slammed by: %p ", |
task->phones[i].callee); |
break; |
case IPC_PHONE_HUNGUP: |
printf("hung up - was: %p ", |
task->phones[i].callee); |
break; |
default: |
break; |
} |
printf("active: %d\n", |
atomic_get(&task->phones[i].active_calls)); |
} |
spinlock_unlock(&task->phones[i].lock); |
} |
/* Print answerbox - calls */ |
spinlock_lock(&task->answerbox.lock); |
printf("ABOX - CALLS:\n"); |
for (tmp = task->answerbox.calls.next; tmp != &task->answerbox.calls; |
tmp = tmp->next) { |
call = list_get_instance(tmp, call_t, link); |
printf("Callid: %p Srctask:%llu M:%d A1:%d A2:%d A3:%d " |
"A4:%d A5:%d Flags:%x\n", call, call->sender->taskid, |
IPC_GET_METHOD(call->data), IPC_GET_ARG1(call->data), |
IPC_GET_ARG2(call->data), IPC_GET_ARG3(call->data), |
IPC_GET_ARG4(call->data), IPC_GET_ARG5(call->data), |
call->flags); |
} |
/* Print answerbox - calls */ |
printf("ABOX - DISPATCHED CALLS:\n"); |
for (tmp=task->answerbox.dispatched_calls.next; |
tmp != &task->answerbox.dispatched_calls; |
tmp = tmp->next) { |
call = list_get_instance(tmp, call_t, link); |
printf("Callid: %p Srctask:%llu M:%d A1:%d A2:%d A3:%d " |
"A4:%d A5:%d Flags:%x\n", call, call->sender->taskid, |
IPC_GET_METHOD(call->data), IPC_GET_ARG1(call->data), |
IPC_GET_ARG2(call->data), IPC_GET_ARG3(call->data), |
IPC_GET_ARG4(call->data), IPC_GET_ARG5(call->data), |
call->flags); |
} |
/* Print answerbox - calls */ |
printf("ABOX - ANSWERS:\n"); |
for (tmp = task->answerbox.answers.next; tmp != &task->answerbox.answers; |
tmp = tmp->next) { |
call = list_get_instance(tmp, call_t, link); |
printf("Callid:%p M:%d A1:%d A2:%d A3:%d A4:%d A5:%d Flags:%x\n", |
call, IPC_GET_METHOD(call->data), IPC_GET_ARG1(call->data), |
IPC_GET_ARG2(call->data), IPC_GET_ARG3(call->data), |
IPC_GET_ARG4(call->data), IPC_GET_ARG5(call->data), |
call->flags); |
} |
spinlock_unlock(&task->answerbox.lock); |
spinlock_unlock(&task->lock); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/ipc/ipcrsc.c |
---|
0,0 → 1,232 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericipc |
* @{ |
*/ |
/** @file |
*/ |
/* IPC resources management |
* |
* The goal of this source code is to properly manage IPC resources and allow |
* straight and clean clean-up procedure upon task termination. |
* |
* The pattern of usage of the resources is: |
* - allocate empty phone slot, connect | deallocate slot |
* - disconnect connected phone (some messages might be on the fly) |
* - find phone in slot and send a message using phone |
* - answer message to phone |
* - hangup phone (the caller has hung up) |
* - hangup phone (the answerbox is exiting) |
* |
* Locking strategy |
* |
* - To use a phone, disconnect a phone etc., the phone must be first locked and |
* then checked that it is connected |
* - To connect an allocated phone it need not be locked (assigning pointer is |
* atomic on all platforms) |
* |
* - To find an empty phone slot, the TASK must be locked |
* - To answer a message, the answerbox must be locked |
* - The locking of phone and answerbox is done at the ipc_ level. |
* It is perfectly correct to pass unconnected phone to these functions and |
* proper reply will be generated. |
* |
* Locking order |
* |
* - first phone, then answerbox |
* + Easy locking on calls |
* - Very hard traversing list of phones when disconnecting because the phones |
* may disconnect during traversal of list of connected phones. The only |
* possibility is try_lock with restart of list traversal. |
* |
* Destroying is less frequent, this approach is taken. |
* |
* Phone call |
* |
* *** Connect_me_to *** |
* The caller sends IPC_M_CONNECT_ME_TO to an answerbox. The server receives |
* 'phoneid' of the connecting phone as an ARG5. If it answers with RETVAL=0, |
* the phonecall is accepted, otherwise it is refused. |
* |
* *** Connect_to_me *** |
* The caller sends IPC_M_CONNECT_TO_ME. |
* The server receives an automatically opened phoneid. If it accepts |
* (RETVAL=0), it can use the phoneid immediately. |
* Possible race condition can arise, when the client receives messages from new |
* connection before getting response for connect_to_me message. Userspace |
* should implement handshake protocol that would control it. |
* |
* Phone hangup |
* |
* *** The caller hangs up (sys_ipc_hangup) *** |
* - The phone is disconnected (no more messages can be sent over this phone), |
* all in-progress messages are correctly handled. The answerbox receives |
* IPC_M_PHONE_HUNGUP call from the phone that hung up. When all async |
* calls are answered, the phone is deallocated. |
* |
* *** The answerbox hangs up (ipc_answer(EHANGUP)) |
* - The phone is disconnected. EHANGUP response code is sent |
* to the calling task. All new calls through this phone |
* get a EHUNGUP error code, the task is expected to |
* send an sys_ipc_hangup after cleaning up its internal structures. |
* |
* Call forwarding |
* |
* The call can be forwarded, so that the answer to call is passed directly |
* to the original sender. However, this poses special problems regarding |
* routing of hangup messages. |
* |
* sys_ipc_hangup -> IPC_M_PHONE_HUNGUP |
* - this message CANNOT be forwarded |
* |
* EHANGUP during forward |
* - The *forwarding* phone will be closed, EFORWARD is sent to receiver. |
* |
* EHANGUP, ENOENT during forward |
* - EFORWARD is sent to the receiver, ipc_forward returns error code EFORWARD |
* |
* Cleanup strategy |
* |
* 1) Disconnect all our phones ('ipc_phone_hangup'). |
* |
* 2) Disconnect all phones connected to answerbox. |
* |
* 3) Answer all messages in 'calls' and 'dispatched_calls' queues with |
* appropriate error code (EHANGUP, EFORWARD). |
* |
* 4) Wait for all async answers to arrive and dispose of them. |
* |
*/ |
#include <synch/spinlock.h> |
#include <ipc/ipc.h> |
#include <arch.h> |
#include <proc/task.h> |
#include <ipc/ipcrsc.h> |
#include <debug.h> |
/** Find call_t * in call table according to callid. |
* |
* @todo Some speedup (hash table?) |
* |
* @param callid Userspace hash of the call. Currently it is the call |
* structure kernel address. |
* |
* @return NULL on not found, otherwise pointer to the call |
* structure. |
*/ |
call_t *get_call(unative_t callid) |
{ |
link_t *lst; |
call_t *call, *result = NULL; |
spinlock_lock(&TASK->answerbox.lock); |
for (lst = TASK->answerbox.dispatched_calls.next; |
lst != &TASK->answerbox.dispatched_calls; lst = lst->next) { |
call = list_get_instance(lst, call_t, link); |
if ((unative_t) call == callid) { |
result = call; |
break; |
} |
} |
spinlock_unlock(&TASK->answerbox.lock); |
return result; |
} |
/** Allocate new phone slot in the current TASK structure. |
* |
* @return New phone handle or -1 if the phone handle limit is |
* exceeded. |
*/ |
int phone_alloc(void) |
{ |
int i; |
spinlock_lock(&TASK->lock); |
for (i = 0; i < IPC_MAX_PHONES; i++) { |
if (TASK->phones[i].state == IPC_PHONE_HUNGUP && |
atomic_get(&TASK->phones[i].active_calls) == 0) |
TASK->phones[i].state = IPC_PHONE_FREE; |
if (TASK->phones[i].state == IPC_PHONE_FREE) { |
TASK->phones[i].state = IPC_PHONE_CONNECTING; |
break; |
} |
} |
spinlock_unlock(&TASK->lock); |
if (i >= IPC_MAX_PHONES) |
return -1; |
return i; |
} |
/** Mark a phone structure free. |
* |
* @param phone Phone structure to be marked free. |
*/ |
static void phone_deallocp(phone_t *phone) |
{ |
ASSERT(phone->state == IPC_PHONE_CONNECTING); |
/* atomic operation */ |
phone->state = IPC_PHONE_FREE; |
} |
/** Free slot from a disconnected phone. |
* |
* All already sent messages will be correctly processed. |
* |
* @param phoneid Phone handle of the phone to be freed. |
*/ |
void phone_dealloc(int phoneid) |
{ |
phone_deallocp(&TASK->phones[phoneid]); |
} |
/** Connect phone to a given answerbox. |
* |
* @param phoneid Phone handle to be connected. |
* @param box Answerbox to which to connect the phone handle. |
* |
* The procedure _enforces_ that the user first marks the phone |
* busy (e.g. via phone_alloc) and then connects the phone, otherwise |
* race condition may appear. |
*/ |
void phone_connect(int phoneid, answerbox_t *box) |
{ |
phone_t *phone = &TASK->phones[phoneid]; |
ASSERT(phone->state == IPC_PHONE_CONNECTING); |
ipc_phone_connect(phone, box); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/console/cmd.c |
---|
0,0 → 1,1176 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericconsole |
* @{ |
*/ |
/** |
* @file cmd.c |
* @brief Kernel console command wrappers. |
* |
* This file is meant to contain all wrapper functions for |
* all kconsole commands. The point is in separating |
* kconsole specific wrappers from kconsole-unaware functions |
* from other subsystems. |
*/ |
#include <console/cmd.h> |
#include <console/console.h> |
#include <console/kconsole.h> |
#include <print.h> |
#include <panic.h> |
#include <arch/types.h> |
#include <adt/list.h> |
#include <arch.h> |
#include <config.h> |
#include <func.h> |
#include <macros.h> |
#include <debug.h> |
#include <symtab.h> |
#include <cpu.h> |
#include <mm/tlb.h> |
#include <arch/mm/tlb.h> |
#include <mm/frame.h> |
#include <main/version.h> |
#include <mm/slab.h> |
#include <proc/scheduler.h> |
#include <proc/thread.h> |
#include <proc/task.h> |
#include <ipc/ipc.h> |
#include <ipc/irq.h> |
#ifdef CONFIG_TEST |
#include <test.h> |
#endif |
/* Data and methods for 'help' command. */ |
static int cmd_help(cmd_arg_t *argv); |
static cmd_info_t help_info = { |
.name = "help", |
.description = "List of supported commands.", |
.func = cmd_help, |
.argc = 0 |
}; |
static cmd_info_t exit_info = { |
.name = "exit", |
.description = "Exit kconsole.", |
.argc = 0 |
}; |
static int cmd_reboot(cmd_arg_t *argv); |
static cmd_info_t reboot_info = { |
.name = "reboot", |
.description = "Reboot.", |
.func = cmd_reboot, |
.argc = 0 |
}; |
static int cmd_uptime(cmd_arg_t *argv); |
static cmd_info_t uptime_info = { |
.name = "uptime", |
.description = "Print uptime information.", |
.func = cmd_uptime, |
.argc = 0 |
}; |
static int cmd_continue(cmd_arg_t *argv); |
static cmd_info_t continue_info = { |
.name = "continue", |
.description = "Return console back to userspace.", |
.func = cmd_continue, |
.argc = 0 |
}; |
#ifdef CONFIG_TEST |
static int cmd_tests(cmd_arg_t *argv); |
static cmd_info_t tests_info = { |
.name = "tests", |
.description = "Print available kernel tests.", |
.func = cmd_tests, |
.argc = 0 |
}; |
static char test_buf[MAX_CMDLINE + 1]; |
static int cmd_test(cmd_arg_t *argv); |
static cmd_arg_t test_argv[] = { |
{ |
.type = ARG_TYPE_STRING, |
.buffer = test_buf, |
.len = sizeof(test_buf) |
} |
}; |
static cmd_info_t test_info = { |
.name = "test", |
.description = "Run kernel test.", |
.func = cmd_test, |
.argc = 1, |
.argv = test_argv |
}; |
static int cmd_bench(cmd_arg_t *argv); |
static cmd_arg_t bench_argv[] = { |
{ |
.type = ARG_TYPE_STRING, |
.buffer = test_buf, |
.len = sizeof(test_buf) |
}, |
{ |
.type = ARG_TYPE_INT, |
} |
}; |
static cmd_info_t bench_info = { |
.name = "bench", |
.description = "Run kernel test as benchmark.", |
.func = cmd_bench, |
.argc = 2, |
.argv = bench_argv |
}; |
#endif |
/* Data and methods for 'description' command. */ |
static int cmd_desc(cmd_arg_t *argv); |
static void desc_help(void); |
static char desc_buf[MAX_CMDLINE+1]; |
static cmd_arg_t desc_argv = { |
.type = ARG_TYPE_STRING, |
.buffer = desc_buf, |
.len = sizeof(desc_buf) |
}; |
static cmd_info_t desc_info = { |
.name = "describe", |
.description = "Describe specified command.", |
.help = desc_help, |
.func = cmd_desc, |
.argc = 1, |
.argv = &desc_argv |
}; |
/* Data and methods for 'symaddr' command. */ |
static int cmd_symaddr(cmd_arg_t *argv); |
static char symaddr_buf[MAX_CMDLINE+1]; |
static cmd_arg_t symaddr_argv = { |
.type = ARG_TYPE_STRING, |
.buffer = symaddr_buf, |
.len = sizeof(symaddr_buf) |
}; |
static cmd_info_t symaddr_info = { |
.name = "symaddr", |
.description = "Return symbol address.", |
.func = cmd_symaddr, |
.argc = 1, |
.argv = &symaddr_argv |
}; |
static char set_buf[MAX_CMDLINE+1]; |
static int cmd_set4(cmd_arg_t *argv); |
static cmd_arg_t set4_argv[] = { |
{ |
.type = ARG_TYPE_STRING, |
.buffer = set_buf, |
.len = sizeof(set_buf) |
}, |
{ |
.type = ARG_TYPE_INT |
} |
}; |
static cmd_info_t set4_info = { |
.name = "set4", |
.description = "set <dest_addr> <value> - 4byte version", |
.func = cmd_set4, |
.argc = 2, |
.argv = set4_argv |
}; |
/* Data and methods for 'call0' command. */ |
static char call0_buf[MAX_CMDLINE + 1]; |
static char carg1_buf[MAX_CMDLINE + 1]; |
static char carg2_buf[MAX_CMDLINE + 1]; |
static char carg3_buf[MAX_CMDLINE + 1]; |
static int cmd_call0(cmd_arg_t *argv); |
static cmd_arg_t call0_argv = { |
.type = ARG_TYPE_STRING, |
.buffer = call0_buf, |
.len = sizeof(call0_buf) |
}; |
static cmd_info_t call0_info = { |
.name = "call0", |
.description = "call0 <function> -> call function().", |
.func = cmd_call0, |
.argc = 1, |
.argv = &call0_argv |
}; |
/* Data and methods for 'mcall0' command. */ |
static int cmd_mcall0(cmd_arg_t *argv); |
static cmd_arg_t mcall0_argv = { |
.type = ARG_TYPE_STRING, |
.buffer = call0_buf, |
.len = sizeof(call0_buf) |
}; |
static cmd_info_t mcall0_info = { |
.name = "mcall0", |
.description = "mcall0 <function> -> call function() on each CPU.", |
.func = cmd_mcall0, |
.argc = 1, |
.argv = &mcall0_argv |
}; |
/* Data and methods for 'call1' command. */ |
static int cmd_call1(cmd_arg_t *argv); |
static cmd_arg_t call1_argv[] = { |
{ |
.type = ARG_TYPE_STRING, |
.buffer = call0_buf, |
.len = sizeof(call0_buf) |
}, |
{ |
.type = ARG_TYPE_VAR, |
.buffer = carg1_buf, |
.len = sizeof(carg1_buf) |
} |
}; |
static cmd_info_t call1_info = { |
.name = "call1", |
.description = "call1 <function> <arg1> -> call function(arg1).", |
.func = cmd_call1, |
.argc = 2, |
.argv = call1_argv |
}; |
/* Data and methods for 'call2' command. */ |
static int cmd_call2(cmd_arg_t *argv); |
static cmd_arg_t call2_argv[] = { |
{ |
.type = ARG_TYPE_STRING, |
.buffer = call0_buf, |
.len = sizeof(call0_buf) |
}, |
{ |
.type = ARG_TYPE_VAR, |
.buffer = carg1_buf, |
.len = sizeof(carg1_buf) |
}, |
{ |
.type = ARG_TYPE_VAR, |
.buffer = carg2_buf, |
.len = sizeof(carg2_buf) |
} |
}; |
static cmd_info_t call2_info = { |
.name = "call2", |
.description = "call2 <function> <arg1> <arg2> -> call function(arg1,arg2).", |
.func = cmd_call2, |
.argc = 3, |
.argv = call2_argv |
}; |
/* Data and methods for 'call3' command. */ |
static int cmd_call3(cmd_arg_t *argv); |
static cmd_arg_t call3_argv[] = { |
{ |
.type = ARG_TYPE_STRING, |
.buffer = call0_buf, |
.len = sizeof(call0_buf) |
}, |
{ |
.type = ARG_TYPE_VAR, |
.buffer = carg1_buf, |
.len = sizeof(carg1_buf) |
}, |
{ |
.type = ARG_TYPE_VAR, |
.buffer = carg2_buf, |
.len = sizeof(carg2_buf) |
}, |
{ |
.type = ARG_TYPE_VAR, |
.buffer = carg3_buf, |
.len = sizeof(carg3_buf) |
} |
}; |
static cmd_info_t call3_info = { |
.name = "call3", |
.description = "call3 <function> <arg1> <arg2> <arg3> -> call function(arg1,arg2,arg3).", |
.func = cmd_call3, |
.argc = 4, |
.argv = call3_argv |
}; |
/* Data and methods for 'halt' command. */ |
static int cmd_halt(cmd_arg_t *argv); |
static cmd_info_t halt_info = { |
.name = "halt", |
.description = "Halt the kernel.", |
.func = cmd_halt, |
.argc = 0 |
}; |
/* Data and methods for 'physmem' command. */ |
static int cmd_physmem(cmd_arg_t *argv); |
cmd_info_t physmem_info = { |
.name = "physmem", |
.description = "Print physical memory configuration.", |
.help = NULL, |
.func = cmd_physmem, |
.argc = 0, |
.argv = NULL |
}; |
/* Data and methods for 'tlb' command. */ |
static int cmd_tlb(cmd_arg_t *argv); |
cmd_info_t tlb_info = { |
.name = "tlb", |
.description = "Print TLB of current processor.", |
.help = NULL, |
.func = cmd_tlb, |
.argc = 0, |
.argv = NULL |
}; |
static int cmd_threads(cmd_arg_t *argv); |
static cmd_info_t threads_info = { |
.name = "threads", |
.description = "List all threads.", |
.func = cmd_threads, |
.argc = 0 |
}; |
static int cmd_tasks(cmd_arg_t *argv); |
static cmd_info_t tasks_info = { |
.name = "tasks", |
.description = "List all tasks.", |
.func = cmd_tasks, |
.argc = 0 |
}; |
static int cmd_sched(cmd_arg_t *argv); |
static cmd_info_t sched_info = { |
.name = "scheduler", |
.description = "List all scheduler information.", |
.func = cmd_sched, |
.argc = 0 |
}; |
static int cmd_slabs(cmd_arg_t *argv); |
static cmd_info_t slabs_info = { |
.name = "slabs", |
.description = "List slab caches.", |
.func = cmd_slabs, |
.argc = 0 |
}; |
/* Data and methods for 'zones' command */ |
static int cmd_zones(cmd_arg_t *argv); |
static cmd_info_t zones_info = { |
.name = "zones", |
.description = "List of memory zones.", |
.func = cmd_zones, |
.argc = 0 |
}; |
/* Data and methods for 'ipc_task' command */ |
static int cmd_ipc_task(cmd_arg_t *argv); |
static cmd_arg_t ipc_task_argv = { |
.type = ARG_TYPE_INT, |
}; |
static cmd_info_t ipc_task_info = { |
.name = "ipc_task", |
.description = "ipc_task <taskid> Show IPC information of given task.", |
.func = cmd_ipc_task, |
.argc = 1, |
.argv = &ipc_task_argv |
}; |
/* Data and methods for 'zone' command */ |
static int cmd_zone(cmd_arg_t *argv); |
static cmd_arg_t zone_argv = { |
.type = ARG_TYPE_INT, |
}; |
static cmd_info_t zone_info = { |
.name = "zone", |
.description = "Show memory zone structure.", |
.func = cmd_zone, |
.argc = 1, |
.argv = &zone_argv |
}; |
/* Data and methods for 'cpus' command. */ |
static int cmd_cpus(cmd_arg_t *argv); |
cmd_info_t cpus_info = { |
.name = "cpus", |
.description = "List all processors.", |
.help = NULL, |
.func = cmd_cpus, |
.argc = 0, |
.argv = NULL |
}; |
/* Data and methods for 'version' command. */ |
static int cmd_version(cmd_arg_t *argv); |
cmd_info_t version_info = { |
.name = "version", |
.description = "Print version information.", |
.help = NULL, |
.func = cmd_version, |
.argc = 0, |
.argv = NULL |
}; |
static cmd_info_t *basic_commands[] = { |
&call0_info, |
&mcall0_info, |
&call1_info, |
&call2_info, |
&call3_info, |
&continue_info, |
&cpus_info, |
&desc_info, |
&exit_info, |
&reboot_info, |
&uptime_info, |
&halt_info, |
&help_info, |
&ipc_task_info, |
&set4_info, |
&slabs_info, |
&symaddr_info, |
&sched_info, |
&threads_info, |
&tasks_info, |
&physmem_info, |
&tlb_info, |
&version_info, |
&zones_info, |
&zone_info, |
#ifdef CONFIG_TEST |
&tests_info, |
&test_info, |
&bench_info, |
#endif |
NULL |
}; |
/** Initialize command info structure. |
* |
* @param cmd Command info structure. |
* |
*/ |
void cmd_initialize(cmd_info_t *cmd) |
{ |
spinlock_initialize(&cmd->lock, "cmd"); |
link_initialize(&cmd->link); |
} |
/** Initialize and register commands. */ |
void cmd_init(void) |
{ |
unsigned int i; |
for (i = 0; basic_commands[i]; i++) { |
cmd_initialize(basic_commands[i]); |
if (!cmd_register(basic_commands[i])) |
panic("could not register command %s\n", basic_commands[i]->name); |
} |
} |
/** List supported commands. |
* |
* @param argv Argument vector. |
* |
* @return 0 on failure, 1 on success. |
*/ |
int cmd_help(cmd_arg_t *argv) |
{ |
link_t *cur; |
spinlock_lock(&cmd_lock); |
for (cur = cmd_head.next; cur != &cmd_head; cur = cur->next) { |
cmd_info_t *hlp; |
hlp = list_get_instance(cur, cmd_info_t, link); |
spinlock_lock(&hlp->lock); |
printf("%s - %s\n", hlp->name, hlp->description); |
spinlock_unlock(&hlp->lock); |
} |
spinlock_unlock(&cmd_lock); |
return 1; |
} |
/** Reboot the system. |
* |
* @param argv Argument vector. |
* |
* @return 0 on failure, 1 on success. |
*/ |
int cmd_reboot(cmd_arg_t *argv) |
{ |
reboot(); |
/* Not reached */ |
return 1; |
} |
/** Print system uptime information. |
* |
* @param argv Argument vector. |
* |
* @return 0 on failure, 1 on success. |
*/ |
int cmd_uptime(cmd_arg_t *argv) |
{ |
ASSERT(uptime); |
/* This doesn't have to be very accurate */ |
unative_t sec = uptime->seconds1; |
printf("Up %u days, %u hours, %u minutes, %u seconds\n", |
sec / 86400, (sec % 86400) / 3600, (sec % 3600) / 60, sec % 60); |
return 1; |
} |
/** Describe specified command. |
* |
* @param argv Argument vector. |
* |
* @return 0 on failure, 1 on success. |
*/ |
int cmd_desc(cmd_arg_t *argv) |
{ |
link_t *cur; |
spinlock_lock(&cmd_lock); |
for (cur = cmd_head.next; cur != &cmd_head; cur = cur->next) { |
cmd_info_t *hlp; |
hlp = list_get_instance(cur, cmd_info_t, link); |
spinlock_lock(&hlp->lock); |
if (strncmp(hlp->name, (const char *) argv->buffer, strlen(hlp->name)) == 0) { |
printf("%s - %s\n", hlp->name, hlp->description); |
if (hlp->help) |
hlp->help(); |
spinlock_unlock(&hlp->lock); |
break; |
} |
spinlock_unlock(&hlp->lock); |
} |
spinlock_unlock(&cmd_lock); |
return 1; |
} |
/** Search symbol table */ |
int cmd_symaddr(cmd_arg_t *argv) |
{ |
symtab_print_search((char *) argv->buffer); |
return 1; |
} |
/** Call function with zero parameters */ |
int cmd_call0(cmd_arg_t *argv) |
{ |
uintptr_t symaddr; |
char *symbol; |
unative_t (*f)(void); |
#ifdef ia64 |
struct { |
unative_t f; |
unative_t gp; |
} fptr; |
#endif |
symaddr = get_symbol_addr((char *) argv->buffer); |
if (!symaddr) |
printf("Symbol %s not found.\n", argv->buffer); |
else if (symaddr == (uintptr_t) -1) { |
symtab_print_search((char *) argv->buffer); |
printf("Duplicate symbol, be more specific.\n"); |
} else { |
symbol = get_symtab_entry(symaddr); |
printf("Calling %s() (%.*p)\n", symbol, sizeof(uintptr_t) * 2, symaddr); |
#ifdef ia64 |
fptr.f = symaddr; |
fptr.gp = ((unative_t *)cmd_call2)[1]; |
f = (unative_t (*)(void)) &fptr; |
#else |
f = (unative_t (*)(void)) symaddr; |
#endif |
printf("Result: %#zx\n", f()); |
} |
return 1; |
} |
/** Call function with zero parameters on each CPU */ |
int cmd_mcall0(cmd_arg_t *argv) |
{ |
/* |
* For each CPU, create a thread which will |
* call the function. |
*/ |
count_t i; |
for (i = 0; i < config.cpu_count; i++) { |
if (!cpus[i].active) |
continue; |
thread_t *t; |
if ((t = thread_create((void (*)(void *)) cmd_call0, (void *) argv, TASK, THREAD_FLAG_WIRED, "call0", false))) { |
spinlock_lock(&t->lock); |
t->cpu = &cpus[i]; |
spinlock_unlock(&t->lock); |
printf("cpu%u: ", i); |
thread_ready(t); |
thread_join(t); |
thread_detach(t); |
} else |
printf("Unable to create thread for cpu%u\n", i); |
} |
return 1; |
} |
/** Call function with one parameter */ |
int cmd_call1(cmd_arg_t *argv) |
{ |
uintptr_t symaddr; |
char *symbol; |
unative_t (*f)(unative_t,...); |
unative_t arg1 = argv[1].intval; |
#ifdef ia64 |
struct { |
unative_t f; |
unative_t gp; |
}fptr; |
#endif |
symaddr = get_symbol_addr((char *) argv->buffer); |
if (!symaddr) |
printf("Symbol %s not found.\n", argv->buffer); |
else if (symaddr == (uintptr_t) -1) { |
symtab_print_search((char *) argv->buffer); |
printf("Duplicate symbol, be more specific.\n"); |
} else { |
symbol = get_symtab_entry(symaddr); |
printf("Calling f(%#zx): %.*p: %s\n", arg1, sizeof(uintptr_t) * 2, symaddr, symbol); |
#ifdef ia64 |
fptr.f = symaddr; |
fptr.gp = ((unative_t *)cmd_call2)[1]; |
f = (unative_t (*)(unative_t,...)) &fptr; |
#else |
f = (unative_t (*)(unative_t,...)) symaddr; |
#endif |
printf("Result: %#zx\n", f(arg1)); |
} |
return 1; |
} |
/** Call function with two parameters */ |
int cmd_call2(cmd_arg_t *argv) |
{ |
uintptr_t symaddr; |
char *symbol; |
unative_t (*f)(unative_t,unative_t,...); |
unative_t arg1 = argv[1].intval; |
unative_t arg2 = argv[2].intval; |
#ifdef ia64 |
struct { |
unative_t f; |
unative_t gp; |
}fptr; |
#endif |
symaddr = get_symbol_addr((char *) argv->buffer); |
if (!symaddr) |
printf("Symbol %s not found.\n", argv->buffer); |
else if (symaddr == (uintptr_t) -1) { |
symtab_print_search((char *) argv->buffer); |
printf("Duplicate symbol, be more specific.\n"); |
} else { |
symbol = get_symtab_entry(symaddr); |
printf("Calling f(0x%zx,0x%zx): %.*p: %s\n", |
arg1, arg2, sizeof(uintptr_t) * 2, symaddr, symbol); |
#ifdef ia64 |
fptr.f = symaddr; |
fptr.gp = ((unative_t *)cmd_call2)[1]; |
f = (unative_t (*)(unative_t,unative_t,...)) &fptr; |
#else |
f = (unative_t (*)(unative_t,unative_t,...)) symaddr; |
#endif |
printf("Result: %#zx\n", f(arg1, arg2)); |
} |
return 1; |
} |
/** Call function with three parameters */ |
int cmd_call3(cmd_arg_t *argv) |
{ |
uintptr_t symaddr; |
char *symbol; |
unative_t (*f)(unative_t,unative_t,unative_t,...); |
unative_t arg1 = argv[1].intval; |
unative_t arg2 = argv[2].intval; |
unative_t arg3 = argv[3].intval; |
#ifdef ia64 |
struct { |
unative_t f; |
unative_t gp; |
}fptr; |
#endif |
symaddr = get_symbol_addr((char *) argv->buffer); |
if (!symaddr) |
printf("Symbol %s not found.\n", argv->buffer); |
else if (symaddr == (uintptr_t) -1) { |
symtab_print_search((char *) argv->buffer); |
printf("Duplicate symbol, be more specific.\n"); |
} else { |
symbol = get_symtab_entry(symaddr); |
printf("Calling f(0x%zx,0x%zx, 0x%zx): %.*p: %s\n", |
arg1, arg2, arg3, sizeof(uintptr_t) * 2, symaddr, symbol); |
#ifdef ia64 |
fptr.f = symaddr; |
fptr.gp = ((unative_t *)cmd_call2)[1]; |
f = (unative_t (*)(unative_t,unative_t,unative_t,...)) &fptr; |
#else |
f = (unative_t (*)(unative_t,unative_t,unative_t,...)) symaddr; |
#endif |
printf("Result: %#zx\n", f(arg1, arg2, arg3)); |
} |
return 1; |
} |
/** Print detailed description of 'describe' command. */ |
void desc_help(void) |
{ |
printf("Syntax: describe command_name\n"); |
} |
/** Halt the kernel. |
* |
* @param argv Argument vector (ignored). |
* |
* @return 0 on failure, 1 on success (never returns). |
*/ |
int cmd_halt(cmd_arg_t *argv) |
{ |
halt(); |
return 1; |
} |
/** Command for printing TLB contents. |
* |
* @param argv Not used. |
* |
* @return Always returns 1. |
*/ |
int cmd_tlb(cmd_arg_t *argv) |
{ |
tlb_print(); |
return 1; |
} |
/** Command for printing physical memory configuration. |
* |
* @param argv Not used. |
* |
* @return Always returns 1. |
*/ |
int cmd_physmem(cmd_arg_t *argv) |
{ |
physmem_print(); |
return 1; |
} |
/** Write 4 byte value to address */ |
int cmd_set4(cmd_arg_t *argv) |
{ |
uint32_t *addr; |
uint32_t arg1 = argv[1].intval; |
bool pointer = false; |
if (((char *)argv->buffer)[0] == '*') { |
addr = (uint32_t *) get_symbol_addr((char *) argv->buffer + 1); |
pointer = true; |
} else if (((char *) argv->buffer)[0] >= '0' && |
((char *)argv->buffer)[0] <= '9') |
addr = (uint32_t *)atoi((char *)argv->buffer); |
else |
addr = (uint32_t *)get_symbol_addr((char *) argv->buffer); |
if (!addr) |
printf("Symbol %s not found.\n", argv->buffer); |
else if (addr == (uint32_t *) -1) { |
symtab_print_search((char *) argv->buffer); |
printf("Duplicate symbol, be more specific.\n"); |
} else { |
if (pointer) |
addr = (uint32_t *)(*(unative_t *)addr); |
printf("Writing 0x%x -> %.*p\n", arg1, sizeof(uintptr_t) * 2, addr); |
*addr = arg1; |
} |
return 1; |
} |
/** Command for listings SLAB caches |
* |
* @param argv Ignores |
* |
* @return Always 1 |
*/ |
int cmd_slabs(cmd_arg_t * argv) { |
slab_print_list(); |
return 1; |
} |
/** Command for listings Thread information |
* |
* @param argv Ignores |
* |
* @return Always 1 |
*/ |
int cmd_threads(cmd_arg_t * argv) { |
thread_print_list(); |
return 1; |
} |
/** Command for listings Task information |
* |
* @param argv Ignores |
* |
* @return Always 1 |
*/ |
int cmd_tasks(cmd_arg_t * argv) { |
task_print_list(); |
return 1; |
} |
/** Command for listings Thread information |
* |
* @param argv Ignores |
* |
* @return Always 1 |
*/ |
int cmd_sched(cmd_arg_t * argv) { |
sched_print_list(); |
return 1; |
} |
/** Command for listing memory zones |
* |
* @param argv Ignored |
* |
* return Always 1 |
*/ |
int cmd_zones(cmd_arg_t * argv) { |
zone_print_list(); |
return 1; |
} |
/** Command for memory zone details |
* |
* @param argv Integer argument from cmdline expected |
* |
* return Always 1 |
*/ |
int cmd_zone(cmd_arg_t * argv) { |
zone_print_one(argv[0].intval); |
return 1; |
} |
/** Command for printing task ipc details |
* |
* @param argv Integer argument from cmdline expected |
* |
* return Always 1 |
*/ |
int cmd_ipc_task(cmd_arg_t * argv) { |
ipc_print_task(argv[0].intval); |
return 1; |
} |
/** Command for listing processors. |
* |
* @param argv Ignored. |
* |
* return Always 1. |
*/ |
int cmd_cpus(cmd_arg_t *argv) |
{ |
cpu_list(); |
return 1; |
} |
/** Command for printing kernel version. |
* |
* @param argv Ignored. |
* |
* return Always 1. |
*/ |
int cmd_version(cmd_arg_t *argv) |
{ |
version_print(); |
return 1; |
} |
/** Command for returning console back to userspace. |
* |
* @param argv Ignored. |
* |
* return Always 1. |
*/ |
int cmd_continue(cmd_arg_t *argv) |
{ |
printf("The kernel will now relinquish the console.\n"); |
printf("Use userspace controls to redraw the screen.\n"); |
arch_release_console(); |
return 1; |
} |
#ifdef CONFIG_TEST |
/** Command for printing kernel tests list. |
* |
* @param argv Ignored. |
* |
* return Always 1. |
*/ |
int cmd_tests(cmd_arg_t *argv) |
{ |
test_t *test; |
for (test = tests; test->name != NULL; test++) |
printf("%s\t\t%s%s\n", test->name, test->desc, (test->safe ? "" : " (unsafe)")); |
printf("*\t\tRun all safe tests\n"); |
return 1; |
} |
static bool run_test(const test_t *test) |
{ |
printf("%s\t\t%s\n", test->name, test->desc); |
/* Update and read thread accounting |
for benchmarking */ |
ipl_t ipl = interrupts_disable(); |
spinlock_lock(&TASK->lock); |
uint64_t t0 = task_get_accounting(TASK); |
spinlock_unlock(&TASK->lock); |
interrupts_restore(ipl); |
/* Execute the test */ |
char * ret = test->entry(false); |
/* Update and read thread accounting */ |
ipl = interrupts_disable(); |
spinlock_lock(&TASK->lock); |
uint64_t dt = task_get_accounting(TASK) - t0; |
spinlock_unlock(&TASK->lock); |
interrupts_restore(ipl); |
uint64_t cycles; |
char suffix; |
order(dt, &cycles, &suffix); |
printf("Time: %llu%c cycles\n", cycles, suffix); |
if (ret == NULL) { |
printf("Test passed\n"); |
return true; |
} |
printf("%s\n", ret); |
return false; |
} |
static bool run_bench(const test_t *test, const uint32_t cnt) |
{ |
uint32_t i; |
bool ret = true; |
uint64_t cycles; |
char suffix; |
if (cnt < 1) |
return true; |
uint64_t *data = (uint64_t *) malloc(sizeof(uint64_t) * cnt, 0); |
if (data == NULL) { |
printf("Error allocating memory for statistics\n"); |
return false; |
} |
for (i = 0; i < cnt; i++) { |
printf("%s (%d/%d) ... ", test->name, i + 1, cnt); |
/* Update and read thread accounting |
for benchmarking */ |
ipl_t ipl = interrupts_disable(); |
spinlock_lock(&TASK->lock); |
uint64_t t0 = task_get_accounting(TASK); |
spinlock_unlock(&TASK->lock); |
interrupts_restore(ipl); |
/* Execute the test */ |
char * ret = test->entry(true); |
/* Update and read thread accounting */ |
ipl = interrupts_disable(); |
spinlock_lock(&TASK->lock); |
uint64_t dt = task_get_accounting(TASK) - t0; |
spinlock_unlock(&TASK->lock); |
interrupts_restore(ipl); |
if (ret != NULL) { |
printf("%s\n", ret); |
ret = false; |
break; |
} |
data[i] = dt; |
order(dt, &cycles, &suffix); |
printf("OK (%llu%c cycles)\n", cycles, suffix); |
} |
if (ret) { |
printf("\n"); |
uint64_t sum = 0; |
for (i = 0; i < cnt; i++) { |
sum += data[i]; |
} |
order(sum / (uint64_t) cnt, &cycles, &suffix); |
printf("Average\t\t%llu%c\n", cycles, suffix); |
} |
free(data); |
return ret; |
} |
/** Command for returning kernel tests |
* |
* @param argv Argument vector. |
* |
* return Always 1. |
*/ |
int cmd_test(cmd_arg_t *argv) |
{ |
test_t *test; |
if (strcmp((char *) argv->buffer, "*") == 0) { |
for (test = tests; test->name != NULL; test++) { |
if (test->safe) { |
printf("\n"); |
if (!run_test(test)) |
break; |
} |
} |
} else { |
bool fnd = false; |
for (test = tests; test->name != NULL; test++) { |
if (strcmp(test->name, (char *) argv->buffer) == 0) { |
fnd = true; |
run_test(test); |
break; |
} |
} |
if (!fnd) |
printf("Unknown test\n"); |
} |
return 1; |
} |
/** Command for returning kernel tests as benchmarks |
* |
* @param argv Argument vector. |
* |
* return Always 1. |
*/ |
int cmd_bench(cmd_arg_t *argv) |
{ |
test_t *test; |
uint32_t cnt = argv[1].intval; |
bool fnd = false; |
for (test = tests; test->name != NULL; test++) { |
if (strcmp(test->name, (char *) argv->buffer) == 0) { |
fnd = true; |
if (test->safe) |
run_bench(test, cnt); |
else |
printf("Unsafe test\n"); |
break; |
} |
} |
if (!fnd) |
printf("Unknown test\n"); |
return 1; |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/console/console.c |
---|
0,0 → 1,169 |
/* |
* Copyright (c) 2003 Josef Cejka |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericconsole |
* @{ |
*/ |
/** @file |
*/ |
#include <console/console.h> |
#include <console/chardev.h> |
#include <synch/waitq.h> |
#include <synch/spinlock.h> |
#include <arch/types.h> |
#include <arch.h> |
#include <func.h> |
#include <print.h> |
#include <atomic.h> |
#define BUFLEN 2048 |
static char debug_buffer[BUFLEN]; |
static size_t offset = 0; |
/** Initialize stdout to something that does not print, but does not fail |
* |
* Save data in some buffer so that it could be retrieved in the debugger |
*/ |
static void null_putchar(chardev_t *d, const char ch) |
{ |
if (offset >= BUFLEN) |
offset = 0; |
debug_buffer[offset++] = ch; |
} |
static chardev_operations_t null_stdout_ops = { |
.write = null_putchar |
}; |
chardev_t null_stdout = { |
.name = "null", |
.op = &null_stdout_ops |
}; |
/** Standard input character device. */ |
chardev_t *stdin = NULL; |
chardev_t *stdout = &null_stdout; |
/** Get character from character device. Do not echo character. |
* |
* @param chardev Character device. |
* |
* @return Character read. |
*/ |
uint8_t _getc(chardev_t *chardev) |
{ |
uint8_t ch; |
ipl_t ipl; |
if (atomic_get(&haltstate)) { |
/* If we are here, we are hopefully on the processor, that |
* issued the 'halt' command, so proceed to read the character |
* directly from input |
*/ |
if (chardev->op->read) |
return chardev->op->read(chardev); |
/* no other way of interacting with user, halt */ |
if (CPU) |
printf("cpu%d: ", CPU->id); |
else |
printf("cpu: "); |
printf("halted - no kconsole\n"); |
cpu_halt(); |
} |
waitq_sleep(&chardev->wq); |
ipl = interrupts_disable(); |
spinlock_lock(&chardev->lock); |
ch = chardev->buffer[(chardev->index - chardev->counter) % CHARDEV_BUFLEN]; |
chardev->counter--; |
spinlock_unlock(&chardev->lock); |
interrupts_restore(ipl); |
chardev->op->resume(chardev); |
return ch; |
} |
/** Get string from character device. |
* |
* Read characters from character device until first occurrence |
* of newline character. |
* |
* @param chardev Character device. |
* @param buf Buffer where to store string terminated by '\0'. |
* @param buflen Size of the buffer. |
* |
* @return Number of characters read. |
*/ |
count_t gets(chardev_t *chardev, char *buf, size_t buflen) |
{ |
index_t index = 0; |
char ch; |
while (index < buflen) { |
ch = _getc(chardev); |
if (ch == '\b') { |
if (index > 0) { |
index--; |
/* Space backspace, space */ |
putchar('\b'); |
putchar(' '); |
putchar('\b'); |
} |
continue; |
} |
putchar(ch); |
if (ch == '\n') { /* end of string => write 0, return */ |
buf[index] = '\0'; |
return (count_t) index; |
} |
buf[index++] = ch; |
} |
return (count_t) index; |
} |
/** Get character from device & echo it to screen */ |
uint8_t getc(chardev_t *chardev) |
{ |
uint8_t ch; |
ch = _getc(chardev); |
putchar(ch); |
return ch; |
} |
void putchar(char c) |
{ |
if (stdout->op->write) |
stdout->op->write(stdout, c); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/console/klog.c |
---|
0,0 → 1,154 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericklog |
* @{ |
*/ |
/** @file |
*/ |
#include <mm/frame.h> |
#include <sysinfo/sysinfo.h> |
#include <console/klog.h> |
#include <print.h> |
#include <ddi/device.h> |
#include <ddi/irq.h> |
#include <ddi/ddi.h> |
#include <ipc/irq.h> |
/** Physical memory area used for klog. */ |
static parea_t klog_parea; |
/* |
* For now, we use 0 as INR. |
* However, on some architectures 0 is the clock interrupt (e.g. amd64 and |
* ia32). It is therefore desirable to have architecture specific definition of |
* KLOG_VIRT_INR in the future. |
*/ |
#define KLOG_VIRT_INR 0 |
/* Order of frame to be allocated for klog communication */ |
#define KLOG_ORDER 0 |
static char *klog; |
static int klogsize; |
static int klogpos; |
SPINLOCK_INITIALIZE(klog_lock); |
static irq_t klog_irq; |
static irq_ownership_t klog_claim(void); |
/** Initialize kernel logging facility |
* |
* Allocate pages that are to be shared with uspace for console data. |
* The shared area is a circular buffer. Userspace application may |
* be notified on new data with indication of position and size |
* of the data within the circular buffer. |
*/ |
void klog_init(void) |
{ |
void *faddr; |
faddr = frame_alloc(KLOG_ORDER, FRAME_ATOMIC); |
if (!faddr) |
panic("Cannot allocate page for klog"); |
klog = (char *) PA2KA(faddr); |
devno_t devno = device_assign_devno(); |
klog_parea.pbase = (uintptr_t) faddr; |
klog_parea.vbase = (uintptr_t) klog; |
klog_parea.frames = 1 << KLOG_ORDER; |
klog_parea.cacheable = true; |
ddi_parea_register(&klog_parea); |
sysinfo_set_item_val("klog.faddr", NULL, (unative_t) faddr); |
sysinfo_set_item_val("klog.pages", NULL, 1 << KLOG_ORDER); |
sysinfo_set_item_val("klog.devno", NULL, devno); |
sysinfo_set_item_val("klog.inr", NULL, KLOG_VIRT_INR); |
irq_initialize(&klog_irq); |
klog_irq.devno = devno; |
klog_irq.inr = KLOG_VIRT_INR; |
klog_irq.claim = klog_claim; |
irq_register(&klog_irq); |
klogsize = PAGE_SIZE << KLOG_ORDER; |
klogpos = 0; |
} |
/** Allways refuse IRQ ownership. |
* |
* This is not a real IRQ, so we always decline. |
* |
* @return Always returns IRQ_DECLINE. |
*/ |
irq_ownership_t klog_claim(void) |
{ |
return IRQ_DECLINE; |
} |
static void klog_vprintf(const char *fmt, va_list args) |
{ |
int ret; |
va_list atst; |
va_copy(atst, args); |
spinlock_lock(&klog_lock); |
ret = vsnprintf(klog+klogpos, klogsize-klogpos, fmt, atst); |
if (ret >= klogsize-klogpos) { |
klogpos = 0; |
if (ret >= klogsize) |
goto out; |
} |
ipc_irq_send_msg_2(&klog_irq, klogpos, ret); |
klogpos += ret; |
if (klogpos >= klogsize) |
klogpos = 0; |
out: |
spinlock_unlock(&klog_lock); |
va_end(atst); |
} |
/** Printf a message to kernel-uspace log */ |
void klog_printf(const char *fmt, ...) |
{ |
va_list args; |
va_start(args, fmt); |
klog_vprintf(fmt, args); |
va_end(args); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/console/kconsole.c |
---|
0,0 → 1,634 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericconsole |
* @{ |
*/ |
/** |
* @file kconsole.c |
* @brief Kernel console. |
* |
* This file contains kernel thread managing the kernel console. |
*/ |
#include <console/kconsole.h> |
#include <console/console.h> |
#include <console/chardev.h> |
#include <console/cmd.h> |
#include <print.h> |
#include <panic.h> |
#include <arch/types.h> |
#include <adt/list.h> |
#include <arch.h> |
#include <macros.h> |
#include <debug.h> |
#include <func.h> |
#include <symtab.h> |
#include <macros.h> |
/** Simple kernel console. |
* |
* The console is realized by kernel thread kconsole. |
* It doesn't understand any useful command on its own, |
* but makes it possible for other kernel subsystems to |
* register their own commands. |
*/ |
/** Locking. |
* |
* There is a list of cmd_info_t structures. This list |
* is protected by cmd_lock spinlock. Note that specially |
* the link elements of cmd_info_t are protected by |
* this lock. |
* |
* Each cmd_info_t also has its own lock, which protects |
* all elements thereof except the link element. |
* |
* cmd_lock must be acquired before any cmd_info lock. |
* When locking two cmd info structures, structure with |
* lower address must be locked first. |
*/ |
SPINLOCK_INITIALIZE(cmd_lock); /**< Lock protecting command list. */ |
LIST_INITIALIZE(cmd_head); /**< Command list. */ |
static cmd_info_t *parse_cmdline(char *cmdline, size_t len); |
static bool parse_argument(char *cmdline, size_t len, index_t *start, |
index_t *end); |
static char history[KCONSOLE_HISTORY][MAX_CMDLINE] = {}; |
/** Initialize kconsole data structures. */ |
void kconsole_init(void) |
{ |
int i; |
cmd_init(); |
for (i = 0; i < KCONSOLE_HISTORY; i++) |
history[i][0] = '\0'; |
} |
/** Register kconsole command. |
* |
* @param cmd Structure describing the command. |
* |
* @return 0 on failure, 1 on success. |
*/ |
int cmd_register(cmd_info_t *cmd) |
{ |
link_t *cur; |
spinlock_lock(&cmd_lock); |
/* |
* Make sure the command is not already listed. |
*/ |
for (cur = cmd_head.next; cur != &cmd_head; cur = cur->next) { |
cmd_info_t *hlp; |
hlp = list_get_instance(cur, cmd_info_t, link); |
if (hlp == cmd) { |
/* The command is already there. */ |
spinlock_unlock(&cmd_lock); |
return 0; |
} |
/* Avoid deadlock. */ |
if (hlp < cmd) { |
spinlock_lock(&hlp->lock); |
spinlock_lock(&cmd->lock); |
} else { |
spinlock_lock(&cmd->lock); |
spinlock_lock(&hlp->lock); |
} |
if ((strncmp(hlp->name, cmd->name, max(strlen(cmd->name), |
strlen(hlp->name))) == 0)) { |
/* The command is already there. */ |
spinlock_unlock(&hlp->lock); |
spinlock_unlock(&cmd->lock); |
spinlock_unlock(&cmd_lock); |
return 0; |
} |
spinlock_unlock(&hlp->lock); |
spinlock_unlock(&cmd->lock); |
} |
/* |
* Now the command can be added. |
*/ |
list_append(&cmd->link, &cmd_head); |
spinlock_unlock(&cmd_lock); |
return 1; |
} |
/** Print count times a character */ |
static void rdln_print_c(char ch, int count) |
{ |
int i; |
for (i = 0; i < count; i++) |
putchar(ch); |
} |
/** Insert character to string */ |
static void insert_char(char *str, char ch, int pos) |
{ |
int i; |
for (i = strlen(str); i > pos; i--) |
str[i] = str[i - 1]; |
str[pos] = ch; |
} |
/** Try to find a command beginning with prefix */ |
static const char * cmdtab_search_one(const char *name,link_t **startpos) |
{ |
size_t namelen = strlen(name); |
const char *curname; |
spinlock_lock(&cmd_lock); |
if (!*startpos) |
*startpos = cmd_head.next; |
for (; *startpos != &cmd_head; *startpos = (*startpos)->next) { |
cmd_info_t *hlp; |
hlp = list_get_instance(*startpos, cmd_info_t, link); |
curname = hlp->name; |
if (strlen(curname) < namelen) |
continue; |
if (strncmp(curname, name, namelen) == 0) { |
spinlock_unlock(&cmd_lock); |
return curname+namelen; |
} |
} |
spinlock_unlock(&cmd_lock); |
return NULL; |
} |
/** Command completion of the commands |
* |
* @param name - string to match, changed to hint on exit |
* @return number of found matches |
*/ |
static int cmdtab_compl(char *name) |
{ |
static char output[MAX_SYMBOL_NAME+1]; |
link_t *startpos = NULL; |
const char *foundtxt; |
int found = 0; |
int i; |
output[0] = '\0'; |
while ((foundtxt = cmdtab_search_one(name, &startpos))) { |
startpos = startpos->next; |
if (!found) |
strncpy(output, foundtxt, strlen(foundtxt)+1); |
else { |
for (i = 0; output[i] && foundtxt[i] && |
output[i] == foundtxt[i]; i++) |
; |
output[i] = '\0'; |
} |
found++; |
} |
if (!found) |
return 0; |
if (found > 1 && !strlen(output)) { |
printf("\n"); |
startpos = NULL; |
while ((foundtxt = cmdtab_search_one(name, &startpos))) { |
cmd_info_t *hlp; |
hlp = list_get_instance(startpos, cmd_info_t, link); |
printf("%s - %s\n", hlp->name, hlp->description); |
startpos = startpos->next; |
} |
} |
strncpy(name, output, MAX_SYMBOL_NAME); |
return found; |
} |
static char * clever_readline(const char *prompt, chardev_t *input) |
{ |
static int histposition = 0; |
static char tmp[MAX_CMDLINE+1]; |
int curlen = 0, position = 0; |
char *current = history[histposition]; |
int i; |
char mod; /* Command Modifier */ |
char c; |
printf("%s> ", prompt); |
while (1) { |
c = _getc(input); |
if (c == '\n') { |
putchar(c); |
break; |
} if (c == '\b') { /* Backspace */ |
if (position == 0) |
continue; |
for (i = position; i < curlen; i++) |
current[i - 1] = current[i]; |
curlen--; |
position--; |
putchar('\b'); |
for (i = position; i < curlen; i++) |
putchar(current[i]); |
putchar(' '); |
rdln_print_c('\b', curlen - position + 1); |
continue; |
} |
if (c == '\t') { /* Tabulator */ |
int found; |
/* Move to the end of the word */ |
for (; position < curlen && current[position] != ' '; |
position++) |
putchar(current[position]); |
/* Copy to tmp last word */ |
for (i = position - 1; i >= 0 && current[i] != ' '; i--) |
; |
/* If word begins with * or &, skip it */ |
if (tmp[0] == '*' || tmp[0] == '&') |
for (i = 1; tmp[i]; i++) |
tmp[i - 1] = tmp[i]; |
i++; /* I is at the start of the word */ |
strncpy(tmp, current + i, position - i + 1); |
if (i == 0) { /* Command completion */ |
found = cmdtab_compl(tmp); |
} else { /* Symtab completion */ |
found = symtab_compl(tmp); |
} |
if (found == 0) |
continue; |
for (i = 0; tmp[i] && curlen < MAX_CMDLINE; |
i++, curlen++) |
insert_char(current, tmp[i], i + position); |
if (strlen(tmp) || found == 1) { /* If we have a hint */ |
for (i = position; i < curlen; i++) |
putchar(current[i]); |
position += strlen(tmp); |
/* Add space to end */ |
if (found == 1 && position == curlen && |
curlen < MAX_CMDLINE) { |
current[position] = ' '; |
curlen++; |
position++; |
putchar(' '); |
} |
} else { /* No hint, table was printed */ |
printf("%s> ", prompt); |
for (i = 0; i < curlen; i++) |
putchar(current[i]); |
position += strlen(tmp); |
} |
rdln_print_c('\b', curlen - position); |
continue; |
} |
if (c == 0x1b) { /* Special command */ |
mod = _getc(input); |
c = _getc(input); |
if (mod != 0x5b && mod != 0x4f) |
continue; |
if (c == 0x33 && _getc(input) == 0x7e) { |
/* Delete */ |
if (position == curlen) |
continue; |
for (i = position + 1; i < curlen; i++) { |
putchar(current[i]); |
current[i - 1] = current[i]; |
} |
putchar(' '); |
rdln_print_c('\b', curlen - position); |
curlen--; |
} else if (c == 0x48) { /* Home */ |
rdln_print_c('\b', position); |
position = 0; |
} else if (c == 0x46) { /* End */ |
for (i = position; i < curlen; i++) |
putchar(current[i]); |
position = curlen; |
} else if (c == 0x44) { /* Left */ |
if (position > 0) { |
putchar('\b'); |
position--; |
} |
continue; |
} else if (c == 0x43) { /* Right */ |
if (position < curlen) { |
putchar(current[position]); |
position++; |
} |
continue; |
} else if (c == 0x41 || c == 0x42) { |
/* Up, down */ |
rdln_print_c('\b', position); |
rdln_print_c(' ', curlen); |
rdln_print_c('\b', curlen); |
if (c == 0x41) /* Up */ |
histposition--; |
else |
histposition++; |
if (histposition < 0) { |
histposition = KCONSOLE_HISTORY - 1; |
} else { |
histposition = |
histposition % KCONSOLE_HISTORY; |
} |
current = history[histposition]; |
printf("%s", current); |
curlen = strlen(current); |
position = curlen; |
continue; |
} |
continue; |
} |
if (curlen >= MAX_CMDLINE) |
continue; |
insert_char(current, c, position); |
curlen++; |
for (i = position; i < curlen; i++) |
putchar(current[i]); |
position++; |
rdln_print_c('\b',curlen - position); |
} |
if (curlen) { |
histposition++; |
histposition = histposition % KCONSOLE_HISTORY; |
} |
current[curlen] = '\0'; |
return current; |
} |
/** Kernel console managing thread. |
* |
* @param prompt Kernel console prompt (e.g kconsole/panic). |
*/ |
void kconsole(void *prompt) |
{ |
cmd_info_t *cmd_info; |
count_t len; |
char *cmdline; |
if (!stdin) { |
printf("%s: no stdin\n", __func__); |
return; |
} |
while (true) { |
cmdline = clever_readline((char *) prompt, stdin); |
len = strlen(cmdline); |
if (!len) |
continue; |
cmd_info = parse_cmdline(cmdline, len); |
if (!cmd_info) |
continue; |
if (strncmp(cmd_info->name, "exit", |
min(strlen(cmd_info->name), 5)) == 0) |
break; |
(void) cmd_info->func(cmd_info->argv); |
} |
} |
static int parse_int_arg(char *text, size_t len, unative_t *result) |
{ |
static char symname[MAX_SYMBOL_NAME]; |
uintptr_t symaddr; |
bool isaddr = false; |
bool isptr = false; |
/* If we get a name, try to find it in symbol table */ |
if (text[0] == '&') { |
isaddr = true; |
text++; |
len--; |
} else if (text[0] == '*') { |
isptr = true; |
text++; |
len--; |
} |
if (text[0] < '0' || text[0] > '9') { |
strncpy(symname, text, min(len + 1, MAX_SYMBOL_NAME)); |
symaddr = get_symbol_addr(symname); |
if (!symaddr) { |
printf("Symbol %s not found.\n", symname); |
return -1; |
} |
if (symaddr == (uintptr_t) -1) { |
printf("Duplicate symbol %s.\n", symname); |
symtab_print_search(symname); |
return -1; |
} |
if (isaddr) |
*result = (unative_t)symaddr; |
else if (isptr) |
*result = **((unative_t **)symaddr); |
else |
*result = *((unative_t *)symaddr); |
} else { /* It's a number - convert it */ |
*result = atoi(text); |
if (isptr) |
*result = *((unative_t *)*result); |
} |
return 0; |
} |
/** Parse command line. |
* |
* @param cmdline Command line as read from input device. |
* @param len Command line length. |
* |
* @return Structure describing the command. |
*/ |
cmd_info_t *parse_cmdline(char *cmdline, size_t len) |
{ |
index_t start = 0, end = 0; |
cmd_info_t *cmd = NULL; |
link_t *cur; |
count_t i; |
int error = 0; |
if (!parse_argument(cmdline, len, &start, &end)) { |
/* Command line did not contain alphanumeric word. */ |
return NULL; |
} |
spinlock_lock(&cmd_lock); |
for (cur = cmd_head.next; cur != &cmd_head; cur = cur->next) { |
cmd_info_t *hlp; |
hlp = list_get_instance(cur, cmd_info_t, link); |
spinlock_lock(&hlp->lock); |
if (strncmp(hlp->name, &cmdline[start], max(strlen(hlp->name), |
end - start + 1)) == 0) { |
cmd = hlp; |
break; |
} |
spinlock_unlock(&hlp->lock); |
} |
spinlock_unlock(&cmd_lock); |
if (!cmd) { |
/* Unknown command. */ |
printf("Unknown command.\n"); |
return NULL; |
} |
/* cmd == hlp is locked */ |
/* |
* The command line must be further analyzed and |
* the parameters therefrom must be matched and |
* converted to those specified in the cmd info |
* structure. |
*/ |
for (i = 0; i < cmd->argc; i++) { |
char *buf; |
start = end + 1; |
if (!parse_argument(cmdline, len, &start, &end)) { |
printf("Too few arguments.\n"); |
spinlock_unlock(&cmd->lock); |
return NULL; |
} |
error = 0; |
switch (cmd->argv[i].type) { |
case ARG_TYPE_STRING: |
buf = (char *) cmd->argv[i].buffer; |
strncpy(buf, (const char *) &cmdline[start], |
min((end - start) + 2, cmd->argv[i].len)); |
buf[min((end - start) + 1, cmd->argv[i].len - 1)] = '\0'; |
break; |
case ARG_TYPE_INT: |
if (parse_int_arg(cmdline + start, end - start + 1, |
&cmd->argv[i].intval)) |
error = 1; |
break; |
case ARG_TYPE_VAR: |
if (start != end && cmdline[start] == '"' && |
cmdline[end] == '"') { |
buf = (char *) cmd->argv[i].buffer; |
strncpy(buf, (const char *) &cmdline[start + 1], |
min((end-start), cmd->argv[i].len)); |
buf[min((end - start), cmd->argv[i].len - 1)] = |
'\0'; |
cmd->argv[i].intval = (unative_t) buf; |
cmd->argv[i].vartype = ARG_TYPE_STRING; |
} else if (!parse_int_arg(cmdline + start, end - start + 1, |
&cmd->argv[i].intval)) { |
cmd->argv[i].vartype = ARG_TYPE_INT; |
} else { |
printf("Unrecognized variable argument.\n"); |
error = 1; |
} |
break; |
case ARG_TYPE_INVALID: |
default: |
printf("invalid argument type\n"); |
error = 1; |
break; |
} |
} |
if (error) { |
spinlock_unlock(&cmd->lock); |
return NULL; |
} |
start = end + 1; |
if (parse_argument(cmdline, len, &start, &end)) { |
printf("Too many arguments.\n"); |
spinlock_unlock(&cmd->lock); |
return NULL; |
} |
spinlock_unlock(&cmd->lock); |
return cmd; |
} |
/** Parse argument. |
* |
* Find start and end positions of command line argument. |
* |
* @param cmdline Command line as read from the input device. |
* @param len Number of characters in cmdline. |
* @param start On entry, 'start' contains pointer to the index |
* of first unprocessed character of cmdline. |
* On successful exit, it marks beginning of the next argument. |
* @param end Undefined on entry. On exit, 'end' points to the last character |
* of the next argument. |
* |
* @return false on failure, true on success. |
*/ |
bool parse_argument(char *cmdline, size_t len, index_t *start, index_t *end) |
{ |
index_t i; |
bool found_start = false; |
ASSERT(start != NULL); |
ASSERT(end != NULL); |
for (i = *start; i < len; i++) { |
if (!found_start) { |
if (isspace(cmdline[i])) |
(*start)++; |
else |
found_start = true; |
} else { |
if (isspace(cmdline[i])) |
break; |
} |
} |
*end = i - 1; |
return found_start; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/console/chardev.c |
---|
0,0 → 1,78 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericconsole |
* @{ |
*/ |
/** @file |
*/ |
#include <console/chardev.h> |
#include <putchar.h> |
#include <synch/waitq.h> |
#include <synch/spinlock.h> |
/** Initialize character device. |
* |
* @param chardev Character device. |
* @param op Implementation of character device operations. |
*/ |
void chardev_initialize(char *name,chardev_t *chardev, |
chardev_operations_t *op) |
{ |
chardev->name = name; |
waitq_initialize(&chardev->wq); |
spinlock_initialize(&chardev->lock, "chardev"); |
chardev->counter = 0; |
chardev->index = 0; |
chardev->op = op; |
} |
/** Push character read from input character device. |
* |
* @param chardev Character device. |
* @param ch Character being pushed. |
*/ |
void chardev_push_character(chardev_t *chardev, uint8_t ch) |
{ |
spinlock_lock(&chardev->lock); |
chardev->counter++; |
if (chardev->counter == CHARDEV_BUFLEN - 1) { |
/* buffer full => disable device interrupt */ |
chardev->op->suspend(chardev); |
} |
chardev->buffer[chardev->index++] = ch; |
chardev->index = chardev->index % CHARDEV_BUFLEN; /* index modulo size of buffer */ |
waitq_wakeup(&chardev->wq, WAKEUP_FIRST); |
spinlock_unlock(&chardev->lock); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/syscall/syscall.c |
---|
0,0 → 1,165 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** |
* @file |
* @brief Syscall table and syscall wrappers. |
*/ |
#include <syscall/syscall.h> |
#include <proc/thread.h> |
#include <proc/task.h> |
#include <mm/as.h> |
#include <print.h> |
#include <putchar.h> |
#include <errno.h> |
#include <arch.h> |
#include <debug.h> |
#include <ipc/sysipc.h> |
#include <synch/futex.h> |
#include <ddi/ddi.h> |
#include <security/cap.h> |
#include <syscall/copy.h> |
#include <sysinfo/sysinfo.h> |
#include <console/console.h> |
#include <console/klog.h> |
/** Print using kernel facility |
* |
* Some simulators can print only through kernel. Userspace can use |
* this syscall to facilitate it. |
*/ |
static unative_t sys_io(int fd, const void * buf, size_t count) |
{ |
size_t i; |
char *data; |
int rc; |
if (count > PAGE_SIZE) |
return ELIMIT; |
data = (char *) malloc(count, 0); |
if (!data) |
return ENOMEM; |
rc = copy_from_uspace(data, buf, count); |
if (rc) { |
free(data); |
return rc; |
} |
for (i = 0; i < count; i++) |
putchar(data[i]); |
free(data); |
return count; |
} |
/** Tell kernel to get keyboard/console access again */ |
static unative_t sys_debug_enable_console(void) |
{ |
arch_grab_console(); |
return 0; |
} |
/** Dispatch system call */ |
unative_t syscall_handler(unative_t a1, unative_t a2, unative_t a3, |
unative_t a4, unative_t a5, unative_t a6, unative_t id) |
{ |
unative_t rc; |
if (id < SYSCALL_END) |
rc = syscall_table[id](a1, a2, a3, a4, a5, a6); |
else { |
klog_printf("TASK %llu: Unknown syscall id %llx", TASK->taskid, |
id); |
task_kill(TASK->taskid); |
thread_exit(); |
} |
if (THREAD->interrupted) |
thread_exit(); |
return rc; |
} |
syshandler_t syscall_table[SYSCALL_END] = { |
(syshandler_t) sys_io, |
(syshandler_t) sys_tls_set, |
/* Thread and task related syscalls. */ |
(syshandler_t) sys_thread_create, |
(syshandler_t) sys_thread_exit, |
(syshandler_t) sys_thread_get_id, |
(syshandler_t) sys_task_get_id, |
/* Synchronization related syscalls. */ |
(syshandler_t) sys_futex_sleep_timeout, |
(syshandler_t) sys_futex_wakeup, |
/* Address space related syscalls. */ |
(syshandler_t) sys_as_area_create, |
(syshandler_t) sys_as_area_resize, |
(syshandler_t) sys_as_area_destroy, |
/* IPC related syscalls. */ |
(syshandler_t) sys_ipc_call_sync_fast, |
(syshandler_t) sys_ipc_call_sync_slow, |
(syshandler_t) sys_ipc_call_async_fast, |
(syshandler_t) sys_ipc_call_async_slow, |
(syshandler_t) sys_ipc_answer_fast, |
(syshandler_t) sys_ipc_answer_slow, |
(syshandler_t) sys_ipc_forward_fast, |
(syshandler_t) sys_ipc_wait_for_call, |
(syshandler_t) sys_ipc_hangup, |
(syshandler_t) sys_ipc_register_irq, |
(syshandler_t) sys_ipc_unregister_irq, |
/* Capabilities related syscalls. */ |
(syshandler_t) sys_cap_grant, |
(syshandler_t) sys_cap_revoke, |
/* DDI related syscalls. */ |
(syshandler_t) sys_physmem_map, |
(syshandler_t) sys_iospace_enable, |
(syshandler_t) sys_preempt_control, |
/* Sysinfo syscalls */ |
(syshandler_t) sys_sysinfo_valid, |
(syshandler_t) sys_sysinfo_value, |
/* Debug calls */ |
(syshandler_t) sys_debug_enable_console |
}; |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/syscall/copy.c |
---|
0,0 → 1,131 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** |
* @file |
* @brief Copying between kernel and userspace. |
* |
* This file contains sanitized functions for copying data |
* between kernel and userspace. |
*/ |
#include <syscall/copy.h> |
#include <proc/thread.h> |
#include <mm/as.h> |
#include <macros.h> |
#include <arch.h> |
#include <errno.h> |
/** Copy data from userspace to kernel. |
* |
* Provisions are made to return value even after page fault. |
* |
* This function can be called only from syscall. |
* |
* @param dst Destination kernel address. |
* @param uspace_src Source userspace address. |
* @param size Size of the data to be copied. |
* |
* @return 0 on success or error code from @ref errno.h. |
*/ |
int copy_from_uspace(void *dst, const void *uspace_src, size_t size) |
{ |
ipl_t ipl; |
int rc; |
ASSERT(THREAD); |
ASSERT(!THREAD->in_copy_from_uspace); |
if (!KERNEL_ADDRESS_SPACE_SHADOWED) { |
if (overlaps((uintptr_t) uspace_src, size, |
KERNEL_ADDRESS_SPACE_START, KERNEL_ADDRESS_SPACE_END-KERNEL_ADDRESS_SPACE_START)) { |
/* |
* The userspace source block conflicts with kernel address space. |
*/ |
return EPERM; |
} |
} |
ipl = interrupts_disable(); |
THREAD->in_copy_from_uspace = true; |
rc = memcpy_from_uspace(dst, uspace_src, size); |
THREAD->in_copy_from_uspace = false; |
interrupts_restore(ipl); |
return !rc ? EPERM : 0; |
} |
/** Copy data from kernel to userspace. |
* |
* Provisions are made to return value even after page fault. |
* |
* This function can be called only from syscall. |
* |
* @param uspace_dst Destination userspace address. |
* @param src Source kernel address. |
* @param size Size of the data to be copied. |
* |
* @return 0 on success or error code from @ref errno.h. |
*/ |
int copy_to_uspace(void *uspace_dst, const void *src, size_t size) |
{ |
ipl_t ipl; |
int rc; |
ASSERT(THREAD); |
ASSERT(!THREAD->in_copy_to_uspace); |
if (!KERNEL_ADDRESS_SPACE_SHADOWED) { |
if (overlaps((uintptr_t) uspace_dst, size, |
KERNEL_ADDRESS_SPACE_START, KERNEL_ADDRESS_SPACE_END-KERNEL_ADDRESS_SPACE_START)) { |
/* |
* The userspace destination block conflicts with kernel address space. |
*/ |
return EPERM; |
} |
} |
ipl = interrupts_disable(); |
THREAD->in_copy_to_uspace = true; |
rc = memcpy_to_uspace(uspace_dst, src, size); |
THREAD->in_copy_to_uspace = false; |
interrupts_restore(ipl); |
return !rc ? EPERM : 0; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/adt/avl.c |
---|
0,0 → 1,730 |
/* |
* Copyright (c) 2007 Vojtech Mencl |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericadt |
* @{ |
*/ |
/** |
* @file |
* @brief AVL tree implementation. |
* |
* This file implements AVL tree type and operations. |
* |
* Implemented AVL tree has the following properties: |
* @li It is a binary search tree with non-unique keys. |
* @li Difference of heights of the left and the right subtree of every node is |
* one at maximum. |
* |
* Every node has a pointer to its parent which allows insertion of multiple |
* identical keys into the tree. |
* |
* Be careful when using this tree because of the base atribute which is added |
* to every inserted node key. There is no rule in which order nodes with the |
* same key are visited. |
*/ |
#include <adt/avl.h> |
#include <debug.h> |
#define LEFT 0 |
#define RIGHT 1 |
/** Search for the first occurence of the given key in an AVL tree. |
* |
* @param t AVL tree. |
* @param key Key to be searched. |
* |
* @return Pointer to a node or NULL if there is no such key. |
*/ |
avltree_node_t *avltree_search(avltree_t *t, avltree_key_t key) |
{ |
avltree_node_t *p; |
/* |
* Iteratively descend to the leaf that can contain the searched key. |
*/ |
p = t->root; |
while (p != NULL) { |
if (p->key > key) |
p = p->lft; |
else if (p->key < key) |
p = p->rgt; |
else |
return p; |
} |
return NULL; |
} |
/** Find the node with the smallest key in an AVL tree. |
* |
* @param t AVL tree. |
* |
* @return Pointer to a node or NULL if there is no node in the tree. |
*/ |
avltree_node_t *avltree_find_min(avltree_t *t) |
{ |
avltree_node_t *p = t->root; |
/* |
* Check whether the tree is empty. |
*/ |
if (!p) |
return NULL; |
/* |
* Iteratively descend to the leftmost leaf in the tree. |
*/ |
while (p->lft != NULL) |
p = p->lft; |
return p; |
} |
#define REBALANCE_INSERT_XX(DIR1, DIR2) \ |
top->DIR1 = par->DIR2; \ |
if (top->DIR1 != NULL) \ |
top->DIR1->par = top; \ |
par->par = top->par; \ |
top->par = par; \ |
par->DIR2 = top; \ |
par->balance = 0; \ |
top->balance = 0; \ |
*dpc = par; |
#define REBALANCE_INSERT_LL() REBALANCE_INSERT_XX(lft, rgt) |
#define REBALANCE_INSERT_RR() REBALANCE_INSERT_XX(rgt, lft) |
#define REBALANCE_INSERT_XY(DIR1, DIR2, SGN) \ |
gpa = par->DIR2; \ |
par->DIR2 = gpa->DIR1; \ |
if (gpa->DIR1 != NULL) \ |
gpa->DIR1->par = par; \ |
gpa->DIR1 = par; \ |
par->par = gpa; \ |
top->DIR1 = gpa->DIR2; \ |
if (gpa->DIR2 != NULL) \ |
gpa->DIR2->par = top; \ |
gpa->DIR2 = top; \ |
gpa->par = top->par; \ |
top->par = gpa; \ |
\ |
if (gpa->balance == -1 * SGN) { \ |
par->balance = 0; \ |
top->balance = 1 * SGN; \ |
} else if (gpa->balance == 0) { \ |
par->balance = 0; \ |
top->balance = 0; \ |
} else { \ |
par->balance = -1 * SGN; \ |
top->balance = 0; \ |
} \ |
gpa->balance = 0; \ |
*dpc = gpa; |
#define REBALANCE_INSERT_LR() REBALANCE_INSERT_XY(lft, rgt, 1) |
#define REBALANCE_INSERT_RL() REBALANCE_INSERT_XY(rgt, lft, -1) |
/** Insert new node into AVL tree. |
* |
* @param t AVL tree. |
* @param newnode New node to be inserted. |
*/ |
void avltree_insert(avltree_t *t, avltree_node_t *newnode) |
{ |
avltree_node_t *par; |
avltree_node_t *gpa; |
avltree_node_t *top; |
avltree_node_t **dpc; |
avltree_key_t key; |
ASSERT(t); |
ASSERT(newnode); |
/* |
* Creating absolute key. |
*/ |
key = newnode->key + t->base; |
/* |
* Iteratively descend to the leaf that can contain the new node. |
* Last node with non-zero balance in the way to leaf is stored as top - |
* it is a place of possible inbalance. |
*/ |
dpc = &t->root; |
gpa = NULL; |
top = t->root; |
while ((par = (*dpc)) != NULL) { |
if (par->balance != 0) { |
top = par; |
} |
gpa = par; |
dpc = par->key > key ? &par->lft: &par->rgt; |
} |
/* |
* Initialize the new node. |
*/ |
newnode->key = key; |
newnode->lft = NULL; |
newnode->rgt = NULL; |
newnode->par = gpa; |
newnode->balance = 0; |
/* |
* Insert first node into the empty tree. |
*/ |
if (t->root == NULL) { |
*dpc = newnode; |
return; |
} |
/* |
* Insert the new node into the previously found leaf position. |
*/ |
*dpc = newnode; |
/* |
* If the tree contains one node - end. |
*/ |
if (top == NULL) |
return; |
/* |
* Store pointer of top's father which points to the node with |
* potentially broken balance (top). |
*/ |
if (top->par == NULL) { |
dpc = &t->root; |
} else { |
if (top->par->lft == top) |
dpc = &top->par->lft; |
else |
dpc = &top->par->rgt; |
} |
/* |
* Repair all balances on the way from top node to the newly inserted |
* node. |
*/ |
par = top; |
while (par != newnode) { |
if (par->key > key) { |
par->balance--; |
par = par->lft; |
} else { |
par->balance++; |
par = par->rgt; |
} |
} |
/* |
* To balance the tree, we must check and balance top node. |
*/ |
if (top->balance == -2) { |
par = top->lft; |
if (par->balance == -1) { |
/* |
* LL rotation. |
*/ |
REBALANCE_INSERT_LL(); |
} else { |
/* |
* LR rotation. |
*/ |
ASSERT(par->balance == 1); |
REBALANCE_INSERT_LR(); |
} |
} else if (top->balance == 2) { |
par = top->rgt; |
if (par->balance == 1) { |
/* |
* RR rotation. |
*/ |
REBALANCE_INSERT_RR(); |
} else { |
/* |
* RL rotation. |
*/ |
ASSERT(par->balance == -1); |
REBALANCE_INSERT_RL(); |
} |
} else { |
/* |
* Balance is not broken, insertion is finised. |
*/ |
return; |
} |
} |
/** Repair the tree after reparenting node u. |
* |
* If node u has no parent, mark it as the root of the whole tree. Otherwise |
* node v represents stale address of one of the children of node u's parent. |
* Replace v with w as node u parent's child (for most uses, u and w will be the |
* same). |
* |
* @param t AVL tree. |
* @param u Node whose new parent has a stale child pointer. |
* @param v Stale child of node u's new parent. |
* @param w New child of node u's new parent. |
* @param dir If not NULL, address of the variable where to store information |
* about whether w replaced v in the left or the right subtree of |
* u's new parent. |
* @param ro Read only operation; do not modify any tree pointers. This is |
* useful for tracking direction via the dir pointer. |
* |
* @return Zero if w became the new root of the tree, otherwise return |
* non-zero. |
*/ |
static int |
repair(avltree_t *t, avltree_node_t *u, avltree_node_t *v, avltree_node_t *w, |
int *dir, int ro) |
{ |
if (u->par == NULL) { |
if (!ro) |
t->root = w; |
return 0; |
} else { |
if (u->par->lft == v) { |
if (!ro) |
u->par->lft = w; |
if (dir) |
*dir = LEFT; |
} else { |
ASSERT(u->par->rgt == v); |
if (!ro) |
u->par->rgt = w; |
if (dir) |
*dir = RIGHT; |
} |
} |
return 1; |
} |
#define REBALANCE_DELETE(DIR1, DIR2, SIGN) \ |
if (cur->balance == -1 * SIGN) { \ |
par->balance = 0; \ |
gpa->balance = 1 * SIGN; \ |
if (gpa->DIR1) \ |
gpa->DIR1->par = gpa; \ |
par->DIR2->par = par; \ |
} else if (cur->balance == 0) { \ |
par->balance = 0; \ |
gpa->balance = 0; \ |
if (gpa->DIR1) \ |
gpa->DIR1->par = gpa; \ |
if (par->DIR2) \ |
par->DIR2->par = par; \ |
} else { \ |
par->balance = -1 * SIGN; \ |
gpa->balance = 0; \ |
if (par->DIR2) \ |
par->DIR2->par = par; \ |
gpa->DIR1->par = gpa; \ |
} \ |
cur->balance = 0; |
#define REBALANCE_DELETE_LR() REBALANCE_DELETE(lft, rgt, 1) |
#define REBALANCE_DELETE_RL() REBALANCE_DELETE(rgt, lft, -1) |
/** Delete a node from the AVL tree. |
* |
* Because multiple identical keys are allowed, the parent pointers are |
* essential during deletion. |
* |
* @param t AVL tree structure. |
* @param node Address of the node which will be deleted. |
*/ |
void avltree_delete(avltree_t *t, avltree_node_t *node) |
{ |
avltree_node_t *cur; |
avltree_node_t *par; |
avltree_node_t *gpa; |
int dir; |
ASSERT(t); |
ASSERT(node); |
if (node->lft == NULL) { |
if (node->rgt) { |
/* |
* Replace the node with its only right son. |
* |
* Balance of the right son will be repaired in the |
* balancing cycle. |
*/ |
cur = node->rgt; |
cur->par = node->par; |
gpa = cur; |
dir = RIGHT; |
cur->balance = node->balance; |
} else { |
if (node->par == NULL) { |
/* |
* The tree has only one node - it will become |
* an empty tree and the balancing can end. |
*/ |
t->root = NULL; |
return; |
} |
/* |
* The node has no child, it will be deleted with no |
* substitution. |
*/ |
gpa = node->par; |
cur = NULL; |
dir = (gpa->lft == node) ? LEFT: RIGHT; |
} |
} else { |
/* |
* The node has the left son. Find a node with the smallest key |
* in the left subtree and replace the deleted node with that |
* node. |
*/ |
for (cur = node->lft; cur->rgt != NULL; cur = cur->rgt) |
; |
if (cur != node->lft) { |
/* |
* The rightmost node of the deleted node's left subtree |
* was found. Replace the deleted node with this node. |
* Cutting off of the found node has two cases that |
* depend on its left son. |
*/ |
if (cur->lft) { |
/* |
* The found node has a left son. |
*/ |
gpa = cur->lft; |
gpa->par = cur->par; |
dir = LEFT; |
gpa->balance = cur->balance; |
} else { |
dir = RIGHT; |
gpa = cur->par; |
} |
cur->par->rgt = cur->lft; |
cur->lft = node->lft; |
cur->lft->par = cur; |
} else { |
/* |
* The left son of the node hasn't got a right son. The |
* left son will take the deleted node's place. |
*/ |
dir = LEFT; |
gpa = cur; |
} |
if (node->rgt) |
node->rgt->par = cur; |
cur->rgt = node->rgt; |
cur->balance = node->balance; |
cur->par = node->par; |
} |
/* |
* Repair the parent node's pointer which pointed previously to the |
* deleted node. |
*/ |
(void) repair(t, node, node, cur, NULL, false); |
/* |
* Repair cycle which repairs balances of nodes on the way from from the |
* cut-off node up to the root. |
*/ |
for (;;) { |
if (dir == LEFT) { |
/* |
* Deletion was made in the left subtree. |
*/ |
gpa->balance++; |
if (gpa->balance == 1) { |
/* |
* Stop balancing, the tree is balanced. |
*/ |
break; |
} else if (gpa->balance == 2) { |
/* |
* Bad balance, heights of left and right |
* subtrees differ more than by one. |
*/ |
par = gpa->rgt; |
if (par->balance == -1) { |
/* |
* RL rotation. |
*/ |
cur = par->lft; |
par->lft = cur->rgt; |
cur->rgt = par; |
gpa->rgt = cur->lft; |
cur->lft = gpa; |
/* |
* Repair balances and paternity of |
* children, depending on the balance |
* factor of the grand child (cur). |
*/ |
REBALANCE_DELETE_RL(); |
/* |
* Repair paternity. |
*/ |
cur->par = gpa->par; |
gpa->par = cur; |
par->par = cur; |
if (!repair(t, cur, gpa, cur, &dir, |
false)) |
break; |
gpa = cur->par; |
} else { |
/* |
* RR rotation. |
*/ |
gpa->rgt = par->lft; |
if (par->lft) |
par->lft->par = gpa; |
par->lft = gpa; |
/* |
* Repair paternity. |
*/ |
par->par = gpa->par; |
gpa->par = par; |
if (par->balance == 0) { |
/* |
* The right child of the |
* balanced node is balanced, |
* after RR rotation is done, |
* the whole tree will be |
* balanced. |
*/ |
par->balance = -1; |
gpa->balance = 1; |
(void) repair(t, par, gpa, par, |
NULL, false); |
break; |
} else { |
par->balance = 0; |
gpa->balance = 0; |
if (!repair(t, par, gpa, par, |
&dir, false)) |
break; |
} |
gpa = par->par; |
} |
} else { |
/* |
* Repair the pointer which pointed to the |
* balanced node. If it was root then balancing |
* is finished else continue with the next |
* iteration (parent node). |
*/ |
if (!repair(t, gpa, gpa, NULL, &dir, true)) |
break; |
gpa = gpa->par; |
} |
} else { |
/* |
* Deletion was made in the right subtree. |
*/ |
gpa->balance--; |
if (gpa->balance == -1) { |
/* |
* Stop balancing, the tree is balanced. |
*/ |
break; |
} else if (gpa->balance == -2) { |
/* |
* Bad balance, heights of left and right |
* subtrees differ more than by one. |
*/ |
par = gpa->lft; |
if (par->balance == 1) { |
/* |
* LR rotation. |
*/ |
cur = par->rgt; |
par->rgt = cur->lft; |
cur->lft = par; |
gpa->lft = cur->rgt; |
cur->rgt = gpa; |
/* |
* Repair balances and paternity of |
* children, depending on the balance |
* factor of the grand child (cur). |
*/ |
REBALANCE_DELETE_LR(); |
/* |
* Repair paternity. |
*/ |
cur->par = gpa->par; |
gpa->par = cur; |
par->par = cur; |
if (!repair(t, cur, gpa, cur, &dir, |
false)) |
break; |
gpa = cur->par; |
} else { |
/* |
* LL rotation. |
*/ |
gpa->lft = par->rgt; |
if (par->rgt) |
par->rgt->par = gpa; |
par->rgt = gpa; |
/* |
* Repair paternity. |
*/ |
par->par = gpa->par; |
gpa->par = par; |
if (par->balance == 0) { |
/* |
* The left child of the |
* balanced node is balanced, |
* after LL rotation is done, |
* the whole tree will be |
* balanced. |
*/ |
par->balance = 1; |
gpa->balance = -1; |
(void) repair(t, par, gpa, par, |
NULL, false); |
break; |
} else { |
par->balance = 0; |
gpa->balance = 0; |
if (!repair(t, par, gpa, par, |
&dir, false)) |
break; |
} |
gpa = par->par; |
} |
} else { |
/* |
* Repair the pointer which pointed to the |
* balanced node. If it was root then balancing |
* is finished. Otherwise continue with the next |
* iteration (parent node). |
*/ |
if (!repair(t, gpa, gpa, NULL, &dir, true)) |
break; |
gpa = gpa->par; |
} |
} |
} |
} |
/** Delete a node with the smallest key from the AVL tree. |
* |
* @param t AVL tree structure. |
*/ |
bool avltree_delete_min(avltree_t *t) |
{ |
avltree_node_t *node; |
/* |
* Start searching for the smallest key in the tree starting in the root |
* node and continue in cycle to the leftmost node in the tree (which |
* must have the smallest key). |
*/ |
node = t->root; |
if (!node) |
return false; |
while (node->lft != NULL) |
node = node->lft; |
avltree_delete(t, node); |
return true; |
} |
/** Walk a subtree of an AVL tree in-order and apply a supplied walker on each |
* visited node. |
* |
* @param node Node representing the root of an AVL subtree to be |
* walked. |
* @param walker Walker function that will be appliad on each visited |
* node. |
* @param arg Argument for the walker. |
* |
* @return Zero if the walk should stop or non-zero otherwise. |
*/ |
static bool _avltree_walk(avltree_node_t *node, avltree_walker_t walker, |
void *arg) |
{ |
if (node->lft) { |
if (!_avltree_walk(node->lft, walker, arg)) |
return false; |
} |
if (!walker(node, arg)) |
return false; |
if (node->rgt) { |
if (!_avltree_walk(node->rgt, walker, arg)) |
return false; |
} |
return true; |
} |
/** Walk the AVL tree in-order and apply the walker function on each visited |
* node. |
* |
* @param t AVL tree to be walked. |
* @param walker Walker function that will be called on each visited |
* node. |
* @param arg Argument for the walker. |
*/ |
void avltree_walk(avltree_t *t, avltree_walker_t walker, void *arg) |
{ |
_avltree_walk(t->root, walker, arg); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/adt/btree.c |
---|
0,0 → 1,1002 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericadt |
* @{ |
*/ |
/** |
* @file |
* @brief B+tree implementation. |
* |
* This file implements B+tree type and operations. |
* |
* The B+tree has the following properties: |
* @li it is a ballanced 3-4-5 tree (i.e. BTREE_M = 5) |
* @li values (i.e. pointers to values) are stored only in leaves |
* @li leaves are linked in a list |
* |
* Be carefull when using these trees. They need to allocate |
* and deallocate memory for their index nodes and as such |
* can sleep. |
*/ |
#include <adt/btree.h> |
#include <adt/list.h> |
#include <mm/slab.h> |
#include <debug.h> |
#include <panic.h> |
#include <print.h> |
static void btree_destroy_subtree(btree_node_t *root); |
static void _btree_insert(btree_t *t, btree_key_t key, void *value, btree_node_t *rsubtree, btree_node_t *node); |
static void _btree_remove(btree_t *t, btree_key_t key, btree_node_t *node); |
static void node_initialize(btree_node_t *node); |
static void node_insert_key_and_lsubtree(btree_node_t *node, btree_key_t key, void *value, btree_node_t *lsubtree); |
static void node_insert_key_and_rsubtree(btree_node_t *node, btree_key_t key, void *value, btree_node_t *rsubtree); |
static void node_remove_key_and_lsubtree(btree_node_t *node, btree_key_t key); |
static void node_remove_key_and_rsubtree(btree_node_t *node, btree_key_t key); |
static btree_node_t *node_split(btree_node_t *node, btree_key_t key, void *value, btree_node_t *rsubtree, btree_key_t *median); |
static btree_node_t *node_combine(btree_node_t *node); |
static index_t find_key_by_subtree(btree_node_t *node, btree_node_t *subtree, bool right); |
static void rotate_from_right(btree_node_t *lnode, btree_node_t *rnode, index_t idx); |
static void rotate_from_left(btree_node_t *lnode, btree_node_t *rnode, index_t idx); |
static bool try_insert_by_rotation_to_left(btree_node_t *node, btree_key_t key, void *value, btree_node_t *rsubtree); |
static bool try_insert_by_rotation_to_right(btree_node_t *node, btree_key_t key, void *value, btree_node_t *rsubtree); |
static bool try_rotation_from_left(btree_node_t *rnode); |
static bool try_rotation_from_right(btree_node_t *lnode); |
#define ROOT_NODE(n) (!(n)->parent) |
#define INDEX_NODE(n) ((n)->subtree[0] != NULL) |
#define LEAF_NODE(n) ((n)->subtree[0] == NULL) |
#define FILL_FACTOR ((BTREE_M-1)/2) |
#define MEDIAN_LOW_INDEX(n) (((n)->keys-1)/2) |
#define MEDIAN_HIGH_INDEX(n) ((n)->keys/2) |
#define MEDIAN_LOW(n) ((n)->key[MEDIAN_LOW_INDEX((n))]); |
#define MEDIAN_HIGH(n) ((n)->key[MEDIAN_HIGH_INDEX((n))]); |
static slab_cache_t *btree_node_slab; |
/** Initialize B-trees. */ |
void btree_init(void) |
{ |
btree_node_slab = slab_cache_create("btree_node_slab", sizeof(btree_node_t), 0, NULL, NULL, SLAB_CACHE_MAGDEFERRED); |
} |
/** Create empty B-tree. |
* |
* @param t B-tree. |
*/ |
void btree_create(btree_t *t) |
{ |
list_initialize(&t->leaf_head); |
t->root = (btree_node_t *) slab_alloc(btree_node_slab, 0); |
node_initialize(t->root); |
list_append(&t->root->leaf_link, &t->leaf_head); |
} |
/** Destroy empty B-tree. */ |
void btree_destroy(btree_t *t) |
{ |
btree_destroy_subtree(t->root); |
} |
/** Insert key-value pair into B-tree. |
* |
* @param t B-tree. |
* @param key Key to be inserted. |
* @param value Value to be inserted. |
* @param leaf_node Leaf node where the insertion should begin. |
*/ |
void btree_insert(btree_t *t, btree_key_t key, void *value, btree_node_t *leaf_node) |
{ |
btree_node_t *lnode; |
ASSERT(value); |
lnode = leaf_node; |
if (!lnode) { |
if (btree_search(t, key, &lnode)) { |
panic("B-tree %p already contains key %d\n", t, key); |
} |
} |
_btree_insert(t, key, value, NULL, lnode); |
} |
/** Destroy subtree rooted in a node. |
* |
* @param root Root of the subtree. |
*/ |
void btree_destroy_subtree(btree_node_t *root) |
{ |
count_t i; |
if (root->keys) { |
for (i = 0; i < root->keys + 1; i++) { |
if (root->subtree[i]) |
btree_destroy_subtree(root->subtree[i]); |
} |
} |
slab_free(btree_node_slab, root); |
} |
/** Recursively insert into B-tree. |
* |
* @param t B-tree. |
* @param key Key to be inserted. |
* @param value Value to be inserted. |
* @param rsubtree Right subtree of the inserted key. |
* @param node Start inserting into this node. |
*/ |
void _btree_insert(btree_t *t, btree_key_t key, void *value, btree_node_t *rsubtree, btree_node_t *node) |
{ |
if (node->keys < BTREE_MAX_KEYS) { |
/* |
* Node conatins enough space, the key can be stored immediately. |
*/ |
node_insert_key_and_rsubtree(node, key, value, rsubtree); |
} else if (try_insert_by_rotation_to_left(node, key, value, rsubtree)) { |
/* |
* The key-value-rsubtree triplet has been inserted because |
* some keys could have been moved to the left sibling. |
*/ |
} else if (try_insert_by_rotation_to_right(node, key, value, rsubtree)) { |
/* |
* The key-value-rsubtree triplet has been inserted because |
* some keys could have been moved to the right sibling. |
*/ |
} else { |
btree_node_t *rnode; |
btree_key_t median; |
/* |
* Node is full and both siblings (if both exist) are full too. |
* Split the node and insert the smallest key from the node containing |
* bigger keys (i.e. the new node) into its parent. |
*/ |
rnode = node_split(node, key, value, rsubtree, &median); |
if (LEAF_NODE(node)) { |
list_prepend(&rnode->leaf_link, &node->leaf_link); |
} |
if (ROOT_NODE(node)) { |
/* |
* We split the root node. Create new root. |
*/ |
t->root = (btree_node_t *) slab_alloc(btree_node_slab, 0); |
node->parent = t->root; |
rnode->parent = t->root; |
node_initialize(t->root); |
/* |
* Left-hand side subtree will be the old root (i.e. node). |
* Right-hand side subtree will be rnode. |
*/ |
t->root->subtree[0] = node; |
t->root->depth = node->depth + 1; |
} |
_btree_insert(t, median, NULL, rnode, node->parent); |
} |
} |
/** Remove B-tree node. |
* |
* @param t B-tree. |
* @param key Key to be removed from the B-tree along with its associated value. |
* @param leaf_node If not NULL, pointer to the leaf node where the key is found. |
*/ |
void btree_remove(btree_t *t, btree_key_t key, btree_node_t *leaf_node) |
{ |
btree_node_t *lnode; |
lnode = leaf_node; |
if (!lnode) { |
if (!btree_search(t, key, &lnode)) { |
panic("B-tree %p does not contain key %d\n", t, key); |
} |
} |
_btree_remove(t, key, lnode); |
} |
/** Recursively remove B-tree node. |
* |
* @param t B-tree. |
* @param key Key to be removed from the B-tree along with its associated value. |
* @param node Node where the key being removed resides. |
*/ |
void _btree_remove(btree_t *t, btree_key_t key, btree_node_t *node) |
{ |
if (ROOT_NODE(node)) { |
if (node->keys == 1 && node->subtree[0]) { |
/* |
* Free the current root and set new root. |
*/ |
t->root = node->subtree[0]; |
t->root->parent = NULL; |
slab_free(btree_node_slab, node); |
} else { |
/* |
* Remove the key from the root node. |
* Note that the right subtree is removed because when |
* combining two nodes, the left-side sibling is preserved |
* and the right-side sibling is freed. |
*/ |
node_remove_key_and_rsubtree(node, key); |
} |
return; |
} |
if (node->keys <= FILL_FACTOR) { |
/* |
* If the node is below the fill factor, |
* try to borrow keys from left or right sibling. |
*/ |
if (!try_rotation_from_left(node)) |
try_rotation_from_right(node); |
} |
if (node->keys > FILL_FACTOR) { |
count_t i; |
/* |
* The key can be immediatelly removed. |
* |
* Note that the right subtree is removed because when |
* combining two nodes, the left-side sibling is preserved |
* and the right-side sibling is freed. |
*/ |
node_remove_key_and_rsubtree(node, key); |
for (i = 0; i < node->parent->keys; i++) { |
if (node->parent->key[i] == key) |
node->parent->key[i] = node->key[0]; |
} |
} else { |
index_t idx; |
btree_node_t *rnode, *parent; |
/* |
* The node is below the fill factor as well as its left and right sibling. |
* Resort to combining the node with one of its siblings. |
* The node which is on the left is preserved and the node on the right is |
* freed. |
*/ |
parent = node->parent; |
node_remove_key_and_rsubtree(node, key); |
rnode = node_combine(node); |
if (LEAF_NODE(rnode)) |
list_remove(&rnode->leaf_link); |
idx = find_key_by_subtree(parent, rnode, true); |
ASSERT((int) idx != -1); |
slab_free(btree_node_slab, rnode); |
_btree_remove(t, parent->key[idx], parent); |
} |
} |
/** Search key in a B-tree. |
* |
* @param t B-tree. |
* @param key Key to be searched. |
* @param leaf_node Address where to put pointer to visited leaf node. |
* |
* @return Pointer to value or NULL if there is no such key. |
*/ |
void *btree_search(btree_t *t, btree_key_t key, btree_node_t **leaf_node) |
{ |
btree_node_t *cur, *next; |
/* |
* Iteratively descend to the leaf that can contain the searched key. |
*/ |
for (cur = t->root; cur; cur = next) { |
/* Last iteration will set this with proper leaf node address. */ |
*leaf_node = cur; |
/* |
* The key can be in the leftmost subtree. |
* Test it separately. |
*/ |
if (key < cur->key[0]) { |
next = cur->subtree[0]; |
continue; |
} else { |
void *val; |
count_t i; |
/* |
* Now if the key is smaller than cur->key[i] |
* it can only mean that the value is in cur->subtree[i] |
* or it is not in the tree at all. |
*/ |
for (i = 1; i < cur->keys; i++) { |
if (key < cur->key[i]) { |
next = cur->subtree[i]; |
val = cur->value[i - 1]; |
if (LEAF_NODE(cur)) |
return key == cur->key[i - 1] ? val : NULL; |
goto descend; |
} |
} |
/* |
* Last possibility is that the key is in the rightmost subtree. |
*/ |
next = cur->subtree[i]; |
val = cur->value[i - 1]; |
if (LEAF_NODE(cur)) |
return key == cur->key[i - 1] ? val : NULL; |
} |
descend: |
; |
} |
/* |
* The key was not found in the *leaf_node and is smaller than any of its keys. |
*/ |
return NULL; |
} |
/** Return pointer to B-tree leaf node's left neighbour. |
* |
* @param t B-tree. |
* @param node Node whose left neighbour will be returned. |
* |
* @return Left neighbour of the node or NULL if the node does not have the left neighbour. |
*/ |
btree_node_t *btree_leaf_node_left_neighbour(btree_t *t, btree_node_t *node) |
{ |
ASSERT(LEAF_NODE(node)); |
if (node->leaf_link.prev != &t->leaf_head) |
return list_get_instance(node->leaf_link.prev, btree_node_t, leaf_link); |
else |
return NULL; |
} |
/** Return pointer to B-tree leaf node's right neighbour. |
* |
* @param t B-tree. |
* @param node Node whose right neighbour will be returned. |
* |
* @return Right neighbour of the node or NULL if the node does not have the right neighbour. |
*/ |
btree_node_t *btree_leaf_node_right_neighbour(btree_t *t, btree_node_t *node) |
{ |
ASSERT(LEAF_NODE(node)); |
if (node->leaf_link.next != &t->leaf_head) |
return list_get_instance(node->leaf_link.next, btree_node_t, leaf_link); |
else |
return NULL; |
} |
/** Initialize B-tree node. |
* |
* @param node B-tree node. |
*/ |
void node_initialize(btree_node_t *node) |
{ |
int i; |
node->keys = 0; |
/* Clean also space for the extra key. */ |
for (i = 0; i < BTREE_MAX_KEYS + 1; i++) { |
node->key[i] = 0; |
node->value[i] = NULL; |
node->subtree[i] = NULL; |
} |
node->subtree[i] = NULL; |
node->parent = NULL; |
link_initialize(&node->leaf_link); |
link_initialize(&node->bfs_link); |
node->depth = 0; |
} |
/** Insert key-value-lsubtree triplet into B-tree node. |
* |
* It is actually possible to have more keys than BTREE_MAX_KEYS. |
* This feature is used during insert by right rotation. |
* |
* @param node B-tree node into wich the new key is to be inserted. |
* @param key The key to be inserted. |
* @param value Pointer to value to be inserted. |
* @param lsubtree Pointer to the left subtree. |
*/ |
void node_insert_key_and_lsubtree(btree_node_t *node, btree_key_t key, void *value, btree_node_t *lsubtree) |
{ |
count_t i; |
for (i = 0; i < node->keys; i++) { |
if (key < node->key[i]) { |
count_t j; |
for (j = node->keys; j > i; j--) { |
node->key[j] = node->key[j - 1]; |
node->value[j] = node->value[j - 1]; |
node->subtree[j + 1] = node->subtree[j]; |
} |
node->subtree[j + 1] = node->subtree[j]; |
break; |
} |
} |
node->key[i] = key; |
node->value[i] = value; |
node->subtree[i] = lsubtree; |
node->keys++; |
} |
/** Insert key-value-rsubtree triplet into B-tree node. |
* |
* It is actually possible to have more keys than BTREE_MAX_KEYS. |
* This feature is used during splitting the node when the |
* number of keys is BTREE_MAX_KEYS + 1. Insert by left rotation |
* also makes use of this feature. |
* |
* @param node B-tree node into wich the new key is to be inserted. |
* @param key The key to be inserted. |
* @param value Pointer to value to be inserted. |
* @param rsubtree Pointer to the right subtree. |
*/ |
void node_insert_key_and_rsubtree(btree_node_t *node, btree_key_t key, void *value, btree_node_t *rsubtree) |
{ |
count_t i; |
for (i = 0; i < node->keys; i++) { |
if (key < node->key[i]) { |
count_t j; |
for (j = node->keys; j > i; j--) { |
node->key[j] = node->key[j - 1]; |
node->value[j] = node->value[j - 1]; |
node->subtree[j + 1] = node->subtree[j]; |
} |
break; |
} |
} |
node->key[i] = key; |
node->value[i] = value; |
node->subtree[i + 1] = rsubtree; |
node->keys++; |
} |
/** Remove key and its left subtree pointer from B-tree node. |
* |
* Remove the key and eliminate gaps in node->key array. |
* Note that the value pointer and the left subtree pointer |
* is removed from the node as well. |
* |
* @param node B-tree node. |
* @param key Key to be removed. |
*/ |
void node_remove_key_and_lsubtree(btree_node_t *node, btree_key_t key) |
{ |
count_t i, j; |
for (i = 0; i < node->keys; i++) { |
if (key == node->key[i]) { |
for (j = i + 1; j < node->keys; j++) { |
node->key[j - 1] = node->key[j]; |
node->value[j - 1] = node->value[j]; |
node->subtree[j - 1] = node->subtree[j]; |
} |
node->subtree[j - 1] = node->subtree[j]; |
node->keys--; |
return; |
} |
} |
panic("node %p does not contain key %d\n", node, key); |
} |
/** Remove key and its right subtree pointer from B-tree node. |
* |
* Remove the key and eliminate gaps in node->key array. |
* Note that the value pointer and the right subtree pointer |
* is removed from the node as well. |
* |
* @param node B-tree node. |
* @param key Key to be removed. |
*/ |
void node_remove_key_and_rsubtree(btree_node_t *node, btree_key_t key) |
{ |
count_t i, j; |
for (i = 0; i < node->keys; i++) { |
if (key == node->key[i]) { |
for (j = i + 1; j < node->keys; j++) { |
node->key[j - 1] = node->key[j]; |
node->value[j - 1] = node->value[j]; |
node->subtree[j] = node->subtree[j + 1]; |
} |
node->keys--; |
return; |
} |
} |
panic("node %p does not contain key %d\n", node, key); |
} |
/** Split full B-tree node and insert new key-value-right-subtree triplet. |
* |
* This function will split a node and return a pointer to a newly created |
* node containing keys greater than or equal to the greater of medians |
* (or median) of the old keys and the newly added key. It will also write |
* the median key to a memory address supplied by the caller. |
* |
* If the node being split is an index node, the median will not be |
* included in the new node. If the node is a leaf node, |
* the median will be copied there. |
* |
* @param node B-tree node wich is going to be split. |
* @param key The key to be inserted. |
* @param value Pointer to the value to be inserted. |
* @param rsubtree Pointer to the right subtree of the key being added. |
* @param median Address in memory, where the median key will be stored. |
* |
* @return Newly created right sibling of node. |
*/ |
btree_node_t *node_split(btree_node_t *node, btree_key_t key, void *value, btree_node_t *rsubtree, btree_key_t *median) |
{ |
btree_node_t *rnode; |
count_t i, j; |
ASSERT(median); |
ASSERT(node->keys == BTREE_MAX_KEYS); |
/* |
* Use the extra space to store the extra node. |
*/ |
node_insert_key_and_rsubtree(node, key, value, rsubtree); |
/* |
* Compute median of keys. |
*/ |
*median = MEDIAN_HIGH(node); |
/* |
* Allocate and initialize new right sibling. |
*/ |
rnode = (btree_node_t *) slab_alloc(btree_node_slab, 0); |
node_initialize(rnode); |
rnode->parent = node->parent; |
rnode->depth = node->depth; |
/* |
* Copy big keys, values and subtree pointers to the new right sibling. |
* If this is an index node, do not copy the median. |
*/ |
i = (count_t) INDEX_NODE(node); |
for (i += MEDIAN_HIGH_INDEX(node), j = 0; i < node->keys; i++, j++) { |
rnode->key[j] = node->key[i]; |
rnode->value[j] = node->value[i]; |
rnode->subtree[j] = node->subtree[i]; |
/* |
* Fix parent links in subtrees. |
*/ |
if (rnode->subtree[j]) |
rnode->subtree[j]->parent = rnode; |
} |
rnode->subtree[j] = node->subtree[i]; |
if (rnode->subtree[j]) |
rnode->subtree[j]->parent = rnode; |
rnode->keys = j; /* Set number of keys of the new node. */ |
node->keys /= 2; /* Shrink the old node. */ |
return rnode; |
} |
/** Combine node with any of its siblings. |
* |
* The siblings are required to be below the fill factor. |
* |
* @param node Node to combine with one of its siblings. |
* |
* @return Pointer to the rightmost of the two nodes. |
*/ |
btree_node_t *node_combine(btree_node_t *node) |
{ |
index_t idx; |
btree_node_t *rnode; |
count_t i; |
ASSERT(!ROOT_NODE(node)); |
idx = find_key_by_subtree(node->parent, node, false); |
if (idx == node->parent->keys) { |
/* |
* Rightmost subtree of its parent, combine with the left sibling. |
*/ |
idx--; |
rnode = node; |
node = node->parent->subtree[idx]; |
} else { |
rnode = node->parent->subtree[idx + 1]; |
} |
/* Index nodes need to insert parent node key in between left and right node. */ |
if (INDEX_NODE(node)) |
node->key[node->keys++] = node->parent->key[idx]; |
/* Copy the key-value-subtree triplets from the right node. */ |
for (i = 0; i < rnode->keys; i++) { |
node->key[node->keys + i] = rnode->key[i]; |
node->value[node->keys + i] = rnode->value[i]; |
if (INDEX_NODE(node)) { |
node->subtree[node->keys + i] = rnode->subtree[i]; |
rnode->subtree[i]->parent = node; |
} |
} |
if (INDEX_NODE(node)) { |
node->subtree[node->keys + i] = rnode->subtree[i]; |
rnode->subtree[i]->parent = node; |
} |
node->keys += rnode->keys; |
return rnode; |
} |
/** Find key by its left or right subtree. |
* |
* @param node B-tree node. |
* @param subtree Left or right subtree of a key found in node. |
* @param right If true, subtree is a right subtree. If false, subtree is a left subtree. |
* |
* @return Index of the key associated with the subtree. |
*/ |
index_t find_key_by_subtree(btree_node_t *node, btree_node_t *subtree, bool right) |
{ |
count_t i; |
for (i = 0; i < node->keys + 1; i++) { |
if (subtree == node->subtree[i]) |
return i - (int) (right != false); |
} |
panic("node %p does not contain subtree %p\n", node, subtree); |
} |
/** Rotate one key-value-rsubtree triplet from the left sibling to the right sibling. |
* |
* The biggest key and its value and right subtree is rotated from the left node |
* to the right. If the node is an index node, than the parent node key belonging to |
* the left node takes part in the rotation. |
* |
* @param lnode Left sibling. |
* @param rnode Right sibling. |
* @param idx Index of the parent node key that is taking part in the rotation. |
*/ |
void rotate_from_left(btree_node_t *lnode, btree_node_t *rnode, index_t idx) |
{ |
btree_key_t key; |
key = lnode->key[lnode->keys - 1]; |
if (LEAF_NODE(lnode)) { |
void *value; |
value = lnode->value[lnode->keys - 1]; |
node_remove_key_and_rsubtree(lnode, key); |
node_insert_key_and_lsubtree(rnode, key, value, NULL); |
lnode->parent->key[idx] = key; |
} else { |
btree_node_t *rsubtree; |
rsubtree = lnode->subtree[lnode->keys]; |
node_remove_key_and_rsubtree(lnode, key); |
node_insert_key_and_lsubtree(rnode, lnode->parent->key[idx], NULL, rsubtree); |
lnode->parent->key[idx] = key; |
/* Fix parent link of the reconnected right subtree. */ |
rsubtree->parent = rnode; |
} |
} |
/** Rotate one key-value-lsubtree triplet from the right sibling to the left sibling. |
* |
* The smallest key and its value and left subtree is rotated from the right node |
* to the left. If the node is an index node, than the parent node key belonging to |
* the right node takes part in the rotation. |
* |
* @param lnode Left sibling. |
* @param rnode Right sibling. |
* @param idx Index of the parent node key that is taking part in the rotation. |
*/ |
void rotate_from_right(btree_node_t *lnode, btree_node_t *rnode, index_t idx) |
{ |
btree_key_t key; |
key = rnode->key[0]; |
if (LEAF_NODE(rnode)) { |
void *value; |
value = rnode->value[0]; |
node_remove_key_and_lsubtree(rnode, key); |
node_insert_key_and_rsubtree(lnode, key, value, NULL); |
rnode->parent->key[idx] = rnode->key[0]; |
} else { |
btree_node_t *lsubtree; |
lsubtree = rnode->subtree[0]; |
node_remove_key_and_lsubtree(rnode, key); |
node_insert_key_and_rsubtree(lnode, rnode->parent->key[idx], NULL, lsubtree); |
rnode->parent->key[idx] = key; |
/* Fix parent link of the reconnected left subtree. */ |
lsubtree->parent = lnode; |
} |
} |
/** Insert key-value-rsubtree triplet and rotate the node to the left, if this operation can be done. |
* |
* Left sibling of the node (if it exists) is checked for free space. |
* If there is free space, the key is inserted and the smallest key of |
* the node is moved there. The index node which is the parent of both |
* nodes is fixed. |
* |
* @param node B-tree node. |
* @param inskey Key to be inserted. |
* @param insvalue Value to be inserted. |
* @param rsubtree Right subtree of inskey. |
* |
* @return True if the rotation was performed, false otherwise. |
*/ |
bool try_insert_by_rotation_to_left(btree_node_t *node, btree_key_t inskey, void *insvalue, btree_node_t *rsubtree) |
{ |
index_t idx; |
btree_node_t *lnode; |
/* |
* If this is root node, the rotation can not be done. |
*/ |
if (ROOT_NODE(node)) |
return false; |
idx = find_key_by_subtree(node->parent, node, true); |
if ((int) idx == -1) { |
/* |
* If this node is the leftmost subtree of its parent, |
* the rotation can not be done. |
*/ |
return false; |
} |
lnode = node->parent->subtree[idx]; |
if (lnode->keys < BTREE_MAX_KEYS) { |
/* |
* The rotaion can be done. The left sibling has free space. |
*/ |
node_insert_key_and_rsubtree(node, inskey, insvalue, rsubtree); |
rotate_from_right(lnode, node, idx); |
return true; |
} |
return false; |
} |
/** Insert key-value-rsubtree triplet and rotate the node to the right, if this operation can be done. |
* |
* Right sibling of the node (if it exists) is checked for free space. |
* If there is free space, the key is inserted and the biggest key of |
* the node is moved there. The index node which is the parent of both |
* nodes is fixed. |
* |
* @param node B-tree node. |
* @param inskey Key to be inserted. |
* @param insvalue Value to be inserted. |
* @param rsubtree Right subtree of inskey. |
* |
* @return True if the rotation was performed, false otherwise. |
*/ |
bool try_insert_by_rotation_to_right(btree_node_t *node, btree_key_t inskey, void *insvalue, btree_node_t *rsubtree) |
{ |
index_t idx; |
btree_node_t *rnode; |
/* |
* If this is root node, the rotation can not be done. |
*/ |
if (ROOT_NODE(node)) |
return false; |
idx = find_key_by_subtree(node->parent, node, false); |
if (idx == node->parent->keys) { |
/* |
* If this node is the rightmost subtree of its parent, |
* the rotation can not be done. |
*/ |
return false; |
} |
rnode = node->parent->subtree[idx + 1]; |
if (rnode->keys < BTREE_MAX_KEYS) { |
/* |
* The rotaion can be done. The right sibling has free space. |
*/ |
node_insert_key_and_rsubtree(node, inskey, insvalue, rsubtree); |
rotate_from_left(node, rnode, idx); |
return true; |
} |
return false; |
} |
/** Rotate in a key from the left sibling or from the index node, if this operation can be done. |
* |
* @param rnode Node into which to add key from its left sibling or from the index node. |
* |
* @return True if the rotation was performed, false otherwise. |
*/ |
bool try_rotation_from_left(btree_node_t *rnode) |
{ |
index_t idx; |
btree_node_t *lnode; |
/* |
* If this is root node, the rotation can not be done. |
*/ |
if (ROOT_NODE(rnode)) |
return false; |
idx = find_key_by_subtree(rnode->parent, rnode, true); |
if ((int) idx == -1) { |
/* |
* If this node is the leftmost subtree of its parent, |
* the rotation can not be done. |
*/ |
return false; |
} |
lnode = rnode->parent->subtree[idx]; |
if (lnode->keys > FILL_FACTOR) { |
rotate_from_left(lnode, rnode, idx); |
return true; |
} |
return false; |
} |
/** Rotate in a key from the right sibling or from the index node, if this operation can be done. |
* |
* @param lnode Node into which to add key from its right sibling or from the index node. |
* |
* @return True if the rotation was performed, false otherwise. |
*/ |
bool try_rotation_from_right(btree_node_t *lnode) |
{ |
index_t idx; |
btree_node_t *rnode; |
/* |
* If this is root node, the rotation can not be done. |
*/ |
if (ROOT_NODE(lnode)) |
return false; |
idx = find_key_by_subtree(lnode->parent, lnode, false); |
if (idx == lnode->parent->keys) { |
/* |
* If this node is the rightmost subtree of its parent, |
* the rotation can not be done. |
*/ |
return false; |
} |
rnode = lnode->parent->subtree[idx + 1]; |
if (rnode->keys > FILL_FACTOR) { |
rotate_from_right(lnode, rnode, idx); |
return true; |
} |
return false; |
} |
/** Print B-tree. |
* |
* @param t Print out B-tree. |
*/ |
void btree_print(btree_t *t) |
{ |
count_t i; |
int depth = t->root->depth; |
link_t head, *cur; |
printf("Printing B-tree:\n"); |
list_initialize(&head); |
list_append(&t->root->bfs_link, &head); |
/* |
* Use BFS search to print out the tree. |
* Levels are distinguished from one another by node->depth. |
*/ |
while (!list_empty(&head)) { |
link_t *hlp; |
btree_node_t *node; |
hlp = head.next; |
ASSERT(hlp != &head); |
node = list_get_instance(hlp, btree_node_t, bfs_link); |
list_remove(hlp); |
ASSERT(node); |
if (node->depth != depth) { |
printf("\n"); |
depth = node->depth; |
} |
printf("("); |
for (i = 0; i < node->keys; i++) { |
printf("%llu%s", node->key[i], i < node->keys - 1 ? "," : ""); |
if (node->depth && node->subtree[i]) { |
list_append(&node->subtree[i]->bfs_link, &head); |
} |
} |
if (node->depth && node->subtree[i]) { |
list_append(&node->subtree[i]->bfs_link, &head); |
} |
printf(")"); |
} |
printf("\n"); |
printf("Printing list of leaves:\n"); |
for (cur = t->leaf_head.next; cur != &t->leaf_head; cur = cur->next) { |
btree_node_t *node; |
node = list_get_instance(cur, btree_node_t, leaf_link); |
ASSERT(node); |
printf("("); |
for (i = 0; i < node->keys; i++) |
printf("%llu%s", node->key[i], i < node->keys - 1 ? "," : ""); |
printf(")"); |
} |
printf("\n"); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/adt/hash_table.c |
---|
0,0 → 1,176 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericadt |
* @{ |
*/ |
/** |
* @file |
* @brief Implementation of generic chained hash table. |
* |
* This file contains implementation of generic chained hash table. |
*/ |
#include <adt/hash_table.h> |
#include <adt/list.h> |
#include <arch/types.h> |
#include <debug.h> |
#include <mm/slab.h> |
#include <memstr.h> |
/** Create chained hash table. |
* |
* @param h Hash table structure. Will be initialized by this call. |
* @param m Number of slots in the hash table. |
* @param max_keys Maximal number of keys needed to identify an item. |
* @param op Hash table operations structure. |
*/ |
void hash_table_create(hash_table_t *h, count_t m, count_t max_keys, hash_table_operations_t *op) |
{ |
index_t i; |
ASSERT(h); |
ASSERT(op && op->hash && op->compare); |
ASSERT(max_keys > 0); |
h->entry = (link_t *) malloc(m * sizeof(link_t), 0); |
if (!h->entry) { |
panic("cannot allocate memory for hash table\n"); |
} |
memsetb((uintptr_t) h->entry, m * sizeof(link_t), 0); |
for (i = 0; i < m; i++) |
list_initialize(&h->entry[i]); |
h->entries = m; |
h->max_keys = max_keys; |
h->op = op; |
} |
/** Insert item into hash table. |
* |
* @param h Hash table. |
* @param key Array of all keys necessary to compute hash index. |
* @param item Item to be inserted into the hash table. |
*/ |
void hash_table_insert(hash_table_t *h, unative_t key[], link_t *item) |
{ |
index_t chain; |
ASSERT(item); |
ASSERT(h && h->op && h->op->hash && h->op->compare); |
chain = h->op->hash(key); |
ASSERT(chain < h->entries); |
list_append(item, &h->entry[chain]); |
} |
/** Search hash table for an item matching keys. |
* |
* @param h Hash table. |
* @param key Array of all keys needed to compute hash index. |
* |
* @return Matching item on success, NULL if there is no such item. |
*/ |
link_t *hash_table_find(hash_table_t *h, unative_t key[]) |
{ |
link_t *cur; |
index_t chain; |
ASSERT(h && h->op && h->op->hash && h->op->compare); |
chain = h->op->hash(key); |
ASSERT(chain < h->entries); |
for (cur = h->entry[chain].next; cur != &h->entry[chain]; cur = cur->next) { |
if (h->op->compare(key, h->max_keys, cur)) { |
/* |
* The entry is there. |
*/ |
return cur; |
} |
} |
return NULL; |
} |
/** Remove all matching items from hash table. |
* |
* For each removed item, h->remove_callback() is called. |
* |
* @param h Hash table. |
* @param key Array of keys that will be compared against items of the hash table. |
* @param keys Number of keys in the key array. |
*/ |
void hash_table_remove(hash_table_t *h, unative_t key[], count_t keys) |
{ |
index_t chain; |
link_t *cur; |
ASSERT(h && h->op && h->op->hash && h->op->compare && h->op->remove_callback); |
ASSERT(keys <= h->max_keys); |
if (keys == h->max_keys) { |
/* |
* All keys are known, hash_table_find() can be used to find the entry. |
*/ |
cur = hash_table_find(h, key); |
if (cur) { |
list_remove(cur); |
h->op->remove_callback(cur); |
} |
return; |
} |
/* |
* Fewer keys were passed. |
* Any partially matching entries are to be removed. |
*/ |
for (chain = 0; chain < h->entries; chain++) { |
for (cur = h->entry[chain].next; cur != &h->entry[chain]; cur = cur->next) { |
if (h->op->compare(key, keys, cur)) { |
link_t *hlp; |
hlp = cur; |
cur = cur->prev; |
list_remove(hlp); |
h->op->remove_callback(hlp); |
continue; |
} |
} |
} |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/adt/bitmap.c |
---|
0,0 → 1,188 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericadt |
* @{ |
*/ |
/** |
* @file |
* @brief Implementation of bitmap ADT. |
* |
* This file implements bitmap ADT and provides functions for |
* setting and clearing ranges of bits. |
*/ |
#include <adt/bitmap.h> |
#include <arch/types.h> |
#include <align.h> |
#include <debug.h> |
#include <macros.h> |
#define ALL_ONES 0xff |
#define ALL_ZEROES 0x00 |
/** Initialize bitmap. |
* |
* No portion of the bitmap is set or cleared by this function. |
* |
* @param bitmap Bitmap structure. |
* @param map Address of the memory used to hold the map. |
* @param bits Number of bits stored in bitmap. |
*/ |
void bitmap_initialize(bitmap_t *bitmap, uint8_t *map, count_t bits) |
{ |
bitmap->map = map; |
bitmap->bits = bits; |
} |
/** Set range of bits. |
* |
* @param bitmap Bitmap structure. |
* @param start Starting bit. |
* @param bits Number of bits to set. |
*/ |
void bitmap_set_range(bitmap_t *bitmap, index_t start, count_t bits) |
{ |
index_t i=0; |
index_t aligned_start; |
count_t lub; /* leading unaligned bits */ |
count_t amb; /* aligned middle bits */ |
count_t tab; /* trailing aligned bits */ |
ASSERT(start + bits <= bitmap->bits); |
aligned_start = ALIGN_UP(start, 8); |
lub = min(aligned_start - start, bits); |
amb = bits > lub ? bits - lub : 0; |
tab = amb % 8; |
if ( start + bits < aligned_start ) { |
/* |
* Set bits in the middle of byte |
*/ |
bitmap->map[start / 8] |= ((1 << lub)-1) << (start&7); |
return; |
} |
if (lub) { |
/* |
* Make sure to set any leading unaligned bits. |
*/ |
bitmap->map[start / 8] |= ~((1 << (8 - lub)) - 1); |
} |
for (i = 0; i < amb / 8; i++) { |
/* |
* The middle bits can be set byte by byte. |
*/ |
bitmap->map[aligned_start / 8 + i] = ALL_ONES; |
} |
if (tab) { |
/* |
* Make sure to set any trailing aligned bits. |
*/ |
bitmap->map[aligned_start / 8 + i] |= (1 << tab) - 1; |
} |
} |
/** Clear range of bits. |
* |
* @param bitmap Bitmap structure. |
* @param start Starting bit. |
* @param bits Number of bits to clear. |
*/ |
void bitmap_clear_range(bitmap_t *bitmap, index_t start, count_t bits) |
{ |
index_t i=0; |
index_t aligned_start; |
count_t lub; /* leading unaligned bits */ |
count_t amb; /* aligned middle bits */ |
count_t tab; /* trailing aligned bits */ |
ASSERT(start + bits <= bitmap->bits); |
aligned_start = ALIGN_UP(start, 8); |
lub = min(aligned_start - start, bits); |
amb = bits > lub ? bits - lub : 0; |
tab = amb % 8; |
if ( start + bits < aligned_start ) |
{ |
/* |
* Set bits in the middle of byte |
*/ |
bitmap->map[start / 8] &= ~(((1 << lub)-1) << (start&7)); |
return; |
} |
if (lub) { |
/* |
* Make sure to clear any leading unaligned bits. |
*/ |
bitmap->map[start / 8] &= (1 << (8 - lub)) - 1; |
} |
for (i = 0; i < amb / 8; i++) { |
/* |
* The middle bits can be cleared byte by byte. |
*/ |
bitmap->map[aligned_start / 8 + i] = ALL_ZEROES; |
} |
if (tab) { |
/* |
* Make sure to clear any trailing aligned bits. |
*/ |
bitmap->map[aligned_start / 8 + i] &= ~((1 << tab) - 1); |
} |
} |
/** Copy portion of one bitmap into another bitmap. |
* |
* @param dst Destination bitmap. |
* @param src Source bitmap. |
* @param bits Number of bits to copy. |
*/ |
void bitmap_copy(bitmap_t *dst, bitmap_t *src, count_t bits) |
{ |
index_t i; |
ASSERT(bits <= dst->bits); |
ASSERT(bits <= src->bits); |
for (i = 0; i < bits / 8; i++) |
dst->map[i] = src->map[i]; |
if (bits % 8) { |
bitmap_clear_range(dst, i * 8, bits % 8); |
dst->map[i] |= src->map[i] & ((1 << (bits % 8)) - 1); |
} |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/adt/list.c |
---|
0,0 → 1,94 |
/* |
* Copyright (c) 2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericadt |
* @{ |
*/ |
/** |
* @file |
* @brief Functions completing doubly linked circular list implementaion. |
* |
* This file contains some of the functions implementing doubly linked circular lists. |
* However, this ADT is mostly implemented in @ref list.h. |
*/ |
#include <adt/list.h> |
/** Check for membership |
* |
* Check whether link is contained in the list head. |
* The membership is defined as pointer equivalence. |
* |
* @param link Item to look for. |
* @param head List to look in. |
* |
* @return true if link is contained in head, false otherwise. |
* |
*/ |
bool list_member(const link_t *link, const link_t *head) |
{ |
bool found = false; |
link_t *hlp = head->next; |
while (hlp != head) { |
if (hlp == link) { |
found = true; |
break; |
} |
hlp = hlp->next; |
} |
return found; |
} |
/** Concatenate two lists |
* |
* Concatenate lists head1 and head2, producing a single |
* list head1 containing items from both (in head1, head2 |
* order) and empty list head2. |
* |
* @param head1 First list and concatenated output |
* @param head2 Second list and empty output. |
* |
*/ |
void list_concat(link_t *head1, link_t *head2) |
{ |
if (list_empty(head2)) |
return; |
head2->next->prev = head1->prev; |
head2->prev->next = head1; |
head1->prev->next = head2->next; |
head1->prev = head2->prev; |
list_initialize(head2); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/ddi/irq.c |
---|
0,0 → 1,380 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericddi |
* @{ |
*/ |
/** |
* @file |
* @brief IRQ dispatcher. |
* |
* This file provides means of connecting IRQs with particular |
* devices and logic for dispatching interrupts to IRQ handlers |
* defined by those devices. |
* |
* This code is designed to support: |
* - multiple devices sharing single IRQ |
* - multiple IRQs per signle device |
* |
* |
* Note about architectures. |
* |
* Some architectures has the term IRQ well defined. Examples |
* of such architectures include amd64, ia32 and mips32. Some |
* other architectures, such as sparc64, don't use the term |
* at all. In those cases, we boldly step forward and define what |
* an IRQ is. |
* |
* The implementation is generic enough and still allows the |
* architectures to use the hardware layout effectively. |
* For instance, on amd64 and ia32, where there is only 16 |
* IRQs, the irq_hash_table can be optimized to a one-dimensional |
* array. Next, when it is known that the IRQ numbers (aka INR's) |
* are unique, the claim functions can always return IRQ_ACCEPT. |
* |
* |
* Note about the irq_hash_table. |
* |
* The hash table is configured to use two keys: inr and devno. |
* However, the hash index is computed only from inr. Moreover, |
* if devno is -1, the match is based on the return value of |
* the claim() function instead of on devno. |
*/ |
#include <ddi/irq.h> |
#include <adt/hash_table.h> |
#include <arch/types.h> |
#include <synch/spinlock.h> |
#include <arch.h> |
#define KEY_INR 0 |
#define KEY_DEVNO 1 |
/** |
* Spinlock protecting the hash table. |
* This lock must be taken only when interrupts are disabled. |
*/ |
SPINLOCK_INITIALIZE(irq_hash_table_lock); |
static hash_table_t irq_hash_table; |
/** |
* Hash table operations for cases when we know that |
* there will be collisions between different keys. |
*/ |
static index_t irq_ht_hash(unative_t *key); |
static bool irq_ht_compare(unative_t *key, count_t keys, link_t *item); |
static hash_table_operations_t irq_ht_ops = { |
.hash = irq_ht_hash, |
.compare = irq_ht_compare, |
.remove_callback = NULL /* not used */ |
}; |
/** |
* Hash table operations for cases when we know that |
* there will be no collisions between different keys. |
* However, there might be still collisions among |
* elements with single key (sharing of one IRQ). |
*/ |
static index_t irq_lin_hash(unative_t *key); |
static bool irq_lin_compare(unative_t *key, count_t keys, link_t *item); |
static hash_table_operations_t irq_lin_ops = { |
.hash = irq_lin_hash, |
.compare = irq_lin_compare, |
.remove_callback = NULL /* not used */ |
}; |
/** Initialize IRQ subsystem. |
* |
* @param inrs Numbers of unique IRQ numbers or INRs. |
* @param chains Number of chains in the hash table. |
*/ |
void irq_init(count_t inrs, count_t chains) |
{ |
/* |
* Be smart about the choice of the hash table operations. |
* In cases in which inrs equals the requested number of |
* chains (i.e. where there is no collision between |
* different keys), we can use optimized set of operations. |
*/ |
if (inrs == chains) |
hash_table_create(&irq_hash_table, chains, 2, &irq_lin_ops); |
else |
hash_table_create(&irq_hash_table, chains, 2, &irq_ht_ops); |
} |
/** Initialize one IRQ structure. |
* |
* @param irq Pointer to the IRQ structure to be initialized. |
* |
*/ |
void irq_initialize(irq_t *irq) |
{ |
link_initialize(&irq->link); |
spinlock_initialize(&irq->lock, "irq.lock"); |
irq->preack = false; |
irq->inr = -1; |
irq->devno = -1; |
irq->trigger = (irq_trigger_t) 0; |
irq->claim = NULL; |
irq->handler = NULL; |
irq->arg = NULL; |
irq->notif_cfg.notify = false; |
irq->notif_cfg.answerbox = NULL; |
irq->notif_cfg.code = NULL; |
irq->notif_cfg.method = 0; |
irq->notif_cfg.counter = 0; |
link_initialize(&irq->notif_cfg.link); |
} |
/** Register IRQ for device. |
* |
* The irq structure must be filled with information |
* about the interrupt source and with the claim() |
* function pointer and irq_handler() function pointer. |
* |
* @param irq IRQ structure belonging to a device. |
*/ |
void irq_register(irq_t *irq) |
{ |
ipl_t ipl; |
unative_t key[] = { |
(unative_t) irq->inr, |
(unative_t) irq->devno |
}; |
ipl = interrupts_disable(); |
spinlock_lock(&irq_hash_table_lock); |
hash_table_insert(&irq_hash_table, key, &irq->link); |
spinlock_unlock(&irq_hash_table_lock); |
interrupts_restore(ipl); |
} |
/** Dispatch the IRQ. |
* |
* We assume this function is only called from interrupt |
* context (i.e. that interrupts are disabled prior to |
* this call). |
* |
* This function attempts to lookup a fitting IRQ |
* structure. In case of success, return with interrupts |
* disabled and holding the respective structure. |
* |
* @param inr Interrupt number (aka inr or irq). |
* |
* @return IRQ structure of the respective device or NULL. |
*/ |
irq_t *irq_dispatch_and_lock(inr_t inr) |
{ |
link_t *lnk; |
unative_t key[] = { |
(unative_t) inr, |
(unative_t) -1 /* search will use claim() instead of devno */ |
}; |
spinlock_lock(&irq_hash_table_lock); |
lnk = hash_table_find(&irq_hash_table, key); |
if (lnk) { |
irq_t *irq; |
irq = hash_table_get_instance(lnk, irq_t, link); |
spinlock_unlock(&irq_hash_table_lock); |
return irq; |
} |
spinlock_unlock(&irq_hash_table_lock); |
return NULL; |
} |
/** Find the IRQ structure corresponding to inr and devno. |
* |
* This functions attempts to lookup the IRQ structure |
* corresponding to its arguments. On success, this |
* function returns with interrups disabled, holding |
* the lock of the respective IRQ structure. |
* |
* This function assumes interrupts are already disabled. |
* |
* @param inr INR being looked up. |
* @param devno Devno being looked up. |
* |
* @return Locked IRQ structure on success or NULL on failure. |
*/ |
irq_t *irq_find_and_lock(inr_t inr, devno_t devno) |
{ |
link_t *lnk; |
unative_t keys[] = { |
(unative_t) inr, |
(unative_t) devno |
}; |
spinlock_lock(&irq_hash_table_lock); |
lnk = hash_table_find(&irq_hash_table, keys); |
if (lnk) { |
irq_t *irq; |
irq = hash_table_get_instance(lnk, irq_t, link); |
spinlock_unlock(&irq_hash_table_lock); |
return irq; |
} |
spinlock_unlock(&irq_hash_table_lock); |
return NULL; |
} |
/** Compute hash index for the key. |
* |
* This function computes hash index into |
* the IRQ hash table for which there |
* can be collisions between different |
* INRs. |
* |
* The devno is not used to compute the hash. |
* |
* @param key The first of the keys is inr and the second is devno or -1. |
* |
* @return Index into the hash table. |
*/ |
index_t irq_ht_hash(unative_t key[]) |
{ |
inr_t inr = (inr_t) key[KEY_INR]; |
return inr % irq_hash_table.entries; |
} |
/** Compare hash table element with a key. |
* |
* There are two things to note about this function. |
* First, it is used for the more complex architecture setup |
* in which there are way too many interrupt numbers (i.e. inr's) |
* to arrange the hash table so that collisions occur only |
* among same inrs of different devnos. So the explicit check |
* for inr match must be done. |
* Second, if devno is -1, the second key (i.e. devno) is not |
* used for the match and the result of the claim() function |
* is used instead. |
* |
* This function assumes interrupts are already disabled. |
* |
* @param key Keys (i.e. inr and devno). |
* @param keys This is 2. |
* @param item The item to compare the key with. |
* |
* @return True on match or false otherwise. |
*/ |
bool irq_ht_compare(unative_t key[], count_t keys, link_t *item) |
{ |
irq_t *irq = hash_table_get_instance(item, irq_t, link); |
inr_t inr = (inr_t) key[KEY_INR]; |
devno_t devno = (devno_t) key[KEY_DEVNO]; |
bool rv; |
spinlock_lock(&irq->lock); |
if (devno == -1) { |
/* Invoked by irq_dispatch_and_lock(). */ |
rv = ((irq->inr == inr) && (irq->claim() == IRQ_ACCEPT)); |
} else { |
/* Invoked by irq_find_and_lock(). */ |
rv = ((irq->inr == inr) && (irq->devno == devno)); |
} |
/* unlock only on non-match */ |
if (!rv) |
spinlock_unlock(&irq->lock); |
return rv; |
} |
/** Compute hash index for the key. |
* |
* This function computes hash index into |
* the IRQ hash table for which there |
* are no collisions between different |
* INRs. |
* |
* @param key The first of the keys is inr and the second is devno or -1. |
* |
* @return Index into the hash table. |
*/ |
index_t irq_lin_hash(unative_t key[]) |
{ |
inr_t inr = (inr_t) key[KEY_INR]; |
return inr; |
} |
/** Compare hash table element with a key. |
* |
* There are two things to note about this function. |
* First, it is used for the less complex architecture setup |
* in which there are not too many interrupt numbers (i.e. inr's) |
* to arrange the hash table so that collisions occur only |
* among same inrs of different devnos. So the explicit check |
* for inr match is not done. |
* Second, if devno is -1, the second key (i.e. devno) is not |
* used for the match and the result of the claim() function |
* is used instead. |
* |
* This function assumes interrupts are already disabled. |
* |
* @param key Keys (i.e. inr and devno). |
* @param keys This is 2. |
* @param item The item to compare the key with. |
* |
* @return True on match or false otherwise. |
*/ |
bool irq_lin_compare(unative_t key[], count_t keys, link_t *item) |
{ |
irq_t *irq = list_get_instance(item, irq_t, link); |
devno_t devno = (devno_t) key[KEY_DEVNO]; |
bool rv; |
spinlock_lock(&irq->lock); |
if (devno == -1) { |
/* Invoked by irq_dispatch_and_lock() */ |
rv = (irq->claim() == IRQ_ACCEPT); |
} else { |
/* Invoked by irq_find_and_lock() */ |
rv = (irq->devno == devno); |
} |
/* unlock only on non-match */ |
if (!rv) |
spinlock_unlock(&irq->lock); |
return rv; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/ddi/ddi.c |
---|
0,0 → 1,271 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericddi |
* @{ |
*/ |
/** |
* @file |
* @brief Device Driver Interface functions. |
* |
* This file contains functions that comprise the Device Driver Interface. |
* These are the functions for mapping physical memory and enabling I/O |
* space to tasks. |
*/ |
#include <ddi/ddi.h> |
#include <ddi/ddi_arg.h> |
#include <proc/task.h> |
#include <security/cap.h> |
#include <mm/frame.h> |
#include <mm/as.h> |
#include <synch/spinlock.h> |
#include <syscall/copy.h> |
#include <adt/btree.h> |
#include <arch.h> |
#include <align.h> |
#include <errno.h> |
/** This lock protects the parea_btree. */ |
SPINLOCK_INITIALIZE(parea_lock); |
/** B+tree with enabled physical memory areas. */ |
static btree_t parea_btree; |
/** Initialize DDI. */ |
void ddi_init(void) |
{ |
btree_create(&parea_btree); |
} |
/** Enable piece of physical memory for mapping by physmem_map(). |
* |
* @param parea Pointer to physical area structure. |
* |
* @todo This function doesn't check for overlaps. It depends on the kernel to |
* create disjunct physical memory areas. |
*/ |
void ddi_parea_register(parea_t *parea) |
{ |
ipl_t ipl; |
ipl = interrupts_disable(); |
spinlock_lock(&parea_lock); |
/* |
* TODO: we should really check for overlaps here. |
* However, we should be safe because the kernel is pretty sane and |
* memory of different devices doesn't overlap. |
*/ |
btree_insert(&parea_btree, (btree_key_t) parea->pbase, parea, NULL); |
spinlock_unlock(&parea_lock); |
interrupts_restore(ipl); |
} |
/** Map piece of physical memory into virtual address space of current task. |
* |
* @param pf Physical address of the starting frame. |
* @param vp Virtual address of the starting page. |
* @param pages Number of pages to map. |
* @param flags Address space area flags for the mapping. |
* |
* @return 0 on success, EPERM if the caller lacks capabilities to use this |
* syscall, ENOENT if there is no task matching the specified ID or the |
* physical address space is not enabled for mapping and ENOMEM if there |
* was a problem in creating address space area. |
*/ |
static int ddi_physmem_map(uintptr_t pf, uintptr_t vp, count_t pages, int flags) |
{ |
ipl_t ipl; |
cap_t caps; |
mem_backend_data_t backend_data; |
backend_data.base = pf; |
backend_data.frames = pages; |
/* |
* Make sure the caller is authorised to make this syscall. |
*/ |
caps = cap_get(TASK); |
if (!(caps & CAP_MEM_MANAGER)) |
return EPERM; |
ipl = interrupts_disable(); |
/* |
* Check if the physical memory area is enabled for mapping. |
* If the architecture supports virtually indexed caches, intercept |
* attempts to create an illegal address alias. |
*/ |
spinlock_lock(&parea_lock); |
parea_t *parea; |
btree_node_t *nodep; |
parea = (parea_t *) btree_search(&parea_btree, (btree_key_t) pf, &nodep); |
if (!parea || parea->frames < pages || ((flags & AS_AREA_CACHEABLE) && |
!parea->cacheable) || (!(flags & AS_AREA_CACHEABLE) && |
parea->cacheable)) { |
/* |
* This physical memory area cannot be mapped. |
*/ |
spinlock_unlock(&parea_lock); |
interrupts_restore(ipl); |
return ENOENT; |
} |
spinlock_unlock(&parea_lock); |
spinlock_lock(&TASK->lock); |
if (!as_area_create(TASK->as, flags, pages * PAGE_SIZE, vp, AS_AREA_ATTR_NONE, |
&phys_backend, &backend_data)) { |
/* |
* The address space area could not have been created. |
* We report it using ENOMEM. |
*/ |
spinlock_unlock(&TASK->lock); |
interrupts_restore(ipl); |
return ENOMEM; |
} |
/* |
* Mapping is created on-demand during page fault. |
*/ |
spinlock_unlock(&TASK->lock); |
interrupts_restore(ipl); |
return 0; |
} |
/** Enable range of I/O space for task. |
* |
* @param id Task ID of the destination task. |
* @param ioaddr Starting I/O address. |
* @param size Size of the enabled I/O space.. |
* |
* @return 0 on success, EPERM if the caller lacks capabilities to use this |
* syscall, ENOENT if there is no task matching the specified ID. |
*/ |
static int ddi_iospace_enable(task_id_t id, uintptr_t ioaddr, size_t size) |
{ |
ipl_t ipl; |
cap_t caps; |
task_t *t; |
int rc; |
/* |
* Make sure the caller is authorised to make this syscall. |
*/ |
caps = cap_get(TASK); |
if (!(caps & CAP_IO_MANAGER)) |
return EPERM; |
ipl = interrupts_disable(); |
spinlock_lock(&tasks_lock); |
t = task_find_by_id(id); |
if ((!t) || (!context_check(CONTEXT, t->context))) { |
/* |
* There is no task with the specified ID |
* or the task belongs to a different security |
* context. |
*/ |
spinlock_unlock(&tasks_lock); |
interrupts_restore(ipl); |
return ENOENT; |
} |
/* Lock the task and release the lock protecting tasks_btree. */ |
spinlock_lock(&t->lock); |
spinlock_unlock(&tasks_lock); |
rc = ddi_iospace_enable_arch(t, ioaddr, size); |
spinlock_unlock(&t->lock); |
interrupts_restore(ipl); |
return rc; |
} |
/** Wrapper for SYS_PHYSMEM_MAP syscall. |
* |
* @param phys_base Physical base address to map |
* @param virt_base Destination virtual address |
* @param pages Number of pages |
* @param flags Flags of newly mapped pages |
* |
* @return 0 on success, otherwise it returns error code found in errno.h |
*/ |
unative_t sys_physmem_map(unative_t phys_base, unative_t virt_base, |
unative_t pages, unative_t flags) |
{ |
return (unative_t) ddi_physmem_map(ALIGN_DOWN((uintptr_t) phys_base, |
FRAME_SIZE), ALIGN_DOWN((uintptr_t) virt_base, PAGE_SIZE), |
(count_t) pages, (int) flags); |
} |
/** Wrapper for SYS_ENABLE_IOSPACE syscall. |
* |
* @param uspace_io_arg User space address of DDI argument structure. |
* |
* @return 0 on success, otherwise it returns error code found in errno.h |
*/ |
unative_t sys_iospace_enable(ddi_ioarg_t *uspace_io_arg) |
{ |
ddi_ioarg_t arg; |
int rc; |
rc = copy_from_uspace(&arg, uspace_io_arg, sizeof(ddi_ioarg_t)); |
if (rc != 0) |
return (unative_t) rc; |
return (unative_t) ddi_iospace_enable((task_id_t) arg.task_id, |
(uintptr_t) arg.ioaddr, (size_t) arg.size); |
} |
/** Disable or enable preemption. |
* |
* @param enable If non-zero, the preemption counter will be decremented, |
* leading to potential enabling of preemption. Otherwise the preemption |
* counter will be incremented, preventing preemption from occurring. |
* |
* @return Zero on success or EPERM if callers capabilities are not sufficient. |
*/ |
unative_t sys_preempt_control(int enable) |
{ |
if (!cap_get(TASK) & CAP_PREEMPT_CONTROL) |
return EPERM; |
if (enable) |
preemption_enable(); |
else |
preemption_disable(); |
return 0; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/ddi/device.c |
---|
0,0 → 1,59 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericddi |
* @{ |
*/ |
/** |
* @file |
* @brief Device numbers. |
*/ |
#include <arch/types.h> |
#include <ddi/device.h> |
#include <atomic.h> |
#include <debug.h> |
static atomic_t last; |
/** Assign new device number. |
* |
* @return Unique device number. |
*/ |
devno_t device_assign_devno(void) |
{ |
devno_t devno; |
devno = (devno_t) atomic_postinc(&last); |
ASSERT(devno >= 0); |
return devno; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/cpu/cpu.c |
---|
0,0 → 1,113 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** |
* @file |
* @brief CPU subsystem initialization and listing. |
*/ |
#include <cpu.h> |
#include <arch.h> |
#include <arch/cpu.h> |
#include <mm/slab.h> |
#include <mm/page.h> |
#include <mm/frame.h> |
#include <arch/types.h> |
#include <config.h> |
#include <panic.h> |
#include <memstr.h> |
#include <adt/list.h> |
#include <print.h> |
cpu_t *cpus; |
/** Initialize CPUs |
* |
* Initialize kernel CPUs support. |
* |
*/ |
void cpu_init(void) { |
unsigned int i, j; |
#ifdef CONFIG_SMP |
if (config.cpu_active == 1) { |
#endif /* CONFIG_SMP */ |
cpus = (cpu_t *) malloc(sizeof(cpu_t) * config.cpu_count, |
FRAME_ATOMIC); |
if (!cpus) |
panic("malloc/cpus"); |
/* initialize everything */ |
memsetb((uintptr_t) cpus, sizeof(cpu_t) * config.cpu_count, 0); |
for (i = 0; i < config.cpu_count; i++) { |
cpus[i].stack = (uint8_t *) frame_alloc(STACK_FRAMES, FRAME_KA | FRAME_ATOMIC); |
cpus[i].id = i; |
spinlock_initialize(&cpus[i].lock, "cpu_t.lock"); |
for (j = 0; j < RQ_COUNT; j++) { |
spinlock_initialize(&cpus[i].rq[j].lock, "rq_t.lock"); |
list_initialize(&cpus[i].rq[j].rq_head); |
} |
} |
#ifdef CONFIG_SMP |
} |
#endif /* CONFIG_SMP */ |
CPU = &cpus[config.cpu_active-1]; |
CPU->active = 1; |
CPU->tlb_active = 1; |
cpu_identify(); |
cpu_arch_init(); |
} |
/** List all processors. */ |
void cpu_list(void) |
{ |
unsigned int i; |
for (i = 0; i < config.cpu_count; i++) { |
if (cpus[i].active) |
cpu_print_report(&cpus[i]); |
else |
printf("cpu%d: not active\n", i); |
} |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/security/cap.c |
---|
0,0 → 1,181 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** |
* @file cap.c |
* @brief Capabilities control. |
* |
* @see cap.h |
*/ |
#include <security/cap.h> |
#include <proc/task.h> |
#include <synch/spinlock.h> |
#include <syscall/sysarg64.h> |
#include <syscall/copy.h> |
#include <arch.h> |
#include <errno.h> |
/** Set capabilities. |
* |
* @param t Task whose capabilities are to be changed. |
* @param caps New set of capabilities. |
*/ |
void cap_set(task_t *t, cap_t caps) |
{ |
ipl_t ipl; |
ipl = interrupts_disable(); |
spinlock_lock(&t->lock); |
t->capabilities = caps; |
spinlock_unlock(&t->lock); |
interrupts_restore(ipl); |
} |
/** Get capabilities. |
* |
* @param t Task whose capabilities are to be returned. |
* @return Task's capabilities. |
*/ |
cap_t cap_get(task_t *t) |
{ |
ipl_t ipl; |
cap_t caps; |
ipl = interrupts_disable(); |
spinlock_lock(&t->lock); |
caps = t->capabilities; |
spinlock_unlock(&t->lock); |
interrupts_restore(ipl); |
return caps; |
} |
/** Grant capabilities to a task. |
* |
* The calling task must have the CAP_CAP capability. |
* |
* @param uspace_taskid_arg Userspace structure holding destination task ID. |
* @param caps Capabilities to grant. |
* |
* @return Zero on success or an error code from @ref errno.h. |
*/ |
unative_t sys_cap_grant(sysarg64_t *uspace_taskid_arg, cap_t caps) |
{ |
sysarg64_t taskid_arg; |
task_t *t; |
ipl_t ipl; |
int rc; |
if (!(cap_get(TASK) & CAP_CAP)) |
return (unative_t) EPERM; |
rc = copy_from_uspace(&taskid_arg, uspace_taskid_arg, sizeof(sysarg64_t)); |
if (rc != 0) |
return (unative_t) rc; |
ipl = interrupts_disable(); |
spinlock_lock(&tasks_lock); |
t = task_find_by_id((task_id_t) taskid_arg.value); |
if ((!t) || (!context_check(CONTEXT, t->context))) { |
spinlock_unlock(&tasks_lock); |
interrupts_restore(ipl); |
return (unative_t) ENOENT; |
} |
spinlock_lock(&t->lock); |
cap_set(t, cap_get(t) | caps); |
spinlock_unlock(&t->lock); |
spinlock_unlock(&tasks_lock); |
interrupts_restore(ipl); |
return 0; |
} |
/** Revoke capabilities from a task. |
* |
* The calling task must have the CAP_CAP capability or the caller must |
* attempt to revoke capabilities from itself. |
* |
* @param uspace_taskid_arg Userspace structure holding destination task ID. |
* @param caps Capabilities to revoke. |
* |
* @return Zero on success or an error code from @ref errno.h. |
*/ |
unative_t sys_cap_revoke(sysarg64_t *uspace_taskid_arg, cap_t caps) |
{ |
sysarg64_t taskid_arg; |
task_t *t; |
ipl_t ipl; |
int rc; |
rc = copy_from_uspace(&taskid_arg, uspace_taskid_arg, sizeof(sysarg64_t)); |
if (rc != 0) |
return (unative_t) rc; |
ipl = interrupts_disable(); |
spinlock_lock(&tasks_lock); |
t = task_find_by_id((task_id_t) taskid_arg.value); |
if ((!t) || (!context_check(CONTEXT, t->context))) { |
spinlock_unlock(&tasks_lock); |
interrupts_restore(ipl); |
return (unative_t) ENOENT; |
} |
/* |
* Revoking capabilities is different from granting them in that |
* a task can revoke capabilities from itself even if it |
* doesn't have CAP_CAP. |
*/ |
if (!(cap_get(TASK) & CAP_CAP) || !(t == TASK)) { |
spinlock_unlock(&tasks_lock); |
interrupts_restore(ipl); |
return (unative_t) EPERM; |
} |
spinlock_lock(&t->lock); |
cap_set(t, cap_get(t) & ~caps); |
spinlock_unlock(&t->lock); |
spinlock_unlock(&tasks_lock); |
interrupts_restore(ipl); |
return 0; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/sysinfo/sysinfo.c |
---|
0,0 → 1,313 |
/* |
* Copyright (c) 2006 Jakub Vana |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** @file |
*/ |
#include <sysinfo/sysinfo.h> |
#include <mm/slab.h> |
#include <print.h> |
#include <syscall/copy.h> |
sysinfo_item_t *_root = NULL; |
static sysinfo_item_t *sysinfo_find_item(const char *name, sysinfo_item_t *subtree) |
{ |
if (subtree == NULL) |
return NULL; |
while (subtree != NULL) { |
int i = 0; |
char *a = (char *) name; |
char *b = subtree->name; |
while ((a[i] == b[i]) && (b[i])) |
i++; |
if ((!a[i]) && (!b[i])) /* Last name in path matches */ |
return subtree; |
if ((a[i] == '.') && (!b[i])) { /* Middle name in path matches */ |
if (subtree->subinfo_type == SYSINFO_SUBINFO_TABLE) |
return sysinfo_find_item(a + i + 1, subtree->subinfo.table); |
//if (subtree->subinfo_type == SYSINFO_SUBINFO_FUNCTION) /* Subinfo managed by subsystem */ |
// return NULL; |
return NULL; /* No subinfo */ |
} |
/* No matches try next */ |
subtree = subtree->next; |
i = 0; |
} |
return NULL; |
} |
static sysinfo_item_t *sysinfo_create_path(const char *name, sysinfo_item_t **psubtree) |
{ |
sysinfo_item_t *subtree; |
subtree = *psubtree; |
if (subtree == NULL) { |
sysinfo_item_t *item = malloc(sizeof(sysinfo_item_t), 0); |
int i = 0, j; |
ASSERT(item); |
*psubtree = item; |
item->next = NULL; |
item->val_type = SYSINFO_VAL_UNDEFINED; |
item->subinfo.table = NULL; |
while (name[i] && (name[i] != '.')) |
i++; |
item->name = malloc(i, 0); |
ASSERT(item->name); |
for (j = 0; j < i; j++) |
item->name[j] = name[j]; |
item->name[j] = 0; |
if (name[i]) { /* =='.' */ |
item->subinfo_type = SYSINFO_SUBINFO_TABLE; |
return sysinfo_create_path(name + i + 1, &(item->subinfo.table)); |
} |
item->subinfo_type = SYSINFO_SUBINFO_NONE; |
return item; |
} |
while (subtree != NULL) { |
int i = 0, j; |
char *a = (char *) name; |
char *b = subtree->name; |
while ((a[i] == b[i]) && (b[i])) |
i++; |
if ((!a[i]) && (!b[i])) /* Last name in path matches */ |
return subtree; |
if ((a[i] == '.') && (!b[i])) { /* Middle name in path matches */ |
if (subtree->subinfo_type == SYSINFO_SUBINFO_TABLE) |
return sysinfo_create_path(a + i + 1, &(subtree->subinfo.table)); |
if (subtree->subinfo_type == SYSINFO_SUBINFO_NONE) { |
subtree->subinfo_type = SYSINFO_SUBINFO_TABLE; |
return sysinfo_create_path(a + i + 1,&(subtree->subinfo.table)); |
} |
//if (subtree->subinfo_type == SYSINFO_SUBINFO_FUNCTION) /* Subinfo managed by subsystem */ |
// return NULL; |
return NULL; |
} |
/* No matches try next or create new*/ |
if (subtree->next == NULL) { |
sysinfo_item_t *item = malloc(sizeof(sysinfo_item_t), 0); |
ASSERT(item); |
subtree->next = item; |
item->next = NULL; |
item->val_type = SYSINFO_VAL_UNDEFINED; |
item->subinfo.table = NULL; |
i = 0; |
while (name[i] && (name[i] != '.')) |
i++; |
item->name = malloc(i, 0); |
ASSERT(item->name); |
for (j = 0; j < i; j++) |
item->name[j] = name[j]; |
item->name[j] = 0; |
if(name[i]) { /* =='.' */ |
item->subinfo_type = SYSINFO_SUBINFO_TABLE; |
return sysinfo_create_path(name + i + 1, &(item->subinfo.table)); |
} |
item->subinfo_type = SYSINFO_SUBINFO_NONE; |
return item; |
} else { |
subtree = subtree->next; |
i = 0; |
} |
} |
panic("Not reached\n"); |
return NULL; |
} |
void sysinfo_set_item_val(const char *name, sysinfo_item_t **root, unative_t val) |
{ |
if (root == NULL) |
root = &_root; |
/* If already created create only returns pointer |
If not, create it */ |
sysinfo_item_t *item = sysinfo_create_path(name, root); |
if (item != NULL) { /* If in subsystem, unable to create or return so unable to set */ |
item->val.val=val; |
item->val_type = SYSINFO_VAL_VAL; |
} |
} |
void sysinfo_set_item_function(const char *name, sysinfo_item_t **root, sysinfo_val_fn_t fn) |
{ |
if (root == NULL) |
root = &_root; |
/* If already created create only returns pointer |
If not, create it */ |
sysinfo_item_t *item = sysinfo_create_path(name, root); |
if (item != NULL) { /* If in subsystem, unable to create or return so unable to set */ |
item->val.fn=fn; |
item->val_type = SYSINFO_VAL_FUNCTION; |
} |
} |
void sysinfo_set_item_undefined(const char *name, sysinfo_item_t **root) |
{ |
if (root == NULL) |
root = &_root; |
/* If already created create only returns pointer |
If not, create it */ |
sysinfo_item_t *item = sysinfo_create_path(name, root); |
if (item != NULL) |
item->val_type = SYSINFO_VAL_UNDEFINED; |
} |
void sysinfo_dump(sysinfo_item_t **proot, int depth) |
{ |
sysinfo_item_t *root; |
if (proot == NULL) |
proot = &_root; |
root = *proot; |
while (root != NULL) { |
int i; |
unative_t val = 0; |
char *vtype = NULL; |
for (i = 0; i < depth; i++) |
printf(" "); |
switch (root->val_type) { |
case SYSINFO_VAL_UNDEFINED: |
val = 0; |
vtype = "UND"; |
break; |
case SYSINFO_VAL_VAL: |
val = root->val.val; |
vtype = "VAL"; |
break; |
case SYSINFO_VAL_FUNCTION: |
val = ((sysinfo_val_fn_t) (root->val.fn)) (root); |
vtype = "FUN"; |
break; |
} |
printf("%s %s val:%d(%x) sub:%s\n", root->name, vtype, val, |
val, (root->subinfo_type == SYSINFO_SUBINFO_NONE) ? |
"NON" : ((root->subinfo_type == SYSINFO_SUBINFO_TABLE) ? |
"TAB" : "FUN")); |
if (root->subinfo_type == SYSINFO_SUBINFO_TABLE) |
sysinfo_dump(&(root -> subinfo.table), depth + 1); |
root = root->next; |
} |
} |
sysinfo_rettype_t sysinfo_get_val(const char *name, sysinfo_item_t **root) |
{ |
// TODO: Implement Subsystem subinfo (by function implemented subinfo) |
sysinfo_rettype_t ret = {0, false}; |
if (root == NULL) |
root = &_root; |
sysinfo_item_t *item = sysinfo_find_item(name, *root); |
if (item != NULL) { |
if (item->val_type == SYSINFO_VAL_UNDEFINED) |
return ret; |
else |
ret.valid = true; |
if (item->val_type == SYSINFO_VAL_VAL) |
ret.val = item->val.val; |
else |
ret.val = ((sysinfo_val_fn_t) (item->val.fn)) (item); |
} |
return ret; |
} |
unative_t sys_sysinfo_valid(unative_t ptr, unative_t len) |
{ |
char *str; |
sysinfo_rettype_t ret = {0, 0}; |
str = malloc(len + 1, 0); |
ASSERT(str); |
if (!((copy_from_uspace(str, (void *) ptr, len + 1)) || (str[len]))) |
ret = sysinfo_get_val(str, NULL); |
free(str); |
return ret.valid; |
} |
unative_t sys_sysinfo_value(unative_t ptr, unative_t len) |
{ |
char *str; |
sysinfo_rettype_t ret = {0, 0}; |
str = malloc(len + 1, 0); |
ASSERT(str); |
if (!((copy_from_uspace(str, (void *) ptr, len + 1)) || (str[len]))) |
ret = sysinfo_get_val(str, NULL); |
free(str); |
return ret.val; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/smp/smp.c |
---|
0,0 → 1,46 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** |
* @file |
*/ |
#include <smp/smp.h> |
#ifdef CONFIG_SMP |
waitq_t ap_completion_wq; |
#endif /* CONFIG_SMP */ |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/smp/ipi.c |
---|
0,0 → 1,70 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** |
* @file |
* @brief Generic IPI interface. |
*/ |
#ifdef CONFIG_SMP |
#include <smp/ipi.h> |
#include <config.h> |
/** Broadcast IPI message |
* |
* Broadcast IPI message to all CPUs. |
* |
* @param ipi Message to broadcast. |
* |
* @bug The decision whether to actually send the IPI must be based |
* on a different criterion. The current version has |
* problems when some of the detected CPUs are marked |
* disabled in machine configuration. |
*/ |
void ipi_broadcast(int ipi) |
{ |
/* |
* Provisions must be made to avoid sending IPI: |
* - before all CPU's were configured to accept the IPI |
* - if there is only one CPU but the kernel was compiled with CONFIG_SMP |
*/ |
if ((config.cpu_active > 1) && (config.cpu_active == config.cpu_count)) |
ipi_broadcast_arch(ipi); |
} |
#endif /* CONFIG_SMP */ |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/src/preempt/preemption.c |
---|
0,0 → 1,60 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** |
* @file preemption.c |
* @brief Preemption control. |
*/ |
#include <preemption.h> |
#include <arch.h> |
#include <arch/asm.h> |
#include <arch/barrier.h> |
#include <debug.h> |
/** Increment preemption disabled counter. */ |
void preemption_disable(void) |
{ |
THE->preemption_disabled++; |
memory_barrier(); |
} |
/** Decrement preemption disabled counter. */ |
void preemption_enable(void) |
{ |
ASSERT(THE->preemption_disabled); |
memory_barrier(); |
THE->preemption_disabled--; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/proc/tasklet.h |
---|
0,0 → 1,73 |
/* |
* Copyright (c) 2007 Jan Hudecek |
* Copyright (c) 2008 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericproc |
* @{ |
*/ |
/** @file tasklet.h |
* @brief Tasklets declarations |
*/ |
#ifndef KERN_TASKLET_H_ |
#define KERN_TASKLET_H_ |
#include <adt/list.h> |
/** Tasklet callback type */ |
typedef void (* tasklet_callback_t)(void *arg); |
/** Tasklet state */ |
typedef enum { |
NotActive, |
Scheduled, |
InProgress, |
Disabled |
} tasklet_state_t; |
/** Structure describing a tasklet */ |
typedef struct tasklet_descriptor { |
link_t link; |
/** Callback to call */ |
tasklet_callback_t callback; |
/** Argument passed to the callback */ |
void* arg; |
/** State of the tasklet */ |
tasklet_state_t state; |
} tasklet_descriptor_t; |
extern void tasklet_init(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/proc/task.h |
---|
0,0 → 1,140 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericproc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_TASK_H_ |
#define KERN_TASK_H_ |
#include <cpu.h> |
#include <ipc/ipc.h> |
#include <synch/spinlock.h> |
#include <synch/mutex.h> |
#include <synch/rwlock.h> |
#include <synch/futex.h> |
#include <adt/avl.h> |
#include <adt/btree.h> |
#include <adt/list.h> |
#include <security/cap.h> |
#include <arch/proc/task.h> |
#include <arch/proc/thread.h> |
#include <arch/context.h> |
#include <arch/fpu_context.h> |
#include <arch/cpu.h> |
#include <mm/tlb.h> |
#include <proc/scheduler.h> |
struct thread; |
/** Task structure. */ |
typedef struct task { |
/** Task's linkage for the tasks_tree AVL tree. */ |
avltree_node_t tasks_tree_node; |
/** Task lock. |
* |
* Must be acquired before threads_lock and thread lock of any of its |
* threads. |
*/ |
SPINLOCK_DECLARE(lock); |
char *name; |
/** List of threads contained in this task. */ |
link_t th_head; |
/** Address space. */ |
as_t *as; |
/** Unique identity of task. */ |
task_id_t taskid; |
/** Task security context. */ |
context_id_t context; |
/** Number of references (i.e. threads). */ |
atomic_t refcount; |
/** Number of threads that haven't exited yet. */ |
atomic_t lifecount; |
/** Task capabilities. */ |
cap_t capabilities; |
/* IPC stuff */ |
answerbox_t answerbox; /**< Communication endpoint */ |
phone_t phones[IPC_MAX_PHONES]; |
/** |
* Active asynchronous messages. It is used for limiting uspace to |
* certain extent. |
*/ |
atomic_t active_calls; |
/** Architecture specific task data. */ |
task_arch_t arch; |
/** |
* Serializes access to the B+tree of task's futexes. This mutex is |
* independent on the task spinlock. |
*/ |
mutex_t futexes_lock; |
/** B+tree of futexes referenced by this task. */ |
btree_t futexes; |
/** Accumulated accounting. */ |
uint64_t cycles; |
} task_t; |
SPINLOCK_EXTERN(tasks_lock); |
extern avltree_t tasks_tree; |
extern void task_init(void); |
extern void task_done(void); |
extern task_t *task_create(as_t *as, char *name); |
extern void task_destroy(task_t *t); |
extern task_t *task_run_program(void *program_addr, char *name); |
extern task_t *task_find_by_id(task_id_t id); |
extern int task_kill(task_id_t id); |
extern uint64_t task_get_accounting(task_t *t); |
extern void cap_set(task_t *t, cap_t caps); |
extern cap_t cap_get(task_t *t); |
#ifndef task_create_arch |
extern void task_create_arch(task_t *t); |
#endif |
#ifndef task_destroy_arch |
extern void task_destroy_arch(task_t *t); |
#endif |
extern unative_t sys_task_get_id(task_id_t *uspace_task_id); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/proc/thread.h |
---|
0,0 → 1,262 |
/* |
* Copyright (c) 2001-2007 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericproc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_THREAD_H_ |
#define KERN_THREAD_H_ |
#include <synch/waitq.h> |
#include <proc/task.h> |
#include <time/timeout.h> |
#include <cpu.h> |
#include <synch/rwlock.h> |
#include <synch/spinlock.h> |
#include <adt/avl.h> |
#include <mm/slab.h> |
#include <arch/cpu.h> |
#include <mm/tlb.h> |
#include <proc/uarg.h> |
#define THREAD_STACK_SIZE STACK_SIZE |
#define THREAD_NAME_BUFLEN 20 |
extern char *thread_states[]; |
/* Thread flags */ |
/** Thread cannot be migrated to another CPU. |
* |
* When using this flag, the caller must set cpu in the thread_t |
* structure manually before calling thread_ready (even on uniprocessor). |
*/ |
#define THREAD_FLAG_WIRED (1 << 0) |
/** Thread was migrated to another CPU and has not run yet. */ |
#define THREAD_FLAG_STOLEN (1 << 1) |
/** Thread executes in userspace. */ |
#define THREAD_FLAG_USPACE (1 << 2) |
/** Thread will be attached by the caller. */ |
#define THREAD_FLAG_NOATTACH (1 << 3) |
/** Thread states. */ |
typedef enum { |
/** It is an error, if thread is found in this state. */ |
Invalid, |
/** State of a thread that is currently executing on some CPU. */ |
Running, |
/** Thread in this state is waiting for an event. */ |
Sleeping, |
/** State of threads in a run queue. */ |
Ready, |
/** Threads are in this state before they are first readied. */ |
Entering, |
/** After a thread calls thread_exit(), it is put into Exiting state. */ |
Exiting, |
/** Threads that were not detached but exited are Lingering. */ |
Lingering |
} state_t; |
/** Thread structure. There is one per thread. */ |
typedef struct thread { |
link_t rq_link; /**< Run queue link. */ |
link_t wq_link; /**< Wait queue link. */ |
link_t th_link; /**< Links to threads within containing task. */ |
/** Threads linkage to the threads_tree. */ |
avltree_node_t threads_tree_node; |
/** Lock protecting thread structure. |
* |
* Protects the whole thread structure except list links above. |
*/ |
SPINLOCK_DECLARE(lock); |
char name[THREAD_NAME_BUFLEN]; |
/** Function implementing the thread. */ |
void (* thread_code)(void *); |
/** Argument passed to thread_code() function. */ |
void *thread_arg; |
/** |
* From here, the stored context is restored when the thread is |
* scheduled. |
*/ |
context_t saved_context; |
/** |
* From here, the stored timeout context is restored when sleep times |
* out. |
*/ |
context_t sleep_timeout_context; |
/** |
* From here, the stored interruption context is restored when sleep is |
* interrupted. |
*/ |
context_t sleep_interruption_context; |
/** If true, the thread can be interrupted from sleep. */ |
bool sleep_interruptible; |
/** Wait queue in which this thread sleeps. */ |
waitq_t *sleep_queue; |
/** Timeout used for timeoutable sleeping. */ |
timeout_t sleep_timeout; |
/** Flag signalling sleep timeout in progress. */ |
volatile int timeout_pending; |
/** |
* True if this thread is executing copy_from_uspace(). |
* False otherwise. |
*/ |
bool in_copy_from_uspace; |
/** |
* True if this thread is executing copy_to_uspace(). |
* False otherwise. |
*/ |
bool in_copy_to_uspace; |
/** |
* If true, the thread will not go to sleep at all and will call |
* thread_exit() before returning to userspace. |
*/ |
bool interrupted; |
/** If true, thread_join_timeout() cannot be used on this thread. */ |
bool detached; |
/** Waitq for thread_join_timeout(). */ |
waitq_t join_wq; |
/** Link used in the joiner_head list. */ |
link_t joiner_link; |
fpu_context_t *saved_fpu_context; |
int fpu_context_exists; |
/* |
* Defined only if thread doesn't run. |
* It means that fpu context is in CPU that last time executes this |
* thread. This disables migration. |
*/ |
int fpu_context_engaged; |
rwlock_type_t rwlock_holder_type; |
/** Callback fired in scheduler before the thread is put asleep. */ |
void (* call_me)(void *); |
/** Argument passed to call_me(). */ |
void *call_me_with; |
/** Thread's state. */ |
state_t state; |
/** Thread's flags. */ |
int flags; |
/** Thread's CPU. */ |
cpu_t *cpu; |
/** Containing task. */ |
task_t *task; |
/** Ticks before preemption. */ |
uint64_t ticks; |
/** Thread accounting. */ |
uint64_t cycles; |
/** Last sampled cycle. */ |
uint64_t last_cycle; |
/** Thread doesn't affect accumulated accounting. */ |
bool uncounted; |
/** Thread's priority. Implemented as index to CPU->rq */ |
int priority; |
/** Thread ID. */ |
thread_id_t tid; |
/** Architecture-specific data. */ |
thread_arch_t arch; |
/** Thread's kernel stack. */ |
uint8_t *kstack; |
} thread_t; |
/** Thread list lock. |
* |
* This lock protects the threads_tree. |
* Must be acquired before T.lock for each T of type thread_t. |
* |
*/ |
SPINLOCK_EXTERN(threads_lock); |
/** AVL tree containing all threads. */ |
extern avltree_t threads_tree; |
extern void thread_init(void); |
extern thread_t *thread_create(void (* func)(void *), void *arg, task_t *task, |
int flags, char *name, bool uncounted); |
extern void thread_attach(thread_t *t, task_t *task); |
extern void thread_ready(thread_t *t); |
extern void thread_exit(void) __attribute__((noreturn)); |
#ifndef thread_create_arch |
extern void thread_create_arch(thread_t *t); |
#endif |
#ifndef thr_constructor_arch |
extern void thr_constructor_arch(thread_t *t); |
#endif |
#ifndef thr_destructor_arch |
extern void thr_destructor_arch(thread_t *t); |
#endif |
extern void thread_sleep(uint32_t sec); |
extern void thread_usleep(uint32_t usec); |
#define thread_join(t) \ |
thread_join_timeout((t), SYNCH_NO_TIMEOUT, SYNCH_FLAGS_NONE) |
extern int thread_join_timeout(thread_t *t, uint32_t usec, int flags); |
extern void thread_detach(thread_t *t); |
extern void thread_register_call_me(void (* call_me)(void *), |
void *call_me_with); |
extern void thread_print_list(void); |
extern void thread_destroy(thread_t *t); |
extern void thread_update_accounting(void); |
extern bool thread_exists(thread_t *t); |
/** Fpu context slab cache. */ |
extern slab_cache_t *fpu_context_slab; |
/* Thread syscall prototypes. */ |
extern unative_t sys_thread_create(uspace_arg_t *uspace_uarg, char *uspace_name, thread_id_t *uspace_thread_id); |
extern unative_t sys_thread_exit(int uspace_status); |
extern unative_t sys_thread_get_id(thread_id_t *uspace_thread_id); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/proc/scheduler.h |
---|
0,0 → 1,72 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericproc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_SCHEDULER_H_ |
#define KERN_SCHEDULER_H_ |
#include <synch/spinlock.h> |
#include <time/clock.h> /* HZ */ |
#include <atomic.h> |
#include <adt/list.h> |
#define RQ_COUNT 16 |
#define NEEDS_RELINK_MAX (HZ) |
/** Scheduler run queue structure. */ |
typedef struct { |
SPINLOCK_DECLARE(lock); |
link_t rq_head; /**< List of ready threads. */ |
count_t n; /**< Number of threads in rq_ready. */ |
} runq_t; |
extern atomic_t nrdy; |
extern void scheduler_init(void); |
extern void scheduler_fpu_lazy_request(void); |
extern void scheduler(void); |
extern void kcpulb(void *arg); |
extern void sched_print_list(void); |
/* |
* To be defined by architectures: |
*/ |
extern void before_task_runs_arch(void); |
extern void before_thread_runs_arch(void); |
extern void after_thread_ran_arch(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/proc/uarg.h |
---|
0,0 → 1,52 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericproc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_UARG_H_ |
#define KERN_UARG_H_ |
/** Structure passed to uinit kernel thread as argument. */ |
typedef struct uspace_arg { |
void *uspace_entry; |
void *uspace_stack; |
void (* uspace_thread_function)(); |
void *uspace_thread_arg; |
struct uspace_arg *uspace_uarg; |
} uspace_arg_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/lib/elf.h |
---|
0,0 → 1,344 |
/* |
* Copyright (c) 2006 Sergey Bondari |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ELF_H_ |
#define KERN_ELF_H_ |
#include <arch/elf.h> |
#include <arch/types.h> |
/** |
* current ELF version |
*/ |
#define EV_CURRENT 1 |
/** |
* ELF types |
*/ |
#define ET_NONE 0 /* No type */ |
#define ET_REL 1 /* Relocatable file */ |
#define ET_EXEC 2 /* Executable */ |
#define ET_DYN 3 /* Shared object */ |
#define ET_CORE 4 /* Core */ |
#define ET_LOPROC 0xff00 /* Processor specific */ |
#define ET_HIPROC 0xffff /* Processor specific */ |
/** |
* ELF machine types |
*/ |
#define EM_NO 0 /* No machine */ |
#define EM_SPARC 2 /* SPARC */ |
#define EM_386 3 /* i386 */ |
#define EM_MIPS 8 /* MIPS RS3000 */ |
#define EM_MIPS_RS3_LE 10 /* MIPS RS3000 LE */ |
#define EM_PPC 20 /* PPC32 */ |
#define EM_PPC64 21 /* PPC64 */ |
#define EM_ARM 40 /* ARM */ |
#define EM_SPARCV9 43 /* SPARC64 */ |
#define EM_IA_64 50 /* IA-64 */ |
#define EM_X86_64 62 /* AMD64/EMT64 */ |
/** |
* ELF identification indexes |
*/ |
#define EI_MAG0 0 |
#define EI_MAG1 1 |
#define EI_MAG2 2 |
#define EI_MAG3 3 |
#define EI_CLASS 4 /* File class */ |
#define EI_DATA 5 /* Data encoding */ |
#define EI_VERSION 6 /* File version */ |
#define EI_OSABI 7 |
#define EI_ABIVERSION 8 |
#define EI_PAD 9 /* Start of padding bytes */ |
#define EI_NIDENT 16 /* ELF identification table size */ |
/** |
* ELF magic number |
*/ |
#define ELFMAG0 0x7f |
#define ELFMAG1 'E' |
#define ELFMAG2 'L' |
#define ELFMAG3 'F' |
/** |
* ELF file classes |
*/ |
#define ELFCLASSNONE 0 |
#define ELFCLASS32 1 |
#define ELFCLASS64 2 |
/** |
* ELF data encoding types |
*/ |
#define ELFDATANONE 0 |
#define ELFDATA2LSB 1 /* Least significant byte first (little endian) */ |
#define ELFDATA2MSB 2 /* Most signigicant byte first (big endian) */ |
/** |
* ELF error return codes |
*/ |
#define EE_OK 0 /* No error */ |
#define EE_INVALID 1 /* Invalid ELF image */ |
#define EE_MEMORY 2 /* Cannot allocate address space */ |
#define EE_INCOMPATIBLE 3 /* ELF image is not compatible with current architecture */ |
#define EE_UNSUPPORTED 4 /* Non-supported ELF (e.g. dynamic ELFs) */ |
#define EE_IRRECOVERABLE 5 |
/** |
* ELF section types |
*/ |
#define SHT_NULL 0 |
#define SHT_PROGBITS 1 |
#define SHT_SYMTAB 2 |
#define SHT_STRTAB 3 |
#define SHT_RELA 4 |
#define SHT_HASH 5 |
#define SHT_DYNAMIC 6 |
#define SHT_NOTE 7 |
#define SHT_NOBITS 8 |
#define SHT_REL 9 |
#define SHT_SHLIB 10 |
#define SHT_DYNSYM 11 |
#define SHT_LOOS 0x60000000 |
#define SHT_HIOS 0x6fffffff |
#define SHT_LOPROC 0x70000000 |
#define SHT_HIPROC 0x7fffffff |
#define SHT_LOUSER 0x80000000 |
#define SHT_HIUSER 0xffffffff |
/** |
* ELF section flags |
*/ |
#define SHF_WRITE 0x1 |
#define SHF_ALLOC 0x2 |
#define SHF_EXECINSTR 0x4 |
#define SHF_TLS 0x400 |
#define SHF_MASKPROC 0xf0000000 |
/** |
* Symbol binding |
*/ |
#define STB_LOCAL 0 |
#define STB_GLOBAL 1 |
#define STB_WEAK 2 |
#define STB_LOPROC 13 |
#define STB_HIPROC 15 |
/** |
* Symbol types |
*/ |
#define STT_NOTYPE 0 |
#define STT_OBJECT 1 |
#define STT_FUNC 2 |
#define STT_SECTION 3 |
#define STT_FILE 4 |
#define STT_LOPROC 13 |
#define STT_HIPROC 15 |
/** |
* Program segment types |
*/ |
#define PT_NULL 0 |
#define PT_LOAD 1 |
#define PT_DYNAMIC 2 |
#define PT_INTERP 3 |
#define PT_NOTE 4 |
#define PT_SHLIB 5 |
#define PT_PHDR 6 |
#define PT_LOPROC 0x70000000 |
#define PT_HIPROC 0x7fffffff |
/** |
* Program segment attributes. |
*/ |
#define PF_X 1 |
#define PF_W 2 |
#define PF_R 4 |
/** |
* ELF data types |
* |
* These types are found to be identical in both 32-bit and 64-bit |
* ELF object file specifications. They are the only types used |
* in ELF header. |
*/ |
typedef uint64_t elf_xword; |
typedef int64_t elf_sxword; |
typedef uint32_t elf_word; |
typedef int32_t elf_sword; |
typedef uint16_t elf_half; |
/** |
* 32-bit ELF data types. |
* |
* These types are specific for 32-bit format. |
*/ |
typedef uint32_t elf32_addr; |
typedef uint32_t elf32_off; |
/** |
* 64-bit ELF data types. |
* |
* These types are specific for 64-bit format. |
*/ |
typedef uint64_t elf64_addr; |
typedef uint64_t elf64_off; |
/** ELF header */ |
struct elf32_header { |
uint8_t e_ident[EI_NIDENT]; |
elf_half e_type; |
elf_half e_machine; |
elf_word e_version; |
elf32_addr e_entry; |
elf32_off e_phoff; |
elf32_off e_shoff; |
elf_word e_flags; |
elf_half e_ehsize; |
elf_half e_phentsize; |
elf_half e_phnum; |
elf_half e_shentsize; |
elf_half e_shnum; |
elf_half e_shstrndx; |
}; |
struct elf64_header { |
uint8_t e_ident[EI_NIDENT]; |
elf_half e_type; |
elf_half e_machine; |
elf_word e_version; |
elf64_addr e_entry; |
elf64_off e_phoff; |
elf64_off e_shoff; |
elf_word e_flags; |
elf_half e_ehsize; |
elf_half e_phentsize; |
elf_half e_phnum; |
elf_half e_shentsize; |
elf_half e_shnum; |
elf_half e_shstrndx; |
}; |
/* |
* ELF segment header. |
* Segments headers are also known as program headers. |
*/ |
struct elf32_segment_header { |
elf_word p_type; |
elf32_off p_offset; |
elf32_addr p_vaddr; |
elf32_addr p_paddr; |
elf_word p_filesz; |
elf_word p_memsz; |
elf_word p_flags; |
elf_word p_align; |
}; |
struct elf64_segment_header { |
elf_word p_type; |
elf_word p_flags; |
elf64_off p_offset; |
elf64_addr p_vaddr; |
elf64_addr p_paddr; |
elf_xword p_filesz; |
elf_xword p_memsz; |
elf_xword p_align; |
}; |
/* |
* ELF section header |
*/ |
struct elf32_section_header { |
elf_word sh_name; |
elf_word sh_type; |
elf_word sh_flags; |
elf32_addr sh_addr; |
elf32_off sh_offset; |
elf_word sh_size; |
elf_word sh_link; |
elf_word sh_info; |
elf_word sh_addralign; |
elf_word sh_entsize; |
}; |
struct elf64_section_header { |
elf_word sh_name; |
elf_word sh_type; |
elf_xword sh_flags; |
elf64_addr sh_addr; |
elf64_off sh_offset; |
elf_xword sh_size; |
elf_word sh_link; |
elf_word sh_info; |
elf_xword sh_addralign; |
elf_xword sh_entsize; |
}; |
/* |
* ELF symbol table entry |
*/ |
struct elf32_symbol { |
elf_word st_name; |
elf32_addr st_value; |
elf_word st_size; |
uint8_t st_info; |
uint8_t st_other; |
elf_half st_shndx; |
}; |
struct elf64_symbol { |
elf_word st_name; |
uint8_t st_info; |
uint8_t st_other; |
elf_half st_shndx; |
elf64_addr st_value; |
elf_xword st_size; |
}; |
#ifdef __32_BITS__ |
typedef struct elf32_header elf_header_t; |
typedef struct elf32_segment_header elf_segment_header_t; |
typedef struct elf32_section_header elf_section_header_t; |
typedef struct elf32_symbol elf_symbol_t; |
#endif |
#ifdef __64_BITS__ |
typedef struct elf64_header elf_header_t; |
typedef struct elf64_segment_header elf_segment_header_t; |
typedef struct elf64_section_header elf_section_header_t; |
typedef struct elf64_symbol elf_symbol_t; |
#endif |
extern char *elf_error(unsigned int rc); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/lib/rd.h |
---|
0,0 → 1,82 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericmm |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_RD_H_ |
#define KERN_RD_H_ |
#include <arch/types.h> |
/** |
* RAM disk version |
*/ |
#define RD_VERSION 1 |
/** |
* RAM disk magic number |
*/ |
#define RD_MAGIC_SIZE 4 |
#define RD_MAG0 'H' |
#define RD_MAG1 'O' |
#define RD_MAG2 'R' |
#define RD_MAG3 'D' |
/** |
* RAM disk data encoding types |
*/ |
#define RD_DATA_NONE 0 |
#define RD_DATA_LSB 1 /* Least significant byte first (little endian) */ |
#define RD_DATA_MSB 2 /* Most signigicant byte first (big endian) */ |
/** |
* RAM disk error return codes |
*/ |
#define RE_OK 0 /* No error */ |
#define RE_INVALID 1 /* Invalid RAM disk image */ |
#define RE_UNSUPPORTED 2 /* Non-supported image (e.g. wrong version) */ |
/** RAM disk header */ |
typedef struct { |
uint8_t magic[RD_MAGIC_SIZE]; |
uint8_t version; |
uint8_t data_type; |
uint32_t header_size; |
uint64_t data_size; |
} rd_header; |
extern int init_rd(rd_header * addr, size_t size); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/lib/objc.h |
---|
0,0 → 1,50 |
/* |
* Copyright (c) 2007 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_OBJC_H_ |
#define KERN_OBJC_H_ |
extern id class_create_instance(Class _class); |
extern id object_dispose(id object); |
@interface base_t { |
Class isa; |
} |
+ (id) new; |
- (id) free; |
@end |
#endif |
/tags/0.3.0/kernel/generic/include/lib/objc_ext.h |
---|
0,0 → 1,64 |
/* |
* Copyright (c) 2007 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_OBJC_EXT_H_ |
#define KERN_OBJC_EXT_H_ |
#include <arch/types.h> |
#include <arch/arg.h> |
extern void *stderr; |
extern void __assert_fail(const char *assertion, const char *file, unsigned int line, const char *function); |
extern void abort(void); |
extern void *fopen(const char *path, const char *mode); |
extern size_t fread(void *ptr, size_t size, size_t nmemb, void *stream); |
extern size_t fwrite(const void *ptr, size_t size, size_t nmemb, void *stream); |
extern int fflush(void *stream); |
extern int feof(void *stream); |
extern int fclose(void *stream); |
extern int vfprintf(void *stream, const char *format, va_list ap); |
extern int sscanf(const char *str, const char *format, ...); |
extern const unsigned short **__ctype_b_loc(void); |
extern long int __strtol_internal(const char *__nptr, char **__endptr, int __base, int __group); |
extern void *memset(void *s, int c, size_t n); |
extern void *calloc(size_t nmemb, size_t size); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/mm/slab.h |
---|
0,0 → 1,147 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericmm |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_SLAB_H_ |
#define KERN_SLAB_H_ |
#include <adt/list.h> |
#include <synch/spinlock.h> |
#include <atomic.h> |
#include <mm/frame.h> |
/** Minimum size to be allocated by malloc */ |
#define SLAB_MIN_MALLOC_W 4 |
/** Maximum size to be allocated by malloc */ |
#define SLAB_MAX_MALLOC_W 18 |
/** Initial Magazine size (TODO: dynamically growing magazines) */ |
#define SLAB_MAG_SIZE 4 |
/** If object size is less, store control structure inside SLAB */ |
#define SLAB_INSIDE_SIZE (PAGE_SIZE >> 3) |
/** Maximum wasted space we allow for cache */ |
#define SLAB_MAX_BADNESS(cache) (((unsigned int) PAGE_SIZE << (cache)->order) >> 2) |
/* slab_reclaim constants */ |
/** Reclaim all possible memory, because we are in memory stress */ |
#define SLAB_RECLAIM_ALL 0x1 |
/* cache_create flags */ |
/** Do not use per-cpu cache */ |
#define SLAB_CACHE_NOMAGAZINE 0x1 |
/** Have control structure inside SLAB */ |
#define SLAB_CACHE_SLINSIDE 0x2 |
/** We add magazine cache later, if we have this flag */ |
#define SLAB_CACHE_MAGDEFERRED (0x4 | SLAB_CACHE_NOMAGAZINE) |
typedef struct { |
link_t link; |
count_t busy; /**< Count of full slots in magazine */ |
count_t size; /**< Number of slots in magazine */ |
void *objs[]; /**< Slots in magazine */ |
} slab_magazine_t; |
typedef struct { |
slab_magazine_t *current; |
slab_magazine_t *last; |
SPINLOCK_DECLARE(lock); |
} slab_mag_cache_t; |
typedef struct { |
char *name; |
link_t link; |
/* Configuration */ |
/** Size of slab position - align_up(sizeof(obj)) */ |
size_t size; |
int (*constructor)(void *obj, int kmflag); |
int (*destructor)(void *obj); |
/** Flags changing behaviour of cache */ |
int flags; |
/* Computed values */ |
uint8_t order; /**< Order of frames to be allocated */ |
unsigned int objects; /**< Number of objects that fit in */ |
/* Statistics */ |
atomic_t allocated_slabs; |
atomic_t allocated_objs; |
atomic_t cached_objs; |
/** How many magazines in magazines list */ |
atomic_t magazine_counter; |
/* Slabs */ |
link_t full_slabs; /**< List of full slabs */ |
link_t partial_slabs; /**< List of partial slabs */ |
SPINLOCK_DECLARE(slablock); |
/* Magazines */ |
link_t magazines; /**< List o full magazines */ |
SPINLOCK_DECLARE(maglock); |
/** CPU cache */ |
slab_mag_cache_t *mag_cache; |
} slab_cache_t; |
extern slab_cache_t * slab_cache_create(char *name, size_t size, size_t align, |
int (*constructor)(void *obj, int kmflag), int (*destructor)(void *obj), |
int flags); |
extern void slab_cache_destroy(slab_cache_t *cache); |
extern void * slab_alloc(slab_cache_t *cache, int flags); |
extern void slab_free(slab_cache_t *cache, void *obj); |
extern count_t slab_reclaim(int flags); |
/* slab subsytem initialization */ |
extern void slab_cache_init(void); |
extern void slab_enable_cpucache(void); |
/* kconsole debug */ |
extern void slab_print_list(void); |
/* malloc support */ |
extern void * malloc(unsigned int size, int flags); |
extern void * realloc(void *ptr, unsigned int size, int flags); |
extern void free(void *ptr); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/mm/as.h |
---|
0,0 → 1,317 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericmm |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_AS_H_ |
#define KERN_AS_H_ |
/** Address space area flags. */ |
#define AS_AREA_READ 1 |
#define AS_AREA_WRITE 2 |
#define AS_AREA_EXEC 4 |
#define AS_AREA_CACHEABLE 8 |
#ifdef KERNEL |
#include <arch/mm/page.h> |
#include <arch/mm/as.h> |
#include <arch/mm/asid.h> |
#include <arch/types.h> |
#include <synch/spinlock.h> |
#include <synch/mutex.h> |
#include <adt/list.h> |
#include <adt/btree.h> |
#include <lib/elf.h> |
#ifdef __OBJC__ |
#include <lib/objc.h> |
#endif |
/** |
* Defined to be true if user address space and kernel address space shadow each |
* other. |
*/ |
#define KERNEL_ADDRESS_SPACE_SHADOWED KERNEL_ADDRESS_SPACE_SHADOWED_ARCH |
#define KERNEL_ADDRESS_SPACE_START KERNEL_ADDRESS_SPACE_START_ARCH |
#define KERNEL_ADDRESS_SPACE_END KERNEL_ADDRESS_SPACE_END_ARCH |
#define USER_ADDRESS_SPACE_START USER_ADDRESS_SPACE_START_ARCH |
#define USER_ADDRESS_SPACE_END USER_ADDRESS_SPACE_END_ARCH |
#define USTACK_ADDRESS USTACK_ADDRESS_ARCH |
/** Kernel address space. */ |
#define FLAG_AS_KERNEL (1 << 0) |
/* Address space area attributes. */ |
#define AS_AREA_ATTR_NONE 0 |
#define AS_AREA_ATTR_PARTIAL 1 /**< Not fully initialized area. */ |
/** The page fault was not resolved by as_page_fault(). */ |
#define AS_PF_FAULT 0 |
/** The page fault was resolved by as_page_fault(). */ |
#define AS_PF_OK 1 |
/** The page fault was caused by memcpy_from_uspace() or memcpy_to_uspace(). */ |
#define AS_PF_DEFER 2 |
#ifdef __OBJC__ |
@interface as_t : base_t { |
@public |
/** Protected by asidlock. */ |
link_t inactive_as_with_asid_link; |
/** |
* Number of processors on wich is this address space active. |
* Protected by asidlock. |
*/ |
count_t cpu_refcount; |
/** |
* Address space identifier. |
* Constant on architectures that do not support ASIDs. |
* Protected by asidlock. |
*/ |
asid_t asid; |
/** Number of references (i.e tasks that reference this as). */ |
atomic_t refcount; |
mutex_t lock; |
/** B+tree of address space areas. */ |
btree_t as_area_btree; |
/** Non-generic content. */ |
as_genarch_t genarch; |
/** Architecture specific content. */ |
as_arch_t arch; |
} |
+ (pte_t *) page_table_create: (int) flags; |
+ (void) page_table_destroy: (pte_t *) page_table; |
- (void) page_table_lock: (bool) _lock; |
- (void) page_table_unlock: (bool) unlock; |
@end |
#else |
/** Address space structure. |
* |
* as_t contains the list of as_areas of userspace accessible |
* pages for one or more tasks. Ranges of kernel memory pages are not |
* supposed to figure in the list as they are shared by all tasks and |
* set up during system initialization. |
*/ |
typedef struct as { |
/** Protected by asidlock. */ |
link_t inactive_as_with_asid_link; |
/** |
* Number of processors on wich is this address space active. |
* Protected by asidlock. |
*/ |
count_t cpu_refcount; |
/** |
* Address space identifier. |
* Constant on architectures that do not support ASIDs. |
* Protected by asidlock. |
*/ |
asid_t asid; |
/** Number of references (i.e tasks that reference this as). */ |
atomic_t refcount; |
mutex_t lock; |
/** B+tree of address space areas. */ |
btree_t as_area_btree; |
/** Non-generic content. */ |
as_genarch_t genarch; |
/** Architecture specific content. */ |
as_arch_t arch; |
} as_t; |
typedef struct { |
pte_t *(* page_table_create)(int flags); |
void (* page_table_destroy)(pte_t *page_table); |
void (* page_table_lock)(as_t *as, bool lock); |
void (* page_table_unlock)(as_t *as, bool unlock); |
} as_operations_t; |
#endif |
/** |
* This structure contains information associated with the shared address space |
* area. |
*/ |
typedef struct { |
/** This lock must be acquired only when the as_area lock is held. */ |
mutex_t lock; |
/** This structure can be deallocated if refcount drops to 0. */ |
count_t refcount; |
/** |
* B+tree containing complete map of anonymous pages of the shared area. |
*/ |
btree_t pagemap; |
} share_info_t; |
/** Page fault access type. */ |
typedef enum { |
PF_ACCESS_READ, |
PF_ACCESS_WRITE, |
PF_ACCESS_EXEC |
} pf_access_t; |
struct mem_backend; |
/** Backend data stored in address space area. */ |
typedef union mem_backend_data { |
struct { /**< elf_backend members */ |
elf_header_t *elf; |
elf_segment_header_t *segment; |
}; |
struct { /**< phys_backend members */ |
uintptr_t base; |
count_t frames; |
}; |
} mem_backend_data_t; |
/** Address space area structure. |
* |
* Each as_area_t structure describes one contiguous area of virtual memory. |
*/ |
typedef struct { |
mutex_t lock; |
/** Containing address space. */ |
as_t *as; |
/** |
* Flags related to the memory represented by the address space area. |
*/ |
int flags; |
/** Attributes related to the address space area itself. */ |
int attributes; |
/** Size of this area in multiples of PAGE_SIZE. */ |
count_t pages; |
/** Base address of this area. */ |
uintptr_t base; |
/** Map of used space. */ |
btree_t used_space; |
/** |
* If the address space area has been shared, this pointer will |
* reference the share info structure. |
*/ |
share_info_t *sh_info; |
/** Memory backend backing this address space area. */ |
struct mem_backend *backend; |
/** Data to be used by the backend. */ |
mem_backend_data_t backend_data; |
} as_area_t; |
/** Address space area backend structure. */ |
typedef struct mem_backend { |
int (* page_fault)(as_area_t *area, uintptr_t addr, pf_access_t access); |
void (* frame_free)(as_area_t *area, uintptr_t page, uintptr_t frame); |
void (* share)(as_area_t *area); |
} mem_backend_t; |
extern as_t *AS_KERNEL; |
#ifndef __OBJC__ |
extern as_operations_t *as_operations; |
#endif |
extern link_t inactive_as_with_asid_head; |
extern void as_init(void); |
extern as_t *as_create(int flags); |
extern void as_destroy(as_t *as); |
extern void as_switch(as_t *old_as, as_t *new_as); |
extern int as_page_fault(uintptr_t page, pf_access_t access, istate_t *istate); |
extern as_area_t *as_area_create(as_t *as, int flags, size_t size, |
uintptr_t base, int attrs, mem_backend_t *backend, |
mem_backend_data_t *backend_data); |
extern int as_area_destroy(as_t *as, uintptr_t address); |
extern int as_area_resize(as_t *as, uintptr_t address, size_t size, int flags); |
int as_area_share(as_t *src_as, uintptr_t src_base, size_t acc_size, |
as_t *dst_as, uintptr_t dst_base, int dst_flags_mask); |
extern int as_area_get_flags(as_area_t *area); |
extern bool as_area_check_access(as_area_t *area, pf_access_t access); |
extern size_t as_area_get_size(uintptr_t base); |
extern int used_space_insert(as_area_t *a, uintptr_t page, count_t count); |
extern int used_space_remove(as_area_t *a, uintptr_t page, count_t count); |
/* Interface to be implemented by architectures. */ |
#ifndef as_constructor_arch |
extern int as_constructor_arch(as_t *as, int flags); |
#endif /* !def as_constructor_arch */ |
#ifndef as_destructor_arch |
extern int as_destructor_arch(as_t *as); |
#endif /* !def as_destructor_arch */ |
#ifndef as_create_arch |
extern int as_create_arch(as_t *as, int flags); |
#endif /* !def as_create_arch */ |
#ifndef as_install_arch |
extern void as_install_arch(as_t *as); |
#endif /* !def as_install_arch */ |
#ifndef as_deinstall_arch |
extern void as_deinstall_arch(as_t *as); |
#endif /* !def as_deinstall_arch */ |
/* Backend declarations and functions. */ |
extern mem_backend_t anon_backend; |
extern mem_backend_t elf_backend; |
extern mem_backend_t phys_backend; |
extern unsigned int elf_load(elf_header_t *header, as_t *as); |
/* Address space area related syscalls. */ |
extern unative_t sys_as_area_create(uintptr_t address, size_t size, int flags); |
extern unative_t sys_as_area_resize(uintptr_t address, size_t size, int flags); |
extern unative_t sys_as_area_destroy(uintptr_t address); |
/* Introspection functions. */ |
extern void as_print(as_t *as); |
#endif /* KERNEL */ |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/mm/frame.h |
---|
0,0 → 1,129 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* Copyright (c) 2005 Sergey Bondari |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericmm |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_FRAME_H_ |
#define KERN_FRAME_H_ |
#include <arch/types.h> |
#include <adt/list.h> |
#include <synch/spinlock.h> |
#include <mm/buddy.h> |
#include <arch/mm/page.h> |
#include <arch/mm/frame.h> |
#define ONE_FRAME 0 |
#define TWO_FRAMES 1 |
#define FOUR_FRAMES 2 |
#ifdef ARCH_STACK_FRAMES |
#define STACK_FRAMES ARCH_STACK_FRAMES |
#else |
#define STACK_FRAMES ONE_FRAME |
#endif |
/** Maximum number of zones in system. */ |
#define ZONES_MAX 16 |
/** If possible, merge with neighbouring zones. */ |
#define ZONE_JOIN 0x1 |
/** Convert the frame address to kernel va. */ |
#define FRAME_KA 0x1 |
/** Do not panic and do not sleep on failure. */ |
#define FRAME_ATOMIC 0x2 |
/** Do not start reclaiming when no free memory. */ |
#define FRAME_NO_RECLAIM 0x4 |
static inline uintptr_t PFN2ADDR(pfn_t frame) |
{ |
return (uintptr_t) (frame << FRAME_WIDTH); |
} |
static inline pfn_t ADDR2PFN(uintptr_t addr) |
{ |
return (pfn_t) (addr >> FRAME_WIDTH); |
} |
static inline count_t SIZE2FRAMES(size_t size) |
{ |
if (!size) |
return 0; |
return (count_t) ((size - 1) >> FRAME_WIDTH) + 1; |
} |
static inline size_t FRAMES2SIZE(count_t frames) |
{ |
return (size_t) (frames << FRAME_WIDTH); |
} |
#define IS_BUDDY_ORDER_OK(index, order) \ |
((~(((unative_t) -1) << (order)) & (index)) == 0) |
#define IS_BUDDY_LEFT_BLOCK(zone, frame) \ |
(((frame_index((zone), (frame)) >> (frame)->buddy_order) & 0x1) == 0) |
#define IS_BUDDY_RIGHT_BLOCK(zone, frame) \ |
(((frame_index((zone), (frame)) >> (frame)->buddy_order) & 0x1) == 1) |
#define IS_BUDDY_LEFT_BLOCK_ABS(zone, frame) \ |
(((frame_index_abs((zone), (frame)) >> (frame)->buddy_order) & 0x1) == 0) |
#define IS_BUDDY_RIGHT_BLOCK_ABS(zone, frame) \ |
(((frame_index_abs((zone), (frame)) >> (frame)->buddy_order) & 0x1) == 1) |
#define frame_alloc(order, flags) \ |
frame_alloc_generic(order, flags, NULL) |
extern void frame_init(void); |
extern void *frame_alloc_generic(uint8_t order, int flags, unsigned int *pzone); |
extern void frame_free(uintptr_t frame); |
extern void frame_reference_add(pfn_t pfn); |
extern int zone_create(pfn_t start, count_t count, pfn_t confframe, int flags); |
extern void *frame_get_parent(pfn_t frame, unsigned int hint); |
extern void frame_set_parent(pfn_t frame, void *data, unsigned int hint); |
extern void frame_mark_unavailable(pfn_t start, count_t count); |
extern uintptr_t zone_conf_size(count_t count); |
extern void zone_merge(unsigned int z1, unsigned int z2); |
extern void zone_merge_all(void); |
extern uint64_t zone_total_size(void); |
/* |
* Console functions |
*/ |
extern void zone_print_list(void); |
extern void zone_print_one(unsigned int znum); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/mm/mm.h |
---|
0,0 → 1,67 |
/* |
* Copyright (c) 2007 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericmm |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_MM_H_ |
#define KERN_MM_H_ |
#define PAGE_CACHEABLE_SHIFT 0 |
#define PAGE_NOT_CACHEABLE_SHIFT PAGE_CACHEABLE_SHIFT |
#define PAGE_PRESENT_SHIFT 1 |
#define PAGE_NOT_PRESENT_SHIFT PAGE_PRESENT_SHIFT |
#define PAGE_USER_SHIFT 2 |
#define PAGE_KERNEL_SHIFT PAGE_USER_SHIFT |
#define PAGE_READ_SHIFT 3 |
#define PAGE_WRITE_SHIFT 4 |
#define PAGE_EXEC_SHIFT 5 |
#define PAGE_GLOBAL_SHIFT 6 |
#define PAGE_NOT_CACHEABLE (0 << PAGE_CACHEABLE_SHIFT) |
#define PAGE_CACHEABLE (1 << PAGE_CACHEABLE_SHIFT) |
#define PAGE_PRESENT (0 << PAGE_PRESENT_SHIFT) |
#define PAGE_NOT_PRESENT (1 << PAGE_PRESENT_SHIFT) |
#define PAGE_USER (1 << PAGE_USER_SHIFT) |
#define PAGE_KERNEL (0 << PAGE_USER_SHIFT) |
#define PAGE_READ (1 << PAGE_READ_SHIFT) |
#define PAGE_WRITE (1 << PAGE_WRITE_SHIFT) |
#define PAGE_EXEC (1 << PAGE_EXEC_SHIFT) |
#define PAGE_GLOBAL (1 << PAGE_GLOBAL_SHIFT) |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/mm/page.h |
---|
0,0 → 1,72 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericmm |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_PAGE_H_ |
#define KERN_PAGE_H_ |
#include <arch/types.h> |
#include <mm/as.h> |
#include <memstr.h> |
/** |
* Macro for computing page color. |
*/ |
#define PAGE_COLOR(va) (((va) >> PAGE_WIDTH) & ((1 << PAGE_COLOR_BITS) - 1)) |
/** Operations to manipulate page mappings. */ |
typedef struct { |
void (* mapping_insert)(as_t *as, uintptr_t page, uintptr_t frame, |
int flags); |
void (* mapping_remove)(as_t *as, uintptr_t page); |
pte_t *(* mapping_find)(as_t *as, uintptr_t page); |
} page_mapping_operations_t; |
extern page_mapping_operations_t *page_mapping_operations; |
extern void page_init(void); |
extern void page_table_lock(as_t *as, bool lock); |
extern void page_table_unlock(as_t *as, bool unlock); |
extern void page_mapping_insert(as_t *as, uintptr_t page, uintptr_t frame, |
int flags); |
extern void page_mapping_remove(as_t *as, uintptr_t page); |
extern pte_t *page_mapping_find(as_t *as, uintptr_t page); |
extern pte_t *page_table_create(int flags); |
extern void page_table_destroy(pte_t *page_table); |
extern void map_structure(uintptr_t s, size_t size); |
extern uintptr_t hw_map(uintptr_t physaddr, size_t size); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/mm/tlb.h |
---|
0,0 → 1,91 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericmm |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_TLB_H_ |
#define KERN_TLB_H_ |
#include <arch/mm/asid.h> |
#include <arch/types.h> |
/** |
* Number of TLB shootdown messages that can be queued in processor tlb_messages |
* queue. |
*/ |
#define TLB_MESSAGE_QUEUE_LEN 10 |
/** Type of TLB shootdown message. */ |
typedef enum { |
/** Invalid type. */ |
TLB_INVL_INVALID = 0, |
/** Invalidate all entries in TLB. */ |
TLB_INVL_ALL, |
/** Invalidate all entries belonging to one address space. */ |
TLB_INVL_ASID, |
/** Invalidate specified page range belonging to one address space. */ |
TLB_INVL_PAGES |
} tlb_invalidate_type_t; |
/** TLB shootdown message. */ |
typedef struct { |
tlb_invalidate_type_t type; /**< Message type. */ |
asid_t asid; /**< Address space identifier. */ |
uintptr_t page; /**< Page address. */ |
count_t count; /**< Number of pages to invalidate. */ |
} tlb_shootdown_msg_t; |
extern void tlb_init(void); |
#ifdef CONFIG_SMP |
extern void tlb_shootdown_start(tlb_invalidate_type_t type, asid_t asid, |
uintptr_t page, count_t count); |
extern void tlb_shootdown_finalize(void); |
extern void tlb_shootdown_ipi_recv(void); |
#else |
#define tlb_shootdown_start(w, x, y, z) |
#define tlb_shootdown_finalize() |
#define tlb_shootdown_ipi_recv() |
#endif /* CONFIG_SMP */ |
/* Export TLB interface that each architecture must implement. */ |
extern void tlb_arch_init(void); |
extern void tlb_print(void); |
extern void tlb_shootdown_ipi_send(void); |
extern void tlb_invalidate_all(void); |
extern void tlb_invalidate_asid(asid_t asid); |
extern void tlb_invalidate_pages(asid_t asid, uintptr_t page, count_t cnt); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/mm/buddy.h |
---|
0,0 → 1,93 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericmm |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_BUDDY_H_ |
#define KERN_BUDDY_H_ |
#include <arch/types.h> |
#include <adt/list.h> |
#define BUDDY_SYSTEM_INNER_BLOCK 0xff |
struct buddy_system; |
/** Buddy system operations to be implemented by each implementation. */ |
typedef struct { |
/** |
* Return pointer to left-side or right-side buddy for block passed as |
* argument. |
*/ |
link_t *(* find_buddy)(struct buddy_system *, link_t *); |
/** |
* Bisect the block passed as argument and return pointer to the new |
* right-side buddy. |
*/ |
link_t *(* bisect)(struct buddy_system *, link_t *); |
/** Coalesce two buddies into a bigger block. */ |
link_t *(* coalesce)(struct buddy_system *, link_t *, link_t *); |
/** Set order of block passed as argument. */ |
void (*set_order)(struct buddy_system *, link_t *, uint8_t); |
/** Return order of block passed as argument. */ |
uint8_t (*get_order)(struct buddy_system *, link_t *); |
/** Mark block as busy. */ |
void (*mark_busy)(struct buddy_system *, link_t *); |
/** Mark block as available. */ |
void (*mark_available)(struct buddy_system *, link_t *); |
/** Find parent of block that has given order */ |
link_t *(* find_block)(struct buddy_system *, link_t *, uint8_t); |
void (* print_id)(struct buddy_system *, link_t *); |
} buddy_system_operations_t; |
typedef struct buddy_system { |
/** Maximal order of block which can be stored by buddy system. */ |
uint8_t max_order; |
link_t *order; |
buddy_system_operations_t *op; |
/** Pointer to be used by the implementation. */ |
void *data; |
} buddy_system_t; |
extern void buddy_system_create(buddy_system_t *b, uint8_t max_order, |
buddy_system_operations_t *op, void *data); |
extern link_t *buddy_system_alloc(buddy_system_t *b, uint8_t i); |
extern bool buddy_system_can_alloc(buddy_system_t *b, uint8_t order); |
extern void buddy_system_free(buddy_system_t *b, link_t *block); |
extern void buddy_system_structure_print(buddy_system_t *b, size_t elem_size); |
extern size_t buddy_conf_size(int max_order); |
extern link_t *buddy_system_alloc_block(buddy_system_t *b, link_t *block); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/mm/asid.h |
---|
0,0 → 1,89 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericmm |
* @{ |
*/ |
/** @file |
*/ |
/* |
* This is generic interface for managing |
* Address Space IDentifiers (ASIDs). |
*/ |
#ifndef KERN_ASID_H_ |
#define KERN_ASID_H_ |
#ifndef __ASM__ |
#include <arch/mm/asid.h> |
#include <synch/spinlock.h> |
#include <adt/list.h> |
#include <mm/as.h> |
#endif |
#define ASID_KERNEL 0 |
#define ASID_INVALID 1 |
#define ASID_START 2 |
#define ASID_MAX ASID_MAX_ARCH |
#ifndef __ASM__ |
#define ASIDS_ALLOCABLE ((ASID_MAX + 1) - ASID_START) |
SPINLOCK_EXTERN(asidlock); |
extern link_t as_with_asid_head; |
#ifndef asid_get |
extern asid_t asid_get(void); |
#endif /* !def asid_get */ |
#ifndef asid_put |
extern void asid_put(asid_t asid); |
#endif /* !def asid_put */ |
#ifndef asid_install |
extern void asid_install(as_t *as); |
#endif /* !def asid_install */ |
#ifndef asid_find_free |
extern asid_t asid_find_free(void); |
#endif /* !def asid_find_free */ |
#ifndef asid_put_arch |
extern void asid_put_arch(asid_t asid); |
#endif /* !def asid_put_arch */ |
#endif |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/config.h |
---|
0,0 → 1,85 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_CONFIG_H_ |
#define KERN_CONFIG_H_ |
#include <arch/types.h> |
#include <arch/mm/page.h> |
#define STACK_SIZE PAGE_SIZE |
#define CONFIG_MEMORY_SIZE (8 * 1024 * 1024) |
#define CONFIG_INIT_TASKS 32 |
typedef struct { |
uintptr_t addr; |
size_t size; |
} init_task_t; |
typedef struct { |
count_t cnt; |
init_task_t tasks[CONFIG_INIT_TASKS]; |
} init_t; |
/** Boot allocations. |
* |
* Allocatations made by the boot that are meant to be used by the kernel |
* are all recorded in the ballocs_t type. |
*/ |
typedef struct { |
uintptr_t base; |
size_t size; |
} ballocs_t; |
typedef struct { |
count_t cpu_count; /**< Number of processors detected. */ |
volatile count_t cpu_active; /**< Number of processors that are up and running. */ |
uintptr_t base; |
size_t kernel_size; /**< Size of memory in bytes taken by kernel and stack */ |
uintptr_t stack_base; /**< Base adddress of initial stack */ |
size_t stack_size; /**< Size of initial stack */ |
} config_t; |
extern config_t config; |
extern init_t init; |
extern ballocs_t ballocs; |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/macros.h |
---|
0,0 → 1,78 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_MACROS_H_ |
#define KERN_MACROS_H_ |
#include <arch/types.h> |
#define isdigit(d) (((d) >= '0') && ((d) <= '9')) |
#define islower(c) (((c) >= 'a') && ((c) <= 'z')) |
#define isupper(c) (((c) >= 'A') && ((c) <= 'Z')) |
#define isalpha(c) (is_lower(c) || is_upper(c)) |
#define isalphanum(c) (is_alpha(c) || is_digit(c)) |
#define isspace(c) (((c) == ' ') || ((c) == '\t') || ((c) == '\n') || \ |
((c) == '\r')) |
#define min(a,b) ((a) < (b) ? (a) : (b)) |
#define max(a,b) ((a) > (b) ? (a) : (b)) |
/** Return true if the interlvals overlap. |
* |
* @param s1 Start address of the first interval. |
* @param sz1 Size of the first interval. |
* @param s2 Start address of the second interval. |
* @param sz2 Size of the second interval. |
*/ |
static inline int overlaps(uintptr_t s1, size_t sz1, uintptr_t s2, size_t sz2) |
{ |
uintptr_t e1 = s1 + sz1; |
uintptr_t e2 = s2 + sz2; |
return (s1 < e2) && (s2 < e1); |
} |
/* Compute overlapping of physical addresses */ |
#define PA_overlaps(x, szx, y, szy) overlaps(KA2PA(x), szx, KA2PA(y), szy) |
#define SIZE2KB(size) (size >> 10) |
#define SIZE2MB(size) (size >> 20) |
#define STRING(arg) STRING_ARG(arg) |
#define STRING_ARG(arg) #arg |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/errno.h |
---|
0,0 → 1,63 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ERRNO_H_ |
#define KERN_ERRNO_H_ |
/* 1-255 are kernel error codes, 256-512 are user error codes */ |
#define EOK 0 /* No error */ |
#define ENOENT -1 /* No such entry */ |
#define ENOMEM -2 /* Not enough memory */ |
#define ELIMIT -3 /* Limit exceeded */ |
#define EREFUSED -4 /* Connection refused */ |
#define EFORWARD -5 /* Forward error */ |
#define EPERM -6 /* Permission denied */ |
#define EHANGUP -7 /* Answerbox closed connection, call |
* sys_ipc_hangup() to close the connection. |
* Used by answerbox to close the connection. |
*/ |
#define EEXISTS -8 /* Entry already exists */ |
#define EBADMEM -9 /* Bad memory pointer */ |
#define ENOTSUP -10 /* Not supported */ |
#define EADDRNOTAVAIL -11 /* Address not available. */ |
#define ETIMEOUT -12 /* Timeout expired */ |
#define EINVAL -13 /* Invalid value */ |
#define EBUSY -14 /* Resource is busy */ |
#define EOVERFLOW -15 /* The result does not fit its size. */ |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/ipc/ipc.h |
---|
0,0 → 1,310 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericipc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_IPC_H_ |
#define KERN_IPC_H_ |
/* Length of data being transfered with IPC call */ |
/* - the uspace may not be able to utilize full length */ |
#define IPC_CALL_LEN 6 |
/** Maximum active async calls per thread */ |
#ifdef CONFIG_DEBUG |
#define IPC_MAX_ASYNC_CALLS 4 |
#else |
#define IPC_MAX_ASYNC_CALLS 4000 |
#endif |
/* Flags for calls */ |
/** This is answer to a call */ |
#define IPC_CALL_ANSWERED (1 << 0) |
/** This call will not be freed on error */ |
#define IPC_CALL_STATIC_ALLOC (1 << 1) |
/** Answer will not be passed to userspace, will be discarded */ |
#define IPC_CALL_DISCARD_ANSWER (1 << 2) |
/** Call was forwarded */ |
#define IPC_CALL_FORWARDED (1 << 3) |
/** Identify connect_me_to answer */ |
#define IPC_CALL_CONN_ME_TO (1 << 4) |
/** Interrupt notification */ |
#define IPC_CALL_NOTIF (1 << 5) |
/* |
* Bits used in call hashes. |
* The addresses are aligned at least to 4 that is why we can use the 2 least |
* significant bits of the call address. |
*/ |
/** Type of this call is 'answer' */ |
#define IPC_CALLID_ANSWERED 1 |
/** Type of this call is 'notification' */ |
#define IPC_CALLID_NOTIFICATION 2 |
/* Return values from sys_ipc_call_async(). */ |
#define IPC_CALLRET_FATAL -1 |
#define IPC_CALLRET_TEMPORARY -2 |
/* Macros for manipulating calling data */ |
#define IPC_SET_RETVAL(data, retval) ((data).args[0] = (retval)) |
#define IPC_SET_METHOD(data, val) ((data).args[0] = (val)) |
#define IPC_SET_ARG1(data, val) ((data).args[1] = (val)) |
#define IPC_SET_ARG2(data, val) ((data).args[2] = (val)) |
#define IPC_SET_ARG3(data, val) ((data).args[3] = (val)) |
#define IPC_SET_ARG4(data, val) ((data).args[4] = (val)) |
#define IPC_SET_ARG5(data, val) ((data).args[5] = (val)) |
#define IPC_GET_METHOD(data) ((data).args[0]) |
#define IPC_GET_RETVAL(data) ((data).args[0]) |
#define IPC_GET_ARG1(data) ((data).args[1]) |
#define IPC_GET_ARG2(data) ((data).args[2]) |
#define IPC_GET_ARG3(data) ((data).args[3]) |
#define IPC_GET_ARG4(data) ((data).args[4]) |
#define IPC_GET_ARG5(data) ((data).args[5]) |
/* Well known phone descriptors */ |
#define PHONE_NS 0 |
/* Forwarding flags. */ |
#define IPC_FF_NONE 0 |
/** |
* The call will be routed as though it was initially sent via the phone used to |
* forward it. This feature is intended to support the situation in which the |
* forwarded call needs to be handled by the same connection fibril as any other |
* calls that were initially sent by the forwarder to the same destination. This |
* flag has no imapct on routing replies. |
*/ |
#define IPC_FF_ROUTE_FROM_ME (1 << 0) |
/* System-specific methods - only through special syscalls |
* These methods have special behaviour |
*/ |
/** Protocol for CONNECT - TO - ME |
* |
* Calling process asks the callee to create a callback connection, |
* so that it can start initiating new messages. |
* |
* The protocol for negotiating is: |
* - sys_connect_to_me - sends a message IPC_M_CONNECT_TO_ME |
* - recipient - upon receipt tries to allocate new phone |
* - if it fails, responds with ELIMIT |
* - passes call to userspace. If userspace |
* responds with error, phone is deallocated and |
* error is sent back to caller. Otherwise |
* the call is accepted and the response is sent back. |
* - the allocated phoneid is passed to userspace |
* (on the receiving side) as ARG5 of the call. |
*/ |
#define IPC_M_CONNECT_TO_ME 1 |
/** Protocol for CONNECT - ME - TO |
* |
* Calling process asks the callee to create for him a new connection. |
* E.g. the caller wants a name server to connect him to print server. |
* |
* The protocol for negotiating is: |
* - sys_connect_me_to - send a synchronous message to name server |
* indicating that it wants to be connected to some |
* service |
* - arg1/2/3 are user specified, arg5 contains |
* address of the phone that should be connected |
* (TODO: it leaks to userspace) |
* - recipient - if ipc_answer == 0, then accept connection |
* - otherwise connection refused |
* - recepient may forward message. |
* |
*/ |
#define IPC_M_CONNECT_ME_TO 2 |
/** This message is sent to answerbox when the phone |
* is hung up |
*/ |
#define IPC_M_PHONE_HUNGUP 3 |
/** Send as_area over IPC. |
* - ARG1 - source as_area base address |
* - ARG2 - size of source as_area (filled automatically by kernel) |
* - ARG3 - flags of the as_area being sent |
* |
* on answer, the recipient must set: |
* - ARG1 - dst as_area base adress |
*/ |
#define IPC_M_SHARE_OUT 4 |
/** Receive as_area over IPC. |
* - ARG1 - destination as_area base address |
* - ARG2 - destination as_area size |
* - ARG3 - user defined argument |
* |
* on answer, the recipient must set: |
* |
* - ARG1 - source as_area base address |
* - ARG2 - flags that will be used for sharing |
*/ |
#define IPC_M_SHARE_IN 5 |
/** Send data to another address space over IPC. |
* - ARG1 - source address space virtual address |
* - ARG2 - size of data to be copied, may be overriden by the recipient |
* |
* on answer, the recipient must set: |
* |
* - ARG1 - final destination address space virtual address |
* - ARG2 - final size of data to be copied |
*/ |
#define IPC_M_DATA_WRITE 6 |
/** Receive data from another address space over IPC. |
* - ARG1 - destination virtual address in the source address space |
* - ARG2 - size of data to be received, may be cropped by the recipient |
* |
* on answer, the recipient must set: |
* |
* - ARG1 - source virtual address in the destination address space |
* - ARG2 - final size of data to be copied |
*/ |
#define IPC_M_DATA_READ 7 |
/* Well-known methods */ |
#define IPC_M_LAST_SYSTEM 511 |
#define IPC_M_PING 512 |
/* User methods */ |
#define IPC_FIRST_USER_METHOD 1024 |
#ifdef KERNEL |
#define IPC_MAX_PHONES 16 |
#include <synch/waitq.h> |
struct answerbox; |
struct task; |
typedef enum { |
/** Phone is free and can be allocated */ |
IPC_PHONE_FREE = 0, |
/** Phone is connecting somewhere */ |
IPC_PHONE_CONNECTING, |
/** Phone is connected */ |
IPC_PHONE_CONNECTED, |
/** Phone is hung up, waiting for answers to come */ |
IPC_PHONE_HUNGUP, |
/** Phone was hungup from server */ |
IPC_PHONE_SLAMMED |
} ipc_phone_state_t; |
/** Structure identifying phone (in TASK structure) */ |
typedef struct { |
SPINLOCK_DECLARE(lock); |
link_t link; |
struct answerbox *callee; |
ipc_phone_state_t state; |
atomic_t active_calls; |
} phone_t; |
typedef struct answerbox { |
SPINLOCK_DECLARE(lock); |
struct task *task; |
waitq_t wq; |
/** Phones connected to this answerbox. */ |
link_t connected_phones; |
/** Received calls. */ |
link_t calls; |
link_t dispatched_calls; /* Should be hash table in the future */ |
/** Answered calls. */ |
link_t answers; |
SPINLOCK_DECLARE(irq_lock); |
/** Notifications from IRQ handlers. */ |
link_t irq_notifs; |
/** IRQs with notifications to this answerbox. */ |
link_t irq_head; |
} answerbox_t; |
typedef struct { |
unative_t args[IPC_CALL_LEN]; |
phone_t *phone; |
} ipc_data_t; |
typedef struct { |
link_t link; |
int flags; |
/** Identification of the caller. */ |
struct task *sender; |
/** The caller box is different from sender->answerbox for synchronous |
* calls. */ |
answerbox_t *callerbox; |
/** Private data to internal IPC. */ |
unative_t priv; |
/** Data passed from/to userspace. */ |
ipc_data_t data; |
/** Buffer for IPC_M_DATA_WRITE and IPC_M_DATA_READ. */ |
uint8_t *buffer; |
} call_t; |
extern void ipc_init(void); |
extern call_t * ipc_wait_for_call(answerbox_t *box, uint32_t usec, int flags); |
extern void ipc_answer(answerbox_t *box, call_t *request); |
extern int ipc_call(phone_t *phone, call_t *call); |
extern void ipc_call_sync(phone_t *phone, call_t *request); |
extern void ipc_phone_init(phone_t *phone); |
extern void ipc_phone_connect(phone_t *phone, answerbox_t *box); |
extern void ipc_call_free(call_t *call); |
extern call_t * ipc_call_alloc(int flags); |
extern void ipc_answerbox_init(answerbox_t *box); |
extern void ipc_call_static_init(call_t *call); |
extern void task_print_list(void); |
extern int ipc_forward(call_t *call, phone_t *newphone, answerbox_t *oldbox, |
int mode); |
extern void ipc_cleanup(void); |
extern int ipc_phone_hangup(phone_t *phone); |
extern void ipc_backsend_err(phone_t *phone, call_t *call, unative_t err); |
extern void ipc_print_task(task_id_t taskid); |
extern answerbox_t *ipc_phone_0; |
#endif |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/ipc/sysipc.h |
---|
0,0 → 1,64 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericipc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_SYSIPC_H_ |
#define KERN_SYSIPC_H_ |
#include <ipc/ipc.h> |
#include <ipc/irq.h> |
#include <arch/types.h> |
unative_t sys_ipc_call_sync_fast(unative_t phoneid, unative_t method, |
unative_t arg1, unative_t arg2, unative_t arg3, ipc_data_t *data); |
unative_t sys_ipc_call_sync_slow(unative_t phoneid, ipc_data_t *question, |
ipc_data_t *reply); |
unative_t sys_ipc_call_async_fast(unative_t phoneid, unative_t method, |
unative_t arg1, unative_t arg2, unative_t arg3, unative_t arg4); |
unative_t sys_ipc_call_async_slow(unative_t phoneid, ipc_data_t *data); |
unative_t sys_ipc_answer_fast(unative_t callid, unative_t retval, |
unative_t arg1, unative_t arg2, unative_t arg3, unative_t arg4); |
unative_t sys_ipc_answer_slow(unative_t callid, ipc_data_t *data); |
unative_t sys_ipc_wait_for_call(ipc_data_t *calldata, uint32_t usec, |
int nonblocking); |
unative_t sys_ipc_forward_fast(unative_t callid, unative_t phoneid, |
unative_t method, unative_t arg1, unative_t arg2, int mode); |
unative_t sys_ipc_hangup(int phoneid); |
unative_t sys_ipc_register_irq(inr_t inr, devno_t devno, unative_t method, |
irq_code_t *ucode); |
unative_t sys_ipc_unregister_irq(inr_t inr, devno_t devno); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/ipc/irq.h |
---|
0,0 → 1,73 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericipc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_IPC_IRQ_H_ |
#define KERN_IPC_IRQ_H_ |
/** Maximum length of IPC IRQ program */ |
#define IRQ_MAX_PROG_SIZE 10 |
#include <ipc/ipc.h> |
#include <ddi/irq.h> |
#include <arch/types.h> |
#include <adt/list.h> |
extern int ipc_irq_register(answerbox_t *box, inr_t inr, devno_t devno, |
unative_t method, irq_code_t *ucode); |
extern void ipc_irq_send_notif(irq_t *irq); |
extern void ipc_irq_unregister(answerbox_t *box, inr_t inr, devno_t devno); |
extern void ipc_irq_cleanup(answerbox_t *box); |
/* |
* User friendly wrappers for ipc_irq_send_msg(). They are in the form |
* ipc_irq_send_msg_m(), where m is the number of payload arguments. |
*/ |
#define ipc_irq_send_msg_1(irq, a1) \ |
ipc_irq_send_msg((irq), (a1), 0, 0, 0, 0) |
#define ipc_irq_send_msg_2(irq, a1, a2) \ |
ipc_irq_send_msg((irq), (a1), (a2), 0, 0, 0) |
#define ipc_irq_send_msg_3(irq, a1, a2, a3) \ |
ipc_irq_send_msg((irq), (a1), (a2), (a3), 0, 0) |
#define ipc_irq_send_msg_4(irq, a1, a2, a3, a4) \ |
ipc_irq_send_msg((irq), (a1), (a2), (a3), (a4), 0) |
#define ipc_irq_send_msg_5(irq, a1, a2, a3, a4, a5) \ |
ipc_irq_send_msg((irq), (a1), (a2), (a3), (a4), (a5)) |
extern void ipc_irq_send_msg(irq_t *irq, unative_t a1, unative_t a2, |
unative_t a3, unative_t a4, unative_t a5); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/ipc/ipcrsc.h |
---|
0,0 → 1,46 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericipc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_IPCRSC_H_ |
#define KERN_IPCRSC_H_ |
extern call_t * get_call(unative_t callid); |
extern int phone_alloc(void); |
extern void phone_connect(int phoneid, answerbox_t *box); |
extern void phone_dealloc(int phoneid); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/panic.h |
---|
0,0 → 1,52 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_PANIC_H_ |
#define KERN_PANIC_H_ |
#ifdef CONFIG_DEBUG |
#define panic(format, ...) \ |
panic_printf("Kernel panic in %s() at %s on line %d: " format, __func__, \ |
__FILE__, __LINE__, ##__VA_ARGS__); |
#else |
#define panic(format, ...) \ |
panic_printf("Kernel panic: " format, ##__VA_ARGS__); |
#endif |
extern void panic_printf(char *fmt, ...) __attribute__((noreturn)) ; |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/syscall/syscall.h |
---|
0,0 → 1,89 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_SYSCALL_H_ |
#define KERN_SYSCALL_H_ |
typedef enum { |
SYS_IO = 0, |
SYS_TLS_SET = 1, /* Hardcoded in AMD64, IA32 uspace - fibril.S */ |
SYS_THREAD_CREATE, |
SYS_THREAD_EXIT, |
SYS_THREAD_GET_ID, |
SYS_TASK_GET_ID, |
SYS_FUTEX_SLEEP, |
SYS_FUTEX_WAKEUP, |
SYS_AS_AREA_CREATE, |
SYS_AS_AREA_RESIZE, |
SYS_AS_AREA_DESTROY, |
SYS_IPC_CALL_SYNC_FAST, |
SYS_IPC_CALL_SYNC_SLOW, |
SYS_IPC_CALL_ASYNC_FAST, |
SYS_IPC_CALL_ASYNC_SLOW, |
SYS_IPC_ANSWER_FAST, |
SYS_IPC_ANSWER_SLOW, |
SYS_IPC_FORWARD_FAST, |
SYS_IPC_WAIT, |
SYS_IPC_HANGUP, |
SYS_IPC_REGISTER_IRQ, |
SYS_IPC_UNREGISTER_IRQ, |
SYS_CAP_GRANT, |
SYS_CAP_REVOKE, |
SYS_PHYSMEM_MAP, |
SYS_IOSPACE_ENABLE, |
SYS_PREEMPT_CONTROL, |
SYS_SYSINFO_VALID, |
SYS_SYSINFO_VALUE, |
SYS_DEBUG_ENABLE_CONSOLE, |
SYSCALL_END |
} syscall_t; |
#ifdef KERNEL |
#include <arch/types.h> |
typedef unative_t (*syshandler_t)(unative_t, unative_t, unative_t, unative_t, |
unative_t, unative_t); |
extern syshandler_t syscall_table[SYSCALL_END]; |
extern unative_t syscall_handler(unative_t, unative_t, unative_t, unative_t, |
unative_t, unative_t, unative_t); |
extern unative_t sys_tls_set(unative_t); |
#endif |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/syscall/copy.h |
---|
0,0 → 1,58 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_COPY_H_ |
#define KERN_COPY_H_ |
#include <arch/types.h> |
/** Label within memcpy_from_uspace() that contains return -1. */ |
extern char memcpy_from_uspace_failover_address; |
/** Label within memcpy_to_uspace() that contains return -1. */ |
extern char memcpy_to_uspace_failover_address; |
extern int copy_from_uspace(void *dst, const void *uspace_src, size_t size); |
extern int copy_to_uspace(void *dst_uspace, const void *src, size_t size); |
/* |
* This interface must be implemented by each architecture. |
*/ |
extern int memcpy_from_uspace(void *dst, const void *uspace_src, size_t size); |
extern int memcpy_to_uspace(void *uspace_dst, const void *src, size_t size); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/syscall/sysarg64.h |
---|
0,0 → 1,48 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** |
* @file |
* @brief Wrapper for explicit 64-bit arguments passed to syscalls. |
*/ |
#ifndef KERN_SYSARG64_H_ |
#define KERN_SYSARG64_H_ |
typedef struct { |
unsigned long long value; |
} sysarg64_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/adt/avl.h |
---|
0,0 → 1,141 |
/* |
* Copyright (C) 2007 Vojtech Mencl |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericadt |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_AVLTREE_H_ |
#define KERN_AVLTREE_H_ |
#include <arch/types.h> |
/** |
* Macro for getting a pointer to the structure which contains the avltree |
* structure. |
* |
* @param link Pointer to the avltree structure. |
* @param type Name of the outer structure. |
* @param member Name of avltree attribute in the outer structure. |
*/ |
#define avltree_get_instance(node, type, member) \ |
((type *)(((uint8_t *)(node)) - ((uint8_t *) &(((type *) NULL)->member)))) |
typedef struct avltree_node avltree_node_t; |
typedef struct avltree avltree_t; |
typedef uint64_t avltree_key_t; |
typedef bool (* avltree_walker_t)(avltree_node_t *, void *); |
/** AVL tree node structure. */ |
struct avltree_node |
{ |
/** |
* Pointer to the left descendant of this node. |
* |
* All keys of nodes in the left subtree are less than the key of this |
* node. |
*/ |
struct avltree_node *lft; |
/** |
* Pointer to the right descendant of this node. |
* |
* All keys of nodes in the right subtree are greater than the key of |
* this node. |
*/ |
struct avltree_node *rgt; |
/** Pointer to the parent node. Root node has NULL parent. */ |
struct avltree_node *par; |
/** Node's key. */ |
avltree_key_t key; |
/** |
* Difference between the heights of the left and the right subtree of |
* this node. |
*/ |
int8_t balance; |
}; |
/** AVL tree structure. */ |
struct avltree |
{ |
/** AVL root node pointer */ |
struct avltree_node *root; |
/** |
* Base of the tree is a value that is smaller or equal than every value |
* in the tree (valid for positive keys otherwise ignore this atribute). |
* |
* The base is added to the current key when a new node is inserted into |
* the tree. The base is changed to the key of the node which is deleted |
* with avltree_delete_min(). |
*/ |
avltree_key_t base; |
}; |
/** Create empty AVL tree. |
* |
* @param t AVL tree. |
*/ |
static inline void avltree_create(avltree_t *t) |
{ |
t->root = NULL; |
t->base = 0; |
} |
/** Initialize node. |
* |
* @param node Node which is initialized. |
*/ |
static inline void avltree_node_initialize(avltree_node_t *node) |
{ |
node->key = 0; |
node->lft = NULL; |
node->rgt = NULL; |
node->par = NULL; |
node->balance = 0; |
} |
extern avltree_node_t *avltree_find_min(avltree_t *t); |
extern avltree_node_t *avltree_search(avltree_t *t, avltree_key_t key); |
extern void avltree_insert(avltree_t *t, avltree_node_t *newnode); |
extern void avltree_delete(avltree_t *t, avltree_node_t *node); |
extern bool avltree_delete_min(avltree_t *t); |
extern void avltree_walk(avltree_t *t, avltree_walker_t walker, void *arg); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/adt/list.h |
---|
0,0 → 1,192 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericadt |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_LIST_H_ |
#define KERN_LIST_H_ |
#include <arch/types.h> |
/** Doubly linked list head and link type. */ |
typedef struct link { |
struct link *prev; /**< Pointer to the previous item in the list. */ |
struct link *next; /**< Pointer to the next item in the list. */ |
} link_t; |
/** Declare and initialize statically allocated list. |
* |
* @param name Name of the new statically allocated list. |
*/ |
#define LIST_INITIALIZE(name) \ |
link_t name = { .prev = &name, .next = &name } |
/** Initialize doubly-linked circular list link |
* |
* Initialize doubly-linked list link. |
* |
* @param link Pointer to link_t structure to be initialized. |
*/ |
static inline void link_initialize(link_t *link) |
{ |
link->prev = NULL; |
link->next = NULL; |
} |
/** Initialize doubly-linked circular list |
* |
* Initialize doubly-linked circular list. |
* |
* @param head Pointer to link_t structure representing head of the list. |
*/ |
static inline void list_initialize(link_t *head) |
{ |
head->prev = head; |
head->next = head; |
} |
/** Add item to the beginning of doubly-linked circular list |
* |
* Add item to the beginning of doubly-linked circular list. |
* |
* @param link Pointer to link_t structure to be added. |
* @param head Pointer to link_t structure representing head of the list. |
*/ |
static inline void list_prepend(link_t *link, link_t *head) |
{ |
link->next = head->next; |
link->prev = head; |
head->next->prev = link; |
head->next = link; |
} |
/** Add item to the end of doubly-linked circular list |
* |
* Add item to the end of doubly-linked circular list. |
* |
* @param link Pointer to link_t structure to be added. |
* @param head Pointer to link_t structure representing head of the list. |
*/ |
static inline void list_append(link_t *link, link_t *head) |
{ |
link->prev = head->prev; |
link->next = head; |
head->prev->next = link; |
head->prev = link; |
} |
/** Remove item from doubly-linked circular list |
* |
* Remove item from doubly-linked circular list. |
* |
* @param link Pointer to link_t structure to be removed from the list it is |
* contained in. |
*/ |
static inline void list_remove(link_t *link) |
{ |
link->next->prev = link->prev; |
link->prev->next = link->next; |
link_initialize(link); |
} |
/** Query emptiness of doubly-linked circular list |
* |
* Query emptiness of doubly-linked circular list. |
* |
* @param head Pointer to link_t structure representing head of the list. |
*/ |
static inline bool list_empty(link_t *head) |
{ |
return head->next == head ? true : false; |
} |
/** Split or concatenate headless doubly-linked circular list |
* |
* Split or concatenate headless doubly-linked circular list. |
* |
* Note that the algorithm works both directions: |
* concatenates splitted lists and splits concatenated lists. |
* |
* @param part1 Pointer to link_t structure leading the first (half of the |
* headless) list. |
* @param part2 Pointer to link_t structure leading the second (half of the |
* headless) list. |
*/ |
static inline void headless_list_split_or_concat(link_t *part1, link_t *part2) |
{ |
link_t *hlp; |
part1->prev->next = part2; |
part2->prev->next = part1; |
hlp = part1->prev; |
part1->prev = part2->prev; |
part2->prev = hlp; |
} |
/** Split headless doubly-linked circular list |
* |
* Split headless doubly-linked circular list. |
* |
* @param part1 Pointer to link_t structure leading the first half of the |
* headless list. |
* @param part2 Pointer to link_t structure leading the second half of the |
* headless list. |
*/ |
static inline void headless_list_split(link_t *part1, link_t *part2) |
{ |
headless_list_split_or_concat(part1, part2); |
} |
/** Concatenate two headless doubly-linked circular lists |
* |
* Concatenate two headless doubly-linked circular lists. |
* |
* @param part1 Pointer to link_t structure leading the first headless list. |
* @param part2 Pointer to link_t structure leading the second headless list. |
*/ |
static inline void headless_list_concat(link_t *part1, link_t *part2) |
{ |
headless_list_split_or_concat(part1, part2); |
} |
#define list_get_instance(link, type, member) \ |
((type *)(((uint8_t *)(link)) - ((uint8_t *)&(((type *)NULL)->member)))) |
extern bool list_member(const link_t *link, const link_t *head); |
extern void list_concat(link_t *head1, link_t *head2); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/adt/hash_table.h |
---|
0,0 → 1,88 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericadt |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_HASH_TABLE_H_ |
#define KERN_HASH_TABLE_H_ |
#include <adt/list.h> |
#include <arch/types.h> |
/** Set of operations for hash table. */ |
typedef struct { |
/** Hash function. |
* |
* @param key Array of keys needed to compute hash index. All keys must |
* be passed. |
* |
* @return Index into hash table. |
*/ |
index_t (* hash)(unative_t key[]); |
/** Hash table item comparison function. |
* |
* @param key Array of keys that will be compared with item. It is not |
* necessary to pass all keys. |
* |
* @return true if the keys match, false otherwise. |
*/ |
bool (*compare)(unative_t key[], count_t keys, link_t *item); |
/** Hash table item removal callback. |
* |
* @param item Item that was removed from the hash table. |
*/ |
void (*remove_callback)(link_t *item); |
} hash_table_operations_t; |
/** Hash table structure. */ |
typedef struct { |
link_t *entry; |
count_t entries; |
count_t max_keys; |
hash_table_operations_t *op; |
} hash_table_t; |
#define hash_table_get_instance(item, type, member) \ |
list_get_instance((item), type, member) |
extern void hash_table_create(hash_table_t *h, count_t m, count_t max_keys, |
hash_table_operations_t *op); |
extern void hash_table_insert(hash_table_t *h, unative_t key[], link_t *item); |
extern link_t *hash_table_find(hash_table_t *h, unative_t key[]); |
extern void hash_table_remove(hash_table_t *h, unative_t key[], count_t keys); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/adt/btree.h |
---|
0,0 → 1,113 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericadt |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_BTREE_H_ |
#define KERN_BTREE_H_ |
#include <arch/types.h> |
#include <adt/list.h> |
#define BTREE_M 5 |
#define BTREE_MAX_KEYS (BTREE_M - 1) |
typedef uint64_t btree_key_t; |
/** B-tree node structure. */ |
typedef struct btree_node { |
/** Number of keys. */ |
count_t keys; |
/** |
* Keys. We currently support only single keys. Additional room for one |
* extra key is provided. |
*/ |
btree_key_t key[BTREE_MAX_KEYS + 1]; |
/** |
* Pointers to values. Sorted according to the key array. Defined only in |
* leaf-level. There is room for storing value for the extra key. |
*/ |
void *value[BTREE_MAX_KEYS + 1]; |
/** |
* Pointers to descendants of this node sorted according to the key |
* array. |
* |
* subtree[0] points to subtree with keys lesser than to key[0]. |
* subtree[1] points to subtree with keys greater than or equal to |
* key[0] and lesser than key[1]. |
* ... |
* There is room for storing a subtree pointer for the extra key. |
*/ |
struct btree_node *subtree[BTREE_M + 1]; |
/** Pointer to parent node. Root node has NULL parent. */ |
struct btree_node *parent; |
/** |
* Link connecting leaf-level nodes. Defined only when this node is a |
* leaf. */ |
link_t leaf_link; |
/* Variables needed by btree_print(). */ |
link_t bfs_link; |
int depth; |
} btree_node_t; |
/** B-tree structure. */ |
typedef struct { |
btree_node_t *root; /**< B-tree root node pointer. */ |
link_t leaf_head; /**< Leaf-level list head. */ |
} btree_t; |
extern void btree_init(void); |
extern void btree_create(btree_t *t); |
extern void btree_destroy(btree_t *t); |
extern void btree_insert(btree_t *t, btree_key_t key, void *value, |
btree_node_t *leaf_node); |
extern void btree_remove(btree_t *t, btree_key_t key, btree_node_t *leaf_node); |
extern void *btree_search(btree_t *t, btree_key_t key, btree_node_t **leaf_node); |
extern btree_node_t *btree_leaf_node_left_neighbour(btree_t *t, |
btree_node_t *node); |
extern btree_node_t *btree_leaf_node_right_neighbour(btree_t *t, |
btree_node_t *node); |
extern void btree_print(btree_t *t); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/adt/fifo.h |
---|
0,0 → 1,122 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericadt |
* @{ |
*/ |
/** @file |
*/ |
/* |
* This implementation of FIFO stores values in an array |
* (static or dynamic). As such, these FIFOs have upper bound |
* on number of values they can store. Push and pop operations |
* are done via accessing the array through head and tail indices. |
* Because of better operation ordering in fifo_pop(), the access |
* policy for these two indices is to 'increment (mod size of FIFO) |
* and use'. |
*/ |
#ifndef KERN_FIFO_H_ |
#define KERN_FIFO_H_ |
#include <mm/slab.h> |
/** Create and initialize static FIFO. |
* |
* FIFO is allocated statically. |
* This macro is suitable for creating smaller FIFOs. |
* |
* @param name Name of FIFO. |
* @param t Type of values stored in FIFO. |
* @param itms Number of items that can be stored in FIFO. |
*/ |
#define FIFO_INITIALIZE_STATIC(name, t, itms) \ |
struct { \ |
t fifo[(itms)]; \ |
count_t items; \ |
index_t head; \ |
index_t tail; \ |
} name = { \ |
.items = (itms), \ |
.head = 0, \ |
.tail = 0 \ |
} |
/** Create and prepare dynamic FIFO. |
* |
* FIFO is allocated dynamically. |
* This macro is suitable for creating larger FIFOs. |
* |
* @param name Name of FIFO. |
* @param t Type of values stored in FIFO. |
* @param itms Number of items that can be stored in FIFO. |
*/ |
#define FIFO_INITIALIZE_DYNAMIC(name, t, itms) \ |
struct { \ |
t *fifo; \ |
count_t items; \ |
index_t head; \ |
index_t tail; \ |
} name = { \ |
.fifo = NULL, \ |
.items = (itms), \ |
.head = 0, \ |
.tail = 0 \ |
} |
/** Pop value from head of FIFO. |
* |
* @param name FIFO name. |
* |
* @return Leading value in FIFO. |
*/ |
#define fifo_pop(name) \ |
name.fifo[name.head = (name.head + 1) < name.items ? (name.head + 1) : 0] |
/** Push value to tail of FIFO. |
* |
* @param name FIFO name. |
* @param value Value to be appended to FIFO. |
* |
*/ |
#define fifo_push(name, value) \ |
name.fifo[name.tail = \ |
(name.tail + 1) < name.items ? (name.tail + 1) : 0] = (value) |
/** Allocate memory for dynamic FIFO. |
* |
* @param name FIFO name. |
*/ |
#define fifo_create(name) \ |
name.fifo = malloc(sizeof(*name.fifo) * name.items, 0) |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/adt/bitmap.h |
---|
0,0 → 1,55 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericadt |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_BITMAP_H_ |
#define KERN_BITMAP_H_ |
#include <arch/types.h> |
#define BITS2BYTES(bits) (bits ? ((((bits)-1)>>3)+1) : 0) |
typedef struct { |
uint8_t *map; |
count_t bits; |
} bitmap_t; |
extern void bitmap_initialize(bitmap_t *bitmap, uint8_t *map, count_t bits); |
extern void bitmap_set_range(bitmap_t *bitmap, index_t start, count_t bits); |
extern void bitmap_clear_range(bitmap_t *bitmap, index_t start, count_t bits); |
extern void bitmap_copy(bitmap_t *dst, bitmap_t *src, count_t bits); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/synch/spinlock.h |
---|
0,0 → 1,142 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sync |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_SPINLOCK_H_ |
#define KERN_SPINLOCK_H_ |
#include <arch/types.h> |
#include <preemption.h> |
#include <atomic.h> |
#include <debug.h> |
#ifdef CONFIG_SMP |
typedef struct { |
#ifdef CONFIG_DEBUG_SPINLOCK |
char *name; |
#endif |
atomic_t val; |
} spinlock_t; |
/* |
* SPINLOCK_DECLARE is to be used for dynamically allocated spinlocks, |
* where the lock gets initialized in run time. |
*/ |
#define SPINLOCK_DECLARE(slname) spinlock_t slname |
#define SPINLOCK_EXTERN(slname) extern spinlock_t slname |
/* |
* SPINLOCK_INITIALIZE is to be used for statically allocated spinlocks. |
* It declares and initializes the lock. |
*/ |
#ifdef CONFIG_DEBUG_SPINLOCK |
#define SPINLOCK_INITIALIZE(slname) \ |
spinlock_t slname = { \ |
.name = #slname, \ |
.val = { 0 } \ |
} |
#else |
#define SPINLOCK_INITIALIZE(slname) \ |
spinlock_t slname = { \ |
.val = { 0 } \ |
} |
#endif |
extern void spinlock_initialize(spinlock_t *sl, char *name); |
extern int spinlock_trylock(spinlock_t *sl); |
extern void spinlock_lock_debug(spinlock_t *sl); |
#ifdef CONFIG_DEBUG_SPINLOCK |
# define spinlock_lock(x) spinlock_lock_debug(x) |
#else |
# define spinlock_lock(x) atomic_lock_arch(&(x)->val) |
#endif |
/** Unlock spinlock |
* |
* Unlock spinlock. |
* |
* @param sl Pointer to spinlock_t structure. |
*/ |
static inline void spinlock_unlock(spinlock_t *sl) |
{ |
ASSERT(atomic_get(&sl->val) != 0); |
/* |
* Prevent critical section code from bleeding out this way down. |
*/ |
CS_LEAVE_BARRIER(); |
atomic_set(&sl->val, 0); |
preemption_enable(); |
} |
#ifdef CONFIG_DEBUG_SPINLOCK |
extern int printf(const char *, ...); |
#define DEADLOCK_THRESHOLD 100000000 |
#define DEADLOCK_PROBE_INIT(pname) count_t pname = 0 |
#define DEADLOCK_PROBE(pname, value) \ |
if ((pname)++ > (value)) { \ |
(pname) = 0; \ |
printf("Deadlock probe %s: exceeded threshold %d\n", \ |
"cpu%d: function=%s, line=%d\n", \ |
#pname, (value), CPU->id, __func__, __LINE__); \ |
} |
#else |
#define DEADLOCK_PROBE_INIT(pname) |
#define DEADLOCK_PROBE(pname, value) |
#endif |
#else |
/* On UP systems, spinlocks are effectively left out. */ |
#define SPINLOCK_DECLARE(name) |
#define SPINLOCK_EXTERN(name) |
#define SPINLOCK_INITIALIZE(name) |
#define spinlock_initialize(x, name) |
#define spinlock_lock(x) preemption_disable() |
#define spinlock_trylock(x) (preemption_disable(), 1) |
#define spinlock_unlock(x) preemption_enable() |
#define DEADLOCK_PROBE_INIT(pname) |
#define DEADLOCK_PROBE(pname, value) |
#endif |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/synch/waitq.h |
---|
0,0 → 1,82 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sync |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_WAITQ_H_ |
#define KERN_WAITQ_H_ |
#include <arch/types.h> |
#include <synch/spinlock.h> |
#include <synch/synch.h> |
#include <adt/list.h> |
typedef enum { |
WAKEUP_FIRST = 0, |
WAKEUP_ALL |
} wakeup_mode_t; |
/** Wait queue structure. */ |
typedef struct { |
/** Lock protecting wait queue structure. |
* |
* Must be acquired before T.lock for each T of type thread_t. |
*/ |
SPINLOCK_DECLARE(lock); |
/** |
* Number of waitq_wakeup() calls that didn't find a thread to wake up. |
*/ |
int missed_wakeups; |
/** List of sleeping threads for wich there was no missed_wakeup. */ |
link_t head; |
} waitq_t; |
#define waitq_sleep(wq) \ |
waitq_sleep_timeout((wq), SYNCH_NO_TIMEOUT, SYNCH_FLAGS_NONE) |
struct thread; |
extern void waitq_initialize(waitq_t *wq); |
extern int waitq_sleep_timeout(waitq_t *wq, uint32_t usec, int flags); |
extern ipl_t waitq_sleep_prepare(waitq_t *wq); |
extern int waitq_sleep_timeout_unsafe(waitq_t *wq, uint32_t usec, int flags); |
extern void waitq_sleep_finish(waitq_t *wq, int rc, ipl_t ipl); |
extern void waitq_wakeup(waitq_t *wq, wakeup_mode_t mode); |
extern void _waitq_wakeup_unsafe(waitq_t *wq, wakeup_mode_t mode); |
extern void waitq_interrupt_sleep(struct thread *t); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/synch/mutex.h |
---|
0,0 → 1,60 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sync |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_MUTEX_H_ |
#define KERN_MUTEX_H_ |
#include <arch/types.h> |
#include <synch/semaphore.h> |
#include <synch/synch.h> |
typedef struct { |
semaphore_t sem; |
} mutex_t; |
#define mutex_lock(mtx) \ |
_mutex_lock_timeout((mtx), SYNCH_NO_TIMEOUT, SYNCH_FLAGS_NONE) |
#define mutex_trylock(mtx) \ |
_mutex_lock_timeout((mtx), SYNCH_NO_TIMEOUT, SYNCH_FLAGS_NON_BLOCKING) |
#define mutex_lock_timeout(mtx, usec) \ |
_mutex_lock_timeout((mtx), (usec), SYNCH_FLAGS_NON_BLOCKING) |
extern void mutex_initialize(mutex_t *mtx); |
extern int _mutex_lock_timeout(mutex_t *mtx, uint32_t usec, int flags); |
extern void mutex_unlock(mutex_t *mtx); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/synch/futex.h |
---|
0,0 → 1,65 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sync |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_FUTEX_H_ |
#define KERN_FUTEX_H_ |
#include <arch/types.h> |
#include <synch/waitq.h> |
#include <genarch/mm/page_ht.h> |
#include <genarch/mm/page_pt.h> |
/** Kernel-side futex structure. */ |
typedef struct { |
/** Physical address of the status variable. */ |
uintptr_t paddr; |
/** Wait queue for threads waiting for futex availability. */ |
waitq_t wq; |
/** Futex hash table link. */ |
link_t ht_link; |
/** Number of tasks that reference this futex. */ |
count_t refcount; |
} futex_t; |
extern void futex_init(void); |
extern unative_t sys_futex_sleep_timeout(uintptr_t uaddr, uint32_t usec, |
int flags); |
extern unative_t sys_futex_wakeup(uintptr_t uaddr); |
extern void futex_cleanup(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/synch/condvar.h |
---|
0,0 → 1,61 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sync |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_CONDVAR_H_ |
#define KERN_CONDVAR_H_ |
#include <arch/types.h> |
#include <synch/waitq.h> |
#include <synch/mutex.h> |
#include <synch/synch.h> |
typedef struct { |
waitq_t wq; |
} condvar_t; |
#define condvar_wait(cv, mtx) \ |
_condvar_wait_timeout((cv), (mtx), SYNCH_NO_TIMEOUT, SYNCH_FLAGS_NONE) |
#define condvar_wait_timeout(cv, mtx, usec) \ |
_condvar_wait_timeout((cv), (mtx), (usec), SYNCH_FLAGS_NONE) |
extern void condvar_initialize(condvar_t *cv); |
extern void condvar_signal(condvar_t *cv); |
extern void condvar_broadcast(condvar_t *cv); |
extern int _condvar_wait_timeout(condvar_t *cv, mutex_t *mtx, uint32_t usec, |
int flags); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/synch/rwlock.h |
---|
0,0 → 1,83 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sync |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_RWLOCK_H_ |
#define KERN_RWLOCK_H_ |
#include <arch/types.h> |
#include <synch/mutex.h> |
#include <synch/synch.h> |
#include <synch/spinlock.h> |
typedef enum { |
RWLOCK_NONE, |
RWLOCK_READER, |
RWLOCK_WRITER |
} rwlock_type_t; |
typedef struct { |
SPINLOCK_DECLARE(lock); |
/** |
* Mutex for writers, readers can bypass it if readers_in is positive. |
*/ |
mutex_t exclusive; |
/** Number of readers in critical section. */ |
count_t readers_in; |
} rwlock_t; |
#define rwlock_write_lock(rwl) \ |
_rwlock_write_lock_timeout((rwl), SYNCH_NO_TIMEOUT, SYNCH_FLAGS_NONE) |
#define rwlock_read_lock(rwl) \ |
_rwlock_read_lock_timeout((rwl), SYNCH_NO_TIMEOUT, SYNCH_FLAGS_NONE) |
#define rwlock_write_trylock(rwl) \ |
_rwlock_write_lock_timeout((rwl), SYNCH_NO_TIMEOUT, \ |
SYNCH_FLAGS_NON_BLOCKING) |
#define rwlock_read_trylock(rwl) \ |
_rwlock_read_lock_timeout((rwl), SYNCH_NO_TIMEOUT, \ |
SYNCH_FLAGS_NON_BLOCKING) |
#define rwlock_write_lock_timeout(rwl, usec) \ |
_rwlock_write_lock_timeout((rwl), (usec), SYNCH_FLAGS_NONE) |
#define rwlock_read_lock_timeout(rwl, usec) \ |
_rwlock_read_lock_timeout((rwl), (usec), SYNCH_FLAGS_NONE) |
extern void rwlock_initialize(rwlock_t *rwl); |
extern void rwlock_read_unlock(rwlock_t *rwl); |
extern void rwlock_write_unlock(rwlock_t *rwl); |
extern int _rwlock_read_lock_timeout(rwlock_t *rwl, uint32_t usec, int flags); |
extern int _rwlock_write_lock_timeout(rwlock_t *rwl, uint32_t usec, int flags); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/synch/semaphore.h |
---|
0,0 → 1,60 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sync |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_SEMAPHORE_H_ |
#define KERN_SEMAPHORE_H_ |
#include <arch/types.h> |
#include <synch/waitq.h> |
#include <synch/synch.h> |
typedef struct { |
waitq_t wq; |
} semaphore_t; |
#define semaphore_down(s) \ |
_semaphore_down_timeout((s), SYNCH_NO_TIMEOUT, SYNCH_FLAGS_NONE) |
#define semaphore_trydown(s) \ |
_semaphore_down_timeout((s), SYNCH_NO_TIMEOUT, SYNCH_FLAGS_NON_BLOCKING) |
#define semaphore_down_timeout(s, usec) \ |
_semaphore_down_timeout((s), (usec), SYNCH_FLAGS_NONE) |
extern void semaphore_initialize(semaphore_t *s, int val); |
extern int _semaphore_down_timeout(semaphore_t *s, uint32_t usec, int flags); |
extern void semaphore_up(semaphore_t *s); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/synch/synch.h |
---|
0,0 → 1,67 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sync |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_SYNCH_H_ |
#define KERN_SYNCH_H_ |
/** Request with no timeout. */ |
#define SYNCH_NO_TIMEOUT 0 |
/** No flags specified. */ |
#define SYNCH_FLAGS_NONE 0 |
/** Non-blocking operation request. */ |
#define SYNCH_FLAGS_NON_BLOCKING (1 << 0) |
/** Interruptible operation. */ |
#define SYNCH_FLAGS_INTERRUPTIBLE (1 << 1) |
/** Could not satisfy the request without going to sleep. */ |
#define ESYNCH_WOULD_BLOCK 1 |
/** Timeout occurred. */ |
#define ESYNCH_TIMEOUT 2 |
/** Sleep was interrupted. */ |
#define ESYNCH_INTERRUPTED 4 |
/** Operation succeeded without sleeping. */ |
#define ESYNCH_OK_ATOMIC 8 |
/** Operation succeeded and did sleep. */ |
#define ESYNCH_OK_BLOCKED 16 |
#define SYNCH_FAILED(rc) \ |
((rc) & (ESYNCH_WOULD_BLOCK | ESYNCH_TIMEOUT | ESYNCH_INTERRUPTED)) |
#define SYNCH_OK(rc) \ |
((rc) & (ESYNCH_OK_ATOMIC | ESYNCH_OK_BLOCKED)) |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/interrupt.h |
---|
0,0 → 1,66 |
/* |
* Copyright (c) 2005 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericinterrupt |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_INTERRUPT_H_ |
#define KERN_INTERRUPT_H_ |
#include <arch/interrupt.h> |
#include <arch/types.h> |
#include <proc/task.h> |
#include <proc/thread.h> |
#include <arch.h> |
#include <console/klog.h> |
#include <ddi/irq.h> |
typedef void (* iroutine)(int n, istate_t *istate); |
#define fault_if_from_uspace(istate, cmd, ...) \ |
{ \ |
if (istate_from_uspace(istate)) { \ |
task_t *task = TASK; \ |
klog_printf("Task %llu killed due to an exception at %p.", task->taskid, istate_get_pc(istate)); \ |
klog_printf(" " cmd, ##__VA_ARGS__); \ |
task_kill(task->taskid); \ |
thread_exit(); \ |
} \ |
} |
extern iroutine exc_register(int n, const char *name, iroutine f); |
extern void exc_dispatch(int n, istate_t *t); |
void exc_init(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/time/clock.h |
---|
0,0 → 1,57 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup time |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_CLOCK_H_ |
#define KERN_CLOCK_H_ |
#include <arch/types.h> |
#define HZ 100 |
/** Uptime structure */ |
typedef struct { |
unative_t seconds1; |
unative_t useconds; |
unative_t seconds2; |
} uptime_t; |
extern uptime_t *uptime; |
extern void clock(void); |
extern void clock_counter_init(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/time/timeout.h |
---|
0,0 → 1,71 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup time |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_TIMEOUT_H_ |
#define KERN_TIMEOUT_H_ |
#include <arch/types.h> |
#include <adt/list.h> |
#include <cpu.h> |
typedef void (* timeout_handler_t)(void *arg); |
typedef struct { |
SPINLOCK_DECLARE(lock); |
/** Link to the list of active timeouts on THE->cpu */ |
link_t link; |
/** Timeout will be activated in this amount of clock() ticks. */ |
uint64_t ticks; |
/** Function that will be called on timeout activation. */ |
timeout_handler_t handler; |
/** Argument to be passed to handler() function. */ |
void *arg; |
/** On which processor is this timeout registered. */ |
cpu_t *cpu; |
} timeout_t; |
#define us2ticks(us) ((uint64_t) (((uint32_t) (us) / (1000000 / HZ)))) |
extern void timeout_init(void); |
extern void timeout_initialize(timeout_t *t); |
extern void timeout_reinitialize(timeout_t *t); |
extern void timeout_register(timeout_t *t, uint64_t usec, timeout_handler_t f, |
void *arg); |
extern bool timeout_unregister(timeout_t *t); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/time/delay.h |
---|
0,0 → 1,45 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup time |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_DELAY_H_ |
#define KERN_DELAY_H_ |
#include <arch/types.h> |
extern void delay(uint32_t microseconds); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/arch.h |
---|
0,0 → 1,86 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ARCH_H_ |
#define KERN_ARCH_H_ |
#include <arch/arch.h> |
#include <proc/thread.h> |
#include <proc/task.h> |
#define DEFAULT_CONTEXT 0 |
#define CPU THE->cpu |
#define THREAD THE->thread |
#define TASK THE->task |
#define AS THE->as |
#define CONTEXT (THE->task ? THE->task->context : DEFAULT_CONTEXT) |
#define PREEMPTION_DISABLED THE->preemption_disabled |
#define context_check(ctx1, ctx2) ((ctx1) == (ctx2)) |
/** |
* For each possible kernel stack, structure |
* of the following type will be placed at |
* the base address of the stack. |
*/ |
typedef struct { |
count_t preemption_disabled; /**< Preemption disabled counter. */ |
thread_t *thread; /**< Current thread. */ |
task_t *task; /**< Current task. */ |
cpu_t *cpu; /**< Executing cpu. */ |
as_t *as; /**< Current address space. */ |
} the_t; |
#define THE ((the_t *)(get_stack_base())) |
extern void the_initialize(the_t *the); |
extern void the_copy(the_t *src, the_t *dst); |
extern void arch_pre_main(void); |
extern void arch_pre_mm_init(void); |
extern void arch_post_mm_init(void); |
extern void arch_post_cpu_init(void); |
extern void arch_pre_smp_init(void); |
extern void arch_post_smp_init(void); |
extern void calibrate_delay_loop(void); |
extern void reboot(void); |
extern void arch_reboot(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/ddi/irq.h |
---|
0,0 → 1,162 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericddi |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_IRQ_H_ |
#define KERN_IRQ_H_ |
typedef enum { |
CMD_MEM_READ_1 = 0, |
CMD_MEM_READ_2, |
CMD_MEM_READ_4, |
CMD_MEM_READ_8, |
CMD_MEM_WRITE_1, |
CMD_MEM_WRITE_2, |
CMD_MEM_WRITE_4, |
CMD_MEM_WRITE_8, |
CMD_PORT_READ_1, |
CMD_PORT_WRITE_1, |
CMD_IA64_GETCHAR, |
CMD_PPC32_GETCHAR, |
CMD_LAST |
} irq_cmd_type; |
typedef struct { |
irq_cmd_type cmd; |
void *addr; |
unsigned long long value; |
int dstarg; |
} irq_cmd_t; |
typedef struct { |
unsigned int cmdcount; |
irq_cmd_t *cmds; |
} irq_code_t; |
#ifdef KERNEL |
#include <arch/types.h> |
#include <adt/list.h> |
#include <synch/spinlock.h> |
#include <proc/task.h> |
typedef enum { |
IRQ_DECLINE, /**< Decline to service. */ |
IRQ_ACCEPT /**< Accept to service. */ |
} irq_ownership_t; |
typedef enum { |
IRQ_TRIGGER_LEVEL = 1, |
IRQ_TRIGGER_EDGE |
} irq_trigger_t; |
struct irq; |
typedef void (* irq_handler_t)(struct irq *irq, void *arg, ...); |
/** IPC notification config structure. |
* |
* Primarily, this structure is encapsulated in the irq_t structure. |
* It is protected by irq_t::lock. |
*/ |
typedef struct { |
/** When false, notifications are not sent. */ |
bool notify; |
/** Answerbox for notifications. */ |
answerbox_t *answerbox; |
/** Method to be used for the notification. */ |
unative_t method; |
/** Top-half pseudocode. */ |
irq_code_t *code; |
/** Counter. */ |
count_t counter; |
/** |
* Link between IRQs that are notifying the same answerbox. The list is |
* protected by the answerbox irq_lock. |
*/ |
link_t link; |
} ipc_notif_cfg_t; |
/** Structure representing one device IRQ. |
* |
* If one device has multiple interrupts, there will be multiple irq_t |
* instantions with the same devno. |
*/ |
typedef struct irq { |
/** Hash table link. */ |
link_t link; |
/** Lock protecting everything in this structure |
* except the link member. When both the IRQ |
* hash table lock and this lock are to be acquired, |
* this lock must not be taken first. |
*/ |
SPINLOCK_DECLARE(lock); |
/** Send EOI before processing the interrupt. |
* This is essential for timer interrupt which |
* has to be acknowledged before doing preemption |
* to make sure another timer interrupt will |
* be eventually generated. |
*/ |
bool preack; |
/** Unique device number. -1 if not yet assigned. */ |
devno_t devno; |
/** Actual IRQ number. -1 if not yet assigned. */ |
inr_t inr; |
/** Trigger level of the IRQ. */ |
irq_trigger_t trigger; |
/** Claim ownership of the IRQ. */ |
irq_ownership_t (* claim)(void); |
/** Handler for this IRQ and device. */ |
irq_handler_t handler; |
/** Argument for the handler. */ |
void *arg; |
/** Notification configuration structure. */ |
ipc_notif_cfg_t notif_cfg; |
} irq_t; |
extern void irq_init(count_t inrs, count_t chains); |
extern void irq_initialize(irq_t *irq); |
extern void irq_register(irq_t *irq); |
extern irq_t *irq_dispatch_and_lock(inr_t inr); |
extern irq_t *irq_find_and_lock(inr_t inr, devno_t devno); |
#endif |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/ddi/ddi_arg.h |
---|
0,0 → 1,62 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericddi |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_DDI_ARG_H_ |
#define KERN_DDI_ARG_H_ |
/** Structure encapsulating arguments for SYS_PHYSMEM_MAP syscall. */ |
typedef struct { |
/** ID of the destination task. */ |
unsigned long long task_id; |
/** Physical address of starting frame. */ |
void *phys_base; |
/** Virtual address of starting page. */ |
void *virt_base; |
/** Number of pages to map. */ |
unsigned long pages; |
/** Address space area flags for the mapping. */ |
int flags; |
} ddi_memarg_t; |
/** Structure encapsulating arguments for SYS_ENABLE_IOSPACE syscall. */ |
typedef struct { |
unsigned long long task_id; /**< ID of the destination task. */ |
void *ioaddr; /**< Starting I/O space address. */ |
unsigned long size; /**< Number of bytes. */ |
} ddi_ioarg_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/ddi/device.h |
---|
0,0 → 1,43 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericddi |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_DEVICE_H_ |
#define KERN_DEVICE_H_ |
extern devno_t device_assign_devno(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/ddi/ddi.h |
---|
0,0 → 1,66 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericddi |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_DDI_H_ |
#define KERN_DDI_H_ |
#include <ddi/ddi_arg.h> |
#include <arch/types.h> |
#include <proc/task.h> |
/** Structure representing contiguous physical memory area. */ |
typedef struct { |
uintptr_t pbase; /**< Physical base of the area. */ |
uintptr_t vbase; /**< Virtual base of the area. */ |
count_t frames; /**< Number of frames in the area. */ |
bool cacheable; /**< Cacheability. */ |
} parea_t; |
extern void ddi_init(void); |
extern void ddi_parea_register(parea_t *parea); |
extern unative_t sys_physmem_map(unative_t phys_base, unative_t virt_base, |
unative_t pages, unative_t flags); |
extern unative_t sys_iospace_enable(ddi_ioarg_t *uspace_io_arg); |
extern unative_t sys_preempt_control(int enable); |
/* |
* Interface to be implemented by all architectures. |
*/ |
extern int ddi_iospace_enable_arch(task_t *task, uintptr_t ioaddr, size_t size); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/print.h |
---|
0,0 → 1,59 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_PRINT_H_ |
#define KERN_PRINT_H_ |
#include <arch/types.h> |
#include <synch/spinlock.h> |
#include <arch/arg.h> |
/* We need this address in spinlock to avoid deadlock in deadlock detection */ |
SPINLOCK_EXTERN(printf_lock); |
#define EOF (-1) |
extern int puts(const char *s); |
extern int printf(const char *fmt, ...); |
extern int sprintf(char *str, const char *fmt, ...); |
extern int snprintf(char *str, size_t size, const char *fmt, ...); |
extern int vprintf(const char *fmt, va_list ap); |
extern int vsprintf(char *str, const char *fmt, va_list ap); |
extern int vsnprintf(char *str, size_t size, const char *fmt, va_list ap); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/printf/printf_core.h |
---|
0,0 → 1,55 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_PRINTF_CORE_H_ |
#define KERN_PRINTF_CORE_H_ |
#include <arch/types.h> |
#include <arch/arg.h> |
/** Structure for specifying output methods for different printf clones. */ |
struct printf_spec { |
/* Output function, returns count of printed characters or EOF */ |
int (*write)(void *, size_t, void *); |
/* Support data - output stream specification, its state, locks,... */ |
void *data; |
}; |
int printf_core(const char *fmt, struct printf_spec *ps, va_list ap); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/memstr.h |
---|
0,0 → 1,52 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_MEMSTR_H_ |
#define KERN_MEMSTR_H_ |
#include <arch/types.h> |
#include <arch/memstr.h> |
/* |
* Architecture independent variants. |
*/ |
extern void *_memcpy(void *dst, const void *src, size_t cnt); |
extern void _memsetb(uintptr_t dst, size_t cnt, uint8_t x); |
extern void _memsetw(uintptr_t dst, size_t cnt, uint16_t x); |
extern char *strcpy(char *dest, const char *src); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/console/chardev.h |
---|
0,0 → 1,80 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericconsole |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_CHARDEV_H_ |
#define KERN_CHARDEV_H_ |
#include <arch/types.h> |
#include <synch/waitq.h> |
#include <synch/spinlock.h> |
#define CHARDEV_BUFLEN 512 |
struct chardev; |
/* Character device operations interface. */ |
typedef struct { |
/** Suspend pushing characters. */ |
void (* suspend)(struct chardev *); |
/** Resume pushing characters. */ |
void (* resume)(struct chardev *); |
/** Write character to stream. */ |
void (* write)(struct chardev *, char c); |
/** Read character directly from device, assume interrupts disabled. */ |
char (* read)(struct chardev *); |
} chardev_operations_t; |
/** Character input device. */ |
typedef struct chardev { |
char *name; |
waitq_t wq; |
/** Protects everything below. */ |
SPINLOCK_DECLARE(lock); |
uint8_t buffer[CHARDEV_BUFLEN]; |
count_t counter; |
/** Implementation of chardev operations. */ |
chardev_operations_t *op; |
index_t index; |
void *data; |
} chardev_t; |
extern void chardev_initialize(char *name, chardev_t *chardev, |
chardev_operations_t *op); |
extern void chardev_push_character(chardev_t *chardev, uint8_t ch); |
#endif /* KERN_CHARDEV_H_ */ |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/console/kconsole.h |
---|
0,0 → 1,97 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericconsole |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_KCONSOLE_H_ |
#define KERN_KCONSOLE_H_ |
#include <adt/list.h> |
#include <synch/spinlock.h> |
#define MAX_CMDLINE 256 |
#define KCONSOLE_HISTORY 10 |
typedef enum { |
ARG_TYPE_INVALID = 0, |
ARG_TYPE_INT, |
ARG_TYPE_STRING, |
/** Variable type - either symbol or string. */ |
ARG_TYPE_VAR |
} cmd_arg_type_t; |
/** Structure representing one argument of kconsole command line. */ |
typedef struct { |
/** Type descriptor. */ |
cmd_arg_type_t type; |
/** Buffer where to store data. */ |
void *buffer; |
/** Size of the buffer. */ |
size_t len; |
/** Integer value. */ |
unative_t intval; |
/** Resulting type of variable arg */ |
cmd_arg_type_t vartype; |
} cmd_arg_t; |
/** Structure representing one kconsole command. */ |
typedef struct { |
/** Command list link. */ |
link_t link; |
/** This lock protects everything below. */ |
SPINLOCK_DECLARE(lock); |
/** Command name. */ |
const char *name; |
/** Textual description. */ |
const char *description; |
/** Function implementing the command. */ |
int (* func)(cmd_arg_t *); |
/** Number of arguments. */ |
count_t argc; |
/** Argument vector. */ |
cmd_arg_t *argv; |
/** Function for printing detailed help. */ |
void (* help)(void); |
} cmd_info_t; |
SPINLOCK_EXTERN(cmd_lock); |
extern link_t cmd_head; |
extern void kconsole_init(void); |
extern void kconsole(void *prompt); |
extern int cmd_register(cmd_info_t *cmd); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/console/console.h |
---|
0,0 → 1,55 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericconsole |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_CONSOLE_H_ |
#define KERN_CONSOLE_H_ |
#include <arch/types.h> |
#include <console/chardev.h> |
extern chardev_t *stdin; |
extern chardev_t *stdout; |
extern uint8_t getc(chardev_t *chardev); |
uint8_t _getc(chardev_t *chardev); |
extern count_t gets(chardev_t *chardev, char *buf, size_t buflen); |
extern void putchar(char c); |
extern void arch_grab_console(void); |
extern void arch_release_console(void); |
#endif /* KERN_CONSOLE_H_ */ |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/console/cmd.h |
---|
0,0 → 1,46 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericconsole |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_CMD_H_ |
#define KERN_CMD_H_ |
#include <console/kconsole.h> |
extern void cmd_initialize(cmd_info_t *cmd); |
extern void cmd_init(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/console/klog.h |
---|
0,0 → 1,44 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericklog |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_KLOG_H_ |
#define KERN_KLOG_H_ |
void klog_init(void); |
void klog_printf(const char *fmt, ...); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/cpu.h |
---|
0,0 → 1,103 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_CPU_H_ |
#define KERN_CPU_H_ |
#include <mm/tlb.h> |
#include <synch/spinlock.h> |
#include <proc/scheduler.h> |
#include <arch/cpu.h> |
#include <arch/context.h> |
#define CPU_STACK_SIZE STACK_SIZE |
/** CPU structure. |
* |
* There is one structure like this for every processor. |
*/ |
typedef struct { |
SPINLOCK_DECLARE(lock); |
tlb_shootdown_msg_t tlb_messages[TLB_MESSAGE_QUEUE_LEN]; |
count_t tlb_messages_count; |
context_t saved_context; |
atomic_t nrdy; |
runq_t rq[RQ_COUNT]; |
volatile count_t needs_relink; |
SPINLOCK_DECLARE(timeoutlock); |
link_t timeout_active_head; |
count_t missed_clock_ticks; /**< When system clock loses a tick, it is recorded here |
so that clock() can react. This variable is |
CPU-local and can be only accessed when interrupts |
are disabled. */ |
/** |
* Processor ID assigned by kernel. |
*/ |
unsigned int id; |
int active; |
int tlb_active; |
uint16_t frequency_mhz; |
uint32_t delay_loop_const; |
cpu_arch_t arch; |
struct thread *fpu_owner; |
/** |
* Stack used by scheduler when there is no running thread. |
*/ |
uint8_t *stack; |
} cpu_t; |
extern cpu_t *cpus; |
extern void cpu_init(void); |
extern void cpu_list(void); |
extern void cpu_arch_init(void); |
extern void cpu_identify(void); |
extern void cpu_print_report(cpu_t *m); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/func.h |
---|
0,0 → 1,55 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_FUNC_H_ |
#define KERN_FUNC_H_ |
#include <arch/types.h> |
#include <atomic.h> |
extern atomic_t haltstate; |
extern void halt(void); |
extern size_t strlen(const char *str); |
extern int strcmp(const char *src, const char *dst); |
extern int strncmp(const char *src, const char *dst, size_t len); |
extern void strncpy(char *dest, const char *src, size_t len); |
extern unative_t atoi(const char *text); |
extern void order(const uint64_t val, uint64_t *rv, char *suffix); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/fpu_context.h |
---|
0,0 → 1,53 |
/* |
* Copyright (c) 2005 Jakub Vana |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_FPU_CONTEXT_H_ |
#define KERN_FPU_CONTEXT_H_ |
#include <arch/fpu_context.h> |
#if defined(CONFIG_FPU_LAZY) && !defined(ARCH_HAS_FPU) |
# error "CONFIG_FPU_LAZY defined, but no ARCH_HAS_FPU" |
#endif |
extern void fpu_context_save(fpu_context_t *); |
extern void fpu_context_restore(fpu_context_t *); |
extern void fpu_init(void); |
extern void fpu_enable(void); |
extern void fpu_disable(void); |
#endif /* KERN_FPU_CONTEXT_H_ */ |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/debug.h |
---|
0,0 → 1,66 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genericdebug |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_DEBUG_H_ |
#define KERN_DEBUG_H_ |
#include <panic.h> |
#include <arch/debug.h> |
#define CALLER ((uintptr_t)__builtin_return_address(0)) |
#ifndef HERE |
/** Current Instruction Pointer address */ |
# define HERE ((uintptr_t *) 0) |
#endif |
/** Debugging ASSERT macro |
* |
* If CONFIG_DEBUG is set, the ASSERT() macro |
* evaluates expr and if it is false raises |
* kernel panic. |
* |
* @param expr Expression which is expected to be true. |
* |
*/ |
#ifdef CONFIG_DEBUG |
# define ASSERT(expr) if (!(expr)) { panic("assertion failed (%s), caller=%.*p\n", #expr, sizeof(uintptr_t) * 2, CALLER); } |
#else |
# define ASSERT(expr) |
#endif |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/main/main.h |
---|
0,0 → 1,43 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup main |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_MAIN_H_ |
#define KERN_MAIN_H_ |
extern uintptr_t stack_safe; |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/main/kinit.h |
---|
0,0 → 1,43 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup main |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_KINIT_H_ |
#define KERN_KINIT_H_ |
extern void kinit(void *arg); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/main/version.h |
---|
0,0 → 1,44 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup main |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_VERSION_H_ |
#define KERN_VERSION_H_ |
extern void version_print(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/main/uinit.h |
---|
0,0 → 1,45 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup main |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_UINIT_H_ |
#define KERN_UINIT_H_ |
#include <arch/types.h> |
extern void uinit(void *arg); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/bitops.h |
---|
0,0 → 1,92 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_BITOPS_H_ |
#define KERN_BITOPS_H_ |
/** Return position of first non-zero bit from left (i.e. [log_2(arg)]). |
* |
* If number is zero, it returns 0 |
*/ |
static inline int fnzb32(uint32_t arg) |
{ |
int n = 0; |
if (arg >> 16) { |
arg >>= 16; |
n += 16; |
} |
if (arg >> 8) { |
arg >>= 8; |
n += 8; |
} |
if (arg >> 4) { |
arg >>= 4; |
n += 4; |
} |
if (arg >> 2) { |
arg >>= 2; |
n += 2; |
} |
if (arg >> 1) { |
arg >>= 1; |
n += 1; |
} |
return n; |
} |
static inline int fnzb64(uint64_t arg) |
{ |
int n = 0; |
if (arg >> 32) { |
arg >>= 32; |
n += 32; |
} |
return n + fnzb32((uint32_t) arg); |
} |
#define fnzb(x) fnzb32(x) |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/security/cap.h |
---|
0,0 → 1,89 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** @file |
*/ |
/** |
* @file |
* @brief Capabilities definitions. |
* |
* Capabilities represent virtual rights that entitle their |
* holder to perform certain security sensitive tasks. |
* |
* Each task can have arbitrary combination of the capabilities |
* defined in this file. Therefore, they are required to be powers |
* of two. |
*/ |
#ifndef __CAP_H__ |
#define __CAP_H__ |
#include <syscall/sysarg64.h> |
#include <arch/types.h> |
/** |
* CAP_CAP allows its holder to grant/revoke arbitrary |
* privilege to/from other tasks. |
*/ |
#define CAP_CAP (1<<0) |
/** |
* CAP_MEM_MANAGER allows its holder to map physical memory |
* to other tasks. |
*/ |
#define CAP_MEM_MANAGER (1<<1) |
/** |
* CAP_IO_MANAGER allows its holder to access I/O space |
* to other tasks. |
*/ |
#define CAP_IO_MANAGER (1<<2) |
/** |
* CAP_PREEMPT_CONTROL allows its holder to disable/enable preemption. |
*/ |
#define CAP_PREEMPT_CONTROL (1<<3) |
/** |
* CAP_IRQ_REG entitles its holder to register IRQ handlers. |
*/ |
#define CAP_IRQ_REG (1<<4) |
typedef uint32_t cap_t; |
extern unative_t sys_cap_grant(sysarg64_t *uspace_taskid_arg, cap_t caps); |
extern unative_t sys_cap_revoke(sysarg64_t *uspace_taskid_arg, cap_t caps); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/typedefs.h |
---|
0,0 → 1,43 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_TYPEDEFS_H_ |
#define KERN_TYPEDEFS_H_ |
typedef void (* function)(); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/context.h |
---|
0,0 → 1,93 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_CONTEXT_H_ |
#define KERN_CONTEXT_H_ |
#include <arch/types.h> |
#include <arch/context.h> |
#ifndef context_set |
#define context_set(c, _pc, stack, size) \ |
(c)->pc = (uintptr_t) (_pc); \ |
(c)->sp = ((uintptr_t) (stack)) + (size) - SP_DELTA; |
#endif /* context_set */ |
extern int context_save_arch(context_t *c); |
extern void context_restore_arch(context_t *c) __attribute__ ((noreturn)); |
/** Save register context. |
* |
* Save current register context (including stack pointers) |
* to context structure. |
* |
* Note that call to context_restore() will return at the same |
* address as the corresponding call to context_save(). |
* |
* This MUST be a macro, gcc -O0 does not inline functions even |
* if they are marked inline and context_save_arch must be called |
* from level <= that when context_restore is called. |
* |
* @param c Context structure. |
* |
* @return context_save() returns 1, context_restore() returns 0. |
*/ |
#define context_save(c) context_save_arch(c) |
/** Restore register context. |
* |
* Restore previously saved register context (including stack pointers) |
* from context structure. |
* |
* Note that this function does not normally return. |
* Instead, it returns at the same address as the |
* corresponding call to context_save(), the only |
* difference being return value. |
* |
* Note that content of any local variable defined by |
* the caller of context_save() is undefined after |
* context_restore(). |
* |
* @param c Context structure. |
*/ |
static inline void context_restore(context_t *c) |
{ |
context_restore_arch(c); |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/align.h |
---|
0,0 → 1,59 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @ingroup others |
* @{ |
*/ |
/** |
* @file |
* @brief Macros for making values and addresses aligned. |
*/ |
#ifndef KERN_ALIGN_H_ |
#define KERN_ALIGN_H_ |
/** Align to the nearest lower address. |
* |
* @param s Address or size to be aligned. |
* @param a Size of alignment, must be power of 2. |
*/ |
#define ALIGN_DOWN(s, a) ((s) & ~((a) - 1)) |
/** Align to the nearest higher address. |
* |
* @param s Address or size to be aligned. |
* @param a Size of alignment, must be power of 2. |
*/ |
#define ALIGN_UP(s, a) (((s) + ((a) - 1)) & ~((a) - 1)) |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/stackarg.h |
---|
0,0 → 1,64 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** @file |
*/ |
/* |
* Variable argument list manipulation macros |
* for architectures using stack to pass arguments. |
*/ |
#ifndef KERN_STACKARG_H_ |
#define KERN_STACKARG_H_ |
#include <arch/types.h> |
typedef struct va_list { |
int pos; |
uint8_t *last; |
} va_list; |
#define va_start(ap, lst) \ |
(ap).pos = sizeof(lst); \ |
(ap).last = (uint8_t *) &(lst) |
#define va_arg(ap, type) \ |
(*((type *)((ap).last + ((ap).pos += sizeof(type) ) - sizeof(type)))) |
#define va_copy(dst,src) dst=src |
#define va_end(ap) |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/byteorder.h |
---|
0,0 → 1,61 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_BYTEORDER_H_ |
#define KERN_BYTEORDER_H_ |
static inline uint64_t uint64_t_byteorder_swap(uint64_t n) |
{ |
return ((n & 0xff) << 56) | |
((n & 0xff00) << 40) | |
((n & 0xff0000) << 24) | |
((n & 0xff000000LL) << 8) | |
((n & 0xff00000000LL) >> 8) | |
((n & 0xff0000000000LL) >> 24) | |
((n & 0xff000000000000LL) >> 40) | |
((n & 0xff00000000000000LL) >> 56); |
} |
static inline uint32_t uint32_t_byteorder_swap(uint32_t n) |
{ |
return ((n & 0xff) << 24) | |
((n & 0xff00) << 8) | |
((n & 0xff0000) >> 8) | |
((n & 0xff000000) >> 24); |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/symtab.h |
---|
0,0 → 1,58 |
/* |
* Copyright (c) 2005 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_SYMTAB_H_ |
#define KERN_SYMTAB_H_ |
#include <arch/types.h> |
#define MAX_SYMBOL_NAME 64 |
struct symtab_entry { |
uint64_t address_le; |
char symbol_name[MAX_SYMBOL_NAME]; |
}; |
extern char * get_symtab_entry(unative_t addr); |
extern uintptr_t get_symbol_addr(const char *name); |
extern void symtab_print_search(const char *name); |
extern int symtab_compl(char *name); |
/* Symtable linked together by build process */ |
extern struct symtab_entry symbol_table[]; |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/sysinfo/sysinfo.h |
---|
0,0 → 1,91 |
/* |
* Copyright (c) 2006 Jakub Vana |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_SYSINFO_H_ |
#define KERN_SYSINFO_H_ |
#include <arch/types.h> |
typedef union sysinfo_item_val { |
unative_t val; |
void *fn; |
} sysinfo_item_val_t; |
typedef struct sysinfo_item { |
char *name; |
union { |
unative_t val; |
void *fn; |
} val; |
union { |
struct sysinfo_item *table; |
void *fn; |
} subinfo; |
struct sysinfo_item *next; |
int val_type; |
int subinfo_type; |
} sysinfo_item_t; |
#define SYSINFO_VAL_VAL 0 |
#define SYSINFO_VAL_FUNCTION 1 |
#define SYSINFO_VAL_UNDEFINED '?' |
#define SYSINFO_SUBINFO_NONE 0 |
#define SYSINFO_SUBINFO_TABLE 1 |
#define SYSINFO_SUBINFO_FUNCTION 2 |
typedef unative_t (*sysinfo_val_fn_t)(sysinfo_item_t *root); |
typedef unative_t (*sysinfo_subinfo_fn_t)(const char *subname); |
typedef struct sysinfo_rettype { |
unative_t val; |
unative_t valid; |
} sysinfo_rettype_t; |
void sysinfo_set_item_val(const char *name, sysinfo_item_t **root, unative_t val); |
void sysinfo_dump(sysinfo_item_t **root, int depth); |
void sysinfo_set_item_function(const char *name, sysinfo_item_t **root, sysinfo_val_fn_t fn); |
void sysinfo_set_item_undefined(const char *name, sysinfo_item_t **root); |
sysinfo_rettype_t sysinfo_get_val(const char *name, sysinfo_item_t **root); |
unative_t sys_sysinfo_valid(unative_t ptr, unative_t len); |
unative_t sys_sysinfo_value(unative_t ptr, unative_t len); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/userspace.h |
---|
0,0 → 1,47 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_USERSPACE_H_ |
#define KERN_USERSPACE_H_ |
#include <proc/thread.h> |
#include <arch/types.h> |
/** Switch to user-space (CPU user priviledge level) */ |
extern void userspace(uspace_arg_t *uarg) __attribute__ ((noreturn)); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/putchar.h |
---|
0,0 → 1,43 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_PUTCHAR_H_ |
#define KERN_PUTCHAR_H_ |
extern void putchar(const char ch); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/smp/smp.h |
---|
0,0 → 1,52 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_SMP_H_ |
#define KERN_SMP_H_ |
#include <synch/waitq.h> |
extern waitq_t ap_completion_wq; |
#ifdef CONFIG_SMP |
extern void smp_init(void); |
extern void kmp(void *arg); |
#else |
#define smp_init() |
#endif /* CONFIG_SMP */ |
#endif /* __SMP_H__ */ |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/smp/ipi.h |
---|
0,0 → 1,48 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_IPI_H_ |
#define KERN_IPI_H_ |
#ifdef CONFIG_SMP |
extern void ipi_broadcast(int ipi); |
extern void ipi_broadcast_arch(int ipi); |
#else |
#define ipi_broadcast(x) ; |
#endif /* CONFIG_SMP */ |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/atomic.h |
---|
0,0 → 1,57 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ATOMIC_H_ |
#define KERN_ATOMIC_H_ |
typedef struct atomic { |
volatile long count; |
} atomic_t; |
#include <arch/atomic.h> |
static inline void atomic_set(atomic_t *val, long i) |
{ |
val->count = i; |
} |
static inline long atomic_get(atomic_t *val) |
{ |
return val->count; |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/preemption.h |
---|
0,0 → 1,44 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_PREEMPTION_H_ |
#define KERN_PREEMPTION_H_ |
extern void preemption_disable(void); |
extern void preemption_enable(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/stdarg.h |
---|
0,0 → 1,53 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** @file |
*/ |
/* |
* Variable argument list manipulation macros |
* for all architectures with compiler support for __builtin_va_*. |
*/ |
#ifndef KERN_STDARG_H_ |
#define KERN_STDARG_H_ |
typedef __builtin_va_list va_list; |
#define va_start(ap, last) __builtin_va_start(ap, last) |
#define va_arg(ap, type) __builtin_va_arg(ap, type) |
#define va_end(ap) __builtin_va_end(ap) |
#define va_copy(dst,src) __builtin_va_copy(dst,src) |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/generic/include/sort.h |
---|
0,0 → 1,57 |
/* |
* Copyright (c) 2005 Sergey Bondari |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_SORT_H_ |
#define KERN_SORT_H_ |
#include <arch/types.h> |
/* |
* sorting routines |
*/ |
extern void bubblesort(void * data, count_t n, size_t e_size, int (* cmp) (void * a, void * b)); |
extern void qsort(void * data, count_t n, size_t e_size, int (* cmp) (void * a, void * b)); |
/* |
* default sorting comparators |
*/ |
extern int int_cmp(void * a, void * b); |
extern int uint32_t_cmp(void * a, void * b); |
extern int uint16_t_cmp(void * a, void * b); |
extern int uint8_t_cmp(void * a, void * b); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/Makefile |
---|
0,0 → 1,394 |
# |
# Copyright (c) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
## Include configuration |
# |
-include ../version |
-include Makefile.config |
INCLUDES = generic/include |
OPTIMIZATION = 3 |
## Common compiler flags |
# |
DEFS = -D$(ARCH) -DARCH=\"$(ARCH)\" -DRELEASE=\"$(RELEASE)\" "-DNAME=\"$(NAME)\"" \ |
-DKERNEL |
GCC_CFLAGS = -I$(INCLUDES) -O$(OPTIMIZATION) \ |
-fno-builtin -fomit-frame-pointer -Wall -Wextra -Wno-unused-parameter -Wmissing-prototypes -Werror \ |
-nostdlib -nostdinc |
ICC_CFLAGS = -I$(INCLUDES) -O$(OPTIMIZATION) \ |
-fno-builtin -fomit-frame-pointer -Wall -Wmissing-prototypes -Werror \ |
-nostdlib -nostdinc \ |
-wd170 |
SUNCC_CFLAGS = -I$(INCLUDES) -xO$(OPTIMIZATION) \ |
-xnolib -xc99=all -features=extensions \ |
-erroff=E_ZERO_SIZED_STRUCT_UNION |
LFLAGS = -M |
AFLAGS = |
ifdef REVISION |
DEFS += "-DREVISION=\"$(REVISION)\"" |
endif |
ifdef TIMESTAMP |
DEFS += "-DTIMESTAMP=\"$(TIMESTAMP)\"" |
endif |
-include arch/$(ARCH)/Makefile.inc |
-include genarch/Makefile.inc |
## The at-sign |
# |
# The $(ATSIGN) variable holds the ASCII character representing the at-sign |
# ('@') used in various $(AS) constructs (e.g. @progbits). On architectures that |
# don't use '@' for starting a comment, $(ATSIGN) is merely '@'. However, on |
# those that do use it for starting a comment (e.g. arm32), $(ATSIGN) must be |
# defined as the percentile-sign ('%') in the architecture-dependent |
# Makefile.inc. |
# |
ATSIGN ?= @ |
## Cross-platform assembly to start a symtab.data section |
# |
SYMTAB_SECTION=".section symtab.data, \"a\", $(ATSIGN)progbits;" |
## Setup kernel configuration |
# |
ifeq ($(CONFIG_DEBUG),y) |
DEFS += -DCONFIG_DEBUG |
endif |
ifeq ($(CONFIG_DEBUG_SPINLOCK),y) |
DEFS += -DCONFIG_DEBUG_SPINLOCK |
endif |
ifeq ($(CONFIG_DEBUG_AS_WATCHPOINT),y) |
DEFS += -DCONFIG_DEBUG_AS_WATCHPOINT |
endif |
ifeq ($(CONFIG_FPU_LAZY),y) |
DEFS += -DCONFIG_FPU_LAZY |
endif |
ifeq ($(CONFIG_DEBUG_ALLREGS),y) |
DEFS += -DCONFIG_DEBUG_ALLREGS |
endif |
ifeq ($(CONFIG_VHPT),y) |
DEFS += -DCONFIG_VHPT |
endif |
ifeq ($(CONFIG_TSB),y) |
DEFS += -DCONFIG_TSB |
endif |
ifeq ($(CONFIG_Z8530),y) |
DEFS += -DCONFIG_Z8530 |
endif |
ifeq ($(CONFIG_NS16550),y) |
DEFS += -DCONFIG_NS16550 |
endif |
ifeq ($(CONFIG_VIRT_IDX_DCACHE),y) |
DEFS += -DCONFIG_VIRT_IDX_DCACHE |
endif |
ifeq ($(CONFIG_FB),y) |
ifeq ($(ARCH),ia32) |
DEFS += -DCONFIG_VESA_WIDTH=$(CONFIG_VESA_WIDTH) |
DEFS += -DCONFIG_VESA_HEIGHT=$(CONFIG_VESA_HEIGHT) |
DEFS += -DCONFIG_VESA_BPP=$(CONFIG_VESA_BPP) |
endif |
ifeq ($(ARCH),amd64) |
DEFS += -DCONFIG_VESA_WIDTH=$(CONFIG_VESA_WIDTH) |
DEFS += -DCONFIG_VESA_HEIGHT=$(CONFIG_VESA_HEIGHT) |
DEFS += -DCONFIG_VESA_BPP=$(CONFIG_VESA_BPP) |
endif |
ifeq ($(ARCH),ia32xen) |
DEFS += -DCONFIG_VESA_WIDTH=$(CONFIG_VESA_WIDTH) |
DEFS += -DCONFIG_VESA_HEIGHT=$(CONFIG_VESA_HEIGHT) |
DEFS += -DCONFIG_VESA_BPP=$(CONFIG_VESA_BPP) |
endif |
endif |
## Simple detection for the type of the host system |
# |
HOST = $(shell uname) |
## On Solaris, some utilities have slightly different names |
# |
ifeq ($(HOST),SunOS) |
BINUTILS_PREFIX = "g" |
else |
BINUTILS_PREFIX = "" |
endif |
## Toolchain configuration |
# |
ifeq ($(COMPILER),gcc_native) |
CC = gcc |
GCC = gcc |
AS = $(BINUTILS_PREFIX)as |
LD = $(BINUTILS_PREFIX)ld |
OBJCOPY = $(BINUTILS_PREFIX)objcopy |
OBJDUMP = $(BINUTILS_PREFIX)objdump |
LIBDIR = /usr/lib |
CFLAGS = $(GCC_CFLAGS) |
endif |
ifeq ($(COMPILER),icc_native) |
CC = icc |
GCC = gcc |
AS = as |
LD = ld |
OBJCOPY = objcopy |
OBJDUMP = objdump |
LIBDIR = /usr/lib |
CFLAGS = $(ICC_CFLAGS) |
endif |
ifeq ($(COMPILER),suncc_native) |
CC = suncc |
GCC = gcc |
AS = $(BINUTILS_PREFIX)as |
LD = $(BINUTILS_PREFIX)ld |
OBJCOPY = $(BINUTILS_PREFIX)objcopy |
OBJDUMP = $(BINUTILS_PREFIX)objdump |
LIBDIR = /usr/lib |
CFLAGS = $(SUNCC_CFLAGS) |
endif |
ifeq ($(COMPILER),gcc_cross) |
CC = $(TOOLCHAIN_DIR)/bin/$(TARGET)-gcc |
GCC = $(CC) |
AS = $(TOOLCHAIN_DIR)/bin/$(TARGET)-as |
LD = $(TOOLCHAIN_DIR)/bin/$(TARGET)-ld |
OBJCOPY = $(TOOLCHAIN_DIR)/bin/$(TARGET)-objcopy |
OBJDUMP = $(TOOLCHAIN_DIR)/bin/$(TARGET)-objdump |
LIBDIR = $(TOOLCHAIN_DIR)/lib |
CFLAGS = $(GCC_CFLAGS) |
endif |
## Generic kernel sources |
# |
GENERIC_SOURCES = \ |
generic/src/adt/avl.c \ |
generic/src/adt/bitmap.c \ |
generic/src/adt/btree.c \ |
generic/src/adt/hash_table.c \ |
generic/src/adt/list.c \ |
generic/src/console/chardev.c \ |
generic/src/console/console.c \ |
generic/src/console/kconsole.c \ |
generic/src/console/klog.c \ |
generic/src/console/cmd.c \ |
generic/src/cpu/cpu.c \ |
generic/src/ddi/ddi.c \ |
generic/src/ddi/irq.c \ |
generic/src/ddi/device.c \ |
generic/src/interrupt/interrupt.c \ |
generic/src/main/main.c \ |
generic/src/main/kinit.c \ |
generic/src/main/uinit.c \ |
generic/src/main/version.c \ |
generic/src/main/shutdown.c \ |
generic/src/proc/scheduler.c \ |
generic/src/proc/thread.c \ |
generic/src/proc/task.c \ |
generic/src/proc/the.c \ |
generic/src/proc/tasklet.c \ |
generic/src/syscall/syscall.c \ |
generic/src/syscall/copy.c \ |
generic/src/mm/buddy.c \ |
generic/src/mm/frame.c \ |
generic/src/mm/page.c \ |
generic/src/mm/tlb.c \ |
generic/src/mm/as.c \ |
generic/src/mm/backend_anon.c \ |
generic/src/mm/backend_elf.c \ |
generic/src/mm/backend_phys.c \ |
generic/src/mm/slab.c \ |
generic/src/lib/func.c \ |
generic/src/lib/memstr.c \ |
generic/src/lib/sort.c \ |
generic/src/lib/elf.c \ |
generic/src/lib/rd.c \ |
generic/src/printf/printf_core.c \ |
generic/src/printf/printf.c \ |
generic/src/printf/sprintf.c \ |
generic/src/printf/snprintf.c \ |
generic/src/printf/vprintf.c \ |
generic/src/printf/vsprintf.c \ |
generic/src/printf/vsnprintf.c \ |
generic/src/debug/symtab.c \ |
generic/src/time/clock.c \ |
generic/src/time/timeout.c \ |
generic/src/time/delay.c \ |
generic/src/preempt/preemption.c \ |
generic/src/synch/spinlock.c \ |
generic/src/synch/condvar.c \ |
generic/src/synch/rwlock.c \ |
generic/src/synch/mutex.c \ |
generic/src/synch/semaphore.c \ |
generic/src/synch/waitq.c \ |
generic/src/synch/futex.c \ |
generic/src/smp/ipi.c \ |
generic/src/smp/smp.c \ |
generic/src/ipc/ipc.c \ |
generic/src/ipc/sysipc.c \ |
generic/src/ipc/ipcrsc.c \ |
generic/src/ipc/irq.c \ |
generic/src/security/cap.c \ |
generic/src/sysinfo/sysinfo.c |
## Test sources |
# |
ifeq ($(CONFIG_TEST),y) |
DEFS += -DCONFIG_TEST |
CFLAGS += -Itest/ |
GENERIC_SOURCES += \ |
test/test.c \ |
test/atomic/atomic1.c \ |
test/btree/btree1.c \ |
test/avltree/avltree1.c \ |
test/debug/mips1.c \ |
test/fault/fault1.c \ |
test/fpu/fpu1.c \ |
test/fpu/sse1.c \ |
test/fpu/mips2.c \ |
test/mm/falloc1.c \ |
test/mm/falloc2.c \ |
test/mm/mapping1.c \ |
test/mm/slab1.c \ |
test/mm/slab2.c \ |
test/mm/purge1.c \ |
test/synch/rwlock1.c \ |
test/synch/rwlock2.c \ |
test/synch/rwlock3.c \ |
test/synch/rwlock4.c \ |
test/synch/rwlock5.c \ |
test/synch/semaphore1.c \ |
test/synch/semaphore2.c \ |
test/print/print1.c \ |
test/thread/thread1.c \ |
test/sysinfo/sysinfo1.c |
endif |
## Experimental features |
# |
ifeq ($(CONFIG_EXPERIMENTAL),y) |
GENERIC_SOURCES += generic/src/lib/objc_ext.c \ |
generic/src/lib/objc.c |
EXTRA_OBJECTS = $(LIBDIR)/libobjc.a |
EXTRA_FLAGS += -x objective-c |
endif |
GENERIC_OBJECTS := $(addsuffix .o,$(basename $(GENERIC_SOURCES))) |
ARCH_OBJECTS := $(addsuffix .o,$(basename $(ARCH_SOURCES))) |
GENARCH_OBJECTS := $(addsuffix .o,$(basename $(GENARCH_SOURCES))) |
.PHONY: all build config distclean clean archlinks depend disasm |
all: |
../tools/config.py kernel.config default $(ARCH) $(COMPILER) $(CONFIG_DEBUG) $(MACHINE) |
$(MAKE) -C . build |
build: kernel.bin disasm |
config: |
-rm Makefile.depend |
../tools/config.py kernel.config |
-include Makefile.depend |
distclean: clean |
-rm Makefile.config |
clean: |
-rm -f kernel.bin kernel.raw kernel.map kernel.map.pre kernel.objdump kernel.disasm generic/src/debug/real_map.bin Makefile.depend* generic/include/arch generic/include/genarch arch/$(ARCH)/_link.ld |
find generic/src/ arch/*/src/ genarch/src/ test/ -name '*.o' -follow -exec rm \{\} \; |
for arch in arch/* ; do \ |
[ -e $$arch/_link.ld ] && rm $$arch/_link.ld 2>/dev/null ; \ |
done ; exit 0 |
archlinks: |
ln -sfn ../../arch/$(ARCH)/include/ generic/include/arch |
ln -sfn ../../genarch/include/ generic/include/genarch |
depend: archlinks |
-makedepend $(DEFS) $(CFLAGS) -f - $(ARCH_SOURCES) $(GENARCH_SOURCES) $(GENERIC_SOURCES) > Makefile.depend 2> /dev/null |
arch/$(ARCH)/_link.ld: arch/$(ARCH)/_link.ld.in |
$(GCC) $(DEFS) $(GCC_CFLAGS) -D__ASM__ -D__LINKER__ -E -x c $< | grep -v "^\#" > $@ |
generic/src/debug/real_map.bin: depend arch/$(ARCH)/_link.ld $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) |
echo $(SYMTAB_SECTION) | $(AS) $(AFLAGS) -o generic/src/debug/empty_map.o |
$(LD) -T arch/$(ARCH)/_link.ld $(LFLAGS) $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) $(EXTRA_OBJECTS) generic/src/debug/empty_map.o -o $@ -Map kernel.map.pre |
$(OBJDUMP) -t $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) > kernel.objdump |
tools/genmap.py kernel.map.pre kernel.objdump generic/src/debug/real_map.bin |
# Do it once again, this time to get correct even the symbols |
# on architectures, that have bss after symtab |
echo $(SYMTAB_SECTION)" .incbin \"$@\"" | $(AS) $(AFLAGS) -o generic/src/debug/sizeok_map.o |
$(LD) -T arch/$(ARCH)/_link.ld $(LFLAGS) $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) $(EXTRA_OBJECTS) generic/src/debug/sizeok_map.o -o $@ -Map kernel.map.pre |
$(OBJDUMP) -t $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) > kernel.objdump |
tools/genmap.py kernel.map.pre kernel.objdump generic/src/debug/real_map.bin |
generic/src/debug/real_map.o: generic/src/debug/real_map.bin |
echo $(SYMTAB_SECTION)" .incbin \"$<\"" | $(AS) $(AFLAGS) -o $@ |
kernel.raw: depend arch/$(ARCH)/_link.ld $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) generic/src/debug/real_map.o |
$(LD) -T arch/$(ARCH)/_link.ld $(LFLAGS) $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(GENERIC_OBJECTS) $(EXTRA_OBJECTS) generic/src/debug/real_map.o -o $@ -Map kernel.map |
kernel.bin: kernel.raw |
$(OBJCOPY) -O $(BFD) kernel.raw kernel.bin |
disasm: kernel.raw |
$(OBJDUMP) -d kernel.raw > kernel.disasm |
%.o: %.S |
$(GCC) $(DEFS) $(GCC_CFLAGS) -D__ASM__ -c $< -o $@ |
%.o: %.s |
$(AS) $(AFLAGS) $< -o $@ |
%.o: %.c |
$(CC) $(DEFS) $(CFLAGS) $(EXTRA_FLAGS) -c $< -o $@ |
/tags/0.3.0/kernel/test/test.c |
---|
0,0 → 1,69 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup test |
* @{ |
*/ |
/** @file |
*/ |
#include <test.h> |
test_t tests[] = { |
#include <atomic/atomic1.def> |
#include <avltree/avltree1.def> |
#include <btree/btree1.def> |
#include <debug/mips1.def> |
#include <fault/fault1.def> |
#include <fpu/fpu1.def> |
#include <fpu/sse1.def> |
#include <fpu/mips2.def> |
#include <mm/falloc1.def> |
#include <mm/falloc2.def> |
#include <mm/mapping1.def> |
#include <mm/slab1.def> |
#include <mm/slab2.def> |
#include <synch/rwlock1.def> |
#include <synch/rwlock2.def> |
#include <synch/rwlock3.def> |
#include <synch/rwlock4.def> |
#include <synch/rwlock5.def> |
#include <synch/semaphore1.def> |
#include <synch/semaphore2.def> |
#include <print/print1.def> |
#include <thread/thread1.def> |
#include <sysinfo/sysinfo1.def> |
{ |
.name = NULL, |
.desc = NULL, |
.entry = NULL |
} |
}; |
/** @} |
*/ |
/tags/0.3.0/kernel/test/avltree/avltree1.c |
---|
0,0 → 1,286 |
/* |
* Copyright (c) 2007 Vojtech Mencl |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#include <test.h> |
#include <print.h> |
#include <adt/avl.h> |
#include <debug.h> |
#include <arch/types.h> |
#define NODE_COUNT 100 |
static avltree_t avltree; |
/* |
* avl tree nodes in array for faster allocation |
*/ |
static avltree_node_t avltree_nodes[NODE_COUNT]; |
/* |
* head of free nodes' list: |
*/ |
static avltree_node_t *first_free_node = NULL; |
static int test_tree_balance(avltree_node_t *node); |
static avltree_node_t *test_tree_parents(avltree_node_t *node); |
static void print_tree_structure_flat (avltree_node_t *node, int level); |
static avltree_node_t *alloc_avltree_node(void); |
static avltree_node_t *test_tree_parents(avltree_node_t *node) |
{ |
avltree_node_t *tmp; |
if (!node) |
return NULL; |
if (node->lft) { |
tmp = test_tree_parents(node->lft); |
if (tmp != node) { |
printf("Bad parent pointer key: %d, address: %p\n", |
tmp->key, node->lft); |
} |
} |
if (node->rgt) { |
tmp = test_tree_parents(node->rgt); |
if (tmp != node) { |
printf("Bad parent pointer key: %d, address: %p\n", |
tmp->key,node->rgt); |
} |
} |
return node->par; |
} |
int test_tree_balance(avltree_node_t *node) |
{ |
int h1, h2, diff; |
if (!node) |
return 0; |
h1 = test_tree_balance(node->lft); |
h2 = test_tree_balance(node->rgt); |
diff = h2 - h1; |
if (diff != node->balance || (diff != -1 && diff != 0 && diff != 1)) { |
printf("Bad balance\n"); |
} |
return h1 > h2 ? h1 + 1 : h2 + 1; |
} |
/** |
* Prints the structure of the node, which is level levels from the top of the |
* tree. |
*/ |
static void print_tree_structure_flat(avltree_node_t *node, int level) |
{ |
/* |
* You can set the maximum level as high as you like. |
* Most of the time, you'll want to debug code using small trees, |
* so that a large level indicates a loop, which is a bug. |
*/ |
if (level > 16) { |
printf("[...]"); |
return; |
} |
if (node == NULL) |
return; |
printf("%d[%d]", node->key, node->balance); |
if (node->lft != NULL || node->rgt != NULL) { |
printf("("); |
print_tree_structure_flat(node->lft, level + 1); |
if (node->rgt != NULL) { |
printf(","); |
print_tree_structure_flat(node->rgt, level + 1); |
} |
printf(")"); |
} |
} |
static void alloc_avltree_node_prepare(void) |
{ |
int i; |
for (i = 0; i < NODE_COUNT - 1; i++) { |
avltree_nodes[i].par = &avltree_nodes[i + 1]; |
} |
/* |
* Node keys which will be used for insertion. Up to NODE_COUNT size of |
* array. |
*/ |
/* First tree node and same key */ |
avltree_nodes[0].key = 60; |
avltree_nodes[1].key = 60; |
avltree_nodes[2].key = 60; |
/* LL rotation */ |
avltree_nodes[3].key = 50; |
avltree_nodes[4].key = 40; |
avltree_nodes[5].key = 30; |
/* LR rotation */ |
avltree_nodes[6].key = 20; |
avltree_nodes[7].key = 20; |
avltree_nodes[8].key = 25; |
avltree_nodes[9].key = 25; |
/* LL rotation in lower floor */ |
avltree_nodes[10].key = 35; |
/* RR rotation */ |
avltree_nodes[11].key = 70; |
avltree_nodes[12].key = 80; |
/* RL rotation */ |
avltree_nodes[13].key = 90; |
avltree_nodes[14].key = 85; |
/* Insert 0 key */ |
avltree_nodes[15].key = 0; |
avltree_nodes[16].key = 0; |
/* Insert reverse */ |
avltree_nodes[17].key = 600; |
avltree_nodes[18].key = 500; |
avltree_nodes[19].key = 400; |
avltree_nodes[20].key = 300; |
for (i = 21; i < NODE_COUNT; i++) |
avltree_nodes[i].key = i * 3; |
avltree_nodes[i].par = NULL; |
first_free_node = &avltree_nodes[0]; |
} |
static avltree_node_t *alloc_avltree_node(void) |
{ |
avltree_node_t *node; |
node = first_free_node; |
first_free_node = first_free_node->par; |
return node; |
} |
static void test_tree_insert(avltree_t *tree, count_t node_count, bool quiet) |
{ |
unsigned int i; |
avltree_node_t *newnode; |
avltree_create(tree); |
if (!quiet) |
printf("Inserting %d nodes...", node_count); |
for (i = 0; i < node_count; i++) { |
newnode = alloc_avltree_node(); |
avltree_insert(tree, newnode); |
if (!quiet) { |
test_tree_parents(tree->root); |
test_tree_balance(tree->root); |
} |
} |
if (!quiet) |
printf("done.\n"); |
} |
static void test_tree_delete(avltree_t *tree, count_t node_count, |
int node_position, bool quiet) |
{ |
avltree_node_t *delnode; |
unsigned int i; |
switch (node_position) { |
case 0: |
if (!quiet) |
printf("Deleting root nodes..."); |
while (tree->root != NULL) { |
delnode = tree->root; |
avltree_delete(tree, delnode); |
if (!quiet) { |
test_tree_parents(tree->root); |
test_tree_balance(tree->root); |
} |
} |
break; |
case 1: |
if (!quiet) |
printf("Deleting nodes according to creation time..."); |
for (i = 0; i < node_count; i++) { |
avltree_delete(tree, &avltree_nodes[i]); |
if (!quiet) { |
test_tree_parents(tree->root); |
test_tree_balance(tree->root); |
} |
} |
break; |
} |
if (!quiet) |
printf("done.\n"); |
} |
static void test_tree_delmin(avltree_t *tree, count_t node_count, bool quiet) |
{ |
unsigned int i = 0; |
if (!quiet) |
printf("Deleting minimum nodes..."); |
while (tree->root != NULL) { |
i++; |
avltree_delete_min(tree); |
if (!quiet) { |
test_tree_parents(tree->root); |
test_tree_balance(tree->root); |
} |
} |
if (!quiet && (i != node_count)) |
printf("Bad node count. Some nodes have been lost!\n"); |
if (!quiet) |
printf("done.\n"); |
} |
char *test_avltree1(bool quiet) |
{ |
alloc_avltree_node_prepare(); |
test_tree_insert(&avltree, NODE_COUNT, quiet); |
test_tree_delete(&avltree, NODE_COUNT, 0, quiet); |
alloc_avltree_node_prepare(); |
test_tree_insert(&avltree, NODE_COUNT, quiet); |
test_tree_delete(&avltree, NODE_COUNT, 1, quiet); |
alloc_avltree_node_prepare(); |
test_tree_insert(&avltree, NODE_COUNT, quiet); |
test_tree_delmin(&avltree, NODE_COUNT, quiet); |
return NULL; |
} |
/tags/0.3.0/kernel/test/avltree/avltree1.def |
---|
0,0 → 1,6 |
{ |
"avltree1", |
"Test Avl tree operations", |
&test_avltree1, |
true |
}, |
/tags/0.3.0/kernel/test/synch/rwlock5.c |
---|
0,0 → 1,117 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#include <test.h> |
#include <arch.h> |
#include <atomic.h> |
#include <print.h> |
#include <proc/thread.h> |
#include <synch/waitq.h> |
#include <synch/rwlock.h> |
#define READERS 50 |
#define WRITERS 50 |
static rwlock_t rwlock; |
static waitq_t can_start; |
static atomic_t items_read; |
static atomic_t items_written; |
static void writer(void *arg) |
{ |
thread_detach(THREAD); |
waitq_sleep(&can_start); |
rwlock_write_lock(&rwlock); |
atomic_inc(&items_written); |
rwlock_write_unlock(&rwlock); |
} |
static void reader(void *arg) |
{ |
thread_detach(THREAD); |
waitq_sleep(&can_start); |
rwlock_read_lock(&rwlock); |
atomic_inc(&items_read); |
rwlock_read_unlock(&rwlock); |
} |
char * test_rwlock5(bool quiet) |
{ |
int i, j, k; |
long readers, writers; |
waitq_initialize(&can_start); |
rwlock_initialize(&rwlock); |
for (i = 1; i <= 3; i++) { |
thread_t *thrd; |
atomic_set(&items_read, 0); |
atomic_set(&items_written, 0); |
readers = i * READERS; |
writers = (4 - i) * WRITERS; |
printf("Creating %ld readers and %ld writers...", readers, writers); |
for (j = 0; j < (READERS + WRITERS) / 2; j++) { |
for (k = 0; k < i; k++) { |
thrd = thread_create(reader, NULL, TASK, 0, "reader", false); |
if (thrd) |
thread_ready(thrd); |
else |
printf("Could not create reader %d\n", k); |
} |
for (k = 0; k < (4 - i); k++) { |
thrd = thread_create(writer, NULL, TASK, 0, "writer", false); |
if (thrd) |
thread_ready(thrd); |
else |
printf("Could not create writer %d\n", k); |
} |
} |
printf("ok\n"); |
thread_sleep(1); |
waitq_wakeup(&can_start, WAKEUP_ALL); |
while ((items_read.count != readers) || (items_written.count != writers)) { |
printf("%zd readers remaining, %zd writers remaining, readers_in=%zd\n", readers - items_read.count, writers - items_written.count, rwlock.readers_in); |
thread_usleep(100000); |
} |
} |
return NULL; |
} |
/tags/0.3.0/kernel/test/synch/rwlock3.c |
---|
0,0 → 1,96 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#include <test.h> |
#include <arch.h> |
#include <atomic.h> |
#include <print.h> |
#include <proc/thread.h> |
#include <synch/rwlock.h> |
#define THREADS 4 |
static atomic_t thread_count; |
static rwlock_t rwlock; |
static bool sh_quiet; |
static void reader(void *arg) |
{ |
thread_detach(THREAD); |
if (!sh_quiet) |
printf("cpu%d, tid %llu: trying to lock rwlock for reading....\n", CPU->id, THREAD->tid); |
rwlock_read_lock(&rwlock); |
rwlock_read_unlock(&rwlock); |
if (!sh_quiet) { |
printf("cpu%d, tid %llu: success\n", CPU->id, THREAD->tid); |
printf("cpu%d, tid %llu: trying to lock rwlock for writing....\n", CPU->id, THREAD->tid); |
} |
rwlock_write_lock(&rwlock); |
rwlock_write_unlock(&rwlock); |
if (!sh_quiet) |
printf("cpu%d, tid %llu: success\n", CPU->id, THREAD->tid); |
atomic_dec(&thread_count); |
} |
char * test_rwlock3(bool quiet) |
{ |
int i; |
thread_t *thrd; |
sh_quiet = quiet; |
atomic_set(&thread_count, THREADS); |
rwlock_initialize(&rwlock); |
rwlock_write_lock(&rwlock); |
for (i = 0; i < THREADS; i++) { |
thrd = thread_create(reader, NULL, TASK, 0, "reader", false); |
if (thrd) |
thread_ready(thrd); |
else if (!quiet) |
printf("Could not create reader %d\n", i); |
} |
thread_sleep(1); |
rwlock_write_unlock(&rwlock); |
while (atomic_get(&thread_count) > 0) { |
if (!quiet) |
printf("Threads left: %d\n", atomic_get(&thread_count)); |
thread_sleep(1); |
} |
return NULL; |
} |
/tags/0.3.0/kernel/test/synch/rwlock4.c |
---|
0,0 → 1,198 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#include <test.h> |
#include <arch.h> |
#include <atomic.h> |
#include <print.h> |
#include <proc/thread.h> |
#include <arch/types.h> |
#include <arch/context.h> |
#include <context.h> |
#include <synch/waitq.h> |
#include <synch/rwlock.h> |
#include <synch/synch.h> |
#include <synch/spinlock.h> |
#define READERS 50 |
#define WRITERS 50 |
static atomic_t thread_count; |
static rwlock_t rwlock; |
static atomic_t threads_fault; |
static bool sh_quiet; |
SPINLOCK_INITIALIZE(rw_lock); |
static waitq_t can_start; |
static uint32_t seed = 0xdeadbeef; |
static uint32_t random(uint32_t max) |
{ |
uint32_t rc; |
spinlock_lock(&rw_lock); |
rc = seed % max; |
seed = (((seed<<2) ^ (seed>>2)) * 487) + rc; |
spinlock_unlock(&rw_lock); |
return rc; |
} |
static void writer(void *arg) |
{ |
int rc, to; |
thread_detach(THREAD); |
waitq_sleep(&can_start); |
to = random(40000); |
if (!sh_quiet) |
printf("cpu%d, tid %llu w+ (%d)\n", CPU->id, THREAD->tid, to); |
rc = rwlock_write_lock_timeout(&rwlock, to); |
if (SYNCH_FAILED(rc)) { |
if (!sh_quiet) |
printf("cpu%d, tid %llu w!\n", CPU->id, THREAD->tid); |
atomic_dec(&thread_count); |
return; |
} |
if (!sh_quiet) |
printf("cpu%d, tid %llu w=\n", CPU->id, THREAD->tid); |
if (rwlock.readers_in) { |
if (!sh_quiet) |
printf("Oops."); |
atomic_inc(&threads_fault); |
atomic_dec(&thread_count); |
return; |
} |
thread_usleep(random(1000000)); |
if (rwlock.readers_in) { |
if (!sh_quiet) |
printf("Oops."); |
atomic_inc(&threads_fault); |
atomic_dec(&thread_count); |
return; |
} |
rwlock_write_unlock(&rwlock); |
if (!sh_quiet) |
printf("cpu%d, tid %llu w-\n", CPU->id, THREAD->tid); |
atomic_dec(&thread_count); |
} |
static void reader(void *arg) |
{ |
int rc, to; |
thread_detach(THREAD); |
waitq_sleep(&can_start); |
to = random(2000); |
if (!sh_quiet) |
printf("cpu%d, tid %llu r+ (%d)\n", CPU->id, THREAD->tid, to); |
rc = rwlock_read_lock_timeout(&rwlock, to); |
if (SYNCH_FAILED(rc)) { |
if (!sh_quiet) |
printf("cpu%d, tid %llu r!\n", CPU->id, THREAD->tid); |
atomic_dec(&thread_count); |
return; |
} |
if (!sh_quiet) |
printf("cpu%d, tid %llu r=\n", CPU->id, THREAD->tid); |
thread_usleep(30000); |
rwlock_read_unlock(&rwlock); |
if (!sh_quiet) |
printf("cpu%d, tid %llu r-\n", CPU->id, THREAD->tid); |
atomic_dec(&thread_count); |
} |
char * test_rwlock4(bool quiet) |
{ |
context_t ctx; |
uint32_t i; |
sh_quiet = quiet; |
waitq_initialize(&can_start); |
rwlock_initialize(&rwlock); |
atomic_set(&threads_fault, 0); |
uint32_t rd = random(7) + 1; |
uint32_t wr = random(5) + 1; |
atomic_set(&thread_count, rd + wr); |
thread_t *thrd; |
context_save(&ctx); |
if (!quiet) { |
printf("sp=%#x, readers_in=%d\n", ctx.sp, rwlock.readers_in); |
printf("Creating %d readers\n", rd); |
} |
for (i = 0; i < rd; i++) { |
thrd = thread_create(reader, NULL, TASK, 0, "reader", false); |
if (thrd) |
thread_ready(thrd); |
else if (!quiet) |
printf("Could not create reader %d\n", i); |
} |
if (!quiet) |
printf("Creating %d writers\n", wr); |
for (i = 0; i < wr; i++) { |
thrd = thread_create(writer, NULL, TASK, 0, "writer", false); |
if (thrd) |
thread_ready(thrd); |
else if (!quiet) |
printf("Could not create writer %d\n", i); |
} |
thread_usleep(20000); |
waitq_wakeup(&can_start, WAKEUP_ALL); |
while (atomic_get(&thread_count) > 0) { |
if (!quiet) |
printf("Threads left: %d\n", atomic_get(&thread_count)); |
thread_sleep(1); |
} |
if (atomic_get(&threads_fault) == 0) |
return NULL; |
return "Test failed"; |
} |
/tags/0.3.0/kernel/test/synch/semaphore2.c |
---|
0,0 → 1,107 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#include <test.h> |
#include <arch.h> |
#include <atomic.h> |
#include <print.h> |
#include <proc/thread.h> |
#include <arch/types.h> |
#include <arch/context.h> |
#include <synch/waitq.h> |
#include <synch/semaphore.h> |
#include <synch/synch.h> |
#include <synch/spinlock.h> |
static semaphore_t sem; |
SPINLOCK_INITIALIZE(sem_lock); |
static waitq_t can_start; |
static uint32_t seed = 0xdeadbeef; |
static uint32_t random(uint32_t max) |
{ |
uint32_t rc; |
spinlock_lock(&sem_lock); |
rc = seed % max; |
seed = (((seed<<2) ^ (seed>>2)) * 487) + rc; |
spinlock_unlock(&sem_lock); |
return rc; |
} |
static void consumer(void *arg) |
{ |
int rc, to; |
thread_detach(THREAD); |
waitq_sleep(&can_start); |
to = random(20000); |
printf("cpu%d, tid %llu down+ (%d)\n", CPU->id, THREAD->tid, to); |
rc = semaphore_down_timeout(&sem, to); |
if (SYNCH_FAILED(rc)) { |
printf("cpu%d, tid %llu down!\n", CPU->id, THREAD->tid); |
return; |
} |
printf("cpu%d, tid %llu down=\n", CPU->id, THREAD->tid); |
thread_usleep(random(30000)); |
semaphore_up(&sem); |
printf("cpu%d, tid %llu up\n", CPU->id, THREAD->tid); |
} |
char * test_semaphore2(bool quiet) |
{ |
uint32_t i, k; |
waitq_initialize(&can_start); |
semaphore_initialize(&sem, 5); |
thread_t *thrd; |
k = random(7) + 1; |
printf("Creating %d consumers\n", k); |
for (i = 0; i < k; i++) { |
thrd = thread_create(consumer, NULL, TASK, 0, "consumer", false); |
if (thrd) |
thread_ready(thrd); |
else |
printf("Error creating thread\n"); |
} |
thread_usleep(20000); |
waitq_wakeup(&can_start, WAKEUP_ALL); |
return NULL; |
} |
/tags/0.3.0/kernel/test/synch/rwlock1.c |
---|
0,0 → 1,75 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#include <test.h> |
#include <arch.h> |
#include <atomic.h> |
#include <print.h> |
#include <proc/thread.h> |
#include <synch/waitq.h> |
#include <synch/rwlock.h> |
#define READERS 50 |
#define WRITERS 50 |
static rwlock_t rwlock; |
char * test_rwlock1(bool quiet) |
{ |
rwlock_initialize(&rwlock); |
rwlock_write_lock(&rwlock); |
rwlock_write_unlock(&rwlock); |
rwlock_read_lock(&rwlock); |
rwlock_read_lock(&rwlock); |
rwlock_read_lock(&rwlock); |
rwlock_read_lock(&rwlock); |
rwlock_read_lock(&rwlock); |
rwlock_read_unlock(&rwlock); |
rwlock_read_unlock(&rwlock); |
rwlock_read_unlock(&rwlock); |
rwlock_read_unlock(&rwlock); |
rwlock_read_unlock(&rwlock); |
rwlock_write_lock(&rwlock); |
rwlock_write_unlock(&rwlock); |
rwlock_read_lock(&rwlock); |
rwlock_read_unlock(&rwlock); |
rwlock_write_lock(&rwlock); |
rwlock_write_unlock(&rwlock); |
rwlock_read_lock(&rwlock); |
rwlock_read_unlock(&rwlock); |
return NULL; |
} |
/tags/0.3.0/kernel/test/synch/rwlock2.c |
---|
0,0 → 1,87 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#include <test.h> |
#include <arch.h> |
#include <atomic.h> |
#include <print.h> |
#include <proc/thread.h> |
#include <synch/rwlock.h> |
#define READERS 50 |
#define WRITERS 50 |
static rwlock_t rwlock; |
static bool sh_quiet; |
static void writer(void *arg) |
{ |
if (!sh_quiet) |
printf("Trying to lock rwlock for writing....\n"); |
rwlock_write_lock(&rwlock); |
rwlock_write_unlock(&rwlock); |
if (!sh_quiet) |
printf("Trying to lock rwlock for reading....\n"); |
rwlock_read_lock(&rwlock); |
rwlock_read_unlock(&rwlock); |
} |
char * test_rwlock2(bool quiet) |
{ |
thread_t *thrd; |
sh_quiet = quiet; |
rwlock_initialize(&rwlock); |
rwlock_read_lock(&rwlock); |
rwlock_read_lock(&rwlock); |
rwlock_read_lock(&rwlock); |
rwlock_read_lock(&rwlock); |
thrd = thread_create(writer, NULL, TASK, 0, "writer", false); |
if (thrd) |
thread_ready(thrd); |
else |
return "Could not create thread"; |
thread_sleep(1); |
rwlock_read_unlock(&rwlock); |
rwlock_read_unlock(&rwlock); |
rwlock_read_unlock(&rwlock); |
rwlock_read_unlock(&rwlock); |
thread_join(thrd); |
thread_detach(thrd); |
return NULL; |
} |
/tags/0.3.0/kernel/test/synch/semaphore1.c |
---|
0,0 → 1,120 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#include <test.h> |
#include <arch.h> |
#include <atomic.h> |
#include <print.h> |
#include <proc/thread.h> |
#include <synch/waitq.h> |
#include <synch/semaphore.h> |
#define AT_ONCE 3 |
#define PRODUCERS 50 |
#define CONSUMERS 50 |
static semaphore_t sem; |
static waitq_t can_start; |
static atomic_t items_produced; |
static atomic_t items_consumed; |
static void producer(void *arg) |
{ |
thread_detach(THREAD); |
waitq_sleep(&can_start); |
semaphore_down(&sem); |
atomic_inc(&items_produced); |
thread_usleep(250); |
semaphore_up(&sem); |
} |
static void consumer(void *arg) |
{ |
thread_detach(THREAD); |
waitq_sleep(&can_start); |
semaphore_down(&sem); |
atomic_inc(&items_consumed); |
thread_usleep(500); |
semaphore_up(&sem); |
} |
char * test_semaphore1(bool quiet) |
{ |
int i, j, k; |
int consumers, producers; |
waitq_initialize(&can_start); |
semaphore_initialize(&sem, AT_ONCE); |
for (i = 1; i <= 3; i++) { |
thread_t *thrd; |
atomic_set(&items_produced, 0); |
atomic_set(&items_consumed, 0); |
consumers = i * CONSUMERS; |
producers = (4 - i) * PRODUCERS; |
printf("Creating %d consumers and %d producers...", consumers, producers); |
for (j = 0; j < (CONSUMERS + PRODUCERS) / 2; j++) { |
for (k = 0; k < i; k++) { |
thrd = thread_create(consumer, NULL, TASK, 0, "consumer", false); |
if (thrd) |
thread_ready(thrd); |
else |
printf("could not create consumer %d\n", i); |
} |
for (k = 0; k < (4 - i); k++) { |
thrd = thread_create(producer, NULL, TASK, 0, "producer", false); |
if (thrd) |
thread_ready(thrd); |
else |
printf("could not create producer %d\n", i); |
} |
} |
printf("ok\n"); |
thread_sleep(1); |
waitq_wakeup(&can_start, WAKEUP_ALL); |
while ((items_consumed.count != consumers) || (items_produced.count != producers)) { |
printf("%d consumers remaining, %d producers remaining\n", consumers - items_consumed.count, producers - items_produced.count); |
thread_sleep(1); |
} |
} |
return NULL; |
} |
/tags/0.3.0/kernel/test/synch/rwlock1.def |
---|
0,0 → 1,6 |
{ |
"rwlock1", |
"RW-lock test 1", |
&test_rwlock1, |
true |
}, |
/tags/0.3.0/kernel/test/synch/rwlock2.def |
---|
0,0 → 1,6 |
{ |
"rwlock2", |
"RW-lock test 2", |
&test_rwlock2, |
true |
}, |
/tags/0.3.0/kernel/test/synch/rwlock3.def |
---|
0,0 → 1,6 |
{ |
"rwlock3", |
"RW-lock test 3", |
&test_rwlock3, |
true |
}, |
/tags/0.3.0/kernel/test/synch/semaphore1.def |
---|
0,0 → 1,6 |
{ |
"semaphore1", |
"Semaphore test 1", |
&test_semaphore1, |
true |
}, |
/tags/0.3.0/kernel/test/synch/rwlock4.def |
---|
0,0 → 1,6 |
{ |
"rwlock4", |
"RW-lock test 4", |
&test_rwlock4, |
true |
}, |
/tags/0.3.0/kernel/test/synch/semaphore2.def |
---|
0,0 → 1,6 |
{ |
"semaphore2", |
"Semaphore test 2", |
&test_semaphore2, |
true |
}, |
/tags/0.3.0/kernel/test/synch/rwlock5.def |
---|
0,0 → 1,6 |
{ |
"rwlock5", |
"RW-lock test 5", |
&test_rwlock5, |
true |
}, |
/tags/0.3.0/kernel/test/thread/thread1.c |
---|
0,0 → 1,88 |
/* |
* Copyright (c) 2005 Jakub Vana |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#include <print.h> |
#include <debug.h> |
#include <test.h> |
#include <atomic.h> |
#include <proc/thread.h> |
#include <arch.h> |
#define THREADS 5 |
static atomic_t finish; |
static atomic_t threads_finished; |
static bool sh_quiet; |
static void threadtest(void *data) |
{ |
thread_detach(THREAD); |
while (atomic_get(&finish)) { |
if (!sh_quiet) |
printf("%llu ", THREAD->tid); |
thread_usleep(100000); |
} |
atomic_inc(&threads_finished); |
} |
char * test_thread1(bool quiet) |
{ |
unsigned int i, total = 0; |
sh_quiet = quiet; |
atomic_set(&finish, 1); |
atomic_set(&threads_finished, 0); |
for (i = 0; i < THREADS; i++) { |
thread_t *t; |
if (!(t = thread_create(threadtest, NULL, TASK, 0, "threadtest", false))) { |
if (!quiet) |
printf("Could not create thread %d\n", i); |
break; |
} |
thread_ready(t); |
total++; |
} |
if (!quiet) |
printf("Running threads for 10 seconds...\n"); |
thread_sleep(10); |
atomic_set(&finish, 0); |
while (atomic_get(&threads_finished) < ((long) total)) { |
if (!quiet) |
printf("Threads left: %d\n", total - atomic_get(&threads_finished)); |
thread_sleep(1); |
} |
return NULL; |
} |
/tags/0.3.0/kernel/test/thread/thread1.def |
---|
0,0 → 1,6 |
{ |
"thread1", |
"Thread test", |
&test_thread1, |
true |
}, |
/tags/0.3.0/kernel/test/mm/falloc2.c |
---|
0,0 → 1,143 |
/* |
* Copyright (c) 2006 Sergey Bondari |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#include <print.h> |
#include <test.h> |
#include <mm/page.h> |
#include <mm/frame.h> |
#include <mm/slab.h> |
#include <arch/mm/page.h> |
#include <arch/types.h> |
#include <atomic.h> |
#include <debug.h> |
#include <proc/thread.h> |
#include <memstr.h> |
#include <arch.h> |
#define MAX_FRAMES 256 |
#define MAX_ORDER 8 |
#define THREAD_RUNS 1 |
#define THREADS 8 |
static atomic_t thread_count; |
static atomic_t thread_fail; |
static bool sh_quiet; |
static void falloc(void * arg) |
{ |
int order, run, allocated, i; |
uint8_t val = THREAD->tid % THREADS; |
index_t k; |
uintptr_t * frames = (uintptr_t *) malloc(MAX_FRAMES * sizeof(uintptr_t), FRAME_ATOMIC); |
if (frames == NULL) { |
if (!sh_quiet) |
printf("Thread #%llu (cpu%d): Unable to allocate frames\n", THREAD->tid, CPU->id); |
atomic_inc(&thread_fail); |
atomic_dec(&thread_count); |
return; |
} |
thread_detach(THREAD); |
for (run = 0; run < THREAD_RUNS; run++) { |
for (order = 0; order <= MAX_ORDER; order++) { |
if (!sh_quiet) |
printf("Thread #%llu (cpu%d): Allocating %d frames blocks ... \n", THREAD->tid, CPU->id, 1 << order); |
allocated = 0; |
for (i = 0; i < (MAX_FRAMES >> order); i++) { |
frames[allocated] = (uintptr_t)frame_alloc(order, FRAME_ATOMIC | FRAME_KA); |
if (frames[allocated]) { |
memsetb(frames[allocated], FRAME_SIZE << order, val); |
allocated++; |
} else |
break; |
} |
if (!sh_quiet) |
printf("Thread #%llu (cpu%d): %d blocks allocated.\n", THREAD->tid, CPU->id, allocated); |
if (!sh_quiet) |
printf("Thread #%llu (cpu%d): Deallocating ... \n", THREAD->tid, CPU->id); |
for (i = 0; i < allocated; i++) { |
for (k = 0; k <= (((index_t) FRAME_SIZE << order) - 1); k++) { |
if (((uint8_t *) frames[i])[k] != val) { |
if (!sh_quiet) |
printf("Thread #%llu (cpu%d): Unexpected data (%d) in block %p offset %#zx\n", THREAD->tid, CPU->id, ((char *) frames[i])[k], frames[i], k); |
atomic_inc(&thread_fail); |
goto cleanup; |
} |
} |
frame_free(KA2PA(frames[i])); |
} |
if (!sh_quiet) |
printf("Thread #%llu (cpu%d): Finished run.\n", THREAD->tid, CPU->id); |
} |
} |
cleanup: |
free(frames); |
if (!sh_quiet) |
printf("Thread #%llu (cpu%d): Exiting\n", THREAD->tid, CPU->id); |
atomic_dec(&thread_count); |
} |
char * test_falloc2(bool quiet) |
{ |
unsigned int i; |
sh_quiet = quiet; |
atomic_set(&thread_count, THREADS); |
atomic_set(&thread_fail, 0); |
for (i = 0; i < THREADS; i++) { |
thread_t * thrd = thread_create(falloc, NULL, TASK, 0, "falloc", false); |
if (!thrd) { |
if (!quiet) |
printf("Could not create thread %d\n", i); |
break; |
} |
thread_ready(thrd); |
} |
while (atomic_get(&thread_count) > 0) { |
if (!quiet) |
printf("Threads left: %d\n", atomic_get(&thread_count)); |
thread_sleep(1); |
} |
if (atomic_get(&thread_fail) == 0) |
return NULL; |
return "Test failed"; |
} |
/tags/0.3.0/kernel/test/mm/slab1.c |
---|
0,0 → 1,192 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#include <test.h> |
#include <mm/slab.h> |
#include <print.h> |
#include <proc/thread.h> |
#include <arch.h> |
#include <memstr.h> |
#define VAL_COUNT 1024 |
static void * data[VAL_COUNT]; |
static void testit(int size, int count, bool quiet) |
{ |
slab_cache_t *cache; |
int i; |
if (!quiet) |
printf("Creating cache, object size: %d.\n", size); |
cache = slab_cache_create("test_cache", size, 0, NULL, NULL, |
SLAB_CACHE_NOMAGAZINE); |
if (!quiet) |
printf("Allocating %d items...", count); |
for (i = 0; i < count; i++) { |
data[i] = slab_alloc(cache, 0); |
memsetb((uintptr_t) data[i], size, 0); |
} |
if (!quiet) { |
printf("done.\n"); |
printf("Freeing %d items...", count); |
} |
for (i = 0; i < count; i++) |
slab_free(cache, data[i]); |
if (!quiet) { |
printf("done.\n"); |
printf("Allocating %d items...", count); |
} |
for (i = 0; i < count; i++) { |
data[i] = slab_alloc(cache, 0); |
memsetb((uintptr_t) data[i], size, 0); |
} |
if (!quiet) { |
printf("done.\n"); |
printf("Freeing %d items...", count / 2); |
} |
for (i = count - 1; i >= count / 2; i--) |
slab_free(cache, data[i]); |
if (!quiet) { |
printf("done.\n"); |
printf("Allocating %d items...", count / 2); |
} |
for (i = count / 2; i < count; i++) { |
data[i] = slab_alloc(cache, 0); |
memsetb((uintptr_t) data[i], size, 0); |
} |
if (!quiet) { |
printf("done.\n"); |
printf("Freeing %d items...", count); |
} |
for (i = 0; i < count; i++) |
slab_free(cache, data[i]); |
if (!quiet) |
printf("done.\n"); |
slab_cache_destroy(cache); |
if (!quiet) |
printf("Test complete.\n"); |
} |
static void testsimple(bool quiet) |
{ |
testit(100, VAL_COUNT, quiet); |
testit(200, VAL_COUNT, quiet); |
testit(1024, VAL_COUNT, quiet); |
testit(2048, 512, quiet); |
testit(4000, 128, quiet); |
testit(8192, 128, quiet); |
testit(16384, 128, quiet); |
testit(16385, 128, quiet); |
} |
#define THREADS 6 |
#define THR_MEM_COUNT 1024 |
#define THR_MEM_SIZE 128 |
static void * thr_data[THREADS][THR_MEM_COUNT]; |
static slab_cache_t *thr_cache; |
static semaphore_t thr_sem; |
static bool sh_quiet; |
static void slabtest(void *data) |
{ |
int offs = (int) (unative_t) data; |
int i, j; |
thread_detach(THREAD); |
if (!sh_quiet) |
printf("Starting thread #%llu...\n", THREAD->tid); |
for (j = 0; j < 10; j++) { |
for (i = 0; i < THR_MEM_COUNT; i++) |
thr_data[offs][i] = slab_alloc(thr_cache,0); |
for (i = 0; i < THR_MEM_COUNT / 2; i++) |
slab_free(thr_cache, thr_data[offs][i]); |
for (i = 0; i < THR_MEM_COUNT / 2; i++) |
thr_data[offs][i] = slab_alloc(thr_cache, 0); |
for (i = 0; i < THR_MEM_COUNT; i++) |
slab_free(thr_cache, thr_data[offs][i]); |
} |
if (!sh_quiet) |
printf("Thread #%llu finished\n", THREAD->tid); |
semaphore_up(&thr_sem); |
} |
static void testthreads(bool quiet) |
{ |
thread_t *t; |
int i; |
thr_cache = slab_cache_create("thread_cache", THR_MEM_SIZE, 0, NULL, NULL, |
SLAB_CACHE_NOMAGAZINE); |
semaphore_initialize(&thr_sem, 0); |
for (i = 0; i < THREADS; i++) { |
if (!(t = thread_create(slabtest, (void *) (unative_t) i, TASK, 0, "slabtest", false))) { |
if (!quiet) |
printf("Could not create thread %d\n", i); |
} else |
thread_ready(t); |
} |
for (i = 0; i < THREADS; i++) |
semaphore_down(&thr_sem); |
slab_cache_destroy(thr_cache); |
if (!quiet) |
printf("Test complete.\n"); |
} |
char * test_slab1(bool quiet) |
{ |
sh_quiet = quiet; |
testsimple(quiet); |
testthreads(quiet); |
return NULL; |
} |
/tags/0.3.0/kernel/test/mm/slab2.c |
---|
0,0 → 1,259 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#include <test.h> |
#include <mm/slab.h> |
#include <print.h> |
#include <proc/thread.h> |
#include <arch.h> |
#include <mm/frame.h> |
#include <memstr.h> |
#include <synch/condvar.h> |
#include <synch/mutex.h> |
#define ITEM_SIZE 256 |
/** Fill memory with 2 caches, when allocation fails, |
* free one of the caches. We should have everything in magazines, |
* now allocation should clean magazines and allow for full allocation. |
*/ |
static void totalmemtest(bool quiet) |
{ |
slab_cache_t *cache1; |
slab_cache_t *cache2; |
int i; |
void *data1, *data2; |
void *olddata1 = NULL, *olddata2 = NULL; |
cache1 = slab_cache_create("cache1_tst", ITEM_SIZE, 0, NULL, NULL, 0); |
cache2 = slab_cache_create("cache2_tst", ITEM_SIZE, 0, NULL, NULL, 0); |
if (!quiet) |
printf("Allocating..."); |
/* Use atomic alloc, so that we find end of memory */ |
do { |
data1 = slab_alloc(cache1, FRAME_ATOMIC); |
data2 = slab_alloc(cache2, FRAME_ATOMIC); |
if ((!data1) || (!data2)) { |
if (data1) |
slab_free(cache1, data1); |
if (data2) |
slab_free(cache2, data2); |
break; |
} |
memsetb((uintptr_t) data1, ITEM_SIZE, 0); |
memsetb((uintptr_t) data2, ITEM_SIZE, 0); |
*((void **) data1) = olddata1; |
*((void **) data2) = olddata2; |
olddata1 = data1; |
olddata2 = data2; |
} while (1); |
if (!quiet) { |
printf("done.\n"); |
printf("Deallocating cache2..."); |
} |
/* We do not have memory - now deallocate cache2 */ |
while (olddata2) { |
data2 = *((void **) olddata2); |
slab_free(cache2, olddata2); |
olddata2 = data2; |
} |
if (!quiet) { |
printf("done.\n"); |
printf("Allocating to cache1...\n"); |
} |
for (i = 0; i < 30; i++) { |
data1 = slab_alloc(cache1, FRAME_ATOMIC); |
if (!data1) { |
if (!quiet) |
printf("Incorrect memory size - use another test."); |
return; |
} |
memsetb((uintptr_t) data1, ITEM_SIZE, 0); |
*((void **) data1) = olddata1; |
olddata1 = data1; |
} |
while (1) { |
data1 = slab_alloc(cache1, FRAME_ATOMIC); |
if (!data1) |
break; |
memsetb((uintptr_t) data1, ITEM_SIZE, 0); |
*((void **) data1) = olddata1; |
olddata1 = data1; |
} |
if (!quiet) |
printf("Deallocating cache1..."); |
while (olddata1) { |
data1 = *((void **) olddata1); |
slab_free(cache1, olddata1); |
olddata1 = data1; |
} |
if (!quiet) { |
printf("done.\n"); |
slab_print_list(); |
} |
slab_cache_destroy(cache1); |
slab_cache_destroy(cache2); |
} |
static slab_cache_t *thr_cache; |
static semaphore_t thr_sem; |
static condvar_t thread_starter; |
static mutex_t starter_mutex; |
static bool sh_quiet; |
#define THREADS 8 |
static void slabtest(void *priv) |
{ |
void *data = NULL, *new; |
thread_detach(THREAD); |
mutex_lock(&starter_mutex); |
condvar_wait(&thread_starter,&starter_mutex); |
mutex_unlock(&starter_mutex); |
if (!sh_quiet) |
printf("Starting thread #%llu...\n",THREAD->tid); |
/* Alloc all */ |
if (!sh_quiet) |
printf("Thread #%llu allocating...\n", THREAD->tid); |
while (1) { |
/* Call with atomic to detect end of memory */ |
new = slab_alloc(thr_cache, FRAME_ATOMIC); |
if (!new) |
break; |
*((void **) new) = data; |
data = new; |
} |
if (!sh_quiet) |
printf("Thread #%llu releasing...\n", THREAD->tid); |
while (data) { |
new = *((void **)data); |
*((void **) data) = NULL; |
slab_free(thr_cache, data); |
data = new; |
} |
if (!sh_quiet) |
printf("Thread #%llu allocating...\n", THREAD->tid); |
while (1) { |
/* Call with atomic to detect end of memory */ |
new = slab_alloc(thr_cache, FRAME_ATOMIC); |
if (!new) |
break; |
*((void **) new) = data; |
data = new; |
} |
if (!sh_quiet) |
printf("Thread #%llu releasing...\n", THREAD->tid); |
while (data) { |
new = *((void **)data); |
*((void **) data) = NULL; |
slab_free(thr_cache, data); |
data = new; |
} |
if (!sh_quiet) |
printf("Thread #%llu finished\n", THREAD->tid); |
slab_print_list(); |
semaphore_up(&thr_sem); |
} |
static void multitest(int size, bool quiet) |
{ |
/* Start 8 threads that just allocate as much as possible, |
* then release everything, then again allocate, then release |
*/ |
thread_t *t; |
int i; |
if (!quiet) |
printf("Running stress test with size %d\n", size); |
condvar_initialize(&thread_starter); |
mutex_initialize(&starter_mutex); |
thr_cache = slab_cache_create("thread_cache", size, 0, NULL, NULL, 0); |
semaphore_initialize(&thr_sem,0); |
for (i = 0; i < THREADS; i++) { |
if (!(t = thread_create(slabtest, NULL, TASK, 0, "slabtest", false))) { |
if (!quiet) |
printf("Could not create thread %d\n", i); |
} else |
thread_ready(t); |
} |
thread_sleep(1); |
condvar_broadcast(&thread_starter); |
for (i = 0; i < THREADS; i++) |
semaphore_down(&thr_sem); |
slab_cache_destroy(thr_cache); |
if (!quiet) |
printf("Stress test complete.\n"); |
} |
char * test_slab2(bool quiet) |
{ |
sh_quiet = quiet; |
if (!quiet) |
printf("Running reclaim single-thread test .. pass 1\n"); |
totalmemtest(quiet); |
if (!quiet) |
printf("Running reclaim single-thread test .. pass 2\n"); |
totalmemtest(quiet); |
if (!quiet) |
printf("Reclaim test OK.\n"); |
multitest(128, quiet); |
multitest(2048, quiet); |
multitest(8192, quiet); |
return NULL; |
} |
/tags/0.3.0/kernel/test/mm/falloc1.c |
---|
0,0 → 1,103 |
/* |
* Copyright (c) 2006 Sergey Bondari |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#include <print.h> |
#include <test.h> |
#include <mm/page.h> |
#include <mm/frame.h> |
#include <mm/slab.h> |
#include <arch/mm/page.h> |
#include <arch/types.h> |
#include <debug.h> |
#include <align.h> |
#define MAX_FRAMES 1024 |
#define MAX_ORDER 8 |
#define TEST_RUNS 2 |
char * test_falloc1(bool quiet) { |
uintptr_t * frames = (uintptr_t *) malloc(MAX_FRAMES * sizeof(uintptr_t), 0); |
int results[MAX_ORDER + 1]; |
int i, order, run; |
int allocated; |
if (TEST_RUNS < 2) |
return "Test is compiled with TEST_RUNS < 2"; |
if (frames == NULL) |
return "Unable to allocate frames"; |
for (run = 0; run < TEST_RUNS; run++) { |
for (order = 0; order <= MAX_ORDER; order++) { |
if (!quiet) |
printf("Allocating %d frames blocks ... ", 1 << order); |
allocated = 0; |
for (i = 0; i < MAX_FRAMES >> order; i++) { |
frames[allocated] = (uintptr_t) frame_alloc(order, FRAME_ATOMIC | FRAME_KA); |
if (ALIGN_UP(frames[allocated], FRAME_SIZE << order) != frames[allocated]) { |
if (!quiet) |
printf("Block at address %p (size %dK) is not aligned\n", frames[allocated], (FRAME_SIZE << order) >> 10); |
return "Test failed"; |
} |
if (frames[allocated]) |
allocated++; |
else { |
if (!quiet) |
printf("done. "); |
break; |
} |
} |
if (!quiet) |
printf("%d blocks allocated.\n", allocated); |
if (run) { |
if (results[order] != allocated) |
return "Possible frame leak"; |
} else |
results[order] = allocated; |
if (!quiet) |
printf("Deallocating ... "); |
for (i = 0; i < allocated; i++) |
frame_free(KA2PA(frames[i])); |
if (!quiet) |
printf("done.\n"); |
} |
} |
free(frames); |
return NULL; |
} |
/tags/0.3.0/kernel/test/mm/purge1.c |
---|
0,0 → 1,87 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#ifdef ia64 |
#include <print.h> |
#include <test.h> |
#include <mm/page.h> |
#include <mm/frame.h> |
#include <mm/as.h> |
#include <arch/mm/page.h> |
#include <arch/mm/tlb.h> |
#include <arch/types.h> |
#include <debug.h> |
extern void tlb_invalidate_all(void); |
extern void tlb_invalidate_pages(asid_t asid, uintptr_t va, count_t cnt); |
char * test_purge1(bool quiet) |
{ |
tlb_entry_t entryi; |
tlb_entry_t entryd; |
int i; |
entryd.word[0] = 0; |
entryd.word[1] = 0; |
entryd.p = true; /* present */ |
entryd.ma = MA_WRITEBACK; |
entryd.a = true; /* already accessed */ |
entryd.d = true; /* already dirty */ |
entryd.pl = PL_KERNEL; |
entryd.ar = AR_READ | AR_WRITE; |
entryd.ppn = 0; |
entryd.ps = PAGE_WIDTH; |
entryi.word[0] = 0; |
entryi.word[1] = 0; |
entryi.p = true; /* present */ |
entryi.ma = MA_WRITEBACK; |
entryi.a = true; /* already accessed */ |
entryi.d = true; /* already dirty */ |
entryi.pl = PL_KERNEL; |
entryi.ar = AR_READ | AR_EXECUTE; |
entryi.ppn = 0; |
entryi.ps = PAGE_WIDTH; |
for (i = 0; i < 100; i++) { |
itc_mapping_insert(0 + i * (1 << PAGE_WIDTH), 8, entryi); |
dtc_mapping_insert(0 + i * (1 << PAGE_WIDTH), 9, entryd); |
} |
tlb_invalidate_pages(8,0x0c000,14); |
/*tlb_invalidate_all();*/ |
return NULL; |
} |
#endif |
/tags/0.3.0/kernel/test/mm/mapping1.c |
---|
0,0 → 1,99 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#include <print.h> |
#include <test.h> |
#include <mm/page.h> |
#include <mm/frame.h> |
#include <mm/as.h> |
#include <arch/mm/page.h> |
#include <arch/types.h> |
#include <debug.h> |
#define PAGE0 0x10000000 |
#define PAGE1 (PAGE0+PAGE_SIZE) |
#define VALUE0 0x01234567 |
#define VALUE1 0x89abcdef |
char * test_mapping1(bool quiet) |
{ |
uintptr_t frame0, frame1; |
uint32_t v0, v1; |
frame0 = (uintptr_t) frame_alloc(ONE_FRAME, FRAME_KA); |
frame1 = (uintptr_t) frame_alloc(ONE_FRAME, FRAME_KA); |
if (!quiet) |
printf("Writing %#x to physical address %p.\n", VALUE0, KA2PA(frame0)); |
*((uint32_t *) frame0) = VALUE0; |
if (!quiet) |
printf("Writing %#x to physical address %p.\n", VALUE1, KA2PA(frame1)); |
*((uint32_t *) frame1) = VALUE1; |
if (!quiet) |
printf("Mapping virtual address %p to physical address %p.\n", PAGE0, KA2PA(frame0)); |
page_mapping_insert(AS_KERNEL, PAGE0, KA2PA(frame0), PAGE_PRESENT | PAGE_WRITE); |
if (!quiet) |
printf("Mapping virtual address %p to physical address %p.\n", PAGE1, KA2PA(frame1)); |
page_mapping_insert(AS_KERNEL, PAGE1, KA2PA(frame1), PAGE_PRESENT | PAGE_WRITE); |
v0 = *((uint32_t *) PAGE0); |
v1 = *((uint32_t *) PAGE1); |
if (!quiet) { |
printf("Value at virtual address %p is %#x.\n", PAGE0, v0); |
printf("Value at virtual address %p is %#x.\n", PAGE1, v1); |
} |
if (v0 != VALUE0) |
return "Value at v0 not equal to VALUE0"; |
if (v1 != VALUE1) |
return "Value at v1 not equal to VALUE1"; |
if (!quiet) |
printf("Writing %#x to virtual address %p.\n", 0, PAGE0); |
*((uint32_t *) PAGE0) = 0; |
if (!quiet) |
printf("Writing %#x to virtual address %p.\n", 0, PAGE1); |
*((uint32_t *) PAGE1) = 0; |
v0 = *((uint32_t *) PAGE0); |
v1 = *((uint32_t *) PAGE1); |
if (!quiet) { |
printf("Value at virtual address %p is %#x.\n", PAGE0, *((uint32_t *) PAGE0)); |
printf("Value at virtual address %p is %#x.\n", PAGE1, *((uint32_t *) PAGE1)); |
} |
if (v0 != 0) |
return "Value at v0 not equal to 0"; |
if (v1 != 0) |
return "Value at v1 not equal to 0"; |
return NULL; |
} |
/tags/0.3.0/kernel/test/mm/falloc2.def |
---|
0,0 → 1,6 |
{ |
"falloc2", |
"Frame allocator test 2", |
&test_falloc2, |
true |
}, |
/tags/0.3.0/kernel/test/mm/slab1.def |
---|
0,0 → 1,6 |
{ |
"slab1", |
"SLAB test 1", |
&test_slab1, |
true |
}, |
/tags/0.3.0/kernel/test/mm/purge1.def |
---|
0,0 → 1,8 |
#ifdef ia64 |
{ |
"purge1", |
"Itanium TLB purge test", |
&test_purge1, |
true |
}, |
#endif |
/tags/0.3.0/kernel/test/mm/slab2.def |
---|
0,0 → 1,6 |
{ |
"slab2", |
"SLAB test 2", |
&test_slab2, |
true |
}, |
/tags/0.3.0/kernel/test/mm/mapping1.def |
---|
0,0 → 1,6 |
{ |
"mapping1", |
"Mapping test", |
&test_mapping1, |
false |
}, |
/tags/0.3.0/kernel/test/mm/falloc1.def |
---|
0,0 → 1,6 |
{ |
"falloc1", |
"Frame allocator test 1", |
&test_falloc1, |
true |
}, |
/tags/0.3.0/kernel/test/fpu/mips2.c |
---|
0,0 → 1,166 |
/* |
* Copyright (c) 2005 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#ifdef mips32 |
#include <print.h> |
#include <debug.h> |
#include <test.h> |
#include <atomic.h> |
#include <proc/thread.h> |
#include <time/delay.h> |
#include <arch.h> |
#define THREADS 50 |
#define DELAY 10000L |
#define ATTEMPTS 5 |
static atomic_t threads_ok; |
static atomic_t threads_fault; |
static waitq_t can_start; |
static bool sh_quiet; |
static void testit1(void *data) |
{ |
int i; |
int arg __attribute__((aligned(16))) = (int) ((unative_t) data); |
int after_arg __attribute__((aligned(16))); |
thread_detach(THREAD); |
waitq_sleep(&can_start); |
for (i = 0; i < ATTEMPTS; i++) { |
asm volatile ( |
"mtc1 %0,$1" |
: "=r" (arg) |
); |
delay(DELAY); |
asm volatile ( |
"mfc1 %0, $1" |
: "=r" (after_arg) |
); |
if (arg != after_arg) { |
if (!sh_quiet) |
printf("General reg tid%llu: arg(%d) != %d\n", THREAD->tid, arg, after_arg); |
atomic_inc(&threads_fault); |
break; |
} |
} |
atomic_inc(&threads_ok); |
} |
static void testit2(void *data) |
{ |
int i; |
int arg __attribute__((aligned(16))) = (int) ((unative_t) data); |
int after_arg __attribute__((aligned(16))); |
thread_detach(THREAD); |
waitq_sleep(&can_start); |
for (i = 0; i < ATTEMPTS; i++) { |
asm volatile ( |
"mtc1 %0,$1" |
: "=r" (arg) |
); |
scheduler(); |
asm volatile ( |
"mfc1 %0,$1" |
: "=r" (after_arg) |
); |
if (arg != after_arg) { |
if (!sh_quiet) |
printf("General reg tid%llu: arg(%d) != %d\n", THREAD->tid, arg, after_arg); |
atomic_inc(&threads_fault); |
break; |
} |
} |
atomic_inc(&threads_ok); |
} |
char * test_mips2(bool quiet) |
{ |
unsigned int i, total = 0; |
sh_quiet = quiet; |
waitq_initialize(&can_start); |
atomic_set(&threads_ok, 0); |
atomic_set(&threads_fault, 0); |
if (!quiet) |
printf("Creating %d threads... ", 2 * THREADS); |
for (i = 0; i < THREADS; i++) { |
thread_t *t; |
if (!(t = thread_create(testit1, (void *) ((unative_t) 2 * i), TASK, 0, "testit1", false))) { |
if (!quiet) |
printf("could not create thread %d\n", 2 * i); |
break; |
} |
thread_ready(t); |
total++; |
if (!(t = thread_create(testit2, (void *) ((unative_t) 2 * i + 1), TASK, 0, "testit2", false))) { |
if (!quiet) |
printf("could not create thread %d\n", 2 * i + 1); |
break; |
} |
thread_ready(t); |
total++; |
} |
if (!quiet) |
printf("ok\n"); |
thread_sleep(1); |
waitq_wakeup(&can_start, WAKEUP_ALL); |
while (atomic_get(&threads_ok) != (long) total) { |
if (!quiet) |
printf("Threads left: %d\n", total - atomic_get(&threads_ok)); |
thread_sleep(1); |
} |
if (atomic_get(&threads_fault) == 0) |
return NULL; |
return "Test failed"; |
} |
#endif |
/tags/0.3.0/kernel/test/fpu/fpu1.c |
---|
0,0 → 1,230 |
/* |
* Copyright (c) 2005 Jakub Vana |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#if (defined(ia32) || defined(amd64) || defined(ia64) || defined(ia32xen)) |
#include <print.h> |
#include <debug.h> |
#include <test.h> |
#include <atomic.h> |
#include <proc/thread.h> |
#include <arch.h> |
#include <arch/arch.h> |
#define THREADS 150 |
#define ATTEMPTS 100 |
#define E_10e8 271828182 |
#define PI_10e8 314159265 |
#ifdef KERN_ia32_ARCH_H_ |
static inline double sqrt(double x) |
{ |
double v; |
asm ( |
"fsqrt\n" |
: "=t" (v) |
: "0" (x) |
); |
return v; |
} |
#endif |
#ifdef KERN_amd64_ARCH_H_ |
static inline double sqrt(double x) |
{ |
double v; |
asm ( |
"fsqrt\n" |
: "=t" (v) |
: "0" (x) |
); |
return v; |
} |
#endif |
#ifdef KERN_ia64_ARCH_H_ |
#undef PI_10e8 |
#define PI_10e8 3141592 |
static inline long double sqrt(long double a) |
{ |
long double x = 1; |
long double lx = 0; |
if (a < 0.00000000000000001) |
return 0; |
while(x != lx) { |
lx = x; |
x = (x + (a / x)) / 2; |
} |
return x; |
} |
#endif |
static atomic_t threads_ok; |
static atomic_t threads_fault; |
static waitq_t can_start; |
static bool sh_quiet; |
static void e(void *data) |
{ |
int i; |
double e, d, le, f; |
thread_detach(THREAD); |
waitq_sleep(&can_start); |
for (i = 0; i<ATTEMPTS; i++) { |
le = -1; |
e = 0; |
f = 1; |
for (d = 1; e != le; d *= f, f += 1) { |
le = e; |
e = e + 1 / d; |
} |
if ((int) (100000000 * e) != E_10e8) { |
if (!sh_quiet) |
printf("tid%llu: e*10e8=%zd should be %zd\n", THREAD->tid, (unative_t) (100000000 * e), (unative_t) E_10e8); |
atomic_inc(&threads_fault); |
break; |
} |
} |
atomic_inc(&threads_ok); |
} |
static void pi(void *data) |
{ |
int i; |
double lpi, pi; |
double n, ab, ad; |
thread_detach(THREAD); |
waitq_sleep(&can_start); |
for (i = 0; i < ATTEMPTS; i++) { |
lpi = -1; |
pi = 0; |
for (n = 2, ab = sqrt(2); lpi != pi; n *= 2, ab = ad) { |
double sc, cd; |
sc = sqrt(1 - (ab * ab / 4)); |
cd = 1 - sc; |
ad = sqrt(ab * ab / 4 + cd * cd); |
lpi = pi; |
pi = 2 * n * ad; |
} |
#ifdef KERN_ia64_ARCH_H_ |
if ((int) (1000000 * pi) != PI_10e8) { |
if (!sh_quiet) |
printf("tid%llu: pi*10e8=%zd should be %zd\n", THREAD->tid, (unative_t) (1000000 * pi), (unative_t) (PI_10e8 / 100)); |
atomic_inc(&threads_fault); |
break; |
} |
#else |
if ((int) (100000000 * pi) != PI_10e8) { |
if (!sh_quiet) |
printf("tid%llu: pi*10e8=%zd should be %zd\n", THREAD->tid, (unative_t) (100000000 * pi), (unative_t) PI_10e8); |
atomic_inc(&threads_fault); |
break; |
} |
#endif |
} |
atomic_inc(&threads_ok); |
} |
char * test_fpu1(bool quiet) |
{ |
unsigned int i, total = 0; |
sh_quiet = quiet; |
waitq_initialize(&can_start); |
atomic_set(&threads_ok, 0); |
atomic_set(&threads_fault, 0); |
if (!quiet) |
printf("Creating %d threads... ", 2 * THREADS); |
for (i = 0; i < THREADS; i++) { |
thread_t *t; |
if (!(t = thread_create(e, NULL, TASK, 0, "e", false))) { |
if (!quiet) |
printf("could not create thread %d\n", 2 * i); |
break; |
} |
thread_ready(t); |
total++; |
if (!(t = thread_create(pi, NULL, TASK, 0, "pi", false))) { |
if (!quiet) |
printf("could not create thread %d\n", 2 * i + 1); |
break; |
} |
thread_ready(t); |
total++; |
} |
if (!quiet) |
printf("ok\n"); |
thread_sleep(1); |
waitq_wakeup(&can_start, WAKEUP_ALL); |
while (atomic_get(&threads_ok) != (long) total) { |
if (!quiet) |
printf("Threads left: %d\n", total - atomic_get(&threads_ok)); |
thread_sleep(1); |
} |
if (atomic_get(&threads_fault) == 0) |
return NULL; |
return "Test failed"; |
} |
#endif |
/tags/0.3.0/kernel/test/fpu/sse1.c |
---|
0,0 → 1,166 |
/* |
* Copyright (c) 2005 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#if (defined(ia32) || defined(amd64) || defined(ia32xen)) |
#include <print.h> |
#include <debug.h> |
#include <test.h> |
#include <atomic.h> |
#include <proc/thread.h> |
#include <time/delay.h> |
#include <arch.h> |
#define THREADS 25 |
#define DELAY 10000L |
#define ATTEMPTS 5 |
static atomic_t threads_ok; |
static atomic_t threads_fault; |
static waitq_t can_start; |
static bool sh_quiet; |
static void testit1(void *data) |
{ |
int i; |
int arg __attribute__((aligned(16))) = (int) ((unative_t) data); |
int after_arg __attribute__((aligned(16))); |
thread_detach(THREAD); |
waitq_sleep(&can_start); |
for (i = 0; i < ATTEMPTS; i++) { |
asm volatile ( |
"movlpd %0, %%xmm2\n" |
: "=m" (arg) |
); |
delay(DELAY); |
asm volatile ( |
"movlpd %%xmm2, %0\n" |
: "=m" (after_arg) |
); |
if (arg != after_arg) { |
if (!sh_quiet) |
printf("tid%llu: arg(%d) != %d\n", THREAD->tid, arg, after_arg); |
atomic_inc(&threads_fault); |
break; |
} |
} |
atomic_inc(&threads_ok); |
} |
static void testit2(void *data) |
{ |
int i; |
int arg __attribute__((aligned(16))) = (int) ((unative_t) data); |
int after_arg __attribute__((aligned(16))); |
thread_detach(THREAD); |
waitq_sleep(&can_start); |
for (i = 0; i < ATTEMPTS; i++) { |
asm volatile ( |
"movlpd %0, %%xmm2\n" |
: "=m" (arg) |
); |
scheduler(); |
asm volatile ( |
"movlpd %%xmm2, %0\n" |
: "=m" (after_arg) |
); |
if (arg != after_arg) { |
if (!sh_quiet) |
printf("tid%llu: arg(%d) != %d\n", THREAD->tid, arg, after_arg); |
atomic_inc(&threads_fault); |
break; |
} |
} |
atomic_inc(&threads_ok); |
} |
char * test_sse1(bool quiet) |
{ |
unsigned int i, total = 0; |
sh_quiet = quiet; |
waitq_initialize(&can_start); |
atomic_set(&threads_ok, 0); |
atomic_set(&threads_fault, 0); |
if (!quiet) |
printf("Creating %d threads... ", 2 * THREADS); |
for (i = 0; i < THREADS; i++) { |
thread_t *t; |
if (!(t = thread_create(testit1, (void *) ((unative_t) 2 * i), TASK, 0, "testit1", false))) { |
if (!quiet) |
printf("could not create thread %d\n", 2 * i); |
break; |
} |
thread_ready(t); |
total++; |
if (!(t = thread_create(testit2, (void *) ((unative_t) 2 * i + 1), TASK, 0, "testit2", false))) { |
if (!quiet) |
printf("could not create thread %d\n", 2 * i + 1); |
break; |
} |
thread_ready(t); |
total++; |
} |
if (!quiet) |
printf("ok\n"); |
thread_sleep(1); |
waitq_wakeup(&can_start, WAKEUP_ALL); |
while (atomic_get(&threads_ok) != (long) total) { |
if (!quiet) |
printf("Threads left: %d\n", total - atomic_get(&threads_ok)); |
thread_sleep(1); |
} |
if (atomic_get(&threads_fault) == 0) |
return NULL; |
return "Test failed"; |
} |
#endif |
/tags/0.3.0/kernel/test/fpu/mips2.def |
---|
0,0 → 1,8 |
#ifdef mips32 |
{ |
"mips2", |
"MIPS FPU test", |
&test_mips2, |
true |
}, |
#endif |
/tags/0.3.0/kernel/test/fpu/fpu1.def |
---|
0,0 → 1,8 |
#if (defined(ia32) || defined(amd64) || defined(ia64) || defined(ia32xen)) |
{ |
"fpu1", |
"Intel FPU test", |
&test_fpu1, |
true |
}, |
#endif |
/tags/0.3.0/kernel/test/fpu/sse1.def |
---|
0,0 → 1,8 |
#if (defined(ia32) || defined(amd64) || defined(ia32xen)) |
{ |
"sse1", |
"Intel SEE test", |
&test_sse1, |
true |
}, |
#endif |
/tags/0.3.0/kernel/test/test.h |
---|
0,0 → 1,79 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup test |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_TEST_H_ |
#define KERN_TEST_H_ |
#include <arch/types.h> |
typedef char * (* test_entry_t)(bool); |
typedef struct { |
char * name; |
char * desc; |
test_entry_t entry; |
bool safe; |
} test_t; |
extern char * test_atomic1(bool quiet); |
extern char * test_avltree1(bool quiet); |
extern char * test_btree1(bool quiet); |
extern char * test_mips1(bool quiet); |
extern char * test_fault1(bool quiet); |
extern char * test_fpu1(bool quiet); |
extern char * test_sse1(bool quiet); |
extern char * test_mips2(bool quiet); |
extern char * test_falloc1(bool quiet); |
extern char * test_falloc2(bool quiet); |
extern char * test_mapping1(bool quiet); |
extern char * test_purge1(bool quiet); |
extern char * test_slab1(bool quiet); |
extern char * test_slab2(bool quiet); |
extern char * test_rwlock1(bool quiet); |
extern char * test_rwlock2(bool quiet); |
extern char * test_rwlock3(bool quiet); |
extern char * test_rwlock4(bool quiet); |
extern char * test_rwlock5(bool quiet); |
extern char * test_semaphore1(bool quiet); |
extern char * test_semaphore2(bool quiet); |
extern char * test_print1(bool quiet); |
extern char * test_thread1(bool quiet); |
extern char * test_sysinfo1(bool quiet); |
extern test_t tests[]; |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/test/print/print1.c |
---|
0,0 → 1,72 |
/* |
* Copyright (c) 2005 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#include <print.h> |
#include <test.h> |
#define BUFFER_SIZE 32 |
char * test_print1(bool quiet) |
{ |
if (!quiet) { |
int retval; |
unative_t nat = 0x12345678u; |
char buffer[BUFFER_SIZE]; |
printf(" text 10.8s %*.*s \n", 5, 3, "text"); |
printf(" very long text 10.8s %10.8s \n", "very long text"); |
printf(" text 8.10s %8.10s \n", "text"); |
printf(" very long text 8.10s %8.10s \n", "very long text"); |
printf(" char: c '%c', 3.2c '%3.2c', -3.2c '%-3.2c', 2.3c '%2.3c', -2.3c '%-2.3c' \n",'a', 'b', 'c', 'd', 'e' ); |
printf(" int: d '%d', 3.2d '%3.2d', -3.2d '%-3.2d', 2.3d '%2.3d', -2.3d '%-2.3d' \n",1, 1, 1, 1, 1 ); |
printf(" -int: d '%d', 3.2d '%3.2d', -3.2d '%-3.2d', 2.3d '%2.3d', -2.3d '%-2.3d' \n",-1, -1, -1, -1, -1 ); |
printf(" 0xint: x '%#x', 5.3x '%#5.3x', -5.3x '%#-5.3x', 3.5x '%#3.5x', -3.5x '%#-3.5x' \n",17, 17, 17, 17, 17 ); |
printf("'%#llx' 64bit, '%#x' 32bit, '%#hhx' 8bit, '%#hx' 16bit, unative_t '%#zx'. '%#llx' 64bit and '%s' string.\n", 0x1234567887654321ll, 0x12345678, 0x12, 0x1234, nat, 0x1234567887654321ull, "Lovely string" ); |
printf(" Print to NULL '%s'\n", NULL); |
retval = snprintf(buffer, BUFFER_SIZE, "Short text without parameters."); |
printf("Result is: '%s', retval = %d\n", buffer, retval); |
retval = snprintf(buffer, BUFFER_SIZE, "Very very very long text without parameters."); |
printf("Result is: '%s', retval = %d\n", buffer, retval); |
printf("Print short text to %d char long buffer via snprintf.\n", BUFFER_SIZE); |
retval = snprintf(buffer, BUFFER_SIZE, "Short %s", "text"); |
printf("Result is: '%s', retval = %d\n", buffer, retval); |
printf("Print long text to %d char long buffer via snprintf.\n", BUFFER_SIZE); |
retval = snprintf(buffer, BUFFER_SIZE, "Very long %s. This text`s length is more than %d. We are interested in the result.", "text" , BUFFER_SIZE); |
printf("Result is: '%s', retval = %d\n", buffer, retval); |
} |
return NULL; |
} |
/tags/0.3.0/kernel/test/print/print1.def |
---|
0,0 → 1,6 |
{ |
"print1", |
"Printf test", |
&test_print1, |
true |
}, |
/tags/0.3.0/kernel/test/btree/btree1.c |
---|
0,0 → 1,165 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#include <test.h> |
#include <print.h> |
#include <adt/btree.h> |
#include <debug.h> |
static void *data = (void *) 0xdeadbeef; |
char * test_btree1(bool quiet) |
{ |
btree_t t; |
int i; |
btree_create(&t); |
if (!quiet) |
printf("Inserting keys.\n"); |
btree_insert(&t, 19, data, NULL); |
btree_insert(&t, 20, data, NULL); |
btree_insert(&t, 21, data, NULL); |
btree_insert(&t, 0, data, NULL); |
btree_insert(&t, 25, data, NULL); |
btree_insert(&t, 22, data, NULL); |
btree_insert(&t, 26, data, NULL); |
btree_insert(&t, 23, data, NULL); |
btree_insert(&t, 24, data, NULL); |
btree_insert(&t, 5, data, NULL); |
btree_insert(&t, 1, data, NULL); |
btree_insert(&t, 4, data, NULL); |
btree_insert(&t, 28, data, NULL); |
btree_insert(&t, 29, data, NULL); |
btree_insert(&t, 7, data, NULL); |
btree_insert(&t, 8, data, NULL); |
btree_insert(&t, 9, data, NULL); |
btree_insert(&t, 17, data, NULL); |
btree_insert(&t, 18, data, NULL); |
btree_insert(&t, 2, data, NULL); |
btree_insert(&t, 3, data, NULL); |
btree_insert(&t, 6, data, NULL); |
btree_insert(&t, 10, data, NULL); |
btree_insert(&t, 11, data, NULL); |
btree_insert(&t, 12, data, NULL); |
btree_insert(&t, 13, data, NULL); |
btree_insert(&t, 14, data, NULL); |
btree_insert(&t, 15, data, NULL); |
btree_insert(&t, 16, data, NULL); |
btree_insert(&t, 27, data, NULL); |
for (i = 30; i < 50; i++) |
btree_insert(&t, i, data, NULL); |
for (i = 100; i >= 50; i--) |
btree_insert(&t, i, data, NULL); |
if (!quiet) |
btree_print(&t); |
if (!quiet) |
printf("Removing keys.\n"); |
btree_remove(&t, 50, NULL); |
btree_remove(&t, 49, NULL); |
btree_remove(&t, 51, NULL); |
btree_remove(&t, 46, NULL); |
btree_remove(&t, 45, NULL); |
btree_remove(&t, 48, NULL); |
btree_remove(&t, 53, NULL); |
btree_remove(&t, 47, NULL); |
btree_remove(&t, 52, NULL); |
btree_remove(&t, 54, NULL); |
btree_remove(&t, 65, NULL); |
btree_remove(&t, 60, NULL); |
btree_remove(&t, 99, NULL); |
btree_remove(&t, 97, NULL); |
btree_remove(&t, 57, NULL); |
btree_remove(&t, 58, NULL); |
btree_remove(&t, 61, NULL); |
btree_remove(&t, 64, NULL); |
btree_remove(&t, 56, NULL); |
btree_remove(&t, 41, NULL); |
for (i = 5; i < 20; i++) |
btree_remove(&t, i, NULL); |
btree_remove(&t, 2, NULL); |
btree_remove(&t, 43, NULL); |
btree_remove(&t, 22, NULL); |
btree_remove(&t, 100, NULL); |
btree_remove(&t, 98, NULL); |
btree_remove(&t, 96, NULL); |
btree_remove(&t, 66, NULL); |
btree_remove(&t, 1, NULL); |
for (i = 70; i < 90; i++) |
btree_remove(&t, i, NULL); |
btree_remove(&t, 20, NULL); |
btree_remove(&t, 0, NULL); |
btree_remove(&t, 40, NULL); |
btree_remove(&t, 3, NULL); |
btree_remove(&t, 4, NULL); |
btree_remove(&t, 21, NULL); |
btree_remove(&t, 44, NULL); |
btree_remove(&t, 55, NULL); |
btree_remove(&t, 62, NULL); |
btree_remove(&t, 26, NULL); |
btree_remove(&t, 27, NULL); |
btree_remove(&t, 28, NULL); |
btree_remove(&t, 29, NULL); |
btree_remove(&t, 30, NULL); |
btree_remove(&t, 31, NULL); |
btree_remove(&t, 32, NULL); |
btree_remove(&t, 33, NULL); |
btree_remove(&t, 93, NULL); |
btree_remove(&t, 95, NULL); |
btree_remove(&t, 94, NULL); |
btree_remove(&t, 69, NULL); |
btree_remove(&t, 68, NULL); |
btree_remove(&t, 92, NULL); |
btree_remove(&t, 91, NULL); |
btree_remove(&t, 67, NULL); |
btree_remove(&t, 63, NULL); |
btree_remove(&t, 90, NULL); |
btree_remove(&t, 59, NULL); |
btree_remove(&t, 23, NULL); |
btree_remove(&t, 24, NULL); |
btree_remove(&t, 25, NULL); |
btree_remove(&t, 37, NULL); |
btree_remove(&t, 38, NULL); |
btree_remove(&t, 42, NULL); |
btree_remove(&t, 39, NULL); |
btree_remove(&t, 34, NULL); |
btree_remove(&t, 35, NULL); |
btree_remove(&t, 36, NULL); |
if (!quiet) |
btree_print(&t); |
return NULL; |
} |
/tags/0.3.0/kernel/test/btree/btree1.def |
---|
0,0 → 1,6 |
{ |
"btree1", |
"Test B-tree operations", |
&test_btree1, |
true |
}, |
/tags/0.3.0/kernel/test/debug/mips1.c |
---|
0,0 → 1,53 |
/* |
* Copyright (c) 2005 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#ifdef mips32 |
#include <print.h> |
#include <debug.h> |
#include <test.h> |
#include <atomic.h> |
#include <proc/thread.h> |
#include <time/delay.h> |
#include <arch.h> |
char * test_mips1(bool quiet) |
{ |
if (!quiet) |
printf("You should enter kconsole debug mode now.\n"); |
asm volatile ( |
"break\n" |
); |
return "Back from debug mode"; |
} |
#endif |
/tags/0.3.0/kernel/test/debug/mips1.def |
---|
0,0 → 1,8 |
#ifdef mips32 |
{ |
"mips1", |
"MIPS debug test", |
&test_mips1, |
false |
}, |
#endif |
/tags/0.3.0/kernel/test/sysinfo/sysinfo1.c |
---|
0,0 → 1,40 |
/* |
* Copyright (c) 2005 Jakub Vana |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#include <print.h> |
#include <debug.h> |
#include <test.h> |
#include <sysinfo/sysinfo.h> |
char * test_sysinfo1(bool quiet) |
{ |
if (!quiet) |
sysinfo_dump(NULL, 0); |
return NULL; |
} |
/tags/0.3.0/kernel/test/sysinfo/sysinfo1.def |
---|
0,0 → 1,6 |
{ |
"sysinfo1", |
"Sysinfo test", |
&test_sysinfo1, |
true |
}, |
/tags/0.3.0/kernel/test/fault/fault1.c |
---|
0,0 → 1,45 |
/* |
* Copyright (c) 2005 Jakub Vana |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#include <print.h> |
#include <debug.h> |
#include <test.h> |
#include <atomic.h> |
#include <proc/thread.h> |
#include <arch.h> |
char * test_fault1(bool quiet) |
{ |
((int *)(0))[1] = 0; |
return "Written to NULL"; |
} |
/tags/0.3.0/kernel/test/fault/fault1.def |
---|
0,0 → 1,6 |
{ |
"fault1", |
"Write to NULL (maybe page fault)", |
&test_fault1, |
false |
}, |
/tags/0.3.0/kernel/test/atomic/atomic1.c |
---|
0,0 → 1,63 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#include <test.h> |
#include <print.h> |
#include <atomic.h> |
#include <debug.h> |
char * test_atomic1(bool quiet) |
{ |
atomic_t a; |
atomic_set(&a, 10); |
if (atomic_get(&a) != 10) |
return "Failed atomic_set()/atomic_get()"; |
if (atomic_postinc(&a) != 10) |
return "Failed atomic_postinc()"; |
if (atomic_get(&a) != 11) |
return "Failed atomic_get() after atomic_postinc()"; |
if (atomic_postdec(&a) != 11) |
return "Failed atomic_postdec()"; |
if (atomic_get(&a) != 10) |
return "Failed atomic_get() after atomic_postdec()"; |
if (atomic_preinc(&a) != 11) |
return "Failed atomic_preinc()"; |
if (atomic_get(&a) != 11) |
return "Failed atomic_get() after atomic_preinc()"; |
if (atomic_predec(&a) != 10) |
return "Failed atomic_predec()"; |
if (atomic_get(&a) != 10) |
return "Failed atomic_get() after atomic_predec()"; |
return NULL; |
} |
/tags/0.3.0/kernel/test/atomic/atomic1.def |
---|
0,0 → 1,6 |
{ |
"atomic1", |
"Test atomic operations", |
&test_atomic1, |
true |
}, |
/tags/0.3.0/kernel/genarch/src/ofw/ebus.c |
---|
0,0 → 1,140 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ofw |
* @{ |
*/ |
/** |
* @file |
* @brief EBUS 'reg' and 'ranges' properties handling. |
* |
*/ |
#include <genarch/ofw/ofw_tree.h> |
#include <arch/memstr.h> |
#include <arch/trap/interrupt.h> |
#include <func.h> |
#include <panic.h> |
#include <debug.h> |
#include <macros.h> |
/** Apply EBUS ranges to EBUS register. */ |
bool ofw_ebus_apply_ranges(ofw_tree_node_t *node, ofw_ebus_reg_t *reg, uintptr_t *pa) |
{ |
ofw_tree_property_t *prop; |
ofw_ebus_range_t *range; |
count_t ranges; |
prop = ofw_tree_getprop(node, "ranges"); |
if (!prop) |
return false; |
ranges = prop->size / sizeof(ofw_ebus_range_t); |
range = prop->value; |
unsigned int i; |
for (i = 0; i < ranges; i++) { |
if (reg->space != range[i].child_space) |
continue; |
if (overlaps(reg->addr, reg->size, range[i].child_base, range[i].size)) { |
ofw_pci_reg_t pci_reg; |
pci_reg.space = range[i].parent_space; |
pci_reg.addr = range[i].parent_base + (reg->addr - range[i].child_base); |
pci_reg.size = reg->size; |
return ofw_pci_apply_ranges(node->parent, &pci_reg, pa); |
} |
} |
return false; |
} |
bool ofw_ebus_map_interrupt(ofw_tree_node_t *node, ofw_ebus_reg_t *reg, uint32_t interrupt, int *inr) |
{ |
ofw_tree_property_t *prop; |
ofw_tree_node_t *controller; |
prop = ofw_tree_getprop(node, "interrupt-map"); |
if (!prop || !prop->value) |
return false; |
ofw_ebus_intr_map_t *intr_map = prop->value; |
count_t count = prop->size / sizeof(ofw_ebus_intr_map_t); |
ASSERT(count); |
prop = ofw_tree_getprop(node, "interrupt-map-mask"); |
if (!prop || !prop->value) |
return false; |
ofw_ebus_intr_mask_t *intr_mask = prop->value; |
ASSERT(prop->size == sizeof(ofw_ebus_intr_mask_t)); |
uint32_t space = reg->space & intr_mask->space_mask; |
uint32_t addr = reg->addr & intr_mask->addr_mask; |
uint32_t intr = interrupt & intr_mask->intr_mask; |
unsigned int i; |
for (i = 0; i < count; i++) { |
if ((intr_map[i].space == space) && (intr_map[i].addr == addr) |
&& (intr_map[i].intr == intr)) |
goto found; |
} |
return false; |
found: |
/* |
* We found the device that functions as an interrupt controller |
* for the interrupt. We also found partial mapping from interrupt to INO. |
*/ |
controller = ofw_tree_find_node_by_handle(ofw_tree_lookup("/"), intr_map[i].controller_handle); |
if (!controller) |
return false; |
if (strcmp(ofw_tree_node_name(controller), "pci") != 0) { |
/* |
* This is not a PCI node. |
*/ |
return false; |
} |
/* |
* Let the PCI do the next step in mapping the interrupt. |
*/ |
if (!ofw_pci_map_interrupt(controller, NULL, intr_map[i].controller_ino, inr)) |
return false; |
return true; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/genarch/src/ofw/fhc.c |
---|
0,0 → 1,133 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ofw |
* @{ |
*/ |
/** |
* @file |
* @brief FHC 'reg' and 'ranges' properties handling. |
* |
*/ |
#include <genarch/ofw/ofw_tree.h> |
#include <arch/drivers/fhc.h> |
#include <arch/memstr.h> |
#include <func.h> |
#include <panic.h> |
#include <macros.h> |
bool ofw_fhc_apply_ranges(ofw_tree_node_t *node, ofw_fhc_reg_t *reg, uintptr_t *pa) |
{ |
ofw_tree_property_t *prop; |
ofw_fhc_range_t *range; |
count_t ranges; |
prop = ofw_tree_getprop(node, "ranges"); |
if (!prop) |
return false; |
ranges = prop->size / sizeof(ofw_fhc_range_t); |
range = prop->value; |
unsigned int i; |
for (i = 0; i < ranges; i++) { |
if (overlaps(reg->addr, reg->size, range[i].child_base, range[i].size)) { |
uintptr_t addr; |
addr = range[i].parent_base + (reg->addr - range[i].child_base); |
if (!node->parent->parent) { |
*pa = addr; |
return true; |
} |
if (strcmp(ofw_tree_node_name(node->parent), "central") != 0) |
panic("Unexpected parent node: %s.\n", ofw_tree_node_name(node->parent)); |
ofw_central_reg_t central_reg; |
central_reg.addr = addr; |
central_reg.size = reg->size; |
return ofw_central_apply_ranges(node->parent, ¢ral_reg, pa); |
} |
} |
return false; |
} |
bool ofw_central_apply_ranges(ofw_tree_node_t *node, ofw_central_reg_t *reg, uintptr_t *pa) |
{ |
if (node->parent->parent) |
panic("Unexpected parent node: %s.\n", ofw_tree_node_name(node->parent)); |
ofw_tree_property_t *prop; |
ofw_central_range_t *range; |
count_t ranges; |
prop = ofw_tree_getprop(node, "ranges"); |
if (!prop) |
return false; |
ranges = prop->size / sizeof(ofw_central_range_t); |
range = prop->value; |
unsigned int i; |
for (i = 0; i < ranges; i++) { |
if (overlaps(reg->addr, reg->size, range[i].child_base, range[i].size)) { |
*pa = range[i].parent_base + (reg->addr - range[i].child_base); |
return true; |
} |
} |
return false; |
} |
bool ofw_fhc_map_interrupt(ofw_tree_node_t *node, ofw_fhc_reg_t *reg, uint32_t interrupt, int *inr) |
{ |
fhc_t *fhc = NULL; |
if (!node->device) { |
fhc = fhc_init(node); |
if (!fhc) |
return false; |
node->device = fhc; |
central_fhc = fhc; |
} |
/* |
* The interrupt controller for the interrupt is the FHC itself. |
*/ |
fhc_enable_interrupt(fhc, interrupt); |
*inr = interrupt; |
return true; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/genarch/src/ofw/ofw_tree.c |
---|
0,0 → 1,272 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ofw |
* @{ |
*/ |
/** |
* @file |
* @brief OpenFirmware device tree navigation. |
* |
*/ |
#include <genarch/ofw/ofw_tree.h> |
#include <arch/memstr.h> |
#include <mm/slab.h> |
#include <func.h> |
#include <print.h> |
#include <panic.h> |
#define PATH_MAX_LEN 80 |
#define NAME_BUF_LEN 50 |
static ofw_tree_node_t *ofw_root; |
void ofw_tree_init(ofw_tree_node_t *root) |
{ |
ofw_root = root; |
} |
/** Get OpenFirmware node property. |
* |
* @param node Node in which to lookup the property. |
* @param name Name of the property. |
* |
* @return Pointer to the property structure or NULL if no such property. |
*/ |
ofw_tree_property_t *ofw_tree_getprop(const ofw_tree_node_t *node, const char *name) |
{ |
unsigned int i; |
for (i = 0; i < node->properties; i++) { |
if (strcmp(node->property[i].name, name) == 0) |
return &node->property[i]; |
} |
return NULL; |
} |
/** Return value of the 'name' property. |
* |
* @param node Node of interest. |
* |
* @return Value of the 'name' property belonging to the node. |
*/ |
const char *ofw_tree_node_name(const ofw_tree_node_t *node) |
{ |
ofw_tree_property_t *prop; |
prop = ofw_tree_getprop(node, "name"); |
if (!prop) |
panic("Node without name property.\n"); |
if (prop->size < 2) |
panic("Invalid name property.\n"); |
return prop->value; |
} |
/** Lookup child of given name. |
* |
* @param node Node whose child is being looked up. |
* @param name Name of the child being looked up. |
* |
* @return NULL if there is no such child or pointer to the matching child node. |
*/ |
ofw_tree_node_t *ofw_tree_find_child(ofw_tree_node_t *node, const char *name) |
{ |
ofw_tree_node_t *cur; |
/* |
* Try to find the disambigued name. |
*/ |
for (cur = node->child; cur; cur = cur->peer) { |
if (strcmp(cur->da_name, name) == 0) |
return cur; |
} |
/* |
* Disambigued name not found. |
* Lets try our luck with possibly ambiguous "name" property. |
* |
* We need to do this because paths stored in "/aliases" |
* are not always fully-qualified. |
*/ |
for (cur = node->child; cur; cur = cur->peer) { |
if (strcmp(ofw_tree_node_name(cur), name) == 0) |
return cur; |
} |
return NULL; |
} |
/** Lookup first child of given device type. |
* |
* @param node Node whose child is being looked up. |
* @param name Device type of the child being looked up. |
* |
* @return NULL if there is no such child or pointer to the matching child node. |
*/ |
ofw_tree_node_t *ofw_tree_find_child_by_device_type(ofw_tree_node_t *node, const char *name) |
{ |
ofw_tree_node_t *cur; |
ofw_tree_property_t *prop; |
for (cur = node->child; cur; cur = cur->peer) { |
prop = ofw_tree_getprop(cur, "device_type"); |
if (!prop || !prop->value) |
continue; |
if (strcmp(prop->value, name) == 0) |
return cur; |
} |
return NULL; |
} |
/** Lookup node with matching node_handle. |
* |
* Child nodes are looked up recursively contrary to peer nodes that |
* are looked up iteratively to avoid stack overflow. |
* |
* @param root Root of the searched subtree. |
* @param handle OpenFirmware handle. |
* |
* @return NULL if there is no such node or pointer to the matching node. |
*/ |
ofw_tree_node_t *ofw_tree_find_node_by_handle(ofw_tree_node_t *root, uint32_t handle) |
{ |
ofw_tree_node_t *cur; |
for (cur = root; cur; cur = cur->peer) { |
if (cur->node_handle == handle) |
return cur; |
if (cur->child) { |
ofw_tree_node_t *node; |
node = ofw_tree_find_node_by_handle(cur->child, handle); |
if (node) |
return node; |
} |
} |
return NULL; |
} |
/** Lookup first peer of given device type. |
* |
* @param node Node whose peer is being looked up. |
* @param name Device type of the child being looked up. |
* |
* @return NULL if there is no such child or pointer to the matching child node. |
*/ |
ofw_tree_node_t *ofw_tree_find_peer_by_device_type(ofw_tree_node_t *node, const char *name) |
{ |
ofw_tree_node_t *cur; |
ofw_tree_property_t *prop; |
for (cur = node->peer; cur; cur = cur->peer) { |
prop = ofw_tree_getprop(cur, "device_type"); |
if (!prop || !prop->value) |
continue; |
if (strcmp(prop->value, name) == 0) |
return cur; |
} |
return NULL; |
} |
/** Lookup OpenFirmware node by its path. |
* |
* @param path Path to the node. |
* |
* @return NULL if there is no such node or pointer to the leaf node. |
*/ |
ofw_tree_node_t *ofw_tree_lookup(const char *path) |
{ |
char buf[NAME_BUF_LEN+1]; |
ofw_tree_node_t *node = ofw_root; |
index_t i, j; |
if (path[0] != '/') |
return NULL; |
for (i = 1; i < strlen(path) && node; i = j + 1) { |
for (j = i; j < strlen(path) && path[j] != '/'; j++) |
; |
if (i == j) /* skip extra slashes */ |
continue; |
memcpy(buf, &path[i], j - i); |
buf[j - i] = '\0'; |
node = ofw_tree_find_child(node, buf); |
} |
return node; |
} |
/** Print OpenFirmware device subtree rooted in a node. |
* |
* Child nodes are processed recursively and peer nodes are processed |
* iteratively in order to avoid stack overflow. |
* |
* @param node Root of the subtree. |
* @param path Current path, NULL for the very root of the entire tree. |
*/ |
static void ofw_tree_node_print(const ofw_tree_node_t *node, const char *path) |
{ |
char *p; |
const ofw_tree_node_t *cur; |
p = (char *) malloc(PATH_MAX_LEN, 0); |
for (cur = node; cur; cur = cur->peer) { |
if (cur->parent) { |
snprintf(p, PATH_MAX_LEN, "%s/%s", path, cur->da_name); |
printf("%s\n", p); |
} else { |
snprintf(p, PATH_MAX_LEN, "%s", cur->da_name); |
printf("/\n"); |
} |
if (cur->child) |
ofw_tree_node_print(cur->child, p); |
} |
free(p); |
} |
/** Print the structure of the OpenFirmware device tree. */ |
void ofw_tree_print(void) |
{ |
ofw_tree_node_print(ofw_root, NULL); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/genarch/src/ofw/pci.c |
---|
0,0 → 1,140 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ofw |
* @{ |
*/ |
/** |
* @file |
* @brief PCI 'reg' and 'ranges' properties handling. |
* |
*/ |
#include <genarch/ofw/ofw_tree.h> |
#include <arch/drivers/pci.h> |
#include <arch/trap/interrupt.h> |
#include <arch/memstr.h> |
#include <func.h> |
#include <panic.h> |
#include <macros.h> |
#define PCI_SPACE_MASK 0x03000000 |
#define PCI_ABS_MASK 0x80000000 |
#define PCI_REG_MASK 0x000000ff |
#define PCI_IGN 0x1f |
bool ofw_pci_apply_ranges(ofw_tree_node_t *node, ofw_pci_reg_t *reg, uintptr_t *pa) |
{ |
ofw_tree_property_t *prop; |
ofw_pci_range_t *range; |
count_t ranges; |
prop = ofw_tree_getprop(node, "ranges"); |
if (!prop) { |
if (strcmp(ofw_tree_node_name(node->parent), "pci") == 0) |
return ofw_pci_apply_ranges(node->parent, reg, pa); |
return false; |
} |
ranges = prop->size / sizeof(ofw_pci_range_t); |
range = prop->value; |
unsigned int i; |
for (i = 0; i < ranges; i++) { |
if ((reg->space & PCI_SPACE_MASK) != (range[i].space & PCI_SPACE_MASK)) |
continue; |
if (overlaps(reg->addr, reg->size, range[i].child_base, range[i].size)) { |
*pa = range[i].parent_base + (reg->addr - range[i].child_base); |
return true; |
} |
} |
return false; |
} |
bool ofw_pci_reg_absolutize(ofw_tree_node_t *node, ofw_pci_reg_t *reg, ofw_pci_reg_t *out) |
{ |
if (reg->space & PCI_ABS_MASK) { |
/* already absolute */ |
out->space = reg->space; |
out->addr = reg->addr; |
out->size = reg->size; |
return true; |
} |
ofw_tree_property_t *prop; |
ofw_pci_reg_t *assigned_address; |
count_t assigned_addresses; |
prop = ofw_tree_getprop(node, "assigned-addresses"); |
if (!prop) |
panic("Can't find \"assigned-addresses\" property.\n"); |
assigned_addresses = prop->size / sizeof(ofw_pci_reg_t); |
assigned_address = prop->value; |
unsigned int i; |
for (i = 0; i < assigned_addresses; i++) { |
if ((assigned_address[i].space & PCI_REG_MASK) == (reg->space & PCI_REG_MASK)) { |
out->space = assigned_address[i].space; |
out->addr = reg->addr + assigned_address[i].addr; |
out->size = reg->size; |
return true; |
} |
} |
return false; |
} |
/** Map PCI interrupt. |
* |
* So far, we only know how to map interrupts of non-PCI devices connected |
* to a PCI bridge. |
*/ |
bool ofw_pci_map_interrupt(ofw_tree_node_t *node, ofw_pci_reg_t *reg, int ino, int *inr) |
{ |
pci_t *pci = node->device; |
if (!pci) { |
pci = pci_init(node); |
if (!pci) |
return false; |
node->device = pci; |
} |
pci_enable_interrupt(pci, ino); |
*inr = (PCI_IGN << IGN_SHIFT) | ino; |
return true; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/genarch/src/ofw/sbus.c |
---|
0,0 → 1,79 |
/* |
* Copyright (c) 2007 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ofw |
* @{ |
*/ |
/** |
* @file |
* @brief SBUS 'reg' and 'ranges' properties handling. |
* |
*/ |
#include <genarch/ofw/ofw_tree.h> |
#include <macros.h> |
bool ofw_sbus_apply_ranges(ofw_tree_node_t *node, ofw_sbus_reg_t *reg, |
uintptr_t *pa) |
{ |
ofw_tree_property_t *prop; |
ofw_sbus_range_t *range; |
count_t ranges; |
/* |
* The SBUS support is very rudimentary in that we simply assume |
* that the SBUS bus in question is connected directly to the UPA bus. |
* Should we come across configurations that need more robust support, |
* the driver will have to be extended to handle different topologies. |
*/ |
if (!node->parent || node->parent->parent) |
return false; |
prop = ofw_tree_getprop(node, "ranges"); |
if (!prop) |
return false; |
ranges = prop->size / sizeof(ofw_sbus_range_t); |
range = prop->value; |
unsigned int i; |
for (i = 0; i < ranges; i++) { |
if (overlaps(reg->addr, reg->size, range[i].child_base, |
range[i].size)) { |
*pa = range[i].parent_base + |
(reg->addr - range[i].child_base); |
return true; |
} |
} |
return false; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/genarch/src/ofw/upa.c |
---|
0,0 → 1,52 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ofw |
* @{ |
*/ |
/** |
* @file |
* @brief UPA 'reg' and 'ranges' properties handling. |
* |
*/ |
#include <genarch/ofw/ofw_tree.h> |
#include <arch/memstr.h> |
#include <func.h> |
#include <panic.h> |
#include <macros.h> |
#include <debug.h> |
bool ofw_upa_apply_ranges(ofw_tree_node_t *node, ofw_upa_reg_t *reg, uintptr_t *pa) |
{ |
*pa = reg->addr; |
return true; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/genarch/src/kbd/key.c |
---|
0,0 → 1,252 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genarch |
* @{ |
*/ |
/** |
* @file |
* @brief Key processing. |
*/ |
#include <genarch/kbd/key.h> |
#include <genarch/kbd/scanc.h> |
#ifdef CONFIG_I8042 |
#include <genarch/kbd/scanc_pc.h> |
#endif |
#if (defined(CONFIG_Z8530) || defined(CONFIG_NS16550)) |
#include <genarch/kbd/scanc_sun.h> |
#endif |
#include <synch/spinlock.h> |
#include <console/chardev.h> |
#include <macros.h> |
#define PRESSED_SHIFT (1<<0) |
#define PRESSED_CAPSLOCK (1<<1) |
#define LOCKED_CAPSLOCK (1<<0) |
#define ACTIVE_READ_BUFF_SIZE 16 /* Must be power of 2 */ |
chardev_t kbrd; |
static uint8_t active_read_buff[ACTIVE_READ_BUFF_SIZE]; |
SPINLOCK_INITIALIZE(keylock); /**< keylock protects keyflags and lockflags. */ |
static volatile int keyflags; /**< Tracking of multiple keypresses. */ |
static volatile int lockflags; /**< Tracking of multiple keys lockings. */ |
/** Process release of key. |
* |
* @param sc Scancode of the key being released. |
*/ |
void key_released(uint8_t sc) |
{ |
spinlock_lock(&keylock); |
switch (sc) { |
case SC_LSHIFT: |
case SC_RSHIFT: |
keyflags &= ~PRESSED_SHIFT; |
break; |
case SC_CAPSLOCK: |
keyflags &= ~PRESSED_CAPSLOCK; |
if (lockflags & LOCKED_CAPSLOCK) |
lockflags &= ~LOCKED_CAPSLOCK; |
else |
lockflags |= LOCKED_CAPSLOCK; |
break; |
default: |
break; |
} |
spinlock_unlock(&keylock); |
} |
/** Process keypress. |
* |
* @param sc Scancode of the key being pressed. |
*/ |
void key_pressed(uint8_t sc) |
{ |
char *map = sc_primary_map; |
char ascii = sc_primary_map[sc]; |
bool shift, capslock; |
bool letter = false; |
spinlock_lock(&keylock); |
switch (sc) { |
case SC_LSHIFT: |
case SC_RSHIFT: |
keyflags |= PRESSED_SHIFT; |
break; |
case SC_CAPSLOCK: |
keyflags |= PRESSED_CAPSLOCK; |
break; |
case SC_SPEC_ESCAPE: |
break; |
case SC_LEFTARR: |
chardev_push_character(&kbrd, 0x1b); |
chardev_push_character(&kbrd, 0x5b); |
chardev_push_character(&kbrd, 0x44); |
break; |
case SC_RIGHTARR: |
chardev_push_character(&kbrd, 0x1b); |
chardev_push_character(&kbrd, 0x5b); |
chardev_push_character(&kbrd, 0x43); |
break; |
case SC_UPARR: |
chardev_push_character(&kbrd, 0x1b); |
chardev_push_character(&kbrd, 0x5b); |
chardev_push_character(&kbrd, 0x41); |
break; |
case SC_DOWNARR: |
chardev_push_character(&kbrd, 0x1b); |
chardev_push_character(&kbrd, 0x5b); |
chardev_push_character(&kbrd, 0x42); |
break; |
case SC_HOME: |
chardev_push_character(&kbrd, 0x1b); |
chardev_push_character(&kbrd, 0x4f); |
chardev_push_character(&kbrd, 0x48); |
break; |
case SC_END: |
chardev_push_character(&kbrd, 0x1b); |
chardev_push_character(&kbrd, 0x4f); |
chardev_push_character(&kbrd, 0x46); |
break; |
case SC_DELETE: |
chardev_push_character(&kbrd, 0x1b); |
chardev_push_character(&kbrd, 0x5b); |
chardev_push_character(&kbrd, 0x33); |
chardev_push_character(&kbrd, 0x7e); |
break; |
default: |
letter = islower(ascii); |
capslock = (keyflags & PRESSED_CAPSLOCK) || |
(lockflags & LOCKED_CAPSLOCK); |
shift = keyflags & PRESSED_SHIFT; |
if (letter && capslock) |
shift = !shift; |
if (shift) |
map = sc_secondary_map; |
chardev_push_character(&kbrd, map[sc]); |
break; |
} |
spinlock_unlock(&keylock); |
} |
uint8_t active_read_buff_read(void) |
{ |
static int i=0; |
i &= (ACTIVE_READ_BUFF_SIZE-1); |
if(!active_read_buff[i]) { |
return 0; |
} |
return active_read_buff[i++]; |
} |
void active_read_buff_write(uint8_t ch) |
{ |
static int i=0; |
active_read_buff[i] = ch; |
i++; |
i &= (ACTIVE_READ_BUFF_SIZE-1); |
active_read_buff[i]=0; |
} |
void active_read_key_pressed(uint8_t sc) |
{ |
char *map = sc_primary_map; |
char ascii = sc_primary_map[sc]; |
bool shift, capslock; |
bool letter = false; |
/*spinlock_lock(&keylock);*/ |
switch (sc) { |
case SC_LSHIFT: |
case SC_RSHIFT: |
keyflags |= PRESSED_SHIFT; |
break; |
case SC_CAPSLOCK: |
keyflags |= PRESSED_CAPSLOCK; |
break; |
case SC_SPEC_ESCAPE: |
break; |
case SC_LEFTARR: |
active_read_buff_write(0x1b); |
active_read_buff_write(0x5b); |
active_read_buff_write(0x44); |
break; |
case SC_RIGHTARR: |
active_read_buff_write(0x1b); |
active_read_buff_write(0x5b); |
active_read_buff_write(0x43); |
break; |
case SC_UPARR: |
active_read_buff_write(0x1b); |
active_read_buff_write(0x5b); |
active_read_buff_write(0x41); |
break; |
case SC_DOWNARR: |
active_read_buff_write(0x1b); |
active_read_buff_write(0x5b); |
active_read_buff_write(0x42); |
break; |
case SC_HOME: |
active_read_buff_write(0x1b); |
active_read_buff_write(0x4f); |
active_read_buff_write(0x48); |
break; |
case SC_END: |
active_read_buff_write(0x1b); |
active_read_buff_write(0x4f); |
active_read_buff_write(0x46); |
break; |
case SC_DELETE: |
active_read_buff_write(0x1b); |
active_read_buff_write(0x5b); |
active_read_buff_write(0x33); |
active_read_buff_write(0x7e); |
break; |
default: |
letter = islower(ascii); |
capslock = (keyflags & PRESSED_CAPSLOCK) || |
(lockflags & LOCKED_CAPSLOCK); |
shift = keyflags & PRESSED_SHIFT; |
if (letter && capslock) |
shift = !shift; |
if (shift) |
map = sc_secondary_map; |
active_read_buff_write(map[sc]); |
break; |
} |
/*spinlock_unlock(&keylock);*/ |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/genarch/src/kbd/i8042.c |
---|
0,0 → 1,240 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genarch |
* @{ |
*/ |
/** |
* @file |
* @brief i8042 processor driver. |
* |
* It takes care of low-level keyboard functions. |
*/ |
#include <genarch/kbd/i8042.h> |
#include <genarch/kbd/key.h> |
#include <genarch/kbd/scanc.h> |
#include <genarch/kbd/scanc_pc.h> |
#include <arch/drivers/i8042.h> |
#include <cpu.h> |
#include <arch/asm.h> |
#include <arch.h> |
#include <console/chardev.h> |
#include <console/console.h> |
#include <interrupt.h> |
#include <sysinfo/sysinfo.h> |
#include <ipc/irq.h> |
/* Keyboard commands. */ |
#define KBD_ENABLE 0xf4 |
#define KBD_DISABLE 0xf5 |
#define KBD_ACK 0xfa |
/* |
* 60 Write 8042 Command Byte: next data byte written to port 60h is |
* placed in 8042 command register. Format: |
* |
* |7|6|5|4|3|2|1|0|8042 Command Byte |
* | | | | | | | `---- 1=enable output register full interrupt |
* | | | | | | `----- should be 0 |
* | | | | | `------ 1=set status register system, 0=clear |
* | | | | `------- 1=override keyboard inhibit, 0=allow inhibit |
* | | | `-------- disable keyboard I/O by driving clock line low |
* | | `--------- disable auxiliary device, drives clock line low |
* | `---------- IBM scancode translation 0=AT, 1=PC/XT |
* `----------- reserved, should be 0 |
*/ |
#define i8042_SET_COMMAND 0x60 |
#define i8042_COMMAND 0x69 |
#define i8042_BUFFER_FULL_MASK 0x01 |
#define i8042_WAIT_MASK 0x02 |
#define i8042_MOUSE_DATA 0x20 |
static void i8042_suspend(chardev_t *); |
static void i8042_resume(chardev_t *); |
static chardev_operations_t ops = { |
.suspend = i8042_suspend, |
.resume = i8042_resume, |
.read = i8042_key_read |
}; |
/** Structure for i8042's IRQ. */ |
static irq_t i8042_kbd_irq; |
static irq_t i8042_mouse_irq; |
void i8042_grab(void) |
{ |
ipl_t ipl = interrupts_disable(); |
spinlock_lock(&i8042_kbd_irq.lock); |
i8042_kbd_irq.notif_cfg.notify = false; |
spinlock_unlock(&i8042_kbd_irq.lock); |
spinlock_lock(&i8042_mouse_irq.lock); |
i8042_mouse_irq.notif_cfg.notify = false; |
spinlock_unlock(&i8042_mouse_irq.lock); |
interrupts_restore(ipl); |
} |
void i8042_release(void) |
{ |
ipl_t ipl = interrupts_disable(); |
spinlock_lock(&i8042_kbd_irq.lock); |
if (i8042_kbd_irq.notif_cfg.answerbox) |
i8042_kbd_irq.notif_cfg.notify = true; |
spinlock_unlock(&i8042_kbd_irq.lock); |
spinlock_lock(&i8042_mouse_irq.lock); |
if (i8042_mouse_irq.notif_cfg.answerbox) |
i8042_mouse_irq.notif_cfg.notify = true; |
spinlock_unlock(&i8042_mouse_irq.lock); |
interrupts_restore(ipl); |
} |
static irq_ownership_t i8042_claim(void) |
{ |
return IRQ_ACCEPT; |
} |
static void i8042_irq_handler(irq_t *irq, void *arg, ...) |
{ |
if (irq->notif_cfg.notify && irq->notif_cfg.answerbox) |
ipc_irq_send_notif(irq); |
else { |
uint8_t data; |
uint8_t status; |
while (((status = i8042_status_read()) & i8042_BUFFER_FULL_MASK)) { |
data = i8042_data_read(); |
if ((status & i8042_MOUSE_DATA)) |
continue; |
if (data & KEY_RELEASE) |
key_released(data ^ KEY_RELEASE); |
else |
key_pressed(data); |
} |
} |
} |
/** Initialize i8042. */ |
void i8042_init(devno_t kbd_devno, inr_t kbd_inr, devno_t mouse_devno, inr_t mouse_inr) |
{ |
chardev_initialize("i8042_kbd", &kbrd, &ops); |
stdin = &kbrd; |
irq_initialize(&i8042_kbd_irq); |
i8042_kbd_irq.devno = kbd_devno; |
i8042_kbd_irq.inr = kbd_inr; |
i8042_kbd_irq.claim = i8042_claim; |
i8042_kbd_irq.handler = i8042_irq_handler; |
irq_register(&i8042_kbd_irq); |
irq_initialize(&i8042_mouse_irq); |
i8042_mouse_irq.devno = mouse_devno; |
i8042_mouse_irq.inr = mouse_inr; |
i8042_mouse_irq.claim = i8042_claim; |
i8042_mouse_irq.handler = i8042_irq_handler; |
irq_register(&i8042_mouse_irq); |
#ifndef ia64 |
trap_virtual_enable_irqs(1 << kbd_inr); |
trap_virtual_enable_irqs(1 << mouse_inr); |
#endif |
/* |
* Clear input buffer. |
* Number of iterations is limited to prevent infinite looping. |
*/ |
int i; |
for (i = 0; (i8042_status_read() & i8042_BUFFER_FULL_MASK) && i < 100; i++) { |
i8042_data_read(); |
} |
sysinfo_set_item_val("kbd", NULL, true); |
sysinfo_set_item_val("kbd.devno", NULL, kbd_devno); |
sysinfo_set_item_val("kbd.inr", NULL, kbd_inr); |
sysinfo_set_item_val("mouse", NULL, true); |
sysinfo_set_item_val("mouse.devno", NULL, mouse_devno); |
sysinfo_set_item_val("mouse.inr", NULL, mouse_inr); |
i8042_grab(); |
} |
/* Called from getc(). */ |
void i8042_resume(chardev_t *d) |
{ |
} |
/* Called from getc(). */ |
void i8042_suspend(chardev_t *d) |
{ |
} |
char i8042_key_read(chardev_t *d) |
{ |
char ch; |
while(!(ch = active_read_buff_read())) { |
uint8_t x; |
while (!(i8042_status_read() & i8042_BUFFER_FULL_MASK)) |
; |
x = i8042_data_read(); |
if (x & KEY_RELEASE) |
key_released(x ^ KEY_RELEASE); |
else |
active_read_key_pressed(x); |
} |
return ch; |
} |
/** Poll for key press and release events. |
* |
* This function can be used to implement keyboard polling. |
*/ |
void i8042_poll(void) |
{ |
uint8_t x; |
while (((x = i8042_status_read() & i8042_BUFFER_FULL_MASK))) { |
x = i8042_data_read(); |
if (x & KEY_RELEASE) |
key_released(x ^ KEY_RELEASE); |
else |
key_pressed(x); |
} |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/genarch/src/kbd/ns16550.c |
---|
0,0 → 1,224 |
/* |
* Copyright (c) 2001-2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genarch |
* @{ |
*/ |
/** |
* @file |
* @brief NS 16550 serial port / keyboard driver. |
*/ |
#include <genarch/kbd/ns16550.h> |
#include <genarch/kbd/key.h> |
#include <genarch/kbd/scanc.h> |
#include <genarch/kbd/scanc_sun.h> |
#include <arch/drivers/kbd.h> |
#include <arch/drivers/ns16550.h> |
#include <ddi/irq.h> |
#include <ipc/irq.h> |
#include <cpu.h> |
#include <arch/asm.h> |
#include <arch.h> |
#include <console/chardev.h> |
#include <console/console.h> |
#include <interrupt.h> |
#include <arch/interrupt.h> |
#include <sysinfo/sysinfo.h> |
#include <synch/spinlock.h> |
#define LSR_DATA_READY 0x01 |
/** Structure representing the ns16550. */ |
static ns16550_t ns16550; |
/** Structure for ns16550's IRQ. */ |
static irq_t ns16550_irq; |
/* |
* These codes read from ns16550 data register are silently ignored. |
*/ |
#define IGNORE_CODE 0x7f /* all keys up */ |
static void ns16550_suspend(chardev_t *); |
static void ns16550_resume(chardev_t *); |
static chardev_operations_t ops = { |
.suspend = ns16550_suspend, |
.resume = ns16550_resume, |
.read = ns16550_key_read |
}; |
void ns16550_interrupt(void); |
/** Initialize keyboard and service interrupts using kernel routine */ |
void ns16550_grab(void) |
{ |
ipl_t ipl = interrupts_disable(); |
ns16550_ier_write(&ns16550, IER_ERBFI); /* enable receiver interrupt */ |
while (ns16550_lsr_read(&ns16550) & LSR_DATA_READY) |
(void) ns16550_rbr_read(&ns16550); |
spinlock_lock(&ns16550_irq.lock); |
ns16550_irq.notif_cfg.notify = false; |
spinlock_unlock(&ns16550_irq.lock); |
interrupts_restore(ipl); |
} |
/** Resume the former interrupt vector */ |
void ns16550_release(void) |
{ |
ipl_t ipl = interrupts_disable(); |
spinlock_lock(&ns16550_irq.lock); |
if (ns16550_irq.notif_cfg.answerbox) |
ns16550_irq.notif_cfg.notify = true; |
spinlock_unlock(&ns16550_irq.lock); |
interrupts_restore(ipl); |
} |
/** Initialize ns16550. |
* |
* @param devno Device number. |
* @param inr Interrupt number. |
* @param vaddr Virtual address of device's registers. |
*/ |
void ns16550_init(devno_t devno, inr_t inr, uintptr_t vaddr) |
{ |
chardev_initialize("ns16550_kbd", &kbrd, &ops); |
stdin = &kbrd; |
ns16550.devno = devno; |
ns16550.reg = (uint8_t *) vaddr; |
irq_initialize(&ns16550_irq); |
ns16550_irq.devno = devno; |
ns16550_irq.inr = inr; |
ns16550_irq.claim = ns16550_claim; |
ns16550_irq.handler = ns16550_irq_handler; |
irq_register(&ns16550_irq); |
sysinfo_set_item_val("kbd", NULL, true); |
sysinfo_set_item_val("kbd.type", NULL, KBD_NS16550); |
sysinfo_set_item_val("kbd.devno", NULL, devno); |
sysinfo_set_item_val("kbd.inr", NULL, inr); |
sysinfo_set_item_val("kbd.address.virtual", NULL, vaddr); |
ns16550_grab(); |
} |
/** Process ns16550 interrupt. */ |
void ns16550_interrupt(void) |
{ |
/* TODO |
* |
* ns16550 works in the polled mode so far. |
*/ |
} |
/* Called from getc(). */ |
void ns16550_resume(chardev_t *d) |
{ |
} |
/* Called from getc(). */ |
void ns16550_suspend(chardev_t *d) |
{ |
} |
char ns16550_key_read(chardev_t *d) |
{ |
char ch; |
while(!(ch = active_read_buff_read())) { |
uint8_t x; |
while (!(ns16550_lsr_read(&ns16550) & LSR_DATA_READY)) |
; |
x = ns16550_rbr_read(&ns16550); |
if (x != IGNORE_CODE) { |
if (x & KEY_RELEASE) |
key_released(x ^ KEY_RELEASE); |
else |
active_read_key_pressed(x); |
} |
} |
return ch; |
} |
/** Poll for key press and release events. |
* |
* This function can be used to implement keyboard polling. |
*/ |
void ns16550_poll(void) |
{ |
ipl_t ipl; |
ipl = interrupts_disable(); |
spinlock_lock(&ns16550_irq.lock); |
if (ns16550_lsr_read(&ns16550) & LSR_DATA_READY) { |
if (ns16550_irq.notif_cfg.notify && ns16550_irq.notif_cfg.answerbox) { |
/* |
* Send IPC notification. |
*/ |
ipc_irq_send_notif(&ns16550_irq); |
spinlock_unlock(&ns16550_irq.lock); |
interrupts_restore(ipl); |
return; |
} |
} |
spinlock_unlock(&ns16550_irq.lock); |
interrupts_restore(ipl); |
while (ns16550_lsr_read(&ns16550) & LSR_DATA_READY) { |
uint8_t x; |
x = ns16550_rbr_read(&ns16550); |
if (x != IGNORE_CODE) { |
if (x & KEY_RELEASE) |
key_released(x ^ KEY_RELEASE); |
else |
key_pressed(x); |
} |
} |
} |
irq_ownership_t ns16550_claim(void) |
{ |
return (ns16550_lsr_read(&ns16550) & LSR_DATA_READY); |
} |
void ns16550_irq_handler(irq_t *irq, void *arg, ...) |
{ |
panic("Not yet implemented, ns16550 works in polled mode.\n"); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/genarch/src/kbd/z8530.c |
---|
0,0 → 1,215 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genarch |
* @{ |
*/ |
/** |
* @file |
* @brief Zilog 8530 serial port / keyboard driver. |
*/ |
#include <genarch/kbd/z8530.h> |
#include <genarch/kbd/key.h> |
#include <genarch/kbd/scanc.h> |
#include <genarch/kbd/scanc_sun.h> |
#include <arch/drivers/z8530.h> |
#include <ddi/irq.h> |
#include <ipc/irq.h> |
#include <arch/interrupt.h> |
#include <arch/drivers/kbd.h> |
#include <arch/drivers/fhc.h> |
#include <cpu.h> |
#include <arch/asm.h> |
#include <arch.h> |
#include <console/chardev.h> |
#include <console/console.h> |
#include <interrupt.h> |
#include <sysinfo/sysinfo.h> |
#include <print.h> |
/* |
* These codes read from z8530 data register are silently ignored. |
*/ |
#define IGNORE_CODE 0x7f /* all keys up */ |
static z8530_t z8530; /**< z8530 device structure. */ |
static irq_t z8530_irq; /**< z8530's IRQ. */ |
static void z8530_suspend(chardev_t *); |
static void z8530_resume(chardev_t *); |
static chardev_operations_t ops = { |
.suspend = z8530_suspend, |
.resume = z8530_resume, |
.read = z8530_key_read |
}; |
/** Initialize keyboard and service interrupts using kernel routine. */ |
void z8530_grab(void) |
{ |
ipl_t ipl = interrupts_disable(); |
(void) z8530_read_a(&z8530, RR8); |
/* |
* Clear any pending TX interrupts or we never manage |
* to set FHC UART interrupt state to idle. |
*/ |
z8530_write_a(&z8530, WR0, WR0_TX_IP_RST); |
z8530_write_a(&z8530, WR1, WR1_IARCSC); /* interrupt on all characters */ |
/* 8 bits per character and enable receiver */ |
z8530_write_a(&z8530, WR3, WR3_RX8BITSCH | WR3_RX_ENABLE); |
z8530_write_a(&z8530, WR9, WR9_MIE); /* Master Interrupt Enable. */ |
spinlock_lock(&z8530_irq.lock); |
z8530_irq.notif_cfg.notify = false; |
spinlock_unlock(&z8530_irq.lock); |
interrupts_restore(ipl); |
} |
/** Resume the former IPC notification behavior. */ |
void z8530_release(void) |
{ |
ipl_t ipl = interrupts_disable(); |
spinlock_lock(&z8530_irq.lock); |
if (z8530_irq.notif_cfg.answerbox) |
z8530_irq.notif_cfg.notify = true; |
spinlock_unlock(&z8530_irq.lock); |
interrupts_restore(ipl); |
} |
/** Initialize z8530. */ |
void z8530_init(devno_t devno, inr_t inr, uintptr_t vaddr) |
{ |
chardev_initialize("z8530_kbd", &kbrd, &ops); |
stdin = &kbrd; |
z8530.devno = devno; |
z8530.reg = (uint8_t *) vaddr; |
irq_initialize(&z8530_irq); |
z8530_irq.devno = devno; |
z8530_irq.inr = inr; |
z8530_irq.claim = z8530_claim; |
z8530_irq.handler = z8530_irq_handler; |
irq_register(&z8530_irq); |
sysinfo_set_item_val("kbd", NULL, true); |
sysinfo_set_item_val("kbd.type", NULL, KBD_Z8530); |
sysinfo_set_item_val("kbd.devno", NULL, devno); |
sysinfo_set_item_val("kbd.inr", NULL, inr); |
sysinfo_set_item_val("kbd.address.virtual", NULL, vaddr); |
z8530_grab(); |
} |
/** Process z8530 interrupt. |
* |
* @param n Interrupt vector. |
* @param istate Interrupted state. |
*/ |
void z8530_interrupt(void) |
{ |
z8530_poll(); |
} |
/* Called from getc(). */ |
void z8530_resume(chardev_t *d) |
{ |
} |
/* Called from getc(). */ |
void z8530_suspend(chardev_t *d) |
{ |
} |
char z8530_key_read(chardev_t *d) |
{ |
char ch; |
while(!(ch = active_read_buff_read())) { |
uint8_t x; |
while (!(z8530_read_a(&z8530, RR0) & RR0_RCA)) |
; |
x = z8530_read_a(&z8530, RR8); |
if (x != IGNORE_CODE) { |
if (x & KEY_RELEASE) |
key_released(x ^ KEY_RELEASE); |
else |
active_read_key_pressed(x); |
} |
} |
return ch; |
} |
/** Poll for key press and release events. |
* |
* This function can be used to implement keyboard polling. |
*/ |
void z8530_poll(void) |
{ |
uint8_t x; |
while (z8530_read_a(&z8530, RR0) & RR0_RCA) { |
x = z8530_read_a(&z8530, RR8); |
if (x != IGNORE_CODE) { |
if (x & KEY_RELEASE) |
key_released(x ^ KEY_RELEASE); |
else |
key_pressed(x); |
} |
} |
} |
irq_ownership_t z8530_claim(void) |
{ |
return (z8530_read_a(&z8530, RR0) & RR0_RCA); |
} |
void z8530_irq_handler(irq_t *irq, void *arg, ...) |
{ |
/* |
* So far, we know we got this interrupt through the FHC. |
* Since we don't have enough documentation about the FHC |
* and because the interrupt looks like level sensitive, |
* we cannot handle it by scheduling one of the level |
* interrupt traps. Process the interrupt directly. |
*/ |
if (irq->notif_cfg.notify && irq->notif_cfg.answerbox) |
ipc_irq_send_notif(irq); |
else |
z8530_interrupt(); |
fhc_clear_interrupt(central_fhc, irq->inr); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/genarch/src/kbd/scanc_pc.c |
---|
0,0 → 1,200 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genarch |
* @{ |
*/ |
/** |
* @file |
* @brief Scan codes for pc keyboards. |
*/ |
#include <genarch/kbd/scanc.h> |
/** Primary meaning of scancodes. */ |
char sc_primary_map[] = { |
SPECIAL, /* 0x00 */ |
SPECIAL, /* 0x01 - Esc */ |
'1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', |
'\b', /* 0x0e - Backspace */ |
'\t', 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', '\n', |
SPECIAL, /* 0x1d - LCtrl */ |
'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', '\'', |
'`', |
SPECIAL, /* 0x2a - LShift */ |
'\\', |
'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', |
SPECIAL, /* 0x36 - RShift */ |
'*', |
SPECIAL, /* 0x38 - LAlt */ |
' ', |
SPECIAL, /* 0x3a - CapsLock */ |
SPECIAL, /* 0x3b - F1 */ |
SPECIAL, /* 0x3c - F2 */ |
SPECIAL, /* 0x3d - F3 */ |
SPECIAL, /* 0x3e - F4 */ |
SPECIAL, /* 0x3f - F5 */ |
SPECIAL, /* 0x40 - F6 */ |
SPECIAL, /* 0x41 - F7 */ |
SPECIAL, /* 0x42 - F8 */ |
SPECIAL, /* 0x43 - F9 */ |
SPECIAL, /* 0x44 - F10 */ |
SPECIAL, /* 0x45 - NumLock */ |
SPECIAL, /* 0x46 - ScrollLock */ |
'7', '8', '9', '-', |
'4', '5', '6', '+', |
'1', '2', '3', |
'0', '.', |
SPECIAL, /* 0x54 - Alt-SysRq */ |
SPECIAL, /* 0x55 - F11/F12/PF1/FN */ |
SPECIAL, /* 0x56 - unlabelled key next to LAlt */ |
SPECIAL, /* 0x57 - F11 */ |
SPECIAL, /* 0x58 - F12 */ |
SPECIAL, /* 0x59 */ |
SPECIAL, /* 0x5a */ |
SPECIAL, /* 0x5b */ |
SPECIAL, /* 0x5c */ |
SPECIAL, /* 0x5d */ |
SPECIAL, /* 0x5e */ |
SPECIAL, /* 0x5f */ |
SPECIAL, /* 0x60 */ |
SPECIAL, /* 0x61 */ |
SPECIAL, /* 0x62 */ |
SPECIAL, /* 0x63 */ |
SPECIAL, /* 0x64 */ |
SPECIAL, /* 0x65 */ |
SPECIAL, /* 0x66 */ |
SPECIAL, /* 0x67 */ |
SPECIAL, /* 0x68 */ |
SPECIAL, /* 0x69 */ |
SPECIAL, /* 0x6a */ |
SPECIAL, /* 0x6b */ |
SPECIAL, /* 0x6c */ |
SPECIAL, /* 0x6d */ |
SPECIAL, /* 0x6e */ |
SPECIAL, /* 0x6f */ |
SPECIAL, /* 0x70 */ |
SPECIAL, /* 0x71 */ |
SPECIAL, /* 0x72 */ |
SPECIAL, /* 0x73 */ |
SPECIAL, /* 0x74 */ |
SPECIAL, /* 0x75 */ |
SPECIAL, /* 0x76 */ |
SPECIAL, /* 0x77 */ |
SPECIAL, /* 0x78 */ |
SPECIAL, /* 0x79 */ |
SPECIAL, /* 0x7a */ |
SPECIAL, /* 0x7b */ |
SPECIAL, /* 0x7c */ |
SPECIAL, /* 0x7d */ |
SPECIAL, /* 0x7e */ |
SPECIAL, /* 0x7f */ |
}; |
/** Secondary meaning of scancodes. */ |
char sc_secondary_map[] = { |
SPECIAL, /* 0x00 */ |
SPECIAL, /* 0x01 - Esc */ |
'!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', |
SPECIAL, /* 0x0e - Backspace */ |
'\t', 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '{', '}', '\n', |
SPECIAL, /* 0x1d - LCtrl */ |
'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', '"', |
'~', |
SPECIAL, /* 0x2a - LShift */ |
'|', |
'Z', 'X', 'C', 'V', 'B', 'N', 'M', '<', '>', '?', |
SPECIAL, /* 0x36 - RShift */ |
'*', |
SPECIAL, /* 0x38 - LAlt */ |
' ', |
SPECIAL, /* 0x3a - CapsLock */ |
SPECIAL, /* 0x3b - F1 */ |
SPECIAL, /* 0x3c - F2 */ |
SPECIAL, /* 0x3d - F3 */ |
SPECIAL, /* 0x3e - F4 */ |
SPECIAL, /* 0x3f - F5 */ |
SPECIAL, /* 0x40 - F6 */ |
SPECIAL, /* 0x41 - F7 */ |
SPECIAL, /* 0x42 - F8 */ |
SPECIAL, /* 0x43 - F9 */ |
SPECIAL, /* 0x44 - F10 */ |
SPECIAL, /* 0x45 - NumLock */ |
SPECIAL, /* 0x46 - ScrollLock */ |
'7', '8', '9', '-', |
'4', '5', '6', '+', |
'1', '2', '3', |
'0', '.', |
SPECIAL, /* 0x54 - Alt-SysRq */ |
SPECIAL, /* 0x55 - F11/F12/PF1/FN */ |
SPECIAL, /* 0x56 - unlabelled key next to LAlt */ |
SPECIAL, /* 0x57 - F11 */ |
SPECIAL, /* 0x58 - F12 */ |
SPECIAL, /* 0x59 */ |
SPECIAL, /* 0x5a */ |
SPECIAL, /* 0x5b */ |
SPECIAL, /* 0x5c */ |
SPECIAL, /* 0x5d */ |
SPECIAL, /* 0x5e */ |
SPECIAL, /* 0x5f */ |
SPECIAL, /* 0x60 */ |
SPECIAL, /* 0x61 */ |
SPECIAL, /* 0x62 */ |
SPECIAL, /* 0x63 */ |
SPECIAL, /* 0x64 */ |
SPECIAL, /* 0x65 */ |
SPECIAL, /* 0x66 */ |
SPECIAL, /* 0x67 */ |
SPECIAL, /* 0x68 */ |
SPECIAL, /* 0x69 */ |
SPECIAL, /* 0x6a */ |
SPECIAL, /* 0x6b */ |
SPECIAL, /* 0x6c */ |
SPECIAL, /* 0x6d */ |
SPECIAL, /* 0x6e */ |
SPECIAL, /* 0x6f */ |
SPECIAL, /* 0x70 */ |
SPECIAL, /* 0x71 */ |
SPECIAL, /* 0x72 */ |
SPECIAL, /* 0x73 */ |
SPECIAL, /* 0x74 */ |
SPECIAL, /* 0x75 */ |
SPECIAL, /* 0x76 */ |
SPECIAL, /* 0x77 */ |
SPECIAL, /* 0x78 */ |
SPECIAL, /* 0x79 */ |
SPECIAL, /* 0x7a */ |
SPECIAL, /* 0x7b */ |
SPECIAL, /* 0x7c */ |
SPECIAL, /* 0x7d */ |
SPECIAL, /* 0x7e */ |
SPECIAL, /* 0x7f */ |
}; |
/** @} |
*/ |
/tags/0.3.0/kernel/genarch/src/kbd/scanc_sun.c |
---|
0,0 → 1,304 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genarch |
* @{ |
*/ |
/** |
* @file |
* @brief Scan codes for Sun keyboards. |
*/ |
#include <genarch/kbd/scanc.h> |
/** Primary meaning of scancodes. */ |
char sc_primary_map[] = { |
[0x00] = SPECIAL, |
[0x01] = SPECIAL, |
[0x02] = SPECIAL, |
[0x03] = SPECIAL, |
[0x04] = SPECIAL, |
[0x05] = SPECIAL, /* F1 */ |
[0x06] = SPECIAL, /* F2 */ |
[0x07] = SPECIAL, /* F10 */ |
[0x08] = SPECIAL, /* F3 */ |
[0x09] = SPECIAL, /* F11 */ |
[0x0a] = SPECIAL, /* F4 */ |
[0x0b] = SPECIAL, /* F12 */ |
[0x0c] = SPECIAL, /* F5 */ |
[0x0d] = SPECIAL, /* RAlt */ |
[0x0e] = SPECIAL, /* F6 */ |
[0x0f] = SPECIAL, |
[0x10] = SPECIAL, /* F7 */ |
[0x11] = SPECIAL, /* F8 */ |
[0x12] = SPECIAL, /* F9 */ |
[0x13] = SPECIAL, /* LAlt */ |
[0x14] = SPECIAL, /* Up Arrow */ |
[0x15] = SPECIAL, /* Pause */ |
[0x16] = SPECIAL, |
[0x17] = SPECIAL, /* Scroll Lock */ |
[0x18] = SPECIAL, /* Left Arrow */ |
[0x19] = SPECIAL, |
[0x1a] = SPECIAL, |
[0x1b] = SPECIAL, /* Down Arrow */ |
[0x1c] = SPECIAL, /* Right Arrow */ |
[0x1d] = SPECIAL, /* Esc */ |
[0x1e] = '1', |
[0x1f] = '2', |
[0x20] = '3', |
[0x21] = '4', |
[0x22] = '5', |
[0x23] = '6', |
[0x24] = '7', |
[0x25] = '8', |
[0x26] = '9', |
[0x27] = '0', |
[0x28] = '-', |
[0x29] = '=', |
[0x2a] = '`', |
[0x2b] = '\b', /* Backspace */ |
[0x2c] = SPECIAL, /* Insert */ |
[0x2d] = SPECIAL, |
[0x2e] = '/', /* numeric keypad */ |
[0x2f] = '*', /* numeric keypad */ |
[0x30] = SPECIAL, |
[0x31] = SPECIAL, |
[0x32] = '.', /* numeric keypad */ |
[0x33] = SPECIAL, |
[0x34] = SPECIAL, /* Home */ |
[0x35] = '\t', /* Tab */ |
[0x36] = 'q', |
[0x37] = 'w', |
[0x38] = 'e', |
[0x39] = 'r', |
[0x3a] = 't', |
[0x3b] = 'y', |
[0x3c] = 'u', |
[0x3d] = 'i', |
[0x3e] = 'o', |
[0x3f] = 'p', |
[0x40] = '[', |
[0x41] = ']', |
[0x42] = SPECIAL, /* Del */ |
[0x43] = SPECIAL, |
[0x44] = '7', /* numeric keypad */ |
[0x45] = '8', /* numeric keypad */ |
[0x46] = '9', /* numeric keypad */ |
[0x47] = '-', /* numeric keypad */ |
[0x48] = SPECIAL, |
[0x49] = SPECIAL, |
[0x4a] = SPECIAL, /* End */ |
[0x4b] = SPECIAL, |
[0x4c] = SPECIAL, /* Control */ |
[0x4d] = 'a', |
[0x4e] = 's', |
[0x4f] = 'd', |
[0x50] = 'f', |
[0x51] = 'g', |
[0x52] = 'h', |
[0x53] = 'j', |
[0x54] = 'k', |
[0x55] = 'l', |
[0x56] = ';', |
[0x57] = '\'', |
[0x58] = '\\', |
[0x59] = '\n', /* Enter */ |
[0x5a] = '\n', /* Enter on numeric keypad */ |
[0x5b] = '4', /* numeric keypad */ |
[0x5c] = '5', /* numeric keypad */ |
[0x5d] = '6', /* numeric keypad */ |
[0x5e] = '0', /* numeric keypad */ |
[0x5f] = SPECIAL, |
[0x60] = SPECIAL, /* Page Up */ |
[0x61] = SPECIAL, |
[0x62] = SPECIAL, /* Num Lock */ |
[0x63] = SPECIAL, /* LShift */ |
[0x64] = 'z', |
[0x65] = 'x', |
[0x66] = 'c', |
[0x67] = 'v', |
[0x68] = 'b', |
[0x69] = 'n', |
[0x6a] = 'm', |
[0x6b] = ',', |
[0x6c] = '.', |
[0x6d] = '/', |
[0x6e] = SPECIAL, /* RShift */ |
[0x6f] = SPECIAL, |
[0x70] = '1', /* numeric keypad */ |
[0x71] = '2', /* numeric keypad */ |
[0x72] = '3', /* numeric keypad */ |
[0x73] = SPECIAL, |
[0x74] = SPECIAL, |
[0x75] = SPECIAL, |
[0x76] = SPECIAL, |
[0x77] = SPECIAL, /* Caps Lock */ |
[0x78] = SPECIAL, |
[0x79] = ' ', |
[0x7a] = SPECIAL, |
[0x7b] = SPECIAL, /* Page Down */ |
[0x7c] = SPECIAL, |
[0x7d] = '+', /* numeric key pad */ |
[0x7e] = SPECIAL, |
[0x7f] = SPECIAL |
}; |
/** Secondary meaning of scancodes. */ |
char sc_secondary_map[] = { |
[0x00] = SPECIAL, |
[0x01] = SPECIAL, |
[0x02] = SPECIAL, |
[0x03] = SPECIAL, |
[0x04] = SPECIAL, |
[0x05] = SPECIAL, /* F1 */ |
[0x06] = SPECIAL, /* F2 */ |
[0x07] = SPECIAL, /* F10 */ |
[0x08] = SPECIAL, /* F3 */ |
[0x09] = SPECIAL, /* F11 */ |
[0x0a] = SPECIAL, /* F4 */ |
[0x0b] = SPECIAL, /* F12 */ |
[0x0c] = SPECIAL, /* F5 */ |
[0x0d] = SPECIAL, /* RAlt */ |
[0x0e] = SPECIAL, /* F6 */ |
[0x0f] = SPECIAL, |
[0x10] = SPECIAL, /* F7 */ |
[0x11] = SPECIAL, /* F8 */ |
[0x12] = SPECIAL, /* F9 */ |
[0x13] = SPECIAL, /* LAlt */ |
[0x14] = SPECIAL, /* Up Arrow */ |
[0x15] = SPECIAL, /* Pause */ |
[0x16] = SPECIAL, |
[0x17] = SPECIAL, /* Scroll Lock */ |
[0x18] = SPECIAL, /* Left Arrow */ |
[0x19] = SPECIAL, |
[0x1a] = SPECIAL, |
[0x1b] = SPECIAL, /* Down Arrow */ |
[0x1c] = SPECIAL, /* Right Arrow */ |
[0x1d] = SPECIAL, /* Esc */ |
[0x1e] = '!', |
[0x1f] = '@', |
[0x20] = '#', |
[0x21] = '$', |
[0x22] = '%', |
[0x23] = '^', |
[0x24] = '&', |
[0x25] = '*', |
[0x26] = '(', |
[0x27] = ')', |
[0x28] = '_', |
[0x29] = '+', |
[0x2a] = '~', |
[0x2b] = SPECIAL, /* Backspace */ |
[0x2c] = SPECIAL, /* Insert */ |
[0x2d] = SPECIAL, |
[0x2e] = '/', /* numeric keypad */ |
[0x2f] = '*', /* numeric keypad */ |
[0x30] = SPECIAL, |
[0x31] = SPECIAL, |
[0x32] = '.', /* numeric keypad */ |
[0x33] = SPECIAL, |
[0x34] = SPECIAL, /* Home */ |
[0x35] = SPECIAL, /* Tab */ |
[0x36] = 'Q', |
[0x37] = 'W', |
[0x38] = 'E', |
[0x39] = 'R', |
[0x3a] = 'T', |
[0x3b] = 'Y', |
[0x3c] = 'U', |
[0x3d] = 'I', |
[0x3e] = 'O', |
[0x3f] = 'P', |
[0x40] = '{', |
[0x41] = '}', |
[0x42] = SPECIAL, /* Del */ |
[0x43] = SPECIAL, |
[0x44] = '7', /* numeric keypad */ |
[0x45] = '8', /* numeric keypad */ |
[0x46] = '9', /* numeric keypad */ |
[0x47] = '-', /* numeric keypad */ |
[0x48] = SPECIAL, |
[0x49] = SPECIAL, |
[0x4a] = SPECIAL, /* End */ |
[0x4b] = SPECIAL, |
[0x4c] = SPECIAL, /* Control */ |
[0x4d] = 'A', |
[0x4e] = 'S', |
[0x4f] = 'D', |
[0x50] = 'F', |
[0x51] = 'G', |
[0x52] = 'H', |
[0x53] = 'J', |
[0x54] = 'K', |
[0x55] = 'L', |
[0x56] = ':', |
[0x57] = '"', |
[0x58] = '|', |
[0x59] = SPECIAL, /* Enter */ |
[0x5a] = SPECIAL, /* Enter on numeric keypad */ |
[0x5b] = '4', /* numeric keypad */ |
[0x5c] = '5', /* numeric keypad */ |
[0x5d] = '6', /* numeric keypad */ |
[0x5e] = '0', /* numeric keypad */ |
[0x5f] = SPECIAL, |
[0x60] = SPECIAL, /* Page Up */ |
[0x61] = SPECIAL, |
[0x62] = SPECIAL, /* Num Lock */ |
[0x63] = SPECIAL, /* LShift */ |
[0x64] = 'Z', |
[0x65] = 'X', |
[0x66] = 'C', |
[0x67] = 'V', |
[0x68] = 'B', |
[0x69] = 'N', |
[0x6a] = 'M', |
[0x6b] = '<', |
[0x6c] = '>', |
[0x6d] = '?', |
[0x6e] = SPECIAL, /* RShift */ |
[0x6f] = SPECIAL, |
[0x70] = '1', /* numeric keypad */ |
[0x71] = '2', /* numeric keypad */ |
[0x72] = '3', /* numeric keypad */ |
[0x73] = SPECIAL, |
[0x74] = SPECIAL, |
[0x75] = SPECIAL, |
[0x76] = SPECIAL, |
[0x77] = SPECIAL, /* Caps Lock */ |
[0x78] = SPECIAL, |
[0x79] = ' ', |
[0x7a] = SPECIAL, |
[0x7b] = SPECIAL, /* Page Down */ |
[0x7c] = SPECIAL, |
[0x7d] = '+', /* numeric key pad */ |
[0x7e] = SPECIAL, |
[0x7f] = SPECIAL |
}; |
/** @} |
*/ |
/tags/0.3.0/kernel/genarch/src/softint/division.c |
---|
0,0 → 1,200 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genarch |
* @{ |
*/ |
/** @file |
*/ |
#include <genarch/softint/division.h> |
#define ABSVAL(x) ((x) > 0 ? (x) : -(x)) |
#define SGN(x) ((x) >= 0 ? 1 : 0) |
static unsigned int divandmod32(unsigned int a, unsigned int b, |
unsigned int *remainder) |
{ |
unsigned int result; |
int steps = sizeof(unsigned int) * 8; |
*remainder = 0; |
result = 0; |
if (b == 0) { |
/* FIXME: division by zero */ |
return 0; |
} |
if (a < b) { |
*remainder = a; |
return 0; |
} |
for (; steps > 0; steps--) { |
/* shift one bit to remainder */ |
*remainder = ((*remainder) << 1) | (( a >> 31) & 0x1); |
result <<= 1; |
if (*remainder >= b) { |
*remainder -= b; |
result |= 0x1; |
} |
a <<= 1; |
} |
return result; |
} |
static unsigned long long divandmod64(unsigned long long a, |
unsigned long long b, unsigned long long *remainder) |
{ |
unsigned long long result; |
int steps = sizeof(unsigned long long) * 8; |
*remainder = 0; |
result = 0; |
if (b == 0) { |
/* FIXME: division by zero */ |
return 0; |
} |
if (a < b) { |
*remainder = a; |
return 0; |
} |
for (; steps > 0; steps--) { |
/* shift one bit to remainder */ |
*remainder = ((*remainder) << 1) | ((a >> 63) & 0x1); |
result <<= 1; |
if (*remainder >= b) { |
*remainder -= b; |
result |= 0x1; |
} |
a <<= 1; |
} |
return result; |
} |
/* 32bit integer division */ |
int __divsi3(int a, int b) |
{ |
unsigned int rem; |
int result; |
result = (int) divandmod32(ABSVAL(a), ABSVAL(b), &rem); |
if (SGN(a) == SGN(b)) |
return result; |
return -result; |
} |
/* 64bit integer division */ |
long long __divdi3(long long a, long long b) |
{ |
unsigned long long rem; |
long long result; |
result = (long long) divandmod64(ABSVAL(a), ABSVAL(b), &rem); |
if (SGN(a) == SGN(b)) |
return result; |
return -result; |
} |
/* 32bit unsigned integer division */ |
unsigned int __udivsi3(unsigned int a, unsigned int b) |
{ |
unsigned int rem; |
return divandmod32(a, b, &rem); |
} |
/* 64bit unsigned integer division */ |
unsigned long long __udivdi3(unsigned long long a, unsigned long long b) |
{ |
unsigned long long rem; |
return divandmod64(a, b, &rem); |
} |
/* 32bit remainder of the signed division */ |
int __modsi3(int a, int b) |
{ |
unsigned int rem; |
divandmod32(a, b, &rem); |
/* if divident is negative, remainder must be too */ |
if (!(SGN(a))) { |
return -((int) rem); |
} |
return (int) rem; |
} |
/* 64bit remainder of the signed division */ |
long long __moddi3(long long a,long long b) |
{ |
unsigned long long rem; |
divandmod64(a, b, &rem); |
/* if divident is negative, remainder must be too */ |
if (!(SGN(a))) { |
return -((long long) rem); |
} |
return (long long) rem; |
} |
/* 32bit remainder of the unsigned division */ |
unsigned int __umodsi3(unsigned int a, unsigned int b) |
{ |
unsigned int rem; |
divandmod32(a, b, &rem); |
return rem; |
} |
/* 64bit remainder of the unsigned division */ |
unsigned long long __umoddi3(unsigned long long a, unsigned long long b) |
{ |
unsigned long long rem; |
divandmod64(a, b, &rem); |
return rem; |
} |
unsigned long long __udivmoddi3(unsigned long long a, unsigned long long b, |
unsigned long long *c) |
{ |
return divandmod64(a, b, c); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/genarch/src/mm/page_pt.c |
---|
0,0 → 1,268 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genarchmm |
* @{ |
*/ |
/** |
* @file |
* @brief Virtual Address Translation for hierarchical 4-level page tables. |
*/ |
#include <genarch/mm/page_pt.h> |
#include <mm/page.h> |
#include <mm/frame.h> |
#include <mm/as.h> |
#include <arch/mm/page.h> |
#include <arch/mm/as.h> |
#include <arch/types.h> |
#include <arch/asm.h> |
#include <memstr.h> |
static void pt_mapping_insert(as_t *as, uintptr_t page, uintptr_t frame, int flags); |
static void pt_mapping_remove(as_t *as, uintptr_t page); |
static pte_t *pt_mapping_find(as_t *as, uintptr_t page); |
page_mapping_operations_t pt_mapping_operations = { |
.mapping_insert = pt_mapping_insert, |
.mapping_remove = pt_mapping_remove, |
.mapping_find = pt_mapping_find |
}; |
/** Map page to frame using hierarchical page tables. |
* |
* Map virtual address page to physical address frame |
* using flags. |
* |
* The page table must be locked and interrupts must be disabled. |
* |
* @param as Address space to wich page belongs. |
* @param page Virtual address of the page to be mapped. |
* @param frame Physical address of memory frame to which the mapping is done. |
* @param flags Flags to be used for mapping. |
*/ |
void pt_mapping_insert(as_t *as, uintptr_t page, uintptr_t frame, int flags) |
{ |
pte_t *ptl0, *ptl1, *ptl2, *ptl3; |
pte_t *newpt; |
ptl0 = (pte_t *) PA2KA((uintptr_t) as->genarch.page_table); |
if (GET_PTL1_FLAGS(ptl0, PTL0_INDEX(page)) & PAGE_NOT_PRESENT) { |
newpt = (pte_t *)frame_alloc(PTL1_SIZE, FRAME_KA); |
memsetb((uintptr_t)newpt, FRAME_SIZE << PTL1_SIZE, 0); |
SET_PTL1_ADDRESS(ptl0, PTL0_INDEX(page), KA2PA(newpt)); |
SET_PTL1_FLAGS(ptl0, PTL0_INDEX(page), PAGE_PRESENT | PAGE_USER | PAGE_EXEC | PAGE_CACHEABLE | PAGE_WRITE); |
} |
ptl1 = (pte_t *) PA2KA(GET_PTL1_ADDRESS(ptl0, PTL0_INDEX(page))); |
if (GET_PTL2_FLAGS(ptl1, PTL1_INDEX(page)) & PAGE_NOT_PRESENT) { |
newpt = (pte_t *)frame_alloc(PTL2_SIZE, FRAME_KA); |
memsetb((uintptr_t)newpt, FRAME_SIZE << PTL2_SIZE, 0); |
SET_PTL2_ADDRESS(ptl1, PTL1_INDEX(page), KA2PA(newpt)); |
SET_PTL2_FLAGS(ptl1, PTL1_INDEX(page), PAGE_PRESENT | PAGE_USER | PAGE_EXEC | PAGE_CACHEABLE | PAGE_WRITE); |
} |
ptl2 = (pte_t *) PA2KA(GET_PTL2_ADDRESS(ptl1, PTL1_INDEX(page))); |
if (GET_PTL3_FLAGS(ptl2, PTL2_INDEX(page)) & PAGE_NOT_PRESENT) { |
newpt = (pte_t *)frame_alloc(PTL3_SIZE, FRAME_KA); |
memsetb((uintptr_t)newpt, FRAME_SIZE << PTL3_SIZE, 0); |
SET_PTL3_ADDRESS(ptl2, PTL2_INDEX(page), KA2PA(newpt)); |
SET_PTL3_FLAGS(ptl2, PTL2_INDEX(page), PAGE_PRESENT | PAGE_USER | PAGE_EXEC | PAGE_CACHEABLE | PAGE_WRITE); |
} |
ptl3 = (pte_t *) PA2KA(GET_PTL3_ADDRESS(ptl2, PTL2_INDEX(page))); |
SET_FRAME_ADDRESS(ptl3, PTL3_INDEX(page), frame); |
SET_FRAME_FLAGS(ptl3, PTL3_INDEX(page), flags); |
} |
/** Remove mapping of page from hierarchical page tables. |
* |
* Remove any mapping of page within address space as. |
* TLB shootdown should follow in order to make effects of |
* this call visible. |
* |
* Empty page tables except PTL0 are freed. |
* |
* The page table must be locked and interrupts must be disabled. |
* |
* @param as Address space to wich page belongs. |
* @param page Virtual address of the page to be demapped. |
*/ |
void pt_mapping_remove(as_t *as, uintptr_t page) |
{ |
pte_t *ptl0, *ptl1, *ptl2, *ptl3; |
bool empty = true; |
int i; |
/* |
* First, remove the mapping, if it exists. |
*/ |
ptl0 = (pte_t *) PA2KA((uintptr_t) as->genarch.page_table); |
if (GET_PTL1_FLAGS(ptl0, PTL0_INDEX(page)) & PAGE_NOT_PRESENT) |
return; |
ptl1 = (pte_t *) PA2KA(GET_PTL1_ADDRESS(ptl0, PTL0_INDEX(page))); |
if (GET_PTL2_FLAGS(ptl1, PTL1_INDEX(page)) & PAGE_NOT_PRESENT) |
return; |
ptl2 = (pte_t *) PA2KA(GET_PTL2_ADDRESS(ptl1, PTL1_INDEX(page))); |
if (GET_PTL3_FLAGS(ptl2, PTL2_INDEX(page)) & PAGE_NOT_PRESENT) |
return; |
ptl3 = (pte_t *) PA2KA(GET_PTL3_ADDRESS(ptl2, PTL2_INDEX(page))); |
/* Destroy the mapping. Setting to PAGE_NOT_PRESENT is not sufficient. */ |
memsetb((uintptr_t) &ptl3[PTL3_INDEX(page)], sizeof(pte_t), 0); |
/* |
* Second, free all empty tables along the way from PTL3 down to PTL0. |
*/ |
/* check PTL3 */ |
for (i = 0; i < PTL3_ENTRIES; i++) { |
if (PTE_VALID(&ptl3[i])) { |
empty = false; |
break; |
} |
} |
if (empty) { |
/* |
* PTL3 is empty. |
* Release the frame and remove PTL3 pointer from preceding table. |
*/ |
frame_free(KA2PA((uintptr_t) ptl3)); |
if (PTL2_ENTRIES) |
memsetb((uintptr_t) &ptl2[PTL2_INDEX(page)], sizeof(pte_t), 0); |
else if (PTL1_ENTRIES) |
memsetb((uintptr_t) &ptl1[PTL1_INDEX(page)], sizeof(pte_t), 0); |
else |
memsetb((uintptr_t) &ptl0[PTL0_INDEX(page)], sizeof(pte_t), 0); |
} else { |
/* |
* PTL3 is not empty. |
* Therefore, there must be a path from PTL0 to PTL3 and |
* thus nothing to free in higher levels. |
*/ |
return; |
} |
/* check PTL2, empty is still true */ |
if (PTL2_ENTRIES) { |
for (i = 0; i < PTL2_ENTRIES; i++) { |
if (PTE_VALID(&ptl2[i])) { |
empty = false; |
break; |
} |
} |
if (empty) { |
/* |
* PTL2 is empty. |
* Release the frame and remove PTL2 pointer from preceding table. |
*/ |
frame_free(KA2PA((uintptr_t) ptl2)); |
if (PTL1_ENTRIES) |
memsetb((uintptr_t) &ptl1[PTL1_INDEX(page)], sizeof(pte_t), 0); |
else |
memsetb((uintptr_t) &ptl0[PTL0_INDEX(page)], sizeof(pte_t), 0); |
} |
else { |
/* |
* PTL2 is not empty. |
* Therefore, there must be a path from PTL0 to PTL2 and |
* thus nothing to free in higher levels. |
*/ |
return; |
} |
} |
/* check PTL1, empty is still true */ |
if (PTL1_ENTRIES) { |
for (i = 0; i < PTL1_ENTRIES; i++) { |
if (PTE_VALID(&ptl1[i])) { |
empty = false; |
break; |
} |
} |
if (empty) { |
/* |
* PTL1 is empty. |
* Release the frame and remove PTL1 pointer from preceding table. |
*/ |
frame_free(KA2PA((uintptr_t) ptl1)); |
memsetb((uintptr_t) &ptl0[PTL0_INDEX(page)], sizeof(pte_t), 0); |
} |
} |
} |
/** Find mapping for virtual page in hierarchical page tables. |
* |
* Find mapping for virtual page. |
* |
* The page table must be locked and interrupts must be disabled. |
* |
* @param as Address space to which page belongs. |
* @param page Virtual page. |
* |
* @return NULL if there is no such mapping; entry from PTL3 describing the mapping otherwise. |
*/ |
pte_t *pt_mapping_find(as_t *as, uintptr_t page) |
{ |
pte_t *ptl0, *ptl1, *ptl2, *ptl3; |
ptl0 = (pte_t *) PA2KA((uintptr_t) as->genarch.page_table); |
if (GET_PTL1_FLAGS(ptl0, PTL0_INDEX(page)) & PAGE_NOT_PRESENT) |
return NULL; |
ptl1 = (pte_t *) PA2KA(GET_PTL1_ADDRESS(ptl0, PTL0_INDEX(page))); |
if (GET_PTL2_FLAGS(ptl1, PTL1_INDEX(page)) & PAGE_NOT_PRESENT) |
return NULL; |
ptl2 = (pte_t *) PA2KA(GET_PTL2_ADDRESS(ptl1, PTL1_INDEX(page))); |
if (GET_PTL3_FLAGS(ptl2, PTL2_INDEX(page)) & PAGE_NOT_PRESENT) |
return NULL; |
ptl3 = (pte_t *) PA2KA(GET_PTL3_ADDRESS(ptl2, PTL2_INDEX(page))); |
return &ptl3[PTL3_INDEX(page)]; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/genarch/src/mm/as_pt.c |
---|
0,0 → 1,170 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genarchmm |
* @{ |
*/ |
/** |
* @file |
* @brief Address space functions for 4-level hierarchical pagetables. |
*/ |
#include <genarch/mm/page_pt.h> |
#include <mm/page.h> |
#include <mm/frame.h> |
#include <mm/as.h> |
#include <synch/mutex.h> |
#include <arch/mm/page.h> |
#include <arch/mm/as.h> |
#include <arch/types.h> |
#include <memstr.h> |
#include <arch.h> |
static pte_t *ptl0_create(int flags); |
static void ptl0_destroy(pte_t *page_table); |
static void pt_lock(as_t *as, bool lock); |
static void pt_unlock(as_t *as, bool unlock); |
#ifdef __OBJC__ |
@implementation as_t |
+ (pte_t *) page_table_create: (int) flags |
{ |
return ptl0_create(flags); |
} |
+ (void) page_table_destroy: (pte_t *) page_table |
{ |
ptl0_destroy(page_table); |
} |
- (void) page_table_lock: (bool) _lock |
{ |
pt_lock(self, _lock); |
} |
- (void) page_table_unlock: (bool) unlock |
{ |
pt_unlock(self, unlock); |
} |
@end |
#else |
as_operations_t as_pt_operations = { |
.page_table_create = ptl0_create, |
.page_table_destroy = ptl0_destroy, |
.page_table_lock = pt_lock, |
.page_table_unlock = pt_unlock |
}; |
#endif |
/** Create PTL0. |
* |
* PTL0 of 4-level page table will be created for each address space. |
* |
* @param flags Flags can specify whether ptl0 is for the kernel address space. |
* |
* @return New PTL0. |
*/ |
pte_t *ptl0_create(int flags) |
{ |
pte_t *src_ptl0, *dst_ptl0; |
ipl_t ipl; |
int table_size; |
dst_ptl0 = (pte_t *) frame_alloc(PTL0_SIZE, FRAME_KA); |
table_size = FRAME_SIZE << PTL0_SIZE; |
if (flags & FLAG_AS_KERNEL) { |
memsetb((uintptr_t) dst_ptl0, table_size, 0); |
} else { |
uintptr_t src, dst; |
/* |
* Copy the kernel address space portion to new PTL0. |
*/ |
ipl = interrupts_disable(); |
mutex_lock(&AS_KERNEL->lock); |
src_ptl0 = (pte_t *) PA2KA((uintptr_t) AS_KERNEL->genarch.page_table); |
src = (uintptr_t) &src_ptl0[PTL0_INDEX(KERNEL_ADDRESS_SPACE_START)]; |
dst = (uintptr_t) &dst_ptl0[PTL0_INDEX(KERNEL_ADDRESS_SPACE_START)]; |
memsetb((uintptr_t) dst_ptl0, table_size, 0); |
memcpy((void *) dst, (void *) src, table_size - (src - (uintptr_t) src_ptl0)); |
mutex_unlock(&AS_KERNEL->lock); |
interrupts_restore(ipl); |
} |
return (pte_t *) KA2PA((uintptr_t) dst_ptl0); |
} |
/** Destroy page table. |
* |
* Destroy PTL0, other levels are expected to be already deallocated. |
* |
* @param page_table Physical address of PTL0. |
*/ |
void ptl0_destroy(pte_t *page_table) |
{ |
frame_free((uintptr_t)page_table); |
} |
/** Lock page tables. |
* |
* Lock only the address space. |
* Interrupts must be disabled. |
* |
* @param as Address space. |
* @param lock If false, do not attempt to lock the address space. |
*/ |
void pt_lock(as_t *as, bool lock) |
{ |
if (lock) |
mutex_lock(&as->lock); |
} |
/** Unlock page tables. |
* |
* Unlock the address space. |
* Interrupts must be disabled. |
* |
* @param as Address space. |
* @param unlock If false, do not attempt to unlock the address space. |
*/ |
void pt_unlock(as_t *as, bool unlock) |
{ |
if (unlock) |
mutex_unlock(&as->lock); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/genarch/src/mm/asid.c |
---|
0,0 → 1,166 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genarchmm |
* @{ |
*/ |
/** |
* @file |
* @brief ASID management. |
* |
* Modern processor architectures optimize TLB utilization |
* by using ASIDs (a.k.a. memory contexts on sparc64 and |
* region identifiers on ia64). These ASIDs help to associate |
* each TLB item with an address space, thus making |
* finer-grained TLB invalidation possible. |
* |
* Unfortunatelly, there are usually less ASIDs available than |
* there can be unique as_t structures (i.e. address spaces |
* recognized by the kernel). |
* |
* When system runs short of ASIDs, it will attempt to steal |
* ASID from an address space that has not been active for |
* a while. |
* |
* This code depends on the fact that ASIDS_ALLOCABLE |
* is greater than number of supported CPUs (i.e. the |
* amount of concurently active address spaces). |
* |
* Architectures that don't have hardware support for address |
* spaces do not compile with this file. |
*/ |
#include <mm/asid.h> |
#include <mm/as.h> |
#include <mm/tlb.h> |
#include <arch/mm/asid.h> |
#include <synch/spinlock.h> |
#include <synch/mutex.h> |
#include <adt/list.h> |
#include <debug.h> |
static count_t asids_allocated = 0; |
/** Allocate free address space identifier. |
* |
* Interrupts must be disabled and inactive_as_with_asid_lock must be held |
* prior to this call |
* |
* @return New ASID. |
*/ |
asid_t asid_get(void) |
{ |
asid_t asid; |
link_t *tmp; |
as_t *as; |
/* |
* Check if there is an unallocated ASID. |
*/ |
if (asids_allocated == ASIDS_ALLOCABLE) { |
/* |
* All ASIDs are already allocated. |
* Resort to stealing. |
*/ |
/* |
* Remove the first item on the list. |
* It is guaranteed to belong to an |
* inactive address space. |
*/ |
ASSERT(!list_empty(&inactive_as_with_asid_head)); |
tmp = inactive_as_with_asid_head.next; |
list_remove(tmp); |
as = list_get_instance(tmp, as_t, inactive_as_with_asid_link); |
/* |
* Steal the ASID. |
* Note that the stolen ASID is not active. |
*/ |
asid = as->asid; |
ASSERT(asid != ASID_INVALID); |
/* |
* Notify the address space from wich the ASID |
* was stolen by invalidating its asid member. |
*/ |
as->asid = ASID_INVALID; |
/* |
* If the architecture uses some software cache |
* of TLB entries (e.g. TSB on sparc64), the |
* cache must be invalidated as well. |
*/ |
as_invalidate_translation_cache(as, 0, (count_t) -1); |
/* |
* Get the system rid of the stolen ASID. |
*/ |
tlb_shootdown_start(TLB_INVL_ASID, asid, 0, 0); |
tlb_invalidate_asid(asid); |
tlb_shootdown_finalize(); |
} else { |
/* |
* There is at least one unallocated ASID. |
* Find it and assign it. |
*/ |
asid = asid_find_free(); |
asids_allocated++; |
/* |
* Purge the allocated ASID from TLBs. |
*/ |
tlb_shootdown_start(TLB_INVL_ASID, asid, 0, 0); |
tlb_invalidate_asid(asid); |
tlb_shootdown_finalize(); |
} |
return asid; |
} |
/** Release address space identifier. |
* |
* This code relies on architecture |
* dependent functionality. |
* |
* @param asid ASID to be released. |
*/ |
void asid_put(asid_t asid) |
{ |
asids_allocated--; |
asid_put_arch(asid); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/genarch/src/mm/page_ht.c |
---|
0,0 → 1,258 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genarchmm |
* @{ |
*/ |
/** |
* @file |
* @brief Virtual Address Translation (VAT) for global page hash table. |
*/ |
#include <genarch/mm/page_ht.h> |
#include <mm/page.h> |
#include <arch/mm/page.h> |
#include <mm/frame.h> |
#include <mm/slab.h> |
#include <mm/as.h> |
#include <arch/mm/asid.h> |
#include <arch/types.h> |
#include <arch/asm.h> |
#include <synch/spinlock.h> |
#include <arch.h> |
#include <debug.h> |
#include <memstr.h> |
#include <adt/hash_table.h> |
#include <align.h> |
static index_t hash(unative_t key[]); |
static bool compare(unative_t key[], count_t keys, link_t *item); |
static void remove_callback(link_t *item); |
static void ht_mapping_insert(as_t *as, uintptr_t page, uintptr_t frame, |
int flags); |
static void ht_mapping_remove(as_t *as, uintptr_t page); |
static pte_t *ht_mapping_find(as_t *as, uintptr_t page); |
/** |
* This lock protects the page hash table. It must be acquired |
* after address space lock and after any address space area |
* locks. |
*/ |
mutex_t page_ht_lock; |
/** |
* Page hash table. |
* The page hash table may be accessed only when page_ht_lock is held. |
*/ |
hash_table_t page_ht; |
/** Hash table operations for page hash table. */ |
hash_table_operations_t ht_operations = { |
.hash = hash, |
.compare = compare, |
.remove_callback = remove_callback |
}; |
/** Page mapping operations for page hash table architectures. */ |
page_mapping_operations_t ht_mapping_operations = { |
.mapping_insert = ht_mapping_insert, |
.mapping_remove = ht_mapping_remove, |
.mapping_find = ht_mapping_find |
}; |
/** Compute page hash table index. |
* |
* @param key Array of two keys (i.e. page and address space). |
* |
* @return Index into page hash table. |
*/ |
index_t hash(unative_t key[]) |
{ |
as_t *as = (as_t *) key[KEY_AS]; |
uintptr_t page = (uintptr_t) key[KEY_PAGE]; |
index_t index; |
/* |
* Virtual page addresses have roughly the same probability |
* of occurring. Least significant bits of VPN compose the |
* hash index. |
*/ |
index = ((page >> PAGE_WIDTH) & (PAGE_HT_ENTRIES - 1)); |
/* |
* Address space structures are likely to be allocated from |
* similar addresses. Least significant bits compose the |
* hash index. |
*/ |
index |= ((unative_t) as) & (PAGE_HT_ENTRIES - 1); |
return index; |
} |
/** Compare page hash table item with page and/or address space. |
* |
* @param key Array of one or two keys (i.e. page and/or address space). |
* @param keys Number of keys passed. |
* @param item Item to compare the keys with. |
* |
* @return true on match, false otherwise. |
*/ |
bool compare(unative_t key[], count_t keys, link_t *item) |
{ |
pte_t *t; |
ASSERT(item); |
ASSERT((keys > 0) && (keys <= PAGE_HT_KEYS)); |
/* |
* Convert item to PTE. |
*/ |
t = hash_table_get_instance(item, pte_t, link); |
if (keys == PAGE_HT_KEYS) { |
return (key[KEY_AS] == (uintptr_t) t->as) && |
(key[KEY_PAGE] == t->page); |
} else { |
return (key[KEY_AS] == (uintptr_t) t->as); |
} |
} |
/** Callback on page hash table item removal. |
* |
* @param item Page hash table item being removed. |
*/ |
void remove_callback(link_t *item) |
{ |
pte_t *t; |
ASSERT(item); |
/* |
* Convert item to PTE. |
*/ |
t = hash_table_get_instance(item, pte_t, link); |
free(t); |
} |
/** Map page to frame using page hash table. |
* |
* Map virtual address page to physical address frame |
* using flags. |
* |
* The page table must be locked and interrupts must be disabled. |
* |
* @param as Address space to which page belongs. |
* @param page Virtual address of the page to be mapped. |
* @param frame Physical address of memory frame to which the mapping is done. |
* @param flags Flags to be used for mapping. |
*/ |
void ht_mapping_insert(as_t *as, uintptr_t page, uintptr_t frame, int flags) |
{ |
pte_t *t; |
unative_t key[2] = { |
(uintptr_t) as, |
page = ALIGN_DOWN(page, PAGE_SIZE) |
}; |
if (!hash_table_find(&page_ht, key)) { |
t = (pte_t *) malloc(sizeof(pte_t), FRAME_ATOMIC); |
ASSERT(t != NULL); |
t->g = (flags & PAGE_GLOBAL) != 0; |
t->x = (flags & PAGE_EXEC) != 0; |
t->w = (flags & PAGE_WRITE) != 0; |
t->k = !(flags & PAGE_USER); |
t->c = (flags & PAGE_CACHEABLE) != 0; |
t->p = !(flags & PAGE_NOT_PRESENT); |
t->as = as; |
t->page = ALIGN_DOWN(page, PAGE_SIZE); |
t->frame = ALIGN_DOWN(frame, FRAME_SIZE); |
hash_table_insert(&page_ht, key, &t->link); |
} |
} |
/** Remove mapping of page from page hash table. |
* |
* Remove any mapping of page within address space as. |
* TLB shootdown should follow in order to make effects of |
* this call visible. |
* |
* The page table must be locked and interrupts must be disabled. |
* |
* @param as Address space to wich page belongs. |
* @param page Virtual address of the page to be demapped. |
*/ |
void ht_mapping_remove(as_t *as, uintptr_t page) |
{ |
unative_t key[2] = { |
(uintptr_t) as, |
page = ALIGN_DOWN(page, PAGE_SIZE) |
}; |
/* |
* Note that removed PTE's will be freed |
* by remove_callback(). |
*/ |
hash_table_remove(&page_ht, key, 2); |
} |
/** Find mapping for virtual page in page hash table. |
* |
* Find mapping for virtual page. |
* |
* The page table must be locked and interrupts must be disabled. |
* |
* @param as Address space to wich page belongs. |
* @param page Virtual page. |
* |
* @return NULL if there is no such mapping; requested mapping otherwise. |
*/ |
pte_t *ht_mapping_find(as_t *as, uintptr_t page) |
{ |
link_t *hlp; |
pte_t *t = NULL; |
unative_t key[2] = { |
(uintptr_t) as, |
page = ALIGN_DOWN(page, PAGE_SIZE) |
}; |
hlp = hash_table_find(&page_ht, key); |
if (hlp) |
t = hash_table_get_instance(hlp, pte_t, link); |
return t; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/genarch/src/mm/as_ht.c |
---|
0,0 → 1,122 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genarchmm |
* @{ |
*/ |
/** |
* @file |
* @brief Address space functions for global page hash table. |
*/ |
#include <arch/mm/as.h> |
#include <genarch/mm/as_ht.h> |
#include <genarch/mm/page_ht.h> |
#include <mm/as.h> |
#include <mm/frame.h> |
#include <arch/types.h> |
#include <memstr.h> |
#include <adt/hash_table.h> |
#include <synch/mutex.h> |
static pte_t *ht_create(int flags); |
static void ht_destroy(pte_t *page_table); |
static void ht_lock(as_t *as, bool lock); |
static void ht_unlock(as_t *as, bool unlock); |
as_operations_t as_ht_operations = { |
.page_table_create = ht_create, |
.page_table_destroy = ht_destroy, |
.page_table_lock = ht_lock, |
.page_table_unlock = ht_unlock, |
}; |
/** Page hash table create. |
* |
* The page hash table will be created only once |
* and will be shared by all address spaces. |
* |
* @param flags Ignored. |
* |
* @return Returns NULL. |
*/ |
pte_t *ht_create(int flags) |
{ |
if (flags & FLAG_AS_KERNEL) { |
hash_table_create(&page_ht, PAGE_HT_ENTRIES, 2, &ht_operations); |
mutex_initialize(&page_ht_lock); |
} |
return NULL; |
} |
/** Destroy page table. |
* |
* Actually do nothing as the global page hash table is used. |
* |
* @param page_table This parameter is ignored. |
*/ |
void ht_destroy(pte_t *page_table) |
{ |
/* No-op. */ |
} |
/** Lock page table. |
* |
* Lock address space and page hash table. |
* Interrupts must be disabled. |
* |
* @param as Address space. |
* @param lock If false, do not attempt to lock the address space. |
*/ |
void ht_lock(as_t *as, bool lock) |
{ |
if (lock) |
mutex_lock(&as->lock); |
mutex_lock(&page_ht_lock); |
} |
/** Unlock page table. |
* |
* Unlock address space and page hash table. |
* Interrupts must be disabled. |
* |
* @param as Address space. |
* @param unlock If false, do not attempt to lock the address space. |
*/ |
void ht_unlock(as_t *as, bool unlock) |
{ |
mutex_unlock(&page_ht_lock); |
if (unlock) |
mutex_unlock(&as->lock); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/genarch/src/mm/asid_fifo.c |
---|
0,0 → 1,97 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genarchmm |
* @{ |
*/ |
/** |
* @file |
* @brief FIFO queue ASID management. |
* |
* Architectures that link with this file keep the unallocated ASIDs |
* in FIFO queue. The queue can be statically (e.g. mips32) or |
* dynamically allocated (e.g ia64 and sparc64). |
*/ |
#include <genarch/mm/asid_fifo.h> |
#include <arch/mm/asid.h> |
#include <mm/asid.h> |
#include <adt/fifo.h> |
#define FIFO_STATIC_LIMIT 1024 |
#define FIFO_STATIC (ASIDS_ALLOCABLE<FIFO_STATIC_LIMIT) |
/** |
* FIFO queue containing unassigned ASIDs. |
* Can be only accessed when asidlock is held. |
*/ |
#if FIFO_STATIC |
FIFO_INITIALIZE_STATIC(free_asids, asid_t, ASIDS_ALLOCABLE); |
#else |
FIFO_INITIALIZE_DYNAMIC(free_asids, asid_t, ASIDS_ALLOCABLE); |
#endif |
/** Initialize data structures for O(1) ASID allocation and deallocation. */ |
void asid_fifo_init(void) |
{ |
int i; |
#if (!FIFO_STATIC) |
fifo_create(free_asids); |
#endif |
for (i = 0; i < ASIDS_ALLOCABLE; i++) { |
fifo_push(free_asids, ASID_START + i); |
} |
} |
/** Allocate free ASID. |
* |
* Allocation runs in O(1). |
* |
* @return Free ASID. |
*/ |
asid_t asid_find_free(void) |
{ |
return fifo_pop(free_asids); |
} |
/** Return ASID among free ASIDs. |
* |
* This operation runs in O(1). |
* |
* @param asid ASID being freed. |
*/ |
void asid_put_arch(asid_t asid) |
{ |
fifo_push(free_asids, asid); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/genarch/src/acpi/acpi.c |
---|
0,0 → 1,186 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genarch |
* @{ |
*/ |
/** |
* @file |
* @brief Advanced Configuration and Power Interface (ACPI) initialization. |
*/ |
#include <genarch/acpi/acpi.h> |
#include <genarch/acpi/madt.h> |
#include <arch/bios/bios.h> |
#include <mm/as.h> |
#include <mm/page.h> |
#include <print.h> |
#define RSDP_SIGNATURE "RSD PTR " |
#define RSDP_REVISION_OFFS 15 |
struct acpi_rsdp *acpi_rsdp = NULL; |
struct acpi_rsdt *acpi_rsdt = NULL; |
struct acpi_xsdt *acpi_xsdt = NULL; |
struct acpi_signature_map signature_map[] = { |
{ (uint8_t *)"APIC", (void *) &acpi_madt, "Multiple APIC Description Table" } |
}; |
static int rsdp_check(uint8_t *rsdp) { |
struct acpi_rsdp *r = (struct acpi_rsdp *) rsdp; |
uint8_t sum = 0; |
unsigned int i; |
for (i = 0; i < 20; i++) |
sum = (uint8_t) (sum + rsdp[i]); |
if (sum) |
return 0; /* bad checksum */ |
if (r->revision == 0) |
return 1; /* ACPI 1.0 */ |
for (; i < r->length; i++) |
sum = (uint8_t) (sum + rsdp[i]); |
return !sum; |
} |
int acpi_sdt_check(uint8_t *sdt) |
{ |
struct acpi_sdt_header *h = (struct acpi_sdt_header *) sdt; |
uint8_t sum = 0; |
unsigned int i; |
for (i = 0; i < h->length; i++) |
sum = (uint8_t) (sum + sdt[i]); |
return !sum; |
} |
static void map_sdt(struct acpi_sdt_header *sdt) |
{ |
page_mapping_insert(AS_KERNEL, (uintptr_t) sdt, (uintptr_t) sdt, PAGE_NOT_CACHEABLE | PAGE_WRITE); |
map_structure((uintptr_t) sdt, sdt->length); |
} |
static void configure_via_rsdt(void) |
{ |
unsigned int i, j, cnt = (acpi_rsdt->header.length - sizeof(struct acpi_sdt_header)) / sizeof(uint32_t); |
for (i = 0; i < cnt; i++) { |
for (j = 0; j < sizeof(signature_map) / sizeof(struct acpi_signature_map); j++) { |
struct acpi_sdt_header *h = (struct acpi_sdt_header *) (unative_t) acpi_rsdt->entry[i]; |
map_sdt(h); |
if (*((uint32_t *) &h->signature[0]) == *((uint32_t *) &signature_map[j].signature[0])) { |
if (!acpi_sdt_check((uint8_t *) h)) |
goto next; |
*signature_map[j].sdt_ptr = h; |
printf("%#zp: ACPI %s\n", *signature_map[j].sdt_ptr, signature_map[j].description); |
} |
} |
next: |
; |
} |
} |
static void configure_via_xsdt(void) |
{ |
unsigned int i, j, cnt = (acpi_xsdt->header.length - sizeof(struct acpi_sdt_header)) / sizeof(uint64_t); |
for (i = 0; i < cnt; i++) { |
for (j = 0; j < sizeof(signature_map) / sizeof(struct acpi_signature_map); j++) { |
struct acpi_sdt_header *h = (struct acpi_sdt_header *) ((uintptr_t) acpi_rsdt->entry[i]); |
map_sdt(h); |
if (*((uint32_t *) &h->signature[0]) == *((uint32_t *) &signature_map[j].signature[0])) { |
if (!acpi_sdt_check((uint8_t *) h)) |
goto next; |
*signature_map[j].sdt_ptr = h; |
printf("%#zp: ACPI %s\n", *signature_map[j].sdt_ptr, signature_map[j].description); |
} |
} |
next: |
; |
} |
} |
void acpi_init(void) |
{ |
uint8_t *addr[2] = { NULL, (uint8_t *) PA2KA(0xe0000) }; |
int i, j, length[2] = { 1024, 128*1024 }; |
uint64_t *sig = (uint64_t *) RSDP_SIGNATURE; |
/* |
* Find Root System Description Pointer |
* 1. search first 1K of EBDA |
* 2. search 128K starting at 0xe0000 |
*/ |
addr[0] = (uint8_t *) PA2KA(ebda); |
for (i = (ebda ? 0 : 1); i < 2; i++) { |
for (j = 0; j < length[i]; j += 16) { |
if (*((uint64_t *) &addr[i][j]) == *sig && rsdp_check(&addr[i][j])) { |
acpi_rsdp = (struct acpi_rsdp *) &addr[i][j]; |
goto rsdp_found; |
} |
} |
} |
return; |
rsdp_found: |
printf("%#zp: ACPI Root System Description Pointer\n", acpi_rsdp); |
acpi_rsdt = (struct acpi_rsdt *) (unative_t) acpi_rsdp->rsdt_address; |
if (acpi_rsdp->revision) acpi_xsdt = (struct acpi_xsdt *) ((uintptr_t) acpi_rsdp->xsdt_address); |
if (acpi_rsdt) map_sdt((struct acpi_sdt_header *) acpi_rsdt); |
if (acpi_xsdt) map_sdt((struct acpi_sdt_header *) acpi_xsdt); |
if (acpi_rsdt && !acpi_sdt_check((uint8_t *) acpi_rsdt)) { |
printf("RSDT: %s\n", "bad checksum"); |
return; |
} |
if (acpi_xsdt && !acpi_sdt_check((uint8_t *) acpi_xsdt)) { |
printf("XSDT: %s\n", "bad checksum"); |
return; |
} |
if (acpi_xsdt) configure_via_xsdt(); |
else if (acpi_rsdt) configure_via_rsdt(); |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/genarch/src/acpi/madt.c |
---|
0,0 → 1,245 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genarch |
* @{ |
*/ |
/** |
* @file |
* @brief Multiple APIC Description Table (MADT) parsing. |
*/ |
#include <arch/types.h> |
#include <genarch/acpi/acpi.h> |
#include <genarch/acpi/madt.h> |
#include <arch/smp/apic.h> |
#include <arch/smp/smp.h> |
#include <panic.h> |
#include <debug.h> |
#include <config.h> |
#include <print.h> |
#include <mm/slab.h> |
#include <memstr.h> |
#include <sort.h> |
struct acpi_madt *acpi_madt = NULL; |
#ifdef CONFIG_SMP |
/** Standard ISA IRQ map; can be overriden by Interrupt Source Override entries of MADT. */ |
int isa_irq_map[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; |
static void madt_l_apic_entry(struct madt_l_apic *la, uint32_t index); |
static void madt_io_apic_entry(struct madt_io_apic *ioa, uint32_t index); |
static void madt_intr_src_ovrd_entry(struct madt_intr_src_ovrd *override, uint32_t index); |
static int madt_cmp(void * a, void * b); |
struct madt_l_apic *madt_l_apic_entries = NULL; |
struct madt_io_apic *madt_io_apic_entries = NULL; |
index_t madt_l_apic_entry_index = 0; |
index_t madt_io_apic_entry_index = 0; |
count_t madt_l_apic_entry_cnt = 0; |
count_t madt_io_apic_entry_cnt = 0; |
count_t cpu_count = 0; |
struct madt_apic_header * * madt_entries_index = NULL; |
unsigned int madt_entries_index_cnt = 0; |
char *entry[] = { |
"L_APIC", |
"IO_APIC", |
"INTR_SRC_OVRD", |
"NMI_SRC", |
"L_APIC_NMI", |
"L_APIC_ADDR_OVRD", |
"IO_SAPIC", |
"L_SAPIC", |
"PLATFORM_INTR_SRC" |
}; |
/* |
* ACPI MADT Implementation of SMP configuration interface. |
*/ |
static count_t madt_cpu_count(void); |
static bool madt_cpu_enabled(index_t i); |
static bool madt_cpu_bootstrap(index_t i); |
static uint8_t madt_cpu_apic_id(index_t i); |
static int madt_irq_to_pin(unsigned int irq); |
struct smp_config_operations madt_config_operations = { |
.cpu_count = madt_cpu_count, |
.cpu_enabled = madt_cpu_enabled, |
.cpu_bootstrap = madt_cpu_bootstrap, |
.cpu_apic_id = madt_cpu_apic_id, |
.irq_to_pin = madt_irq_to_pin |
}; |
count_t madt_cpu_count(void) |
{ |
return madt_l_apic_entry_cnt; |
} |
bool madt_cpu_enabled(index_t i) |
{ |
ASSERT(i < madt_l_apic_entry_cnt); |
return ((struct madt_l_apic *) madt_entries_index[madt_l_apic_entry_index + i])->flags & 0x1; |
} |
bool madt_cpu_bootstrap(index_t i) |
{ |
ASSERT(i < madt_l_apic_entry_cnt); |
return ((struct madt_l_apic *) madt_entries_index[madt_l_apic_entry_index + i])->apic_id == l_apic_id(); |
} |
uint8_t madt_cpu_apic_id(index_t i) |
{ |
ASSERT(i < madt_l_apic_entry_cnt); |
return ((struct madt_l_apic *) madt_entries_index[madt_l_apic_entry_index + i])->apic_id; |
} |
int madt_irq_to_pin(unsigned int irq) |
{ |
ASSERT(irq < sizeof(isa_irq_map)/sizeof(int)); |
return isa_irq_map[irq]; |
} |
int madt_cmp(void * a, void * b) |
{ |
return |
(((struct madt_apic_header *) a)->type > ((struct madt_apic_header *) b)->type) ? |
1 : |
((((struct madt_apic_header *) a)->type < ((struct madt_apic_header *) b)->type) ? -1 : 0); |
} |
void acpi_madt_parse(void) |
{ |
struct madt_apic_header *end = (struct madt_apic_header *) (((uint8_t *) acpi_madt) + acpi_madt->header.length); |
struct madt_apic_header *h; |
l_apic = (uint32_t *) (unative_t) acpi_madt->l_apic_address; |
/* calculate madt entries */ |
for (h = &acpi_madt->apic_header[0]; h < end; h = (struct madt_apic_header *) (((uint8_t *) h) + h->length)) { |
madt_entries_index_cnt++; |
} |
/* create madt apic entries index array */ |
madt_entries_index = (struct madt_apic_header * *) malloc(madt_entries_index_cnt * sizeof(struct madt_apic_header * *), FRAME_ATOMIC); |
if (!madt_entries_index) |
panic("Memory allocation error."); |
uint32_t index = 0; |
for (h = &acpi_madt->apic_header[0]; h < end; h = (struct madt_apic_header *) (((uint8_t *) h) + h->length)) { |
madt_entries_index[index++] = h; |
} |
/* Quicksort MADT index structure */ |
qsort(madt_entries_index, madt_entries_index_cnt, sizeof(uintptr_t), &madt_cmp); |
/* Parse MADT entries */ |
if (madt_entries_index_cnt > 0) { |
for (index = 0; index < madt_entries_index_cnt - 1; index++) { |
h = madt_entries_index[index]; |
switch (h->type) { |
case MADT_L_APIC: |
madt_l_apic_entry((struct madt_l_apic *) h, index); |
break; |
case MADT_IO_APIC: |
madt_io_apic_entry((struct madt_io_apic *) h, index); |
break; |
case MADT_INTR_SRC_OVRD: |
madt_intr_src_ovrd_entry((struct madt_intr_src_ovrd *) h, index); |
break; |
case MADT_NMI_SRC: |
case MADT_L_APIC_NMI: |
case MADT_L_APIC_ADDR_OVRD: |
case MADT_IO_SAPIC: |
case MADT_L_SAPIC: |
case MADT_PLATFORM_INTR_SRC: |
printf("MADT: skipping %s entry (type=%zd)\n", entry[h->type], h->type); |
break; |
default: |
if (h->type >= MADT_RESERVED_SKIP_BEGIN && h->type <= MADT_RESERVED_SKIP_END) { |
printf("MADT: skipping reserved entry (type=%zd)\n", h->type); |
} |
if (h->type >= MADT_RESERVED_OEM_BEGIN) { |
printf("MADT: skipping OEM entry (type=%zd)\n", h->type); |
} |
break; |
} |
} |
} |
if (cpu_count) |
config.cpu_count = cpu_count; |
} |
void madt_l_apic_entry(struct madt_l_apic *la, uint32_t index) |
{ |
if (!madt_l_apic_entry_cnt++) { |
madt_l_apic_entry_index = index; |
} |
if (!(la->flags & 0x1)) { |
/* Processor is unusable, skip it. */ |
return; |
} |
cpu_count++; |
apic_id_mask |= 1<<la->apic_id; |
} |
void madt_io_apic_entry(struct madt_io_apic *ioa, uint32_t index) |
{ |
if (!madt_io_apic_entry_cnt++) { |
/* remember index of the first io apic entry */ |
madt_io_apic_entry_index = index; |
io_apic = (uint32_t *) (unative_t) ioa->io_apic_address; |
} else { |
/* currently not supported */ |
return; |
} |
} |
void madt_intr_src_ovrd_entry(struct madt_intr_src_ovrd *override, uint32_t index) |
{ |
ASSERT(override->source < sizeof(isa_irq_map)/sizeof(int)); |
printf("MADT: ignoring %s entry: bus=%zd, source=%zd, global_int=%zd, flags=%#hx\n", |
entry[override->header.type], override->bus, override->source, |
override->global_int, override->flags); |
} |
#endif /* CONFIG_SMP */ |
/** @} |
*/ |
/tags/0.3.0/kernel/genarch/src/fb/fb.c |
---|
0,0 → 1,544 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genarch |
* @{ |
*/ |
/** @file |
*/ |
#include <genarch/fb/font-8x16.h> |
#include <genarch/fb/visuals.h> |
#include <genarch/fb/fb.h> |
#include <console/chardev.h> |
#include <console/console.h> |
#include <sysinfo/sysinfo.h> |
#include <mm/slab.h> |
#include <panic.h> |
#include <memstr.h> |
#include <config.h> |
#include <bitops.h> |
#include <print.h> |
#include <ddi/ddi.h> |
#include <arch/types.h> |
#include "helenos.xbm" |
static parea_t fb_parea; /**< Physical memory area for fb. */ |
SPINLOCK_INITIALIZE(fb_lock); |
static uint8_t *fbaddress = NULL; |
static uint8_t *blankline = NULL; |
static uint8_t *dbbuffer = NULL; /* Buffer for fast scrolling console */ |
static index_t dboffset; |
static unsigned int xres = 0; |
static unsigned int yres = 0; |
static unsigned int scanline = 0; |
static unsigned int pixelbytes = 0; |
#ifdef FB_INVERT_COLORS |
static bool invert_colors = true; |
#else |
static bool invert_colors = false; |
#endif |
static unsigned int position = 0; |
static unsigned int columns = 0; |
static unsigned int rows = 0; |
#define COL_WIDTH 8 |
#define ROW_BYTES (scanline * FONT_SCANLINES) |
#define BGCOLOR 0x000080 |
#define FGCOLOR 0xffff00 |
#define LOGOCOLOR 0x2020b0 |
#define RED(x, bits) ((x >> (8 + 8 + 8 - bits)) & ((1 << bits) - 1)) |
#define GREEN(x, bits) ((x >> (8 + 8 - bits)) & ((1 << bits) - 1)) |
#define BLUE(x, bits) ((x >> (8 - bits)) & ((1 << bits) - 1)) |
#define POINTPOS(x, y) ((y) * scanline + (x) * pixelbytes) |
/***************************************************************/ |
/* Pixel specific fuctions */ |
static void (*rgb2scr)(void *, int); |
static int (*scr2rgb)(void *); |
static inline int COLOR(int color) |
{ |
return invert_colors ? ~color : color; |
} |
/* Conversion routines between different color representations */ |
static void rgb_byte0888(void *dst, int rgb) |
{ |
*((int *) dst) = rgb; |
} |
static int byte0888_rgb(void *src) |
{ |
return (*((int *) src)) & 0xffffff; |
} |
static void bgr_byte0888(void *dst, int rgb) |
{ |
*((uint32_t *) dst) = BLUE(rgb, 8) << 16 | GREEN(rgb, 8) << 8 | |
RED(rgb, 8); |
} |
static int byte0888_bgr(void *src) |
{ |
int color = *(uint32_t *)(src); |
return ((color & 0xff) << 16) | (((color >> 8) & 0xff) << 8) | |
((color >> 16) & 0xff); |
} |
static void rgb_byte888(void *dst, int rgb) |
{ |
uint8_t *scr = (uint8_t *) dst; |
#if defined(FB_INVERT_ENDIAN) |
scr[0] = RED(rgb, 8); |
scr[1] = GREEN(rgb, 8); |
scr[2] = BLUE(rgb, 8); |
#else |
scr[2] = RED(rgb, 8); |
scr[1] = GREEN(rgb, 8); |
scr[0] = BLUE(rgb, 8); |
#endif |
} |
static int byte888_rgb(void *src) |
{ |
uint8_t *scr = (uint8_t *) src; |
#if defined(FB_INVERT_ENDIAN) |
return scr[0] << 16 | scr[1] << 8 | scr[2]; |
#else |
return scr[2] << 16 | scr[1] << 8 | scr[0]; |
#endif |
} |
/** 16-bit depth (5:5:5) */ |
static void rgb_byte555(void *dst, int rgb) |
{ |
/* 5-bit, 5-bits, 5-bits */ |
*((uint16_t *) dst) = RED(rgb, 5) << 10 | GREEN(rgb, 5) << 5 | |
BLUE(rgb, 5); |
} |
/** 16-bit depth (5:5:5) */ |
static int byte555_rgb(void *src) |
{ |
int color = *(uint16_t *)(src); |
return (((color >> 10) & 0x1f) << (16 + 3)) | |
(((color >> 5) & 0x1f) << (8 + 3)) | ((color & 0x1f) << 3); |
} |
/** 16-bit depth (5:6:5) */ |
static void rgb_byte565(void *dst, int rgb) |
{ |
/* 5-bit, 6-bits, 5-bits */ |
*((uint16_t *) dst) = RED(rgb, 5) << 11 | GREEN(rgb, 6) << 5 | |
BLUE(rgb, 5); |
} |
/** 16-bit depth (5:6:5) */ |
static int byte565_rgb(void *src) |
{ |
int color = *(uint16_t *)(src); |
return (((color >> 11) & 0x1f) << (16 + 3)) | |
(((color >> 5) & 0x3f) << (8 + 2)) | ((color & 0x1f) << 3); |
} |
/** Put pixel - 8-bit depth (color palette/3:2:3) |
* |
* Even though we try 3:2:3 color scheme here, an 8-bit framebuffer |
* will most likely use a color palette. The color appearance |
* will be pretty random and depend on the default installed |
* palette. This could be fixed by supporting custom palette |
* and setting it to simulate the 8-bit truecolor. |
*/ |
static void rgb_byte8(void *dst, int rgb) |
{ |
*((uint8_t *) dst) = RED(rgb, 3) << 5 | GREEN(rgb, 2) << 3 | |
BLUE(rgb, 3); |
} |
/** Return pixel color - 8-bit depth (color palette/3:2:3) |
* |
* See the comment for rgb_byte(). |
*/ |
static int byte8_rgb(void *src) |
{ |
int color = *(uint8_t *)src; |
return (((color >> 5) & 0x7) << (16 + 5)) | |
(((color >> 3) & 0x3) << (8 + 6)) | ((color & 0x7) << 5); |
} |
static void putpixel(unsigned int x, unsigned int y, int color) |
{ |
(*rgb2scr)(&fbaddress[POINTPOS(x, y)], COLOR(color)); |
if (dbbuffer) { |
int dline = (y + dboffset) % yres; |
(*rgb2scr)(&dbbuffer[POINTPOS(x, dline)], COLOR(color)); |
} |
} |
/** Get pixel from viewport */ |
static int getpixel(unsigned int x, unsigned int y) |
{ |
if (dbbuffer) { |
int dline = (y + dboffset) % yres; |
return COLOR((*scr2rgb)(&dbbuffer[POINTPOS(x, dline)])); |
} |
return COLOR((*scr2rgb)(&fbaddress[POINTPOS(x, y)])); |
} |
/** Fill screen with background color */ |
static void clear_screen(void) |
{ |
unsigned int y; |
for (y = 0; y < yres; y++) { |
memcpy(&fbaddress[scanline * y], blankline, xres * pixelbytes); |
if (dbbuffer) |
memcpy(&dbbuffer[scanline * y], blankline, |
xres * pixelbytes); |
} |
} |
/** Scroll screen one row up */ |
static void scroll_screen(void) |
{ |
if (dbbuffer) { |
count_t first; |
/* Clear the last row */ |
memcpy(&dbbuffer[dboffset * scanline], blankline, ROW_BYTES); |
dboffset = (dboffset + FONT_SCANLINES) % yres; |
first = yres - dboffset; |
/* Move all rows one row up */ |
if (xres * pixelbytes == scanline) { |
memcpy(fbaddress, &dbbuffer[dboffset * scanline], |
first * scanline); |
memcpy(&fbaddress[first * scanline], dbbuffer, |
dboffset * scanline); |
} else { |
/* |
* When the scanline is bigger than number of bytes |
* in the X-resolution, chances are that the |
* frame buffer memory past the X-resolution is special |
* in some way. For example, the SUNW,ffb framebuffer |
* wraps this area around the beginning of the same |
* line. To avoid troubles, copy only memory as |
* specified by the resolution. |
*/ |
unsigned int i; |
for (i = 0; i < first; i++) |
memcpy(&fbaddress[i * scanline], |
&dbbuffer[(dboffset + i) * scanline], |
xres * pixelbytes); |
for (i = 0; i < dboffset; i++) |
memcpy(&fbaddress[(first + i) * scanline], |
&dbbuffer[i * scanline], xres * pixelbytes); |
} |
} else { |
uint8_t *lastline = &fbaddress[(rows - 1) * ROW_BYTES]; |
if (xres * pixelbytes == scanline) { |
/* Move all rows one row up */ |
memcpy((void *) fbaddress, |
(void *) &fbaddress[ROW_BYTES], |
scanline * yres - ROW_BYTES); |
/* Clear the last row */ |
memcpy((void *) lastline, (void *) blankline, |
ROW_BYTES); |
} else { |
/* |
* See the comment in the dbbuffer case. |
*/ |
unsigned int i; |
/* Move all rows one row up */ |
for (i = 0; i < yres - FONT_SCANLINES; i++) |
memcpy(&fbaddress[i * scanline], |
&fbaddress[(i + FONT_SCANLINES) * scanline], |
xres * pixelbytes); |
/* Clear the last row */ |
for (i = 0; i < FONT_SCANLINES; i++) |
memcpy(&lastline[i * scanline], |
&blankline[i * scanline], |
xres * pixelbytes); |
} |
} |
} |
static void invert_pixel(unsigned int x, unsigned int y) |
{ |
putpixel(x, y, ~getpixel(x, y)); |
} |
/** Draw one line of glyph at a given position */ |
static void draw_glyph_line(unsigned int glline, unsigned int x, unsigned int y) |
{ |
unsigned int i; |
for (i = 0; i < 8; i++) |
if (glline & (1 << (7 - i))) { |
putpixel(x + i, y, FGCOLOR); |
} else |
putpixel(x + i, y, BGCOLOR); |
} |
/***************************************************************/ |
/* Character-console functions */ |
/** Draw character at given position */ |
static void draw_glyph(uint8_t glyph, unsigned int col, unsigned int row) |
{ |
unsigned int y; |
for (y = 0; y < FONT_SCANLINES; y++) |
draw_glyph_line(fb_font[glyph * FONT_SCANLINES + y], |
col * COL_WIDTH, row * FONT_SCANLINES + y); |
} |
/** Invert character at given position */ |
static void invert_char(unsigned int col, unsigned int row) |
{ |
unsigned int x; |
unsigned int y; |
for (x = 0; x < COL_WIDTH; x++) |
for (y = 0; y < FONT_SCANLINES; y++) |
invert_pixel(col * COL_WIDTH + x, |
row * FONT_SCANLINES + y); |
} |
/** Draw character at default position */ |
static void draw_char(char chr) |
{ |
draw_glyph(chr, position % columns, position / columns); |
} |
static void draw_logo(unsigned int startx, unsigned int starty) |
{ |
unsigned int x; |
unsigned int y; |
unsigned int byte; |
unsigned int rowbytes; |
rowbytes = (helenos_width - 1) / 8 + 1; |
for (y = 0; y < helenos_height; y++) |
for (x = 0; x < helenos_width; x++) { |
byte = helenos_bits[rowbytes * y + x / 8]; |
byte >>= x % 8; |
if (byte & 1) |
putpixel(startx + x, starty + y, |
COLOR(LOGOCOLOR)); |
} |
} |
/***************************************************************/ |
/* Stdout specific functions */ |
static void invert_cursor(void) |
{ |
invert_char(position % columns, position / columns); |
} |
/** Print character to screen |
* |
* Emulate basic terminal commands |
*/ |
static void fb_putchar(chardev_t *dev, char ch) |
{ |
spinlock_lock(&fb_lock); |
switch (ch) { |
case '\n': |
invert_cursor(); |
position += columns; |
position -= position % columns; |
break; |
case '\r': |
invert_cursor(); |
position -= position % columns; |
break; |
case '\b': |
invert_cursor(); |
if (position % columns) |
position--; |
break; |
case '\t': |
invert_cursor(); |
do { |
draw_char(' '); |
position++; |
} while ((position % 8) && position < columns * rows); |
break; |
default: |
draw_char(ch); |
position++; |
} |
if (position >= columns * rows) { |
position -= columns; |
scroll_screen(); |
} |
invert_cursor(); |
spinlock_unlock(&fb_lock); |
} |
static chardev_t framebuffer; |
static chardev_operations_t fb_ops = { |
.write = fb_putchar, |
}; |
/** Initialize framebuffer as a chardev output device |
* |
* @param addr Physical address of the framebuffer |
* @param x Screen width in pixels |
* @param y Screen height in pixels |
* @param scan Bytes per one scanline |
* @param visual Color model |
* |
*/ |
void fb_init(uintptr_t addr, unsigned int x, unsigned int y, unsigned int scan, |
unsigned int visual) |
{ |
switch (visual) { |
case VISUAL_INDIRECT_8: |
rgb2scr = rgb_byte8; |
scr2rgb = byte8_rgb; |
pixelbytes = 1; |
break; |
case VISUAL_RGB_5_5_5: |
rgb2scr = rgb_byte555; |
scr2rgb = byte555_rgb; |
pixelbytes = 2; |
break; |
case VISUAL_RGB_5_6_5: |
rgb2scr = rgb_byte565; |
scr2rgb = byte565_rgb; |
pixelbytes = 2; |
break; |
case VISUAL_RGB_8_8_8: |
rgb2scr = rgb_byte888; |
scr2rgb = byte888_rgb; |
pixelbytes = 3; |
break; |
case VISUAL_RGB_8_8_8_0: |
rgb2scr = rgb_byte888; |
scr2rgb = byte888_rgb; |
pixelbytes = 4; |
break; |
case VISUAL_RGB_0_8_8_8: |
rgb2scr = rgb_byte0888; |
scr2rgb = byte0888_rgb; |
pixelbytes = 4; |
break; |
case VISUAL_BGR_0_8_8_8: |
rgb2scr = bgr_byte0888; |
scr2rgb = byte0888_bgr; |
pixelbytes = 4; |
break; |
default: |
panic("Unsupported visual.\n"); |
} |
unsigned int fbsize = scan * y; |
/* Map the framebuffer */ |
fbaddress = (uint8_t *) hw_map((uintptr_t) addr, fbsize); |
xres = x; |
yres = y; |
scanline = scan; |
rows = y / FONT_SCANLINES; |
columns = x / COL_WIDTH; |
fb_parea.pbase = (uintptr_t) addr; |
fb_parea.vbase = (uintptr_t) fbaddress; |
fb_parea.frames = SIZE2FRAMES(fbsize); |
fb_parea.cacheable = false; |
ddi_parea_register(&fb_parea); |
sysinfo_set_item_val("fb", NULL, true); |
sysinfo_set_item_val("fb.kind", NULL, 1); |
sysinfo_set_item_val("fb.width", NULL, xres); |
sysinfo_set_item_val("fb.height", NULL, yres); |
sysinfo_set_item_val("fb.scanline", NULL, scan); |
sysinfo_set_item_val("fb.visual", NULL, visual); |
sysinfo_set_item_val("fb.address.physical", NULL, addr); |
sysinfo_set_item_val("fb.invert-colors", NULL, invert_colors); |
/* Allocate double buffer */ |
unsigned int order = fnzb(SIZE2FRAMES(fbsize) - 1) + 1; |
dbbuffer = (uint8_t *) frame_alloc(order, FRAME_ATOMIC | FRAME_KA); |
if (!dbbuffer) |
printf("Failed to allocate scroll buffer.\n"); |
dboffset = 0; |
/* Initialized blank line */ |
blankline = (uint8_t *) malloc(ROW_BYTES, FRAME_ATOMIC); |
if (!blankline) |
panic("Failed to allocate blank line for framebuffer."); |
for (y = 0; y < FONT_SCANLINES; y++) |
for (x = 0; x < xres; x++) |
(*rgb2scr)(&blankline[POINTPOS(x, y)], COLOR(BGCOLOR)); |
clear_screen(); |
/* Update size of screen to match text area */ |
yres = rows * FONT_SCANLINES; |
draw_logo(xres - helenos_width, 0); |
invert_cursor(); |
chardev_initialize("fb", &framebuffer, &fb_ops); |
stdout = &framebuffer; |
} |
/** @} |
*/ |
/tags/0.3.0/kernel/genarch/src/fb/font-8x16.c |
---|
0,0 → 1,4650 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genarch |
* @{ |
*/ |
/** @file |
*/ |
#include <genarch/fb/font-8x16.h> |
unsigned char fb_font[FONT_GLIPHS * FONT_SCANLINES] = { |
/* 0 0x00 '^@' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 1 0x01 '^A' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0x81, /* 10000001 */ |
0xa5, /* 10100101 */ |
0x81, /* 10000001 */ |
0x81, /* 10000001 */ |
0xbd, /* 10111101 */ |
0x99, /* 10011001 */ |
0x81, /* 10000001 */ |
0x81, /* 10000001 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 2 0x02 '^B' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0xff, /* 11111111 */ |
0xdb, /* 11011011 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xc3, /* 11000011 */ |
0xe7, /* 11100111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 3 0x03 '^C' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x6c, /* 01101100 */ |
0xfe, /* 11111110 */ |
0xfe, /* 11111110 */ |
0xfe, /* 11111110 */ |
0xfe, /* 11111110 */ |
0x7c, /* 01111100 */ |
0x38, /* 00111000 */ |
0x10, /* 00010000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 4 0x04 '^D' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x10, /* 00010000 */ |
0x38, /* 00111000 */ |
0x7c, /* 01111100 */ |
0xfe, /* 11111110 */ |
0x7c, /* 01111100 */ |
0x38, /* 00111000 */ |
0x10, /* 00010000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 5 0x05 '^E' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x3c, /* 00111100 */ |
0xe7, /* 11100111 */ |
0xe7, /* 11100111 */ |
0xe7, /* 11100111 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 6 0x06 '^F' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x7e, /* 01111110 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0x7e, /* 01111110 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 7 0x07 '^G' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x3c, /* 00111100 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 8 0x08 '^H' */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xe7, /* 11100111 */ |
0xc3, /* 11000011 */ |
0xc3, /* 11000011 */ |
0xe7, /* 11100111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
/* 9 0x09 '^I' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x3c, /* 00111100 */ |
0x66, /* 01100110 */ |
0x42, /* 01000010 */ |
0x42, /* 01000010 */ |
0x66, /* 01100110 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 10 0x0a '^J' */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xc3, /* 11000011 */ |
0x99, /* 10011001 */ |
0xbd, /* 10111101 */ |
0xbd, /* 10111101 */ |
0x99, /* 10011001 */ |
0xc3, /* 11000011 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
/* 11 0x0b '^K' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x1e, /* 00011110 */ |
0x0e, /* 00001110 */ |
0x1a, /* 00011010 */ |
0x32, /* 00110010 */ |
0x78, /* 01111000 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x78, /* 01111000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 12 0x0c '^L' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x3c, /* 00111100 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x3c, /* 00111100 */ |
0x18, /* 00011000 */ |
0x7e, /* 01111110 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 13 0x0d '^M' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x3f, /* 00111111 */ |
0x33, /* 00110011 */ |
0x3f, /* 00111111 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x70, /* 01110000 */ |
0xf0, /* 11110000 */ |
0xe0, /* 11100000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 14 0x0e '^N' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7f, /* 01111111 */ |
0x63, /* 01100011 */ |
0x7f, /* 01111111 */ |
0x63, /* 01100011 */ |
0x63, /* 01100011 */ |
0x63, /* 01100011 */ |
0x63, /* 01100011 */ |
0x67, /* 01100111 */ |
0xe7, /* 11100111 */ |
0xe6, /* 11100110 */ |
0xc0, /* 11000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 15 0x0f '^O' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0xdb, /* 11011011 */ |
0x3c, /* 00111100 */ |
0xe7, /* 11100111 */ |
0x3c, /* 00111100 */ |
0xdb, /* 11011011 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 16 0x10 '^P' */ |
0x00, /* 00000000 */ |
0x80, /* 10000000 */ |
0xc0, /* 11000000 */ |
0xe0, /* 11100000 */ |
0xf0, /* 11110000 */ |
0xf8, /* 11111000 */ |
0xfe, /* 11111110 */ |
0xf8, /* 11111000 */ |
0xf0, /* 11110000 */ |
0xe0, /* 11100000 */ |
0xc0, /* 11000000 */ |
0x80, /* 10000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 17 0x11 '^Q' */ |
0x00, /* 00000000 */ |
0x02, /* 00000010 */ |
0x06, /* 00000110 */ |
0x0e, /* 00001110 */ |
0x1e, /* 00011110 */ |
0x3e, /* 00111110 */ |
0xfe, /* 11111110 */ |
0x3e, /* 00111110 */ |
0x1e, /* 00011110 */ |
0x0e, /* 00001110 */ |
0x06, /* 00000110 */ |
0x02, /* 00000010 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 18 0x12 '^R' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x7e, /* 01111110 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x7e, /* 01111110 */ |
0x3c, /* 00111100 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 19 0x13 '^S' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x00, /* 00000000 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 20 0x14 '^T' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7f, /* 01111111 */ |
0xdb, /* 11011011 */ |
0xdb, /* 11011011 */ |
0xdb, /* 11011011 */ |
0x7b, /* 01111011 */ |
0x1b, /* 00011011 */ |
0x1b, /* 00011011 */ |
0x1b, /* 00011011 */ |
0x1b, /* 00011011 */ |
0x1b, /* 00011011 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 21 0x15 '^U' */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0x60, /* 01100000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x6c, /* 01101100 */ |
0x38, /* 00111000 */ |
0x0c, /* 00001100 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 22 0x16 '^V' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0xfe, /* 11111110 */ |
0xfe, /* 11111110 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 23 0x17 '^W' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x7e, /* 01111110 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x7e, /* 01111110 */ |
0x3c, /* 00111100 */ |
0x18, /* 00011000 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 24 0x18 '^X' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x7e, /* 01111110 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 25 0x19 '^Y' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x7e, /* 01111110 */ |
0x3c, /* 00111100 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 26 0x1a '^Z' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x0c, /* 00001100 */ |
0xfe, /* 11111110 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 27 0x1b '^[' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0xfe, /* 11111110 */ |
0x60, /* 01100000 */ |
0x30, /* 00110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 28 0x1c '^\' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 29 0x1d '^]' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x28, /* 00101000 */ |
0x6c, /* 01101100 */ |
0xfe, /* 11111110 */ |
0x6c, /* 01101100 */ |
0x28, /* 00101000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 30 0x1e '^^' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x10, /* 00010000 */ |
0x38, /* 00111000 */ |
0x38, /* 00111000 */ |
0x7c, /* 01111100 */ |
0x7c, /* 01111100 */ |
0xfe, /* 11111110 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 31 0x1f '^_' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0xfe, /* 11111110 */ |
0x7c, /* 01111100 */ |
0x7c, /* 01111100 */ |
0x38, /* 00111000 */ |
0x38, /* 00111000 */ |
0x10, /* 00010000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 32 0x20 ' ' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 33 0x21 '!' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x3c, /* 00111100 */ |
0x3c, /* 00111100 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 34 0x22 '"' */ |
0x00, /* 00000000 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x24, /* 00100100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 35 0x23 '#' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0xfe, /* 11111110 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0xfe, /* 11111110 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 36 0x24 '$' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc2, /* 11000010 */ |
0xc0, /* 11000000 */ |
0x7c, /* 01111100 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x86, /* 10000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 37 0x25 '%' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc2, /* 11000010 */ |
0xc6, /* 11000110 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0xc6, /* 11000110 */ |
0x86, /* 10000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 38 0x26 '&' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x38, /* 00111000 */ |
0x76, /* 01110110 */ |
0xdc, /* 11011100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 39 0x27 ''' */ |
0x00, /* 00000000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 40 0x28 '(' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x0c, /* 00001100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 41 0x29 ')' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 42 0x2a '*' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x66, /* 01100110 */ |
0x3c, /* 00111100 */ |
0xff, /* 11111111 */ |
0x3c, /* 00111100 */ |
0x66, /* 01100110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 43 0x2b '+' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x7e, /* 01111110 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 44 0x2c ',' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 45 0x2d '-' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 46 0x2e '.' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 47 0x2f '/' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x02, /* 00000010 */ |
0x06, /* 00000110 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0xc0, /* 11000000 */ |
0x80, /* 10000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 48 0x30 '0' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xd6, /* 11010110 */ |
0xd6, /* 11010110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x6c, /* 01101100 */ |
0x38, /* 00111000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 49 0x31 '1' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x38, /* 00111000 */ |
0x78, /* 01111000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 50 0x32 '2' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0x06, /* 00000110 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0xc0, /* 11000000 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 51 0x33 '3' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x3c, /* 00111100 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 52 0x34 '4' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x0c, /* 00001100 */ |
0x1c, /* 00011100 */ |
0x3c, /* 00111100 */ |
0x6c, /* 01101100 */ |
0xcc, /* 11001100 */ |
0xfe, /* 11111110 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x1e, /* 00011110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 53 0x35 '5' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xfc, /* 11111100 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 54 0x36 '6' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x60, /* 01100000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xfc, /* 11111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 55 0x37 '7' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0xc6, /* 11000110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 56 0x38 '8' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 57 0x39 '9' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7e, /* 01111110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x0c, /* 00001100 */ |
0x78, /* 01111000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 58 0x3a ':' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 59 0x3b ';' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 60 0x3c '<' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x06, /* 00000110 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x0c, /* 00001100 */ |
0x06, /* 00000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 61 0x3d '=' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 62 0x3e '>' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x60, /* 01100000 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x0c, /* 00001100 */ |
0x06, /* 00000110 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 63 0x3f '?' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 64 0x40 '@' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xde, /* 11011110 */ |
0xde, /* 11011110 */ |
0xde, /* 11011110 */ |
0xdc, /* 11011100 */ |
0xc0, /* 11000000 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 65 0x41 'A' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x10, /* 00010000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 66 0x42 'B' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfc, /* 11111100 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x7c, /* 01111100 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0xfc, /* 11111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 67 0x43 'C' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x3c, /* 00111100 */ |
0x66, /* 01100110 */ |
0xc2, /* 11000010 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc2, /* 11000010 */ |
0x66, /* 01100110 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 68 0x44 'D' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xf8, /* 11111000 */ |
0x6c, /* 01101100 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x6c, /* 01101100 */ |
0xf8, /* 11111000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 69 0x45 'E' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0x66, /* 01100110 */ |
0x62, /* 01100010 */ |
0x68, /* 01101000 */ |
0x78, /* 01111000 */ |
0x68, /* 01101000 */ |
0x60, /* 01100000 */ |
0x62, /* 01100010 */ |
0x66, /* 01100110 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 70 0x46 'F' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0x66, /* 01100110 */ |
0x62, /* 01100010 */ |
0x68, /* 01101000 */ |
0x78, /* 01111000 */ |
0x68, /* 01101000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0xf0, /* 11110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 71 0x47 'G' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x3c, /* 00111100 */ |
0x66, /* 01100110 */ |
0xc2, /* 11000010 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xde, /* 11011110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x66, /* 01100110 */ |
0x3a, /* 00111010 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 72 0x48 'H' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 73 0x49 'I' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x3c, /* 00111100 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 74 0x4a 'J' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x1e, /* 00011110 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x78, /* 01111000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 75 0x4b 'K' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xe6, /* 11100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x6c, /* 01101100 */ |
0x78, /* 01111000 */ |
0x78, /* 01111000 */ |
0x6c, /* 01101100 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0xe6, /* 11100110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 76 0x4c 'L' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xf0, /* 11110000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x62, /* 01100010 */ |
0x66, /* 01100110 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 77 0x4d 'M' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0xee, /* 11101110 */ |
0xfe, /* 11111110 */ |
0xfe, /* 11111110 */ |
0xd6, /* 11010110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 78 0x4e 'N' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0xe6, /* 11100110 */ |
0xf6, /* 11110110 */ |
0xfe, /* 11111110 */ |
0xde, /* 11011110 */ |
0xce, /* 11001110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 79 0x4f 'O' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 80 0x50 'P' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfc, /* 11111100 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x7c, /* 01111100 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0xf0, /* 11110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 81 0x51 'Q' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xd6, /* 11010110 */ |
0xde, /* 11011110 */ |
0x7c, /* 01111100 */ |
0x0c, /* 00001100 */ |
0x0e, /* 00001110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 82 0x52 'R' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfc, /* 11111100 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x7c, /* 01111100 */ |
0x6c, /* 01101100 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0xe6, /* 11100110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 83 0x53 'S' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x60, /* 01100000 */ |
0x38, /* 00111000 */ |
0x0c, /* 00001100 */ |
0x06, /* 00000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 84 0x54 'T' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0x7e, /* 01111110 */ |
0x5a, /* 01011010 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 85 0x55 'U' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 86 0x56 'V' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x6c, /* 01101100 */ |
0x38, /* 00111000 */ |
0x10, /* 00010000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 87 0x57 'W' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xd6, /* 11010110 */ |
0xd6, /* 11010110 */ |
0xd6, /* 11010110 */ |
0xfe, /* 11111110 */ |
0xee, /* 11101110 */ |
0x6c, /* 01101100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 88 0x58 'X' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x6c, /* 01101100 */ |
0x7c, /* 01111100 */ |
0x38, /* 00111000 */ |
0x38, /* 00111000 */ |
0x7c, /* 01111100 */ |
0x6c, /* 01101100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 89 0x59 'Y' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x3c, /* 00111100 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 90 0x5a 'Z' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0xc6, /* 11000110 */ |
0x86, /* 10000110 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0xc2, /* 11000010 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 91 0x5b '[' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x3c, /* 00111100 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 92 0x5c '\' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x80, /* 10000000 */ |
0xc0, /* 11000000 */ |
0xe0, /* 11100000 */ |
0x70, /* 01110000 */ |
0x38, /* 00111000 */ |
0x1c, /* 00011100 */ |
0x0e, /* 00001110 */ |
0x06, /* 00000110 */ |
0x02, /* 00000010 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 93 0x5d ']' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x3c, /* 00111100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 94 0x5e '^' */ |
0x10, /* 00010000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 95 0x5f '_' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xff, /* 11111111 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 96 0x60 '`' */ |
0x00, /* 00000000 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x0c, /* 00001100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 97 0x61 'a' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x78, /* 01111000 */ |
0x0c, /* 00001100 */ |
0x7c, /* 01111100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 98 0x62 'b' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xe0, /* 11100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x78, /* 01111000 */ |
0x6c, /* 01101100 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 99 0x63 'c' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 100 0x64 'd' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x1c, /* 00011100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x3c, /* 00111100 */ |
0x6c, /* 01101100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 101 0x65 'e' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 102 0x66 'f' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x1c, /* 00011100 */ |
0x36, /* 00110110 */ |
0x32, /* 00110010 */ |
0x30, /* 00110000 */ |
0x78, /* 01111000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x78, /* 01111000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 103 0x67 'g' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x76, /* 01110110 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x7c, /* 01111100 */ |
0x0c, /* 00001100 */ |
0xcc, /* 11001100 */ |
0x78, /* 01111000 */ |
0x00, /* 00000000 */ |
/* 104 0x68 'h' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xe0, /* 11100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x6c, /* 01101100 */ |
0x76, /* 01110110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0xe6, /* 11100110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 105 0x69 'i' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 106 0x6a 'j' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x00, /* 00000000 */ |
0x0e, /* 00001110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
/* 107 0x6b 'k' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xe0, /* 11100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x66, /* 01100110 */ |
0x6c, /* 01101100 */ |
0x78, /* 01111000 */ |
0x78, /* 01111000 */ |
0x6c, /* 01101100 */ |
0x66, /* 01100110 */ |
0xe6, /* 11100110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 108 0x6c 'l' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 109 0x6d 'm' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xec, /* 11101100 */ |
0xfe, /* 11111110 */ |
0xd6, /* 11010110 */ |
0xd6, /* 11010110 */ |
0xd6, /* 11010110 */ |
0xd6, /* 11010110 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 110 0x6e 'n' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xdc, /* 11011100 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 111 0x6f 'o' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 112 0x70 'p' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xdc, /* 11011100 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x7c, /* 01111100 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0xf0, /* 11110000 */ |
0x00, /* 00000000 */ |
/* 113 0x71 'q' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x76, /* 01110110 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x7c, /* 01111100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x1e, /* 00011110 */ |
0x00, /* 00000000 */ |
/* 114 0x72 'r' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xdc, /* 11011100 */ |
0x76, /* 01110110 */ |
0x66, /* 01100110 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0xf0, /* 11110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 115 0x73 's' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0x60, /* 01100000 */ |
0x38, /* 00111000 */ |
0x0c, /* 00001100 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 116 0x74 't' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x10, /* 00010000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0xfc, /* 11111100 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x36, /* 00110110 */ |
0x1c, /* 00011100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 117 0x75 'u' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 118 0x76 'v' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x6c, /* 01101100 */ |
0x38, /* 00111000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 119 0x77 'w' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xd6, /* 11010110 */ |
0xd6, /* 11010110 */ |
0xd6, /* 11010110 */ |
0xfe, /* 11111110 */ |
0x6c, /* 01101100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 120 0x78 'x' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0x6c, /* 01101100 */ |
0x38, /* 00111000 */ |
0x38, /* 00111000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 121 0x79 'y' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7e, /* 01111110 */ |
0x06, /* 00000110 */ |
0x0c, /* 00001100 */ |
0xf8, /* 11111000 */ |
0x00, /* 00000000 */ |
/* 122 0x7a 'z' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0xcc, /* 11001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 123 0x7b '{' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x0e, /* 00001110 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x70, /* 01110000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x0e, /* 00001110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 124 0x7c '|' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 125 0x7d '}' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x70, /* 01110000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x0e, /* 00001110 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x70, /* 01110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 126 0x7e '~' */ |
0x00, /* 00000000 */ |
0x76, /* 01110110 */ |
0xdc, /* 11011100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 127 0x7f '' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x10, /* 00010000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 128 0x80 '€' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x3c, /* 00111100 */ |
0x66, /* 01100110 */ |
0xc2, /* 11000010 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc2, /* 11000010 */ |
0x66, /* 01100110 */ |
0x3c, /* 00111100 */ |
0x18, /* 00011000 */ |
0x70, /* 01110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 129 0x81 '' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xcc, /* 11001100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 130 0x82 '‚' */ |
0x00, /* 00000000 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 131 0x83 'ƒ' */ |
0x00, /* 00000000 */ |
0x10, /* 00010000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0x00, /* 00000000 */ |
0x78, /* 01111000 */ |
0x0c, /* 00001100 */ |
0x7c, /* 01111100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 132 0x84 '„' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xcc, /* 11001100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x78, /* 01111000 */ |
0x0c, /* 00001100 */ |
0x7c, /* 01111100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 133 0x85 '…' */ |
0x00, /* 00000000 */ |
0x60, /* 01100000 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x78, /* 01111000 */ |
0x0c, /* 00001100 */ |
0x7c, /* 01111100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 134 0x86 '†' */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0x38, /* 00111000 */ |
0x00, /* 00000000 */ |
0x78, /* 01111000 */ |
0x0c, /* 00001100 */ |
0x7c, /* 01111100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 135 0x87 '‡' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x18, /* 00011000 */ |
0x70, /* 01110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 136 0x88 'ˆ' */ |
0x00, /* 00000000 */ |
0x10, /* 00010000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 137 0x89 '‰' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 138 0x8a 'Š' */ |
0x00, /* 00000000 */ |
0x60, /* 01100000 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 139 0x8b '‹' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x66, /* 01100110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 140 0x8c 'Œ' */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x66, /* 01100110 */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 141 0x8d '' */ |
0x00, /* 00000000 */ |
0x60, /* 01100000 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 142 0x8e 'Ž' */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x10, /* 00010000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 143 0x8f '' */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0x38, /* 00111000 */ |
0x10, /* 00010000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 144 0x90 '' */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0x66, /* 01100110 */ |
0x62, /* 01100010 */ |
0x68, /* 01101000 */ |
0x78, /* 01111000 */ |
0x68, /* 01101000 */ |
0x62, /* 01100010 */ |
0x66, /* 01100110 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 145 0x91 '‘' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xec, /* 11101100 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x7e, /* 01111110 */ |
0xd8, /* 11011000 */ |
0xd8, /* 11011000 */ |
0x6e, /* 01101110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 146 0x92 '’' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x3e, /* 00111110 */ |
0x6c, /* 01101100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xfe, /* 11111110 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xce, /* 11001110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 147 0x93 '“' */ |
0x00, /* 00000000 */ |
0x10, /* 00010000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 148 0x94 '”' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 149 0x95 '•' */ |
0x00, /* 00000000 */ |
0x60, /* 01100000 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 150 0x96 '–' */ |
0x00, /* 00000000 */ |
0x30, /* 00110000 */ |
0x78, /* 01111000 */ |
0xcc, /* 11001100 */ |
0x00, /* 00000000 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 151 0x97 '—' */ |
0x00, /* 00000000 */ |
0x60, /* 01100000 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 152 0x98 '˜' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7e, /* 01111110 */ |
0x06, /* 00000110 */ |
0x0c, /* 00001100 */ |
0x78, /* 01111000 */ |
0x00, /* 00000000 */ |
/* 153 0x99 '™' */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 154 0x9a 'š' */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 155 0x9b '›' */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 156 0x9c 'œ' */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0x64, /* 01100100 */ |
0x60, /* 01100000 */ |
0xf0, /* 11110000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0xe6, /* 11100110 */ |
0xfc, /* 11111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 157 0x9d '' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x3c, /* 00111100 */ |
0x18, /* 00011000 */ |
0x7e, /* 01111110 */ |
0x18, /* 00011000 */ |
0x7e, /* 01111110 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 158 0x9e 'ž' */ |
0x00, /* 00000000 */ |
0xf8, /* 11111000 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xf8, /* 11111000 */ |
0xc4, /* 11000100 */ |
0xcc, /* 11001100 */ |
0xde, /* 11011110 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 159 0x9f 'Ÿ' */ |
0x00, /* 00000000 */ |
0x0e, /* 00001110 */ |
0x1b, /* 00011011 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x7e, /* 01111110 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0xd8, /* 11011000 */ |
0x70, /* 01110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 160 0xa0 ' ' */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0x00, /* 00000000 */ |
0x78, /* 01111000 */ |
0x0c, /* 00001100 */ |
0x7c, /* 01111100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 161 0xa1 '¡' */ |
0x00, /* 00000000 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 162 0xa2 '¢' */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 163 0xa3 '£' */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0x00, /* 00000000 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 164 0xa4 '¤' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x76, /* 01110110 */ |
0xdc, /* 11011100 */ |
0x00, /* 00000000 */ |
0xdc, /* 11011100 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 165 0xa5 '¥' */ |
0x76, /* 01110110 */ |
0xdc, /* 11011100 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0xe6, /* 11100110 */ |
0xf6, /* 11110110 */ |
0xfe, /* 11111110 */ |
0xde, /* 11011110 */ |
0xce, /* 11001110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 166 0xa6 '¦' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x3c, /* 00111100 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x3e, /* 00111110 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 167 0xa7 '§' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x38, /* 00111000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 168 0xa8 '¨' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x00, /* 00000000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0xc0, /* 11000000 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 169 0xa9 '©' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 170 0xaa 'ª' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 171 0xab '«' */ |
0x00, /* 00000000 */ |
0x60, /* 01100000 */ |
0xe0, /* 11100000 */ |
0x62, /* 01100010 */ |
0x66, /* 01100110 */ |
0x6c, /* 01101100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0xdc, /* 11011100 */ |
0x86, /* 10000110 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x3e, /* 00111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 172 0xac '¬' */ |
0x00, /* 00000000 */ |
0x60, /* 01100000 */ |
0xe0, /* 11100000 */ |
0x62, /* 01100010 */ |
0x66, /* 01100110 */ |
0x6c, /* 01101100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x66, /* 01100110 */ |
0xce, /* 11001110 */ |
0x9a, /* 10011010 */ |
0x3f, /* 00111111 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 173 0xad '' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x3c, /* 00111100 */ |
0x3c, /* 00111100 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 174 0xae '®' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x36, /* 00110110 */ |
0x6c, /* 01101100 */ |
0xd8, /* 11011000 */ |
0x6c, /* 01101100 */ |
0x36, /* 00110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 175 0xaf '¯' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xd8, /* 11011000 */ |
0x6c, /* 01101100 */ |
0x36, /* 00110110 */ |
0x6c, /* 01101100 */ |
0xd8, /* 11011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 176 0xb0 '°' */ |
0x11, /* 00010001 */ |
0x44, /* 01000100 */ |
0x11, /* 00010001 */ |
0x44, /* 01000100 */ |
0x11, /* 00010001 */ |
0x44, /* 01000100 */ |
0x11, /* 00010001 */ |
0x44, /* 01000100 */ |
0x11, /* 00010001 */ |
0x44, /* 01000100 */ |
0x11, /* 00010001 */ |
0x44, /* 01000100 */ |
0x11, /* 00010001 */ |
0x44, /* 01000100 */ |
0x11, /* 00010001 */ |
0x44, /* 01000100 */ |
/* 177 0xb1 '±' */ |
0x55, /* 01010101 */ |
0xaa, /* 10101010 */ |
0x55, /* 01010101 */ |
0xaa, /* 10101010 */ |
0x55, /* 01010101 */ |
0xaa, /* 10101010 */ |
0x55, /* 01010101 */ |
0xaa, /* 10101010 */ |
0x55, /* 01010101 */ |
0xaa, /* 10101010 */ |
0x55, /* 01010101 */ |
0xaa, /* 10101010 */ |
0x55, /* 01010101 */ |
0xaa, /* 10101010 */ |
0x55, /* 01010101 */ |
0xaa, /* 10101010 */ |
/* 178 0xb2 '²' */ |
0xdd, /* 11011101 */ |
0x77, /* 01110111 */ |
0xdd, /* 11011101 */ |
0x77, /* 01110111 */ |
0xdd, /* 11011101 */ |
0x77, /* 01110111 */ |
0xdd, /* 11011101 */ |
0x77, /* 01110111 */ |
0xdd, /* 11011101 */ |
0x77, /* 01110111 */ |
0xdd, /* 11011101 */ |
0x77, /* 01110111 */ |
0xdd, /* 11011101 */ |
0x77, /* 01110111 */ |
0xdd, /* 11011101 */ |
0x77, /* 01110111 */ |
/* 179 0xb3 '³' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 180 0xb4 '´' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0xf8, /* 11111000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 181 0xb5 'µ' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0xf8, /* 11111000 */ |
0x18, /* 00011000 */ |
0xf8, /* 11111000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 182 0xb6 '¶' */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0xf6, /* 11110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
/* 183 0xb7 '·' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
/* 184 0xb8 '¸' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xf8, /* 11111000 */ |
0x18, /* 00011000 */ |
0xf8, /* 11111000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 185 0xb9 '¹' */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0xf6, /* 11110110 */ |
0x06, /* 00000110 */ |
0xf6, /* 11110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
/* 186 0xba 'º' */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
/* 187 0xbb '»' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0x06, /* 00000110 */ |
0xf6, /* 11110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
/* 188 0xbc '¼' */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0xf6, /* 11110110 */ |
0x06, /* 00000110 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 189 0xbd '½' */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 190 0xbe '¾' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0xf8, /* 11111000 */ |
0x18, /* 00011000 */ |
0xf8, /* 11111000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 191 0xbf '¿' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xf8, /* 11111000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 192 0xc0 'À' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x1f, /* 00011111 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 193 0xc1 'Á' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0xff, /* 11111111 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 194 0xc2 'Â' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xff, /* 11111111 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 195 0xc3 'Ã' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x1f, /* 00011111 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 196 0xc4 'Ä' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xff, /* 11111111 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 197 0xc5 'Å' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0xff, /* 11111111 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 198 0xc6 'Æ' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x1f, /* 00011111 */ |
0x18, /* 00011000 */ |
0x1f, /* 00011111 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 199 0xc7 'Ç' */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x37, /* 00110111 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
/* 200 0xc8 'È' */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x37, /* 00110111 */ |
0x30, /* 00110000 */ |
0x3f, /* 00111111 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 201 0xc9 'É' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x3f, /* 00111111 */ |
0x30, /* 00110000 */ |
0x37, /* 00110111 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
/* 202 0xca 'Ê' */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0xf7, /* 11110111 */ |
0x00, /* 00000000 */ |
0xff, /* 11111111 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 203 0xcb 'Ë' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xff, /* 11111111 */ |
0x00, /* 00000000 */ |
0xf7, /* 11110111 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
/* 204 0xcc 'Ì' */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x37, /* 00110111 */ |
0x30, /* 00110000 */ |
0x37, /* 00110111 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
/* 205 0xcd 'Í' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xff, /* 11111111 */ |
0x00, /* 00000000 */ |
0xff, /* 11111111 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 206 0xce 'Î' */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0xf7, /* 11110111 */ |
0x00, /* 00000000 */ |
0xf7, /* 11110111 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
/* 207 0xcf 'Ï' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0xff, /* 11111111 */ |
0x00, /* 00000000 */ |
0xff, /* 11111111 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 208 0xd0 'Ð' */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0xff, /* 11111111 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 209 0xd1 'Ñ' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xff, /* 11111111 */ |
0x00, /* 00000000 */ |
0xff, /* 11111111 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 210 0xd2 'Ò' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xff, /* 11111111 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
/* 211 0xd3 'Ó' */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x3f, /* 00111111 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 212 0xd4 'Ô' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x1f, /* 00011111 */ |
0x18, /* 00011000 */ |
0x1f, /* 00011111 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 213 0xd5 'Õ' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x1f, /* 00011111 */ |
0x18, /* 00011000 */ |
0x1f, /* 00011111 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 214 0xd6 'Ö' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x3f, /* 00111111 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
/* 215 0xd7 '×' */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0xff, /* 11111111 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
/* 216 0xd8 'Ø' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0xff, /* 11111111 */ |
0x18, /* 00011000 */ |
0xff, /* 11111111 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 217 0xd9 'Ù' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0xf8, /* 11111000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 218 0xda 'Ú' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x1f, /* 00011111 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 219 0xdb 'Û' */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
/* 220 0xdc 'Ü' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
/* 221 0xdd 'Ý' */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
/* 222 0xde 'Þ' */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
/* 223 0xdf 'ß' */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 224 0xe0 'à' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x76, /* 01110110 */ |
0xdc, /* 11011100 */ |
0xd8, /* 11011000 */ |
0xd8, /* 11011000 */ |
0xd8, /* 11011000 */ |
0xdc, /* 11011100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 225 0xe1 'á' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x78, /* 01111000 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xd8, /* 11011000 */ |
0xcc, /* 11001100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xcc, /* 11001100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 226 0xe2 'â' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 227 0xe3 'ã' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 228 0xe4 'ä' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0xc6, /* 11000110 */ |
0x60, /* 01100000 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 229 0xe5 'å' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0xd8, /* 11011000 */ |
0xd8, /* 11011000 */ |
0xd8, /* 11011000 */ |
0xd8, /* 11011000 */ |
0xd8, /* 11011000 */ |
0x70, /* 01110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 230 0xe6 'æ' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x7c, /* 01111100 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0xc0, /* 11000000 */ |
0x00, /* 00000000 */ |
/* 231 0xe7 'ç' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x76, /* 01110110 */ |
0xdc, /* 11011100 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 232 0xe8 'è' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x3c, /* 00111100 */ |
0x18, /* 00011000 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 233 0xe9 'é' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x6c, /* 01101100 */ |
0x38, /* 00111000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 234 0xea 'ê' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0xee, /* 11101110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 235 0xeb 'ë' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x1e, /* 00011110 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x0c, /* 00001100 */ |
0x3e, /* 00111110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 236 0xec 'ì' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0xdb, /* 11011011 */ |
0xdb, /* 11011011 */ |
0xdb, /* 11011011 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 237 0xed 'í' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x03, /* 00000011 */ |
0x06, /* 00000110 */ |
0x7e, /* 01111110 */ |
0xdb, /* 11011011 */ |
0xdb, /* 11011011 */ |
0xf3, /* 11110011 */ |
0x7e, /* 01111110 */ |
0x60, /* 01100000 */ |
0xc0, /* 11000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 238 0xee 'î' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x1c, /* 00011100 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x7c, /* 01111100 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x30, /* 00110000 */ |
0x1c, /* 00011100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 239 0xef 'ï' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 240 0xf0 'ð' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 241 0xf1 'ñ' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x7e, /* 01111110 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 242 0xf2 'ò' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x0c, /* 00001100 */ |
0x06, /* 00000110 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 243 0xf3 'ó' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x0c, /* 00001100 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 244 0xf4 'ô' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x0e, /* 00001110 */ |
0x1b, /* 00011011 */ |
0x1b, /* 00011011 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 245 0xf5 'õ' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0xd8, /* 11011000 */ |
0xd8, /* 11011000 */ |
0xd8, /* 11011000 */ |
0x70, /* 01110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 246 0xf6 'ö' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 247 0xf7 '÷' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x76, /* 01110110 */ |
0xdc, /* 11011100 */ |
0x00, /* 00000000 */ |
0x76, /* 01110110 */ |
0xdc, /* 11011100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 248 0xf8 'ø' */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x38, /* 00111000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 249 0xf9 'ù' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 250 0xfa 'ú' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 251 0xfb 'û' */ |
0x00, /* 00000000 */ |
0x0f, /* 00001111 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0xec, /* 11101100 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x3c, /* 00111100 */ |
0x1c, /* 00011100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 252 0xfc 'ü' */ |
0x00, /* 00000000 */ |
0x6c, /* 01101100 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 253 0xfd 'ý' */ |
0x00, /* 00000000 */ |
0x3c, /* 00111100 */ |
0x66, /* 01100110 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x32, /* 00110010 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 254 0xfe 'þ' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0x7e, /* 01111110 */ |
0x7e, /* 01111110 */ |
0x7e, /* 01111110 */ |
0x7e, /* 01111110 */ |
0x7e, /* 01111110 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 255 0xff 'ÿ' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
}; |
/** @} |
*/ |
/tags/0.3.0/kernel/genarch/src/fb/helenos.xbm |
---|
0,0 → 1,163 |
#define helenos_width 127 |
#define helenos_height 120 |
static unsigned char helenos_bits[] = { |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x1f, 0x00, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
0x80, 0x0f, 0x78, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, 0xf0, 0x01, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x80, 0x81, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, |
0x0f, 0x00, 0x00, 0x83, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x06, |
0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x07, |
0x00, 0x00, 0x00, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x02, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x0c, |
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, |
0x00, 0x00, 0x00, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x0c, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, 0x80, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, |
0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x18, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x80, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, |
0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x00, 0x00, 0x00, |
0x00, 0x00, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, |
0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0xc0, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, |
0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x80, 0xc1, 0x00, 0x00, 0x00, |
0x00, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x80, |
0xc1, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
0xfe, 0x01, 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0x83, 0x01, 0x00, 0x00, |
0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, |
0x03, 0x01, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
0xff, 0x07, 0x00, 0x00, 0x06, 0x03, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0x06, 0x03, 0x00, 0x00, |
0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, |
0x0c, 0x02, 0x00, 0x00, 0x08, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
0xff, 0x0f, 0x00, 0x00, 0x0c, 0x06, 0x00, 0x00, 0x08, 0x03, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, 0xfe, 0x0f, 0x00, 0x00, 0x18, 0x04, 0x00, 0x00, |
0x08, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x1f, 0x00, 0x00, |
0x18, 0x0c, 0x00, 0x00, 0x08, 0x03, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, |
0xfc, 0x1f, 0x00, 0x00, 0x18, 0x0c, 0x00, 0x00, 0x08, 0x03, 0x00, 0x00, |
0x80, 0x1f, 0x00, 0x00, 0xfc, 0x1f, 0x00, 0x00, 0x30, 0x18, 0x00, 0x00, |
0x18, 0x02, 0x00, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0xfc, 0x3f, 0x00, 0x00, |
0x30, 0x18, 0x00, 0x00, 0x18, 0x06, 0x00, 0x00, 0xe0, 0x7f, 0x00, 0x00, |
0xf8, 0x3f, 0x00, 0x00, 0x60, 0x10, 0x00, 0x00, 0x18, 0x06, 0x00, 0x00, |
0xe0, 0x7f, 0x00, 0x00, 0xf8, 0x7f, 0x00, 0x00, 0x60, 0x30, 0x00, 0x00, |
0x38, 0x0c, 0x00, 0x00, 0xf0, 0x7f, 0x00, 0x00, 0xf0, 0x7f, 0x00, 0x00, |
0xe0, 0x20, 0x00, 0x00, 0x30, 0x0c, 0x00, 0x00, 0xe0, 0xff, 0x00, 0x00, |
0xf0, 0x7f, 0x00, 0x00, 0xc0, 0x78, 0x00, 0x00, 0x70, 0x08, 0x00, 0x00, |
0xe0, 0xff, 0x00, 0x00, 0xf0, 0xff, 0x00, 0x00, 0xc0, 0x7c, 0x00, 0x00, |
0x70, 0x18, 0x00, 0x00, 0xe0, 0xff, 0x01, 0x00, 0xf0, 0xff, 0x00, 0x00, |
0x80, 0xfd, 0x00, 0x00, 0x60, 0x3f, 0x00, 0x00, 0xc0, 0xff, 0x01, 0x00, |
0xfc, 0xff, 0x01, 0x00, 0x80, 0xf9, 0x00, 0x00, 0xe0, 0x3f, 0x00, 0x00, |
0xc0, 0xff, 0x01, 0x80, 0xff, 0xff, 0x01, 0x00, 0x80, 0xfb, 0x00, 0x00, |
0xc0, 0x7f, 0x00, 0x00, 0xc0, 0xff, 0x03, 0xe0, 0xff, 0xff, 0x03, 0x00, |
0x00, 0xf3, 0x01, 0x00, 0xc0, 0x7f, 0x00, 0x00, 0x80, 0xff, 0x03, 0xfc, |
0xff, 0xff, 0x03, 0x00, 0x00, 0xf3, 0x01, 0x00, 0xc0, 0x7f, 0x00, 0x00, |
0x80, 0xff, 0x07, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0xf6, 0x03, 0x00, |
0x80, 0xff, 0x00, 0x00, 0x00, 0xff, 0xe7, 0xff, 0xff, 0xff, 0x07, 0x00, |
0x00, 0xe6, 0x03, 0x00, 0x80, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, |
0xff, 0xff, 0x07, 0x00, 0x00, 0xec, 0x07, 0x00, 0x00, 0xff, 0x01, 0x00, |
0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0xcc, 0x07, 0x00, |
0x00, 0xff, 0x01, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x7f, 0xfe, 0x0f, 0x00, |
0x00, 0xdc, 0x07, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xfe, 0xff, 0xff, |
0x1f, 0xfe, 0x0f, 0x00, 0x00, 0xd8, 0x0f, 0x00, 0x00, 0xfe, 0x03, 0x00, |
0x00, 0xfc, 0xff, 0xff, 0x03, 0xfe, 0x1f, 0x00, 0x00, 0x98, 0x0f, 0x00, |
0x00, 0xfe, 0x03, 0x00, 0x00, 0xfc, 0xff, 0xff, 0x00, 0xfc, 0x1f, 0x00, |
0x00, 0xb0, 0x1f, 0x00, 0x00, 0xfc, 0x07, 0x00, 0x00, 0xf8, 0xff, 0x1f, |
0x00, 0xfc, 0x3f, 0x00, 0x00, 0x30, 0x1f, 0x00, 0x00, 0xfc, 0x07, 0x00, |
0x00, 0xf8, 0xff, 0x07, 0x00, 0xfc, 0x3f, 0x00, 0x00, 0x70, 0x1f, 0x00, |
0x00, 0xfc, 0x07, 0x00, 0x00, 0xf8, 0xff, 0x00, 0x00, 0xf8, 0x7f, 0x00, |
0x00, 0x60, 0x3e, 0x00, 0x00, 0xf8, 0x0f, 0x00, 0x00, 0xf0, 0x7f, 0x00, |
0x00, 0xf8, 0x7f, 0x00, 0x00, 0xe0, 0x3e, 0x00, 0x00, 0xf8, 0x0f, 0x00, |
0x00, 0xf0, 0x7f, 0x00, 0x00, 0xf0, 0x7f, 0x00, 0x00, 0xf8, 0x7e, 0x00, |
0x00, 0xf0, 0x1f, 0x00, 0x00, 0xf0, 0xff, 0x00, 0x00, 0xf0, 0xff, 0x00, |
0x00, 0xfc, 0x7c, 0x00, 0x00, 0xf0, 0x1f, 0x00, 0x00, 0xe0, 0xff, 0x00, |
0x00, 0xf0, 0xff, 0x00, 0x00, 0xfe, 0xfd, 0x00, 0x00, 0xf0, 0x1f, 0x00, |
0x00, 0xe0, 0xff, 0x01, 0x00, 0xe0, 0xff, 0x00, 0x80, 0xff, 0xf9, 0x00, |
0x00, 0xe0, 0x3f, 0x00, 0x00, 0xc0, 0xff, 0x01, 0x00, 0xe0, 0xff, 0x00, |
0xc0, 0xff, 0xfb, 0x00, 0x00, 0xe0, 0x3f, 0x00, 0x00, 0xc0, 0xff, 0x03, |
0x00, 0xc0, 0x7f, 0x00, 0xe0, 0xff, 0xfb, 0x01, 0x00, 0xc0, 0x7f, 0x00, |
0x00, 0x80, 0xff, 0x03, 0x00, 0xc0, 0x7f, 0x00, 0xf8, 0xff, 0xf7, 0x01, |
0x00, 0xc0, 0x7f, 0x00, 0x00, 0x80, 0xff, 0x03, 0x00, 0x80, 0x3f, 0x00, |
0xfc, 0xff, 0xf7, 0x03, 0x00, 0xc0, 0x7f, 0x00, 0x00, 0x80, 0xff, 0x07, |
0x00, 0x00, 0x00, 0x00, 0xfe, 0xef, 0xe7, 0x03, 0x00, 0x80, 0xff, 0x00, |
0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0x00, 0x80, 0xff, 0xdf, 0xef, 0x07, |
0x00, 0x80, 0xff, 0x00, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0x00, 0xc0, |
0xff, 0xdf, 0xef, 0x07, 0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xff, 0x0f, |
0x00, 0x00, 0x00, 0xe0, 0xff, 0xcf, 0xcf, 0x07, 0x00, 0x00, 0xff, 0x01, |
0x00, 0x00, 0xfe, 0x1f, 0x00, 0x00, 0x00, 0xf0, 0x7f, 0xc3, 0xcf, 0x0f, |
0x00, 0x00, 0xff, 0x01, 0x00, 0x00, 0xfe, 0x1f, 0x00, 0x00, 0x00, 0xfc, |
0xff, 0xe0, 0xcf, 0x0f, 0x00, 0x00, 0xfe, 0x03, 0x00, 0x00, 0xfc, 0x1f, |
0x00, 0x00, 0x00, 0xfe, 0xff, 0xf9, 0xc7, 0x0f, 0x00, 0x00, 0xfe, 0x03, |
0x00, 0x00, 0xfc, 0x1f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xe7, 0x0f, |
0x00, 0x00, 0xfc, 0x07, 0x00, 0x00, 0xf8, 0x0f, 0x00, 0x00, 0xc0, 0xff, |
0xff, 0xff, 0xe7, 0x0f, 0x00, 0x00, 0xfc, 0x07, 0x00, 0x00, 0xf8, 0x07, |
0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xe3, 0x0f, 0x00, 0x00, 0xfc, 0x0f, |
0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xf1, 0x0f, |
0x00, 0x00, 0xf8, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, |
0xff, 0xff, 0xf8, 0x0f, 0x00, 0x00, 0xf8, 0x0f, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0xfe, 0xff, 0xff, 0x3f, 0xfc, 0x0f, 0x00, 0x00, 0xf0, 0x1f, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x07, 0xfe, 0x0f, |
0x00, 0x00, 0xf0, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, |
0xff, 0x81, 0xff, 0x07, 0x00, 0x00, 0xf0, 0x3f, 0x00, 0x00, 0x00, 0x00, |
0x00, 0xe0, 0xff, 0xff, 0x3f, 0xe0, 0xff, 0x07, 0x00, 0x00, 0xe0, 0x3f, |
0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x07, 0xfc, 0xff, 0x07, |
0x00, 0x00, 0xe0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, |
0x80, 0xff, 0xff, 0x03, 0x00, 0x00, 0xc0, 0x7f, 0x00, 0x00, 0x00, 0x00, |
0x00, 0xfe, 0xff, 0x1f, 0xf0, 0xff, 0xff, 0x01, 0x00, 0x00, 0xc0, 0x7f, |
0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x07, 0xfe, 0xff, 0xff, 0x00, |
0x00, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xc0, |
0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x80, 0xbf, 0x00, 0x00, 0x00, 0x00, |
0xe0, 0xff, 0x1f, 0xf0, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x80, 0xdf, |
0x00, 0x3c, 0x00, 0x00, 0xf0, 0xff, 0x03, 0xfe, 0xff, 0xff, 0x0f, 0x00, |
0x00, 0x00, 0x00, 0xcf, 0x00, 0x7e, 0x00, 0x00, 0xfc, 0x7f, 0xc0, 0xff, |
0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x8f, 0x01, 0x7e, 0x00, 0x00, |
0xfe, 0x0f, 0xf8, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, |
0x01, 0x3e, 0x00, 0x00, 0xff, 0x03, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x9e, 0x03, 0x00, 0x00, 0xc0, 0x7f, 0xc0, 0xff, 0xff, |
0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x03, 0x00, 0x00, 0xe0, |
0x0f, 0xf8, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, |
0x03, 0x00, 0x00, 0xf8, 0x01, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x7c, 0x06, 0x00, 0x00, 0x3f, 0xe0, 0xff, 0xff, 0xff, |
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x0e, 0x00, 0xe0, 0x0f, |
0xfc, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, |
0x3c, 0x00, 0xfc, 0x01, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0xf8, 0x78, 0x80, 0x3f, 0xe0, 0xff, 0xff, 0xff, 0x00, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xe1, 0xff, 0x07, 0xfc, |
0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, |
0x81, 0xff, 0x80, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0xf0, 0x03, 0x00, 0xf0, 0xff, 0xff, 0xff, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x07, 0x00, 0xfe, 0xff, |
0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, |
0x0f, 0x00, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0xc0, 0x3f, 0xc0, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, |
0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, |
0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x1f, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x0f, 0x00, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
0xf0, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; |
/tags/0.3.0/kernel/genarch/include/ofw/ofw_tree.h |
---|
0,0 → 1,185 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#ifndef KERN_OFW_TREE_H_ |
#define KERN_OFW_TREE_H_ |
#include <arch/types.h> |
#define OFW_TREE_PROPERTY_MAX_NAMELEN 32 |
typedef struct ofw_tree_node ofw_tree_node_t; |
typedef struct ofw_tree_property ofw_tree_property_t; |
/** Memory representation of OpenFirmware device tree node. */ |
struct ofw_tree_node { |
ofw_tree_node_t *parent; |
ofw_tree_node_t *peer; |
ofw_tree_node_t *child; |
uint32_t node_handle; /**< Old OpenFirmware node handle. */ |
char *da_name; /**< Disambigued name. */ |
unsigned properties; /**< Number of properties. */ |
ofw_tree_property_t *property; |
/** |
* Pointer to a structure representing respective device. |
* Its semantics is device dependent. |
*/ |
void *device; |
}; |
/** Memory representation of OpenFirmware device tree node property. */ |
struct ofw_tree_property { |
char name[OFW_TREE_PROPERTY_MAX_NAMELEN]; |
size_t size; |
void *value; |
}; |
/* |
* Definition of 'reg' and 'ranges' properties for various buses. |
*/ |
struct ofw_fhc_reg { |
uint64_t addr; |
uint32_t size; |
} __attribute__ ((packed)); |
typedef struct ofw_fhc_reg ofw_fhc_reg_t; |
struct ofw_fhc_range { |
uint64_t child_base; |
uint64_t parent_base; |
uint32_t size; |
} __attribute__ ((packed)); |
typedef struct ofw_fhc_range ofw_fhc_range_t; |
struct ofw_central_reg { |
uint64_t addr; |
uint32_t size; |
} __attribute__ ((packed)); |
typedef struct ofw_central_reg ofw_central_reg_t; |
struct ofw_central_range { |
uint64_t child_base; |
uint64_t parent_base; |
uint32_t size; |
} __attribute__ ((packed)); |
typedef struct ofw_central_range ofw_central_range_t; |
struct ofw_ebus_reg { |
uint32_t space; |
uint32_t addr; |
uint32_t size; |
} __attribute__ ((packed)); |
typedef struct ofw_ebus_reg ofw_ebus_reg_t; |
struct ofw_ebus_range { |
uint32_t child_space; |
uint32_t child_base; |
uint32_t parent_space; |
uint64_t parent_base; /* group phys.mid and phys.lo together */ |
uint32_t size; |
} __attribute__ ((packed)); |
typedef struct ofw_ebus_range ofw_ebus_range_t; |
struct ofw_ebus_intr_map { |
uint32_t space; |
uint32_t addr; |
uint32_t intr; |
uint32_t controller_handle; |
uint32_t controller_ino; |
} __attribute__ ((packed)); |
typedef struct ofw_ebus_intr_map ofw_ebus_intr_map_t; |
struct ofw_ebus_intr_mask { |
uint32_t space_mask; |
uint32_t addr_mask; |
uint32_t intr_mask; |
} __attribute__ ((packed)); |
typedef struct ofw_ebus_intr_mask ofw_ebus_intr_mask_t; |
struct ofw_pci_reg { |
uint32_t space; /* needs to be masked to obtain pure space id */ |
uint64_t addr; /* group phys.mid and phys.lo together */ |
uint64_t size; |
} __attribute__ ((packed)); |
typedef struct ofw_pci_reg ofw_pci_reg_t; |
struct ofw_pci_range { |
uint32_t space; |
uint64_t child_base; /* group phys.mid and phys.lo together */ |
uint64_t parent_base; |
uint64_t size; |
} __attribute__ ((packed)); |
typedef struct ofw_pci_range ofw_pci_range_t; |
struct ofw_sbus_reg { |
uint64_t addr; |
uint32_t size; |
} __attribute__ ((packed)); |
typedef struct ofw_sbus_reg ofw_sbus_reg_t; |
struct ofw_sbus_range { |
uint64_t child_base; |
uint64_t parent_base; |
uint32_t size; |
} __attribute__ ((packed)); |
typedef struct ofw_sbus_range ofw_sbus_range_t; |
struct ofw_upa_reg { |
uint64_t addr; |
uint64_t size; |
} __attribute__ ((packed)); |
typedef struct ofw_upa_reg ofw_upa_reg_t; |
extern void ofw_tree_init(ofw_tree_node_t *root); |
extern void ofw_tree_print(void); |
extern const char *ofw_tree_node_name(const ofw_tree_node_t *node); |
extern ofw_tree_node_t *ofw_tree_lookup(const char *path); |
extern ofw_tree_property_t *ofw_tree_getprop(const ofw_tree_node_t *node, const char *name); |
extern ofw_tree_node_t *ofw_tree_find_child(ofw_tree_node_t *node, const char *name); |
extern ofw_tree_node_t *ofw_tree_find_child_by_device_type(ofw_tree_node_t *node, const char *device_type); |
extern ofw_tree_node_t *ofw_tree_find_peer_by_device_type(ofw_tree_node_t *node, const char *device_type); |
extern ofw_tree_node_t *ofw_tree_find_node_by_handle(ofw_tree_node_t *root, uint32_t handle); |
extern bool ofw_fhc_apply_ranges(ofw_tree_node_t *node, ofw_fhc_reg_t *reg, uintptr_t *pa); |
extern bool ofw_central_apply_ranges(ofw_tree_node_t *node, ofw_central_reg_t *reg, uintptr_t *pa); |
extern bool ofw_ebus_apply_ranges(ofw_tree_node_t *node, ofw_ebus_reg_t *reg, uintptr_t *pa); |
extern bool ofw_pci_apply_ranges(ofw_tree_node_t *node, ofw_pci_reg_t *reg, uintptr_t *pa); |
extern bool ofw_sbus_apply_ranges(ofw_tree_node_t *node, ofw_sbus_reg_t *reg, uintptr_t *pa); |
extern bool ofw_upa_apply_ranges(ofw_tree_node_t *node, ofw_upa_reg_t *reg, uintptr_t *pa); |
extern bool ofw_pci_reg_absolutize(ofw_tree_node_t *node, ofw_pci_reg_t *reg, ofw_pci_reg_t *out); |
extern bool ofw_fhc_map_interrupt(ofw_tree_node_t *node, ofw_fhc_reg_t *reg, uint32_t interrupt, int *inr); |
extern bool ofw_ebus_map_interrupt(ofw_tree_node_t *node, ofw_ebus_reg_t *reg, uint32_t interrupt, int *inr); |
extern bool ofw_pci_map_interrupt(ofw_tree_node_t *node, ofw_pci_reg_t *reg, int ino, int *inr); |
#endif |
/tags/0.3.0/kernel/genarch/include/mm/page_pt.h |
---|
0,0 → 1,133 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genarchmm |
* @{ |
*/ |
/** @file |
*/ |
/* |
* This is the generic 4-level page table interface. |
* Architectures that use hierarchical page tables |
* are supposed to implement *_ARCH macros. |
*/ |
#ifdef CONFIG_PAGE_PT |
#ifndef KERN_PAGE_PT_H_ |
#define KERN_PAGE_PT_H_ |
#include <arch/types.h> |
#include <mm/as.h> |
#include <mm/page.h> |
/* |
* Number of entries in each level. |
*/ |
#define PTL0_ENTRIES PTL0_ENTRIES_ARCH |
#define PTL1_ENTRIES PTL1_ENTRIES_ARCH |
#define PTL2_ENTRIES PTL2_ENTRIES_ARCH |
#define PTL3_ENTRIES PTL3_ENTRIES_ARCH |
/* Table sizes in each level */ |
#define PTL0_SIZE PTL0_SIZE_ARCH |
#define PTL1_SIZE PTL1_SIZE_ARCH |
#define PTL2_SIZE PTL2_SIZE_ARCH |
#define PTL3_SIZE PTL3_SIZE_ARCH |
/* |
* These macros process vaddr and extract those portions |
* of it that function as indices to respective page tables. |
*/ |
#define PTL0_INDEX(vaddr) PTL0_INDEX_ARCH(vaddr) |
#define PTL1_INDEX(vaddr) PTL1_INDEX_ARCH(vaddr) |
#define PTL2_INDEX(vaddr) PTL2_INDEX_ARCH(vaddr) |
#define PTL3_INDEX(vaddr) PTL3_INDEX_ARCH(vaddr) |
#define SET_PTL0_ADDRESS(ptl0) SET_PTL0_ADDRESS_ARCH(ptl0) |
/* |
* These macros traverse the 4-level tree of page tables, |
* each descending by one level. |
*/ |
#define GET_PTL1_ADDRESS(ptl0, i) GET_PTL1_ADDRESS_ARCH(ptl0, i) |
#define GET_PTL2_ADDRESS(ptl1, i) GET_PTL2_ADDRESS_ARCH(ptl1, i) |
#define GET_PTL3_ADDRESS(ptl2, i) GET_PTL3_ADDRESS_ARCH(ptl2, i) |
#define GET_FRAME_ADDRESS(ptl3, i) GET_FRAME_ADDRESS_ARCH(ptl3, i) |
/* |
* These macros are provided to change the shape of the 4-level tree of page |
* tables on respective level. |
*/ |
#define SET_PTL1_ADDRESS(ptl0, i, a) SET_PTL1_ADDRESS_ARCH(ptl0, i, a) |
#define SET_PTL2_ADDRESS(ptl1, i, a) SET_PTL2_ADDRESS_ARCH(ptl1, i, a) |
#define SET_PTL3_ADDRESS(ptl2, i, a) SET_PTL3_ADDRESS_ARCH(ptl2, i, a) |
#define SET_FRAME_ADDRESS(ptl3, i, a) SET_FRAME_ADDRESS_ARCH(ptl3, i, a) |
/* |
* These macros are provided to query various flags within the page tables. |
*/ |
#define GET_PTL1_FLAGS(ptl0, i) GET_PTL1_FLAGS_ARCH(ptl0, i) |
#define GET_PTL2_FLAGS(ptl1, i) GET_PTL2_FLAGS_ARCH(ptl1, i) |
#define GET_PTL3_FLAGS(ptl2, i) GET_PTL3_FLAGS_ARCH(ptl2, i) |
#define GET_FRAME_FLAGS(ptl3, i) GET_FRAME_FLAGS_ARCH(ptl3, i) |
/* |
* These macros are provided to set/clear various flags within the page tables. |
*/ |
#define SET_PTL1_FLAGS(ptl0, i, x) SET_PTL1_FLAGS_ARCH(ptl0, i, x) |
#define SET_PTL2_FLAGS(ptl1, i, x) SET_PTL2_FLAGS_ARCH(ptl1, i, x) |
#define SET_PTL3_FLAGS(ptl2, i, x) SET_PTL3_FLAGS_ARCH(ptl2, i, x) |
#define SET_FRAME_FLAGS(ptl3, i, x) SET_FRAME_FLAGS_ARCH(ptl3, i, x) |
/* |
* Macros for querying the last-level PTEs. |
*/ |
#define PTE_VALID(p) PTE_VALID_ARCH((p)) |
#define PTE_PRESENT(p) PTE_PRESENT_ARCH((p)) |
#define PTE_GET_FRAME(p) PTE_GET_FRAME_ARCH((p)) |
#define PTE_READABLE(p) 1 |
#define PTE_WRITABLE(p) PTE_WRITABLE_ARCH((p)) |
#define PTE_EXECUTABLE(p) PTE_EXECUTABLE_ARCH((p)) |
#ifndef __OBJC__ |
extern as_operations_t as_pt_operations; |
#endif |
extern page_mapping_operations_t pt_mapping_operations; |
extern void page_mapping_insert_pt(as_t *as, uintptr_t page, uintptr_t frame, |
int flags); |
extern pte_t *page_mapping_find_pt(as_t *as, uintptr_t page); |
#endif |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/genarch/include/mm/page_ht.h |
---|
0,0 → 1,75 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genarchmm |
* @{ |
*/ |
/** |
* @file |
* @brief This is the generic page hash table interface. |
*/ |
#ifdef CONFIG_PAGE_HT |
#ifndef KERN_PAGE_HT_H_ |
#define KERN_PAGE_HT_H_ |
#include <arch/types.h> |
#include <mm/as.h> |
#include <mm/page.h> |
#include <synch/mutex.h> |
#include <adt/hash_table.h> |
#define PAGE_HT_KEYS 2 |
#define KEY_AS 0 |
#define KEY_PAGE 1 |
#define PAGE_HT_ENTRIES_BITS 13 |
#define PAGE_HT_ENTRIES (1 << PAGE_HT_ENTRIES_BITS) |
/* Macros for querying page hash table PTEs. */ |
#define PTE_VALID(pte) ((pte) != NULL) |
#define PTE_PRESENT(pte) ((pte)->p != 0) |
#define PTE_GET_FRAME(pte) ((pte)->frame) |
#define PTE_READABLE(pte) 1 |
#define PTE_WRITABLE(pte) ((pte)->w != 0) |
#define PTE_EXECUTABLE(pte) ((pte)->x != 0) |
extern as_operations_t as_ht_operations; |
extern page_mapping_operations_t ht_mapping_operations; |
extern mutex_t page_ht_lock; |
extern hash_table_t page_ht; |
extern hash_table_operations_t ht_operations; |
#endif |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/genarch/include/mm/as_ht.h |
---|
0,0 → 1,65 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genarchmm |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_AS_HT_H_ |
#define KERN_AS_HT_H_ |
#include <mm/mm.h> |
#include <adt/list.h> |
#include <arch/types.h> |
typedef struct { |
} as_genarch_t; |
struct as; |
typedef struct pte { |
link_t link; /**< Page hash table link. */ |
struct as *as; /**< Address space. */ |
uintptr_t page; /**< Virtual memory page. */ |
uintptr_t frame; /**< Physical memory frame. */ |
unsigned g : 1; /**< Global page. */ |
unsigned x : 1; /**< Execute. */ |
unsigned w : 1; /**< Writable. */ |
unsigned k : 1; /**< Kernel privileges required. */ |
unsigned c : 1; /**< Cacheable. */ |
unsigned a : 1; /**< Accessed. */ |
unsigned d : 1; /**< Dirty. */ |
unsigned p : 1; /**< Present. */ |
} pte_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/genarch/include/mm/as_pt.h |
---|
0,0 → 1,51 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genarchmm |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_AS_PT_H_ |
#define KERN_AS_PT_H_ |
#include <mm/mm.h> |
#include <arch/types.h> |
#define AS_PAGE_TABLE |
typedef struct { |
/** Page table pointer. */ |
pte_t *page_table; |
} as_genarch_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/genarch/include/mm/asid_fifo.h |
---|
0,0 → 1,43 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genarchmm |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ASID_FIFO_H_ |
#define KERN_ASID_FIFO_H_ |
extern void asid_fifo_init(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/genarch/include/fb/fb.h |
---|
0,0 → 1,47 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genarch |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_FB_H_ |
#define KERN_FB_H_ |
#include <arch/types.h> |
#include <synch/spinlock.h> |
SPINLOCK_EXTERN(fb_lock); |
void fb_init(uintptr_t addr, unsigned int x, unsigned int y, unsigned int scan, unsigned int visual); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/genarch/include/fb/font-8x16.h |
---|
0,0 → 1,46 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genarch |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_FONT_8X16_H_ |
#define KERN_FONT_8X16_H_ |
#define FONT_GLIPHS 256 |
#define FONT_SCANLINES 16 |
extern unsigned char fb_font[FONT_GLIPHS * FONT_SCANLINES]; |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/genarch/include/fb/visuals.h |
---|
0,0 → 1,51 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genarch |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_VISUALS_H_ |
#define KERN_VISUALS_H_ |
#define VISUAL_INDIRECT_8 0 |
#define VISUAL_RGB_5_5_5 1 |
#define VISUAL_RGB_5_6_5 2 |
#define VISUAL_RGB_8_8_8 3 |
#define VISUAL_RGB_8_8_8_0 4 |
#define VISUAL_RGB_0_8_8_8 5 |
#define VISUAL_BGR_0_8_8_8 6 |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/genarch/include/kbd/z8530.h |
---|
0,0 → 1,57 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genarch |
* @{ |
*/ |
/** |
* @file |
* @brief Headers for Zilog 8530 serial port / keyboard driver. |
*/ |
#ifndef KERN_Z8530_H_ |
#define KERN_Z8530_H_ |
#include <console/chardev.h> |
#include <ipc/irq.h> |
extern bool z8530_belongs_to_kernel; |
extern void z8530_init(devno_t devno, inr_t inr, uintptr_t vaddr); |
extern void z8530_poll(void); |
extern void z8530_grab(void); |
extern void z8530_release(void); |
extern void z8530_interrupt(void); |
extern char z8530_key_read(chardev_t *d); |
extern irq_ownership_t z8530_claim(void); |
extern void z8530_irq_handler(irq_t *irq, void *arg, ...); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/genarch/include/kbd/ns16550.h |
---|
0,0 → 1,54 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genarch |
* @{ |
*/ |
/** |
* @file |
* @brief Headers for NS 16550 serial port / keyboard driver. |
*/ |
#ifndef KERN_NS16550_H_ |
#define KERN_NS16550_H_ |
#include <console/chardev.h> |
#include <ipc/irq.h> |
extern void ns16550_init(devno_t devno, inr_t inr, uintptr_t vaddr); |
extern void ns16550_poll(void); |
extern void ns16550_grab(void); |
extern void ns16550_release(void); |
extern char ns16550_key_read(chardev_t *d); |
extern irq_ownership_t ns16550_claim(void); |
extern void ns16550_irq_handler(irq_t *irq, void *arg, ...); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/genarch/include/kbd/i8042.h |
---|
0,0 → 1,49 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genarch |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_I8042_H_ |
#define KERN_I8042_H_ |
#include <console/chardev.h> |
extern void i8042_init(devno_t kbd_devno, inr_t kbd_inr, devno_t mouse_devno, inr_t mouse_inr); |
extern void i8042_poll(void); |
extern void i8042_grab(void); |
extern void i8042_release(void); |
extern char i8042_key_read(chardev_t *d); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/genarch/include/kbd/key.h |
---|
0,0 → 1,55 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genarch |
* @{ |
*/ |
/** |
* @file |
*/ |
#ifndef KERN_KEY_H_ |
#define KERN_KEY_H_ |
#include <arch/types.h> |
#include <console/chardev.h> |
#define KEY_RELEASE 0x80 |
extern chardev_t kbrd; |
extern void key_released(uint8_t sc); |
extern void key_pressed(uint8_t sc); |
extern uint8_t active_read_buff_read(void); |
extern void active_read_buff_write(uint8_t ch); |
extern void active_read_key_pressed(uint8_t sc); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/genarch/include/kbd/scanc_pc.h |
---|
0,0 → 1,57 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genarch |
* @{ |
*/ |
/** |
* @file |
* @brief Scan codes for pc keyboards. |
*/ |
#ifndef KERN_SCANC_PC_H_ |
#define KERN_SCANC_PC_H_ |
#define SC_ESC 0x01 |
#define SC_BACKSPACE 0x0e |
#define SC_LSHIFT 0x2a |
#define SC_RSHIFT 0x36 |
#define SC_CAPSLOCK 0x3a |
#define SC_SPEC_ESCAPE 0xe0 |
#define SC_LEFTARR 0x4b |
#define SC_RIGHTARR 0x4d |
#define SC_UPARR 0x48 |
#define SC_DOWNARR 0x50 |
#define SC_DELETE 0x53 |
#define SC_HOME 0x47 |
#define SC_END 0x4f |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/genarch/include/kbd/scanc_sun.h |
---|
0,0 → 1,57 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genarch |
* @{ |
*/ |
/** |
* @file |
* @brief Scan codes for sun keyboards. |
*/ |
#ifndef KERN_SCANC_SUN_H_ |
#define KERN_SCANC_SUN_H_ |
#define SC_ESC 0x1d |
#define SC_BACKSPACE 0x2b |
#define SC_LSHIFT 0x63 |
#define SC_RSHIFT 0x6e |
#define SC_CAPSLOCK 0x77 |
#define SC_SPEC_ESCAPE 0xe0 /* ??? */ |
#define SC_LEFTARR 0x18 |
#define SC_RIGHTARR 0x1c |
#define SC_UPARR 0x14 |
#define SC_DOWNARR 0x1b |
#define SC_DELETE 0x42 |
#define SC_HOME 0x34 |
#define SC_END 0x4a |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/genarch/include/kbd/scanc.h |
---|
0,0 → 1,47 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genarch |
* @{ |
*/ |
/** |
* @file |
*/ |
#ifndef KERN_SCANC_H_ |
#define KERN_SCANC_H_ |
#define SPECIAL '?' |
extern char sc_primary_map[]; |
extern char sc_secondary_map[]; |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/genarch/include/softint/division.h |
---|
0,0 → 1,67 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genarch |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_DIVISION_H_ |
#define KERN_DIVISION_H_ |
/* 32bit integer division */ |
int __divsi3(int a, int b); |
/* 64bit integer division */ |
long long __divdi3(long long a, long long b); |
/* 32bit unsigned integer division */ |
unsigned int __udivsi3(unsigned int a, unsigned int b); |
/* 64bit unsigned integer division */ |
unsigned long long __udivdi3(unsigned long long a, unsigned long long b); |
/* 32bit remainder of the signed division */ |
int __modsi3(int a, int b); |
/* 64bit remainder of the signed division */ |
long long __moddi3(long long a, long long b); |
/* 32bit remainder of the unsigned division */ |
unsigned int __umodsi3(unsigned int a, unsigned int b); |
/* 64bit remainder of the unsigned division */ |
unsigned long long __umoddi3(unsigned long long a, unsigned long long b); |
unsigned long long __udivmoddi3(unsigned long long a, unsigned long long b, unsigned long long *c); |
#endif |
/** @} |
*/ |
/tags/0.3.0/kernel/genarch/include/acpi/acpi.h |
---|
0,0 → 1,94 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genarch |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_ACPI_H_ |
#define KERN_ACPI_H_ |
#include <arch/types.h> |
/* Root System Description Pointer */ |
struct acpi_rsdp { |
uint8_t signature[8]; |
uint8_t checksum; |
uint8_t oemid[6]; |
uint8_t revision; |
uint32_t rsdt_address; |
uint32_t length; |
uint64_t xsdt_address; |
uint32_t ext_checksum; |
uint8_t reserved[3]; |
} __attribute__ ((packed)); |
/* System Description Table Header */ |
struct acpi_sdt_header { |
uint8_t signature[4]; |
uint32_t length; |
uint8_t revision; |
uint8_t checksum; |
uint8_t oemid[6]; |
uint8_t oem_table_id[8]; |
uint32_t oem_revision; |
uint32_t creator_id; |
uint32_t creator_revision; |
} __attribute__ ((packed));; |
struct acpi_signature_map { |
uint8_t *signature; |
struct acpi_sdt_header **sdt_ptr; |
char *description; |
}; |
/* Root System Description Table */ |
struct acpi_rsdt { |
struct acpi_sdt_header header; |
uint32_t entry[]; |
} __attribute__ ((packed));; |
/* Extended System Description Table */ |
struct acpi_xsdt { |
struct acpi_sdt_header header; |
uint64_t entry[]; |
} __attribute__ ((packed));; |
extern struct acpi_rsdp *acpi_rsdp; |
extern struct acpi_rsdt *acpi_rsdt; |
extern struct acpi_xsdt *acpi_xsdt; |
extern void acpi_init(void); |
extern int acpi_sdt_check(uint8_t *sdt); |
#endif /* KERN_ACPI_H_ */ |
/** @} |
*/ |
/tags/0.3.0/kernel/genarch/include/acpi/madt.h |
---|
0,0 → 1,149 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genarch |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KERN_MADT_H_ |
#define KERN_MADT_H_ |
#include <genarch/acpi/acpi.h> |
#include <arch/smp/apic.h> |
#include <arch/smp/smp.h> |
#define MADT_L_APIC 0 |
#define MADT_IO_APIC 1 |
#define MADT_INTR_SRC_OVRD 2 |
#define MADT_NMI_SRC 3 |
#define MADT_L_APIC_NMI 4 |
#define MADT_L_APIC_ADDR_OVRD 5 |
#define MADT_IO_SAPIC 6 |
#define MADT_L_SAPIC 7 |
#define MADT_PLATFORM_INTR_SRC 8 |
#define MADT_RESERVED_SKIP_BEGIN 9 |
#define MADT_RESERVED_SKIP_END 127 |
#define MADT_RESERVED_OEM_BEGIN 128 |
struct madt_apic_header { |
uint8_t type; |
uint8_t length; |
} __attribute__ ((packed)); |
/* Multiple APIC Description Table */ |
struct acpi_madt { |
struct acpi_sdt_header header; |
uint32_t l_apic_address; |
uint32_t flags; |
struct madt_apic_header apic_header[]; |
} __attribute__ ((packed)); |
struct madt_l_apic { |
struct madt_apic_header header; |
uint8_t acpi_id; |
uint8_t apic_id; |
uint32_t flags; |
} __attribute__ ((packed)); |
struct madt_io_apic { |
struct madt_apic_header header; |
uint8_t io_apic_id; |
uint8_t reserved; |
uint32_t io_apic_address; |
uint32_t global_intr_base; |
} __attribute__ ((packed)); |
struct madt_intr_src_ovrd { |
struct madt_apic_header header; |
uint8_t bus; |
uint8_t source; |
uint32_t global_int; |
uint16_t flags; |
} __attribute__ ((packed)); |
struct madt_nmi_src { |
struct madt_apic_header header; |
uint16_t flags; |
uint32_t global_intr; |
} __attribute__ ((packed)); |
struct madt_l_apic_nmi { |
struct madt_apic_header header; |
uint8_t acpi_id; |
uint16_t flags; |
uint8_t l_apic_lint; |
} __attribute__ ((packed)); |
struct madt_l_apic_addr_ovrd { |
struct madt_apic_header header; |
uint16_t reserved; |
uint64_t l_apic_address; |
} __attribute__ ((packed)); |
struct madt_io_sapic { |
struct madt_apic_header header; |
uint8_t io_apic_id; |
uint8_t reserved; |
uint32_t global_intr_base; |
uint64_t io_apic_address; |
} __attribute__ ((packed)); |
struct madt_l_sapic { |
struct madt_apic_header header; |
uint8_t acpi_id; |
uint8_t sapic_id; |
uint8_t sapic_eid; |
uint8_t reserved[3]; |
uint32_t flags; |
uint32_t acpi_processor_uid_value; |
uint8_t acpi_processor_uid_str[1]; |
} __attribute__ ((packed)); |
struct madt_platform_intr_src { |
struct madt_apic_header header; |
uint16_t flags; |
uint8_t intr_type; |
uint8_t processor_id; |
uint8_t processor_eid; |
uint8_t io_sapic_vector; |
uint32_t global_intr; |
uint32_t platform_intr_src_flags; |
} __attribute__ ((packed)); |
extern struct acpi_madt *acpi_madt; |
extern struct smp_config_operations madt_config_operations; |
extern void acpi_madt_parse(void); |
#endif /* KERN_MADT_H_ */ |
/** @} |
*/ |
/tags/0.3.0/kernel/genarch/Makefile.inc |
---|
0,0 → 1,104 |
# Copyright (c) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
## Accepted configuration directives |
# |
ifeq ($(CONFIG_ACPI),y) |
GENARCH_SOURCES += \ |
genarch/src/acpi/acpi.c \ |
genarch/src/acpi/madt.c |
endif |
ifeq ($(CONFIG_PAGE_PT),y) |
GENARCH_SOURCES += \ |
genarch/src/mm/page_pt.c \ |
genarch/src/mm/as_pt.c |
endif |
ifeq ($(CONFIG_PAGE_HT),y) |
GENARCH_SOURCES += \ |
genarch/src/mm/page_ht.c \ |
genarch/src/mm/as_ht.c |
endif |
ifeq ($(CONFIG_ASID),y) |
GENARCH_SOURCES += \ |
genarch/src/mm/asid.c |
endif |
ifeq ($(CONFIG_ASID_FIFO),y) |
GENARCH_SOURCES += \ |
genarch/src/mm/asid_fifo.c |
endif |
ifeq ($(CONFIG_SOFTINT),y) |
GENARCH_SOURCES += \ |
genarch/src/softint/division.c |
endif |
## Framebuffer |
ifeq ($(CONFIG_FB),y) |
GENARCH_SOURCES += \ |
genarch/src/fb/font-8x16.c \ |
genarch/src/fb/fb.c |
DEFS += -DCONFIG_FB |
endif |
## i8042 controller |
ifeq ($(CONFIG_I8042),y) |
GENARCH_SOURCES += \ |
genarch/src/kbd/i8042.c \ |
genarch/src/kbd/key.c \ |
genarch/src/kbd/scanc_pc.c |
endif |
## Sun keyboard |
ifeq ($(CONFIG_SUN_KBD),y) |
GENARCH_SOURCES += \ |
genarch/src/kbd/key.c \ |
genarch/src/kbd/scanc_sun.c |
endif |
## z8530 controller |
ifeq ($(CONFIG_Z8530),y) |
GENARCH_SOURCES += \ |
genarch/src/kbd/z8530.c |
endif |
## ns16550 controller |
ifeq ($(CONFIG_NS16550),y) |
GENARCH_SOURCES += \ |
genarch/src/kbd/ns16550.c |
endif |
## OpenFirmware Device Tree |
ifeq ($(CONFIG_OFW_TREE), y) |
GENARCH_SOURCES += \ |
genarch/src/ofw/ofw_tree.c \ |
genarch/src/ofw/ebus.c \ |
genarch/src/ofw/fhc.c \ |
genarch/src/ofw/pci.c \ |
genarch/src/ofw/sbus.c \ |
genarch/src/ofw/upa.c |
endif |
/tags/0.3.0/kernel/kernel.config |
---|
0,0 → 1,150 |
## General configuration directives |
# Architecture |
@ "amd64" AMD64/Intel EM64T |
@ "arm32" ARM 32-bit |
@ "ia32" Intel IA-32 |
@ "ia32xen" Intel IA-32 on Xen hypervisor |
@ "ia64" Intel IA-64 |
@ "mips32" MIPS 32-bit |
@ "ppc32" PowerPC 32-bit |
@ "ppc64" PowerPC 64-bit |
@ "sparc64" Sun UltraSPARC 64-bit |
! ARCH (choice) |
# Compiler |
@ "gcc_cross" GCC Cross-compiler |
@ "gcc_native" GCC Native |
@ "icc_native" ICC Native |
@ "suncc_native" Sun Studio C Compiler |
! [ARCH=amd64|ARCH=ia32|ARCH=ia32xen] COMPILER (choice) |
# Compiler |
@ "gcc_cross" GCC Cross-compiler |
@ "gcc_native" GCC Native |
@ "icc_native" ICC Native |
! [ARCH=ia64] COMPILER (choice) |
# Compiler |
@ "gcc_cross" GCC Cross-compiler |
@ "gcc_native" GCC Native |
@ "suncc_native" Sun Studio C Compiler |
! [ARCH=sparc64] COMPILER (choice) |
# Compiler |
@ "gcc_cross" GCC Cross-compiler |
@ "gcc_native" GCC Native |
! [ARCH=arm32|ARCH=mips32|ARCH=ppc32|ARCH=ppc64] COMPILER (choice) |
# CPU type |
@ "pentium4" Pentium 4 |
@ "pentium3" Pentium 3 |
@ "core" Core Solo/Duo |
@ "athlon-xp" Athlon XP |
@ "athlon-mp" Athlon MP |
! [ARCH=ia32|ARCH=ia32xen] MACHINE (choice) |
# CPU type |
@ "opteron" Opteron |
! [ARCH=amd64] MACHINE (choice) |
# Machine type |
@ "msim" MSIM Simulator |
@ "simics" Virtutech Simics simulator |
@ "lgxemul" GXEmul Little Endian |
@ "bgxemul" GXEmul Big Endian |
@ "indy" SGI Indy |
! [ARCH=mips32] MACHINE (choice) |
# Machine type |
@ "gxemul_testarm" GXEmul testarm |
! [ARCH=arm32] MACHINE (choice) |
# Framebuffer support |
! [(ARCH=mips32&MACHINE=lgxemul)|(ARCH=mips32&MACHINE=bgxemul)|(ARCH=ia32)|(ARCH=amd64)|(ARCH=arm32&MACHINE=gxemul_testarm)] CONFIG_FB (y/n) |
# Framebuffer width |
@ "640" |
@ "800" |
@ "1024" |
@ "1152" |
@ "1280" |
@ "1400" |
@ "1440" |
@ "1600" |
@ "2048" |
! [(ARCH=ia32|ARCH=amd64)&CONFIG_FB=y] CONFIG_VESA_WIDTH (choice) |
# Framebuffer height |
@ "480" |
@ "600" |
@ "768" |
@ "852" |
@ "900" |
@ "960" |
@ "1024" |
@ "1050" |
@ "1200" |
@ "1536" |
! [(ARCH=ia32|ARCH=amd64)&CONFIG_FB=y] CONFIG_VESA_HEIGHT (choice) |
# Framebuffer depth |
@ "8" |
@ "16" |
@ "24" |
! [(ARCH=ia32|ARCH=amd64)&CONFIG_FB=y] CONFIG_VESA_BPP (choice) |
# Support for SMP |
! [ARCH=ia32|ARCH=amd64|ARCH=ia32xen|ARCH=sparc64] CONFIG_SMP (y/n) |
# Improved support for hyperthreading |
! [(ARCH=ia32|ARCH=amd64|ARCH=ia32xen)&CONFIG_SMP=y] CONFIG_HT (y/n) |
# Simics BIOS AP boot fix |
! [(ARCH=ia32|ARCH=amd64)&CONFIG_SMP=y] CONFIG_SIMICS_FIX (y/n) |
# Lazy FPU context switching |
! [(ARCH=mips32&MACHINE!=msim&MACHINE!=simics)|ARCH=amd64|ARCH=ia32|ARCH=ia64|ARCH=sparc64|ARCH=ia32xen] CONFIG_FPU_LAZY (y/n) |
# Use VHPT |
! [ARCH=ia64] CONFIG_VHPT (n/y) |
# Use TSB |
! [ARCH=sparc64] CONFIG_TSB (y/n) |
# Support for Z8530 serial port |
! [ARCH=sparc64] CONFIG_Z8530 (y/n) |
# Support for NS16550 serial port |
! [ARCH=sparc64] CONFIG_NS16550 (y/n) |
# Virtually indexed D-cache support |
! [ARCH=sparc64] CONFIG_VIRT_IDX_DCACHE (y/n) |
## Debugging configuration directives |
# General debuging and assert checking |
! CONFIG_DEBUG (y/n) |
# Deadlock detection support for spinlocks |
! [CONFIG_DEBUG=y&CONFIG_SMP=y] CONFIG_DEBUG_SPINLOCK (y/n) |
# Watchpoint on rewriting AS with zero |
! [CONFIG_DEBUG=y&(ARCH=amd64|ARCH=ia32|ARCH=ia32xen)] CONFIG_DEBUG_AS_WATCHPOINT (y/n) |
# Save all interrupt registers |
! [CONFIG_DEBUG=y&(ARCH=amd64|ARCH=mips32|ARCH=ia32|ARCH=ia32xen)] CONFIG_DEBUG_ALLREGS (y/n) |
## Run-time configuration directives |
# Compile kernel tests |
! CONFIG_TEST (y/n) |
## Experimental features |
# Enable experimental features |
! CONFIG_EXPERIMENTAL (n/y) |
/tags/0.3.0/kernel/doc/AUTHORS |
---|
0,0 → 1,12 |
Jakub Jermar <jermar@helenos.eu> |
Martin Decky <decky@helenos.eu> |
Ondrej Palkovsky <palkovsky@helenos.eu> |
Jakub Vana <vana@helenos.eu> |
Josef Cejka <cejka@helenos.eu> |
Michal Kebrt <michalek.k@seznam.cz> |
Sergey Bondari <bondari@helenos.eu> |
Pavel Jancik <alfik.009@seznam.cz> |
Petr Stepan <stepan.petr@volny.cz> |
Michal Konopa <mkonopa@seznam.cz> |
Vojtech Mencl |
/tags/0.3.0/kernel/doc/doxygroups.h |
---|
0,0 → 1,433 |
/* Definitions of modules and its relations for generating Doxygen documentation */ |
/** @defgroup genericadt Data types |
* @ingroup kernel |
*/ |
/** @defgroup main Kernel initialization |
* @ingroup others |
*/ |
/** @defgroup genericconsole Kernel console |
* @ingroup others |
*/ |
/** |
* @defgroup time Time management |
* @ingroup kernel |
*/ |
/** |
* @defgroup proc Scheduling |
* @ingroup kernel |
*/ |
/** @defgroup genericproc generic |
* @ingroup proc |
*/ |
/** |
* @cond amd64 |
* @defgroup amd64proc amd64 |
* @ingroup proc |
* @endcond |
*/ |
/** |
* @cond arm32 |
* @defgroup arm32proc arm32 |
* @ingroup proc |
* @endcond |
*/ |
/** |
* @cond ia32 |
* @defgroup ia32proc ia32 |
* @ingroup proc |
* @endcond |
*/ |
/** |
* @cond ia64 |
* @defgroup ia64proc ia64 |
* @ingroup proc |
* @endcond |
*/ |
/** |
* @cond mips32 |
* @defgroup mips32proc mips32 |
* @ingroup proc |
* @endcond |
*/ |
/** |
* @cond ppc32 |
* @defgroup ppc32proc ppc32 |
* @ingroup proc |
* @endcond |
*/ |
/** |
* @cond ppc64 |
* @defgroup ppc64proc ppc64 |
* @ingroup proc |
* @endcond |
*/ |
/** |
* @cond sparc64 |
* @defgroup sparc64proc sparc64 |
* @ingroup proc |
* @endcond |
*/ |
/** @defgroup sync Synchronization |
* @ingroup kernel |
*/ |
/** @defgroup mm Memory management |
* @ingroup kernel |
*/ |
/** |
* @defgroup genericmm generic |
* @ingroup mm |
*/ |
/** |
* @defgroup genarchmm genarch |
* @ingroup mm |
*/ |
/** |
* @cond amd64 |
* @defgroup amd64mm amd64 |
* @ingroup mm |
* @endcond |
*/ |
/** |
* @cond arm32 |
* @defgroup arm32mm arm32 |
* @ingroup mm |
* @endcond |
*/ |
/** |
* @cond ia32 |
* @defgroup ia32mm ia32 |
* @ingroup mm |
* @endcond |
*/ |
/** |
* @cond ia64 |
* @defgroup ia64mm ia64 |
* @ingroup mm |
* @endcond |
*/ |
/** |
* @cond mips32 |
* @defgroup mips32mm mips32 |
* @ingroup mm |
* @endcond |
*/ |
/** |
* @cond ppc32 |
* @defgroup ppc32mm ppc32 |
* @ingroup mm |
* @endcond |
*/ |
/** |
* @cond ppc64 |
* @defgroup ppc64mm ppc64 |
* @ingroup mm |
* @endcond |
*/ |
/** |
* @cond sparc64 |
* @defgroup sparc64mm sparc64 |
* @ingroup mm |
* @endcond |
*/ |
/** @defgroup genericipc IPC |
* @ingroup kernel |
*/ |
/** @defgroup genericklog KLog |
* @brief Kernel logging facility |
* @ingroup genericconsole |
*/ |
/** @defgroup ddi Device Driver Interface |
* @ingroup kernel |
*/ |
/** @defgroup genericddi generic |
* @ingroup ddi |
*/ |
/** |
* @cond amd64 |
* @defgroup amd64ddi amd64 |
* @ingroup ddi |
* @endcond |
*/ |
/** |
* @cond arm32 |
* @defgroup arm32ddi arm32 |
* @ingroup ddi |
* @endcond |
*/ |
/** |
* @cond ia32 |
* @defgroup ia32ddi ia32 |
* @ingroup ddi |
* @endcond |
*/ |
/** |
* @cond ia64 |
* @defgroup ia64ddi ia64 |
* @ingroup ddi |
* @endcond |
*/ |
/** |
* @cond mips32 |
* @defgroup mips32ddi mips32 |
* @ingroup ddi |
* @endcond |
*/ |
/** |
* @cond ppc32 |
* @defgroup ppc32ddi ppc32 |
* @ingroup ddi |
* @endcond |
*/ |
/** |
* @cond ppc64 |
* @defgroup ppc64ddi ppc64 |
* @ingroup ddi |
* @endcond |
*/ |
/** |
* @cond sparc64 |
* @defgroup sparc64ddi sparc64 |
* @ingroup ddi |
* @endcond |
*/ |
/** @defgroup debug Debugging |
* @ingroup others |
*/ |
/** @defgroup genericdebug generic |
* @ingroup debug |
*/ |
/** |
* @cond amd64 |
* @defgroup amd64debug ia32/amd64 |
* @ingroup debug |
* @endcond |
*/ |
/** |
* @cond arm32 |
* @defgroup arm32debug arm32 |
* @ingroup debug |
* @endcond |
*/ |
/** |
* @cond ia32 |
* @defgroup amd64debug ia32/amd64 |
* @ingroup debug |
* @endcond |
*/ |
/** |
* @cond ia64 |
* @defgroup ia64debug ia64 |
* @ingroup debug |
* @endcond |
*/ |
/** |
* @cond mips32 |
* @defgroup mips32debug mips32 |
* @ingroup debug |
* @endcond |
*/ |
/** |
* @cond ppc32 |
* @defgroup ppc32debug ppc32 |
* @ingroup debug |
* @endcond |
*/ |
/** |
* @cond ppc64 |
* @defgroup ppc64debug ppc64 |
* @ingroup debug |
* @endcond |
*/ |
/** |
* @cond sparc64 |
* @defgroup sparc64debug sparc64 |
* @ingroup debug |
* @endcond |
*/ |
/** @defgroup interrupt Interrupt handling and dispatching |
* @ingroup kernel |
*/ |
/** |
* @defgroup genericinterrupt generic |
* @ingroup interrupt |
*/ |
/** |
* @cond amd64 |
* @defgroup amd64interrupt amd64 |
* @ingroup interrupt |
* @endcond |
*/ |
/** |
* @cond arm32 |
* @defgroup arm32interrupt arm32 |
* @ingroup interrupt |
* @endcond |
*/ |
/** |
* @cond ia32 |
* @defgroup ia32interrupt ia32 |
* @ingroup interrupt |
* @endcond |
*/ |
/** |
* @cond ia64 |
* @defgroup ia64interrupt ia64 |
* @ingroup interrupt |
* @endcond |
*/ |
/** |
* @cond mips32 |
* @defgroup mips32interrupt mips32 |
* @ingroup interrupt |
* @endcond |
*/ |
/** |
* @cond ppc32 |
* @defgroup ppc32interrupt ppc32 |
* @ingroup interrupt |
* @endcond |
*/ |
/** |
* @cond ppc64 |
* @defgroup ppc64interrupt ppc64 |
* @ingroup interrupt |
* @endcond |
*/ |
/** |
* @cond sparc64 |
* @defgroup sparc64interrupt sparc64 |
* @ingroup interrupt |
* @endcond |
*/ |
/** @defgroup others Miscellanea |
* @ingroup kernel |
*/ |
/** @defgroup generic generic |
* @ingroup others |
*/ |
/** @defgroup genarch genarch |
* @ingroup others |
*/ |
/** |
* @cond amd64 |
* @defgroup amd64 amd64 |
* @ingroup others |
* @endcond |
*/ |
/** |
* @cond arm32 |
* @defgroup arm32 arm32 |
* @ingroup others |
* @endcond |
*/ |
/** |
* @cond ia32 |
* @defgroup ia32 ia32 |
* @ingroup others |
* @endcond |
*/ |
/** |
* @cond ia64 |
* @defgroup ia64 ia64 |
* @ingroup others |
* @endcond |
*/ |
/** |
* @cond mips32 |
* @defgroup mips32 mips32 |
* @ingroup others |
* @endcond |
*/ |
/** |
* @cond ppc32 |
* @defgroup ppc32 ppc32 |
* @ingroup others |
* @endcond |
*/ |
/** |
* @cond ppc64 |
* @defgroup ppc64 ppc64 |
* @ingroup others |
* @endcond |
*/ |
/** |
* @cond sparc64 |
* @defgroup sparc64 sparc64 |
* @ingroup others |
* @endcond |
*/ |
/tags/0.3.0/kernel/doc/arch/arm32 |
---|
0,0 → 1,16 |
arm32 port |
========== |
arm32 port is the ninth port of SPARTAN, originally written by Michal Kebrt, |
Petr Stepan, Pavel Jancik. The goal is to support 32-bit ARM architecture. |
So far, it runs only in emulator. |
HARDWARE REQUIREMENTS |
o no real hardware supported |
EMULATORS AND VIRTUALIZERS |
o GXemul |
TOOLCHAIN REQUIREMENTS |
o binutils 2.17 |
o gcc 4.1.1 |
/tags/0.3.0/kernel/doc/arch/mips32 |
---|
0,0 → 1,24 |
mips32 port |
=========== |
mips32 is the second port of SPARTAN kernel originally written by Jakub Jermar. |
It was first developed to run on MIPS R4000 32-bit simulator. |
Now it can run on real hardware as well. |
It can be compiled and run either as little- or big-endian. |
HARDWARE REQUIREMENTS |
o SGI Indy R4600 |
o emulated MIPS 4K CPU |
CPU |
o QED R4600 |
EMULATORS AND VIRTUALIZERS |
o msim 1.2.12 |
o gxemul - both big and little endian |
o simics 2.2.19 |
TOOLCHAIN REQUIREMENTS |
o binutils 2.16, 2.16.1 |
o gcc 4.0.1, 4.1.0, 4.1.1 |
o older versions may do as well, but are now obsoleted |
/tags/0.3.0/kernel/doc/arch/sparc64 |
---|
0,0 → 1,25 |
sparc64 port |
============ |
Currently, this porting effort is subject to |
Jakub Jermar's work on his master thesis. |
The goal is to provide support for UltraSPARC |
implementation of SPARC V9 architecture. |
MACHINES |
o Sun Ultra 5 |
o Sun Ultra 60 |
o Sun Enterprise E6500 (simulated) |
CPU |
o UltraSPARC II |
o UltraSPARC IIi |
SIMULATORS |
o simics 2.2.19, simics 3.0.17, simics 3.0.21 |
TOOLCHAIN REQUIREMENTS |
o binutils 2.17 |
o gcc 4.1.1 |
o older versions may do as well, but are now obsoleted |
/tags/0.3.0/kernel/doc/arch/amd64 |
---|
0,0 → 1,35 |
amd64 port |
========== |
The fifth port, amd64 port, was originally written by Ondrej Palkovsky. |
The goal is to support AMD64 and Intel Extended Memory 64 Technology PC's. |
The port makes use of portable parts of ia32. |
Both uniprocessors and multiprocessors are supported. |
The kernel runs on real hardware and in simulators too. |
HARDWARE REQUIREMENTS |
o AMD64 architecture processor |
o Intel Extended Memory 64 Technology processor |
CPU |
o Intel Xeon with Intel Extended Memory 64 Technology |
o AMD Athlon 64 |
SMP COMPATIBILITY |
o Bochs 2.2.1 - 2.2.6 |
o 2x-8x AMD64 CPU |
o Simics 2.2.19 |
o 2x-15x AMD hammer CPU |
o QEMU 0.8.0 - QEMU 0.8.1 |
o 2x-15x CPU |
o HP ProLiant ML350 (HyperThreading) |
EMULATORS AND VIRTUALIZERS |
o Bochs 2.2.6 |
o Simics 2.2.19 |
o QEMU 0.8.1 |
TOOLCHAIN REQUIREMENTS |
o binutils 2.16, 2.16.1 |
o gcc 4.0.1, 4.1.0, 4.1.1 |
o older versions may do as well, but are now obsoleted |
/tags/0.3.0/kernel/doc/arch/ia64 |
---|
0,0 → 1,16 |
ia64 port |
========= |
ia64 port is the third port of SPARTAN originally written by Jakub Jermar. |
It is still in its early stages. It runs on HP Ski simulator of IA-64 architecture. |
HARDWARE REQUIREMENTS |
o no real hardware supported |
EMULATORS AND VIRTUALIZERS |
o ski |
TOOLCHAIN REQUIREMENTS |
o binutils 2.15, 2.16, 2.16.1 |
o gcc 4.0.0, 4.0.1, 4.1.0, 4.1.1 |
o older versions may do as well, but are now obsoleted |
/tags/0.3.0/kernel/doc/arch/ppc32 |
---|
0,0 → 1,16 |
ppc32 port |
========== |
ppc32 port is the fourth port of SPARTAN, originally written by Martin Decky. |
The goal is to support 32-bit PowerPC architecture. |
So far, it runs only in emulator. |
HARDWARE REQUIREMENTS |
o no real hardware supported |
EMULATORS AND VIRTUALIZERS |
o PearPC |
TOOLCHAIN REQUIREMENTS |
o binutils 2.16 |
o gcc 4.0.1, 4.1.0, 4.1.1 |
/tags/0.3.0/kernel/doc/arch/ia32 |
---|
0,0 → 1,40 |
ia32 port |
========= |
ia32 port is the oldest and the most advanced one. |
It was originally written by Jakub Jermar. |
It is meant to support ordinary PC's based on IA-32 architecture. |
Both uniprocessor and multiprocessor modes are supported. |
It runs both in emulated environment and on real hardware. |
HARDWARE REQUIREMENTS |
o IA-32 processor (Pentium and successors) |
SMP COMPATIBILITY |
o Bochs 2.0.2 - Bochs 2.2.6 |
o 2x-8x 686 CPU |
o Simics 2.0.28 - Simics 2.2.19 |
o 2x-15x Pentium 4 CPU |
o VMware Workstation 5.5 |
o 2x CPU |
o QEMU 0.8.0 - QEMU 0.8.1 |
o 2x-15x CPU |
o ASUS P/I-P65UP5 + ASUS C-P55T2D REV. 1.41 |
o 2x 200Mhz Pentium CPU |
o ASUS PCH-DL |
o 2x 3000Mhz Pentium 4 Xeon (HT) CPU |
o MSI K7D Master-L |
o 2x 2100MHz Athlon MP CPU |
o ECS 865PE-A REV : 2.0 |
o 1x 2800MHz Pentium 4 Prescott (HT) CPU |
EMULATORS AND VIRTUALIZERS |
o Bochs 2.0.2 - Bochs 2.2.6 |
o VMware Workstation 4, VMware Workstation 5, VMware Workstation 5.5 |
o Simics 2.2.19 |
o QEMU 0.8.0 - QEMU 0.8.1 |
TOOLCHAIN REQUIREMENTS |
o binutils 2.15, 2.16, 2.16.1 |
o gcc 3.3.5, 4.0.1, 4.1.0, 4.1.1 |
o older versions may do as well, but are now obsoleted |
/tags/0.3.0/kernel/doc/mm |
---|
0,0 → 1,87 |
Memory management |
================= |
1. Virtual Address Translation |
1.1 Hierarchical 4-level per address space page tables |
SPARTAN kernel deploys generic interface for 4-level page tables |
for these architectures: amd64, ia32, mips32 and ppc32. In this |
setting, page tables are hierarchical and are not shared by |
address spaces (i.e. one set of page tables per address space). |
VADDR |
+-----------------------------------------------------------------------------+ |
| PTL0_INDEX | PTL1_INDEX | PTL2_INDEX | PTL3_INDEX | OFFSET | |
+-----------------------------------------------------------------------------+ |
PTL0 PTL1 PTL2 PTL3 |
+--------+ +--------+ +--------+ +--------+ |
| | | | | PTL3 | -----\ | | |
| | | | +--------+ | | | |
| | +--------+ | | | | | |
| | | PTL2 | -----\ | | | | | |
| | +--------+ | | | | | | |
| | | | | | | | +--------+ |
+--------+ | | | | | | | FRAME | |
| PTL1 | -----\ | | | | | | +--------+ |
+--------+ | | | | | | | | | |
| | | | | | | | | | | |
| | | | | | | | | | | |
+--------+ \----> +--------+ \----> +--------+ \----> +--------+ |
^ |
| |
| |
+--------+ |
| PTL0 | |
+--------+ |
PTL0 Page Table Level 0 (Page Directory) |
PTL1 Page Table Level 1 |
PTL2 Page Table Level 2 |
PTL3 Page Table Level 3 |
PTL0_INDEX Index into PTL0 |
PTL1_INDEX Index into PTL1 |
PTL2_INDEX Index into PTL2 |
PTL3_INDEX Index into PTL3 |
VADDR Virtual address for which mapping is looked up |
FRAME Physical address of memory frame to which VADDR is mapped |
On architectures whose hardware has fewer levels, PTL2 and, if need be, PTL1 are |
left out. TLB-only architectures are to define custom format for software page |
tables. |
1.2 Single global page hash table |
Generic page hash table interface is deployed on 64-bit architectures without |
implied hardware support for hierarchical page tables, i.e. ia64 and sparc64. |
There is only one global page hash table in the system shared by all address |
spaces. |
2. Memory allocators |
2.1 General allocator |
'malloc' function accepts flags as a second argument. The flags are directly |
passed to the underlying frame_alloc function. |
1) If the flags parameter contains FRAME_ATOMIC, the allocator will not sleep. |
The allocator CAN return NULL, when memory is not directly available. |
The caller MUST check if NULL was not returned |
2) If the flags parameter does not contain FRAME_ATOMIC, the allocator |
will never return NULL, but it CAN sleep indefinitely. The caller |
does not have to check the return value. |
3) The maximum size that can be allocated using malloc is 256K |
Rules 1) and 2) apply to slab_alloc as well. Using SLAB allocator |
to allocate too large values is not recommended. |
/tags/0.3.0/kernel/doc/BUGS_FOUND |
---|
0,0 → 1,23 |
During development of this operating system, there were found bugs in: |
Simics |
====== |
- ia32 BIOS rewrites memory during AP start in SMP environment (#3351) |
- ia32 Simics does not report #GP when EFER.NXE is 0 and finds NX page (#4214) |
- incorrect MIPS instructions MSUB, MSUBU |
Bochs |
===== |
- FXSAVE/FXRSTOR not working correctly with XMM registers (patch #1282033) |
Msim |
==== |
- Incorrect interpretation of lwl/lwr/swl/swr instructions |
- Omitted excMod case in write_proc_mem() |
- Incorrect signed multiplication |
Gcc |
=== |
- Incorrect generation of unaligned data access instructions |
(lwl/lwr/swl/swr) when using mipsel- target and -EB(big endian) |
compilation, -O2 (#23824) |
/tags/0.3.0/kernel/doc/build |
---|
0,0 → 1,14 |
Following make targets are supported: |
make, make all |
- Check configuration, build |
make config |
- Start kernel configuration program |
make clean |
- Clean build temporary files |
make distclean |
- Clean everything including configuration |
/tags/0.3.0/kernel/doc/synchronization |
---|
0,0 → 1,29 |
SPINNING LOCKS |
spinlock_lock, spinlock_trylock, spinlock_unlock |
+------------+ |
| spinlock_t | |
+------------+ |
WAIT QUEUES |
waitq_sleep_timeout, waitq_wakeup |
+---------+ |
| waitq_t | |
+---------+ |
/ \ |
SEMAPHORES / \ CONDITION VARIABLES |
semaphore_down_timeout, semaphore_up condvar_wait_timeout, condvar_signal |
+--------------+ / \ +-----------+ |
| semaphore_t |<-+ +->| condvar_t | |
+--------------+ +-----------+ |
| ^ |
| | |
| +------+ |
V / |
MUTEXES / READERS/WRITERS LOCKS |
mutex_lock_timeout, mutex_unlock rwlock_reader/writer_lock_timeout, rwlock_unlock |
+---------+ / +----------+ |
| mutex_t |------------------------------->| rwlock_t | |
+---------+ / +----------+ |
| / |
+------------------------+ |
/tags/0.3.0/kernel/tools/amd64/decpt.py |
---|
0,0 → 1,25 |
#!/usr/bin/env python |
""" |
Decode 64-bit address into components |
""" |
import sys |
def main(): |
if len(sys.argv) != 2 or not sys.argv[1].startswith('0x'): |
print "%s 0x..." % sys.argv[0] |
sys.exit(1) |
address = int(sys.argv[1],16) |
offset = address & 0xfff |
ptl3 = (address >> 12) & 0x1ff |
ptl2 = (address >> 21) & 0x1ff |
ptl1 = (address >> 30) & 0x1ff |
ptl0 = (address >> 39) & 0x1ff |
print "Ptl0: %3d" % ptl0 |
print "Ptl1: %3d" % ptl1 |
print "Ptl2: %3d" % ptl2 |
print "Ptl3: %3d" % ptl3 |
print "Offset: 0x%x" % offset |
if __name__ == '__main__': |
main() |
Property changes: |
Added: svn:executable |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/tools/ia32/decpt.py |
---|
0,0 → 1,21 |
#!/usr/bin/env python |
""" |
Decode 32-bit address into PTE components |
""" |
import sys |
def main(): |
if len(sys.argv) != 2 or not sys.argv[1].startswith('0x'): |
print "%s 0x..." % sys.argv[0] |
sys.exit(1) |
address = int(sys.argv[1],16) |
offset = address & 0xfff |
ptl1 = (address >> 12) & 0x3ff |
ptl0 = (address >> 22) & 0x3ff |
print "Ptl0: %3d" % ptl0 |
print "Ptl1: %3d" % ptl1 |
print "Offset: 0x%x" % offset |
if __name__ == '__main__': |
main() |
Property changes: |
Added: svn:executable |
+* |
\ No newline at end of property |
/tags/0.3.0/kernel/tools/genmap.py |
---|
0,0 → 1,87 |
#!/usr/bin/env python |
import sys |
import struct |
import re |
MAXSTRING=63 |
symtabfmt = "<Q%ds" % (MAXSTRING+1) |
funcline = re.compile(r'([0-9a-f]+)\s+[lg]\s+.\s+\.text\s+([0-9a-f]+)\s+(.*)$') |
bssline = re.compile(r'([0-9a-f]+)\s+[lg]\s+[a-zA-Z]\s+\.bss\s+([0-9a-f]+)\s+(.*)$') |
dataline = re.compile(r'([0-9a-f]+)\s+[lg]\s+[a-zA-Z]\s+\.data\s+([0-9a-f]+)\s+(.*)$') |
fileexp = re.compile(r'([^\s]+):\s+file format') |
def read_obdump(inp): |
funcs = {} |
data = {} |
bss ={} |
fname = '' |
for line in inp: |
line = line.strip() |
res = funcline.match(line) |
if res: |
funcs.setdefault(fname,[]).append((int(res.group(1),16), |
res.group(3))) |
continue |
res = bssline.match(line) |
if res: |
start = int(res.group(1),16) |
end = int(res.group(2),16) |
if end: |
bss.setdefault(fname,[]).append((start,res.group(3))) |
res = dataline.match(line) |
if res: |
start = int(res.group(1),16) |
end = int(res.group(2),16) |
if end: |
data.setdefault(fname,[]).append((start,res.group(3))) |
res = fileexp.match(line) |
if res: |
fname = res.group(1) |
continue |
return { |
'text' : funcs, |
'bss' : bss, |
'data' : data |
} |
startfile = re.compile(r'\.(text|bss|data)\s+(0x[0-9a-f]+)\s+0x[0-9a-f]+\s+(.*)$') |
def generate(kmapf, obmapf, out): |
obdump = read_obdump(obmapf) |
def sorter(x,y): |
return cmp(x[0],y[0]) |
for line in kmapf: |
line = line.strip() |
res = startfile.match(line) |
if res and obdump[res.group(1)].has_key(res.group(3)): |
offset = int(res.group(2),16) |
fname = res.group(3) |
symbols = obdump[res.group(1)][fname] |
symbols.sort(sorter) |
for addr,symbol in symbols: |
value = fname + ':' + symbol |
data = struct.pack(symtabfmt,addr+offset,value[:MAXSTRING]) |
out.write(data) |
out.write(struct.pack(symtabfmt,0,'')) |
def main(): |
if len(sys.argv) != 4: |
print "Usage: %s <kernel.map> <nm dump> <output.bin>" % sys.argv[0] |
sys.exit(1) |
kmapf = open(sys.argv[1],'r') |
obmapf = open(sys.argv[2],'r') |
out = open(sys.argv[3],'w') |
generate(kmapf,obmapf,out) |
kmapf.close() |
obmapf.close() |
out.close() |
if __name__ == '__main__': |
main() |
Property changes: |
Added: svn:executable |
+* |
\ No newline at end of property |
/tags/0.3.0/uspace/lib/libc/arch/ppc32/include/tls.h |
---|
0,0 → 1,73 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcppc32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_ppc32_TLS_H_ |
#define LIBC_ppc32_TLS_H_ |
#define CONFIG_TLS_VARIANT_1 |
#define PPC_TP_OFFSET 0x7000 |
typedef struct { |
void *fibril_data; |
} tcb_t; |
static inline void __tcb_set(tcb_t *tcb) |
{ |
void *tp = tcb; |
tp += PPC_TP_OFFSET + sizeof(tcb_t); |
asm volatile ( |
"mr %%r2, %0\n" |
: |
: "r" (tp) |
); |
} |
static inline tcb_t * __tcb_get(void) |
{ |
void * retval; |
asm volatile ( |
"mr %0, %%r2\n" |
: "=r" (retval) |
); |
return (tcb_t *)(retval - PPC_TP_OFFSET - sizeof(tcb_t)); |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/ppc32/include/thread.h |
---|
0,0 → 1,41 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcppc32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_ppc32_THREAD_H_ |
#define LIBC_ppc32_THREAD_H_ |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/ppc32/include/types.h |
---|
0,0 → 1,56 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcppc32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_ppc32_TYPES_H_ |
#define LIBC_ppc32_TYPES_H_ |
typedef unsigned int sysarg_t; |
typedef char int8_t; |
typedef short int int16_t; |
typedef int int32_t; |
typedef long long int int64_t; |
typedef unsigned char uint8_t; |
typedef unsigned short int uint16_t; |
typedef unsigned int uint32_t; |
typedef unsigned long long int uint64_t; |
typedef uint32_t uintptr_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/ppc32/include/fibril.h |
---|
0,0 → 1,83 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcppc32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_ppc32_FIBRIL_H_ |
#define LIBC_ppc32_FIBRIL_H_ |
#include <sys/types.h> |
/* We define our own context_set, because we need to set |
* the TLS pointer to the tcb+0x7000 |
* |
* See tls_set in thread.h |
*/ |
#define context_set(c, _pc, stack, size, ptls) \ |
(c)->pc = (sysarg_t) (_pc); \ |
(c)->sp = ((sysarg_t) (stack)) + (size) - SP_DELTA; \ |
(c)->tls = ((sysarg_t) (ptls)) + 0x7000 + sizeof(tcb_t); |
#define SP_DELTA 16 |
typedef struct { |
uint32_t sp; |
uint32_t pc; |
uint32_t tls; |
uint32_t r13; |
uint32_t r14; |
uint32_t r15; |
uint32_t r16; |
uint32_t r17; |
uint32_t r18; |
uint32_t r19; |
uint32_t r20; |
uint32_t r21; |
uint32_t r22; |
uint32_t r23; |
uint32_t r24; |
uint32_t r25; |
uint32_t r26; |
uint32_t r27; |
uint32_t r28; |
uint32_t r29; |
uint32_t r30; |
uint32_t r31; |
uint32_t cr; |
} __attribute__ ((packed)) context_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/ppc32/include/atomic.h |
---|
0,0 → 1,95 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcppc32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_ppc32_ATOMIC_H_ |
#define LIBC_ppc32_ATOMIC_H_ |
static inline void atomic_inc(atomic_t *val) |
{ |
long tmp; |
asm volatile ( |
"1:\n" |
"lwarx %0, 0, %2\n" |
"addic %0, %0, 1\n" |
"stwcx. %0, 0, %2\n" |
"bne- 1b" |
: "=&r" (tmp), "=m" (val->count) |
: "r" (&val->count), "m" (val->count) |
: "cc"); |
} |
static inline void atomic_dec(atomic_t *val) |
{ |
long tmp; |
asm volatile ( |
"1:\n" |
"lwarx %0, 0, %2\n" |
"addic %0, %0, -1\n" |
"stwcx. %0, 0, %2\n" |
"bne- 1b" |
: "=&r" (tmp), "=m" (val->count) |
: "r" (&val->count), "m" (val->count) |
: "cc"); |
} |
static inline long atomic_postinc(atomic_t *val) |
{ |
atomic_inc(val); |
return val->count - 1; |
} |
static inline long atomic_postdec(atomic_t *val) |
{ |
atomic_dec(val); |
return val->count + 1; |
} |
static inline long atomic_preinc(atomic_t *val) |
{ |
atomic_inc(val); |
return val->count; |
} |
static inline long atomic_predec(atomic_t *val) |
{ |
atomic_dec(val); |
return val->count; |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/ppc32/include/syscall.h |
---|
0,0 → 1,44 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** |
* @file |
*/ |
#ifndef LIBC_ppc32_SYSCALL_H_ |
#define LIBC_ppc32_SYSCALL_H_ |
#include <syscall.h> |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/ppc32/include/endian.h |
---|
0,0 → 1,47 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcppc32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_ppc32_ENDIAN_H_ |
#define LIBC_ppc32_ENDIAN_H_ |
#ifndef LIBC_ENDIAN_H_ |
# error "Never use <libarch/endian.h> directly - use <endian.h> instead." |
#endif |
#define __BYTE_ORDER __BIG_ENDIAN |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/ppc32/include/regname.h |
---|
0,0 → 1,188 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcppc32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_ppc32_REGNAME_H_ |
#define LIBC_ppc32_REGNAME_H_ |
/* Condition Register Bit Fields */ |
#define cr0 0 |
#define cr1 1 |
#define cr2 2 |
#define cr3 3 |
#define cr4 4 |
#define cr5 5 |
#define cr6 6 |
#define cr7 7 |
/* General Purpose Registers (GPRs) */ |
#define r0 0 |
#define r1 1 |
#define r2 2 |
#define r3 3 |
#define r4 4 |
#define r5 5 |
#define r6 6 |
#define r7 7 |
#define r8 8 |
#define r9 9 |
#define r10 10 |
#define r11 11 |
#define r12 12 |
#define r13 13 |
#define r14 14 |
#define r15 15 |
#define r16 16 |
#define r17 17 |
#define r18 18 |
#define r19 19 |
#define r20 20 |
#define r21 21 |
#define r22 22 |
#define r23 23 |
#define r24 24 |
#define r25 25 |
#define r26 26 |
#define r27 27 |
#define r28 28 |
#define r29 29 |
#define r30 30 |
#define r31 31 |
/* GPR Aliases */ |
#define sp 1 |
/* Floating Point Registers (FPRs) */ |
#define fr0 0 |
#define fr1 1 |
#define fr2 2 |
#define fr3 3 |
#define fr4 4 |
#define fr5 5 |
#define fr6 6 |
#define fr7 7 |
#define fr8 8 |
#define fr9 9 |
#define fr10 10 |
#define fr11 11 |
#define fr12 12 |
#define fr13 13 |
#define fr14 14 |
#define fr15 15 |
#define fr16 16 |
#define fr17 17 |
#define fr18 18 |
#define fr19 19 |
#define fr20 20 |
#define fr21 21 |
#define fr22 22 |
#define fr23 23 |
#define fr24 24 |
#define fr25 25 |
#define fr26 26 |
#define fr27 27 |
#define fr28 28 |
#define fr29 29 |
#define fr30 30 |
#define fr31 31 |
#define vr0 0 |
#define vr1 1 |
#define vr2 2 |
#define vr3 3 |
#define vr4 4 |
#define vr5 5 |
#define vr6 6 |
#define vr7 7 |
#define vr8 8 |
#define vr9 9 |
#define vr10 10 |
#define vr11 11 |
#define vr12 12 |
#define vr13 13 |
#define vr14 14 |
#define vr15 15 |
#define vr16 16 |
#define vr17 17 |
#define vr18 18 |
#define vr19 19 |
#define vr20 20 |
#define vr21 21 |
#define vr22 22 |
#define vr23 23 |
#define vr24 24 |
#define vr25 25 |
#define vr26 26 |
#define vr27 27 |
#define vr28 28 |
#define vr29 29 |
#define vr30 30 |
#define vr31 31 |
#define evr0 0 |
#define evr1 1 |
#define evr2 2 |
#define evr3 3 |
#define evr4 4 |
#define evr5 5 |
#define evr6 6 |
#define evr7 7 |
#define evr8 8 |
#define evr9 9 |
#define evr10 10 |
#define evr11 11 |
#define evr12 12 |
#define evr13 13 |
#define evr14 14 |
#define evr15 15 |
#define evr16 16 |
#define evr17 17 |
#define evr18 18 |
#define evr19 19 |
#define evr20 20 |
#define evr21 21 |
#define evr22 22 |
#define evr23 23 |
#define evr24 24 |
#define evr25 25 |
#define evr26 26 |
#define evr27 27 |
#define evr28 28 |
#define evr29 29 |
#define evr30 30 |
#define evr31 31 |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/ppc32/include/stackarg.h |
---|
0,0 → 1,41 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcppc32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_STACKARG_H_ |
#define LIBC_STACKARG_H_ |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/ppc32/include/faddr.h |
---|
0,0 → 1,45 |
/* |
* Copyright (c) 2005 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcppc32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_ppc32_FADDR_H_ |
#define LIBC_ppc32_FADDR_H_ |
#include <libarch/types.h> |
#define FADDR(fptr) ((uintptr_t) (fptr)) |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/ppc32/include/limits.h |
---|
0,0 → 1,46 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcppc32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_ppc32_LIMITS_H_ |
#define LIBC_ppc32_LIMITS_H_ |
#define LONG_MIN MIN_INT32 |
#define LONG_MAX MAX_INT32 |
#define ULONG_MIN MIN_UINT32 |
#define ULONG_MAX MAX_UINT32 |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/ppc32/include/config.h |
---|
0,0 → 1,45 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libppc32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_ppc32_CONFIG_H_ |
#define LIBC_ppc32_CONFIG_H_ |
#define PAGE_WIDTH 12 |
#define PAGE_SIZE (1<<PAGE_WIDTH) |
#define PAGE_COLOR_BITS 0 /* dummy */ |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/ppc32/src/fibril.S |
---|
0,0 → 1,62 |
# |
# Copyright (c) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
.text |
.global context_save |
.global context_restore |
#include <libarch/regname.h> |
#include <arch/context_offset.h> |
context_save: |
CONTEXT_SAVE_ARCH_CORE r3 |
mflr r4 |
stw r4, OFFSET_PC(r3) |
mfcr r4 |
stw r4, OFFSET_CR(r3) |
# context_save returns 1 |
li r3, 1 |
blr |
context_restore: |
CONTEXT_RESTORE_ARCH_CORE r3 |
lwz r4, OFFSET_CR(r3) |
mtcr r4 |
lwz r4, OFFSET_PC(r3) |
mtlr r4 |
# context_restore returns 0 |
li r3, 0 |
blr |
/tags/0.3.0/uspace/lib/libc/arch/ppc32/src/syscall.c |
---|
0,0 → 1,66 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcppc32 ppc32 |
* @brief ppc32 architecture dependent parts of libc |
* @ingroup lc |
* @{ |
*/ |
/** @file |
*/ |
#include <libc.h> |
sysarg_t __syscall(const sysarg_t p1, const sysarg_t p2, const sysarg_t p3, |
const sysarg_t p4, const sysarg_t p5, const sysarg_t p6, const syscall_t id) |
{ |
register sysarg_t __ppc32_reg_r3 asm("3") = p1; |
register sysarg_t __ppc32_reg_r4 asm("4") = p2; |
register sysarg_t __ppc32_reg_r5 asm("5") = p3; |
register sysarg_t __ppc32_reg_r6 asm("6") = p4; |
register sysarg_t __ppc32_reg_r7 asm("7") = p5; |
register sysarg_t __ppc32_reg_r8 asm("8") = p6; |
register sysarg_t __ppc32_reg_r9 asm("9") = id; |
asm volatile ( |
"sc\n" |
: "=r" (__ppc32_reg_r3) |
: "r" (__ppc32_reg_r3), |
"r" (__ppc32_reg_r4), |
"r" (__ppc32_reg_r5), |
"r" (__ppc32_reg_r6), |
"r" (__ppc32_reg_r7), |
"r" (__ppc32_reg_r8), |
"r" (__ppc32_reg_r9) |
); |
return __ppc32_reg_r3; |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/ppc32/src/tls.c |
---|
0,0 → 1,49 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcppc32 |
* @{ |
*/ |
/** @file |
*/ |
#include <tls.h> |
#include <sys/types.h> |
tcb_t * __alloc_tls(void **data, size_t size) |
{ |
return tls_alloc_variant_1(data, size); |
} |
void __free_tls_arch(tcb_t *tcb, size_t size) |
{ |
tls_free_variant_1(tcb, size); |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/ppc32/src/entry.s |
---|
0,0 → 1,48 |
# |
# Copyright (c) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
.section .init, "ax" |
.org 0 |
.globl __entry |
.globl __entry_driver |
## User-space task entry point |
# |
# |
__entry: |
bl __main |
bl __io_init |
bl main |
bl __exit |
__entry_driver: |
bl __main |
bl main |
bl __exit |
/tags/0.3.0/uspace/lib/libc/arch/ppc32/src/thread_entry.s |
---|
0,0 → 1,39 |
# |
# Copyright (c) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
.text |
.globl __thread_entry |
## User-space thread entry point for all but the first threads. |
# |
# |
__thread_entry: |
b __thread_main |
.end __thread_entry |
/tags/0.3.0/uspace/lib/libc/arch/ppc32/Makefile.inc |
---|
0,0 → 1,44 |
# |
# Copyright (c) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
## Toolchain configuration |
# |
TARGET = ppc-linux-gnu |
TOOLCHAIN_DIR = /usr/local/ppc/bin |
ARCH_SOURCES += arch/$(ARCH)/src/syscall.c \ |
arch/$(ARCH)/src/fibril.S \ |
arch/$(ARCH)/src/tls.c |
CFLAGS += -mcpu=powerpc -msoft-float -m32 |
AFLAGS += -a32 |
LFLAGS += -N |
BFD_NAME = elf32-powerpc |
BFD_ARCH = powerpc:common |
/tags/0.3.0/uspace/lib/libc/arch/ppc32/_link.ld.in |
---|
0,0 → 1,48 |
STARTUP(LIBC_PREFIX/arch/ARCH/src/entry.o) |
ENTRY(__entry) |
PHDRS { |
text PT_LOAD FLAGS(5); |
data PT_LOAD FLAGS(6); |
} |
SECTIONS { |
. = 0x1000; |
.init ALIGN(0x1000) : SUBALIGN(0x1000) { |
*(.init); |
} :text |
.text : { |
*(.text); |
*(.rodata*); |
} :text |
.data ALIGN(0x1000) : SUBALIGN(0x1000) { |
*(.data); |
*(.sdata); |
} :data |
.tdata : { |
_tdata_start = .; |
*(.tdata); |
_tdata_end = .; |
} :data |
.tbss : { |
_tbss_start = .; |
*(.tbss); |
_tbss_end = .; |
} :data |
_tls_alignment = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss)); |
.bss : { |
*(.sbss); |
*(COMMON); |
*(.bss); |
} :data |
. = ALIGN(0x1000); |
_heap = .; |
/DISCARD/ : { |
*(*); |
} |
} |
/tags/0.3.0/uspace/lib/libc/arch/mips32eb/include/tls.h |
---|
0,0 → 1,0 |
link ../../mips32/include/tls.h |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/uspace/lib/libc/arch/mips32eb/include/fibril.h |
---|
0,0 → 1,0 |
link ../../mips32/include/fibril.h |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/uspace/lib/libc/arch/mips32eb/include/endian.h |
---|
0,0 → 1,50 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcmips32eb mipseb32 |
* @brief mipseb32 architecture dependent parts of libc |
* @ingroup lc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_mips32eb_ENDIAN_H_ |
#define LIBC_mips32eb_ENDIAN_H_ |
#ifndef LIBC_ENDIAN_H_ |
# error "Never use <libarch/endian.h> directly - use <endian.h> instead." |
#endif |
#define __BYTE_ORDER __BIG_ENDIAN |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/mips32eb/include/syscall.h |
---|
0,0 → 1,0 |
link ../../mips32/include/syscall.h |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/uspace/lib/libc/arch/mips32eb/include/faddr.h |
---|
0,0 → 1,0 |
link ../../mips32/include/faddr.h |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/uspace/lib/libc/arch/mips32eb/include/config.h |
---|
0,0 → 1,0 |
link ../../mips32/include/config.h |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/uspace/lib/libc/arch/mips32eb/include/limits.h |
---|
0,0 → 1,0 |
link ../../mips32/include/limits.h |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/uspace/lib/libc/arch/mips32eb/include/atomic.h |
---|
0,0 → 1,0 |
link ../../mips32/include/atomic.h |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/uspace/lib/libc/arch/mips32eb/include/stackarg.h |
---|
0,0 → 1,0 |
link ../../mips32/include/stackarg.h |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/uspace/lib/libc/arch/mips32eb/include/types.h |
---|
0,0 → 1,0 |
link ../../mips32/include/types.h |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/uspace/lib/libc/arch/mips32eb/include/thread.h |
---|
0,0 → 1,0 |
link ../../mips32/include/thread.h |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/uspace/lib/libc/arch/mips32eb/Makefile.inc |
---|
0,0 → 1,43 |
# |
# Copyright (c) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
## Toolchain configuration |
# |
TARGET = mips-sgi-irix5 |
TOOLCHAIN_DIR = /usr/local/mips/bin |
CFLAGS += -mips3 |
ARCH_SOURCES += arch/$(ARCH)/src/syscall.c \ |
arch/$(ARCH)/src/fibril.S \ |
arch/$(ARCH)/src/tls.c |
LFLAGS += -N |
BFD_ARCH = mips |
BFD_NAME = elf32-big |
/tags/0.3.0/uspace/lib/libc/arch/mips32eb/_link.ld.in |
---|
0,0 → 1,0 |
link ../mips32/_link.ld.in |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/uspace/lib/libc/arch/mips32eb/src |
---|
0,0 → 1,0 |
link ../mips32/src |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/uspace/lib/libc/arch/mips32/include/tls.h |
---|
0,0 → 1,86 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcmips32 |
* @{ |
*/ |
/** @file |
* @ingroup libcmips32eb |
*/ |
/* TLS for MIPS is described in http://www.linux-mips.org/wiki/NPTL */ |
#ifndef LIBC_mips32_TLS_H_ |
#define LIBC_mips32_TLS_H_ |
/* |
* FIXME: Note that the use of variant I contradicts the observations made in |
* the note below. Nevertheless the scheme we have used for allocating and |
* deallocatin TLS corresponds to TLS variant I. |
*/ |
#define CONFIG_TLS_VARIANT_1 |
/* I did not find any specification (neither MIPS nor PowerPC), but |
* as I found it |
* - it uses Variant II |
* - TCB is at Address(First TLS Block)+0x7000. |
* - DTV is at Address(First TLS Block)+0x8000 |
* - What would happen if the TLS data was larger then 0x7000? |
* - The linker never accesses DTV directly, has the second definition any |
* sense? |
* We will make it this way: |
* - TCB is at TP-0x7000-sizeof(tcb) |
* - No assumption about DTV etc., but it will not have a fixed address |
*/ |
#define MIPS_TP_OFFSET 0x7000 |
typedef struct { |
void *fibril_data; |
} tcb_t; |
static inline void __tcb_set(tcb_t *tcb) |
{ |
void *tp = tcb; |
tp += MIPS_TP_OFFSET + sizeof(tcb_t); |
asm volatile ("add $27, %0, $0" : : "r"(tp)); /* Move tls to K1 */ |
} |
static inline tcb_t * __tcb_get(void) |
{ |
void * retval; |
asm volatile("add %0, $27, $0" : "=r"(retval)); |
return (tcb_t *)(retval - MIPS_TP_OFFSET - sizeof(tcb_t)); |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/mips32/include/thread.h |
---|
0,0 → 1,42 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcmips32 |
* @{ |
*/ |
/** @file |
* @ingroup libcmips32eb |
*/ |
#ifndef LIBC_mips32_THREAD_H_ |
#define LIBC_mips32_THREAD_H_ |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/mips32/include/stackarg.h |
---|
0,0 → 1,62 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcmips32 |
* @{ |
*/ |
/** @file |
* @ingroup libcmips32eb |
*/ |
#ifndef LIBC_mips32_STACKARG_H_ |
#define LIBC_mips32_STACKARG_H_ |
/* dont allow to define it second time in stdarg.h */ |
#define __VARARGS_DEFINED |
#include <sys/types.h> |
/** |
* va_arg macro for MIPS32 - problem is that 64 bit values must be aligned on an 8-byte boundary (32bit values not) |
* To satisfy this, paddings must be sometimes inserted. |
*/ |
typedef uint8_t* va_list; |
#define va_start(ap, lst) \ |
((ap) = (va_list)&(lst) + sizeof(lst)) |
#define va_arg(ap, type) \ |
(((type *)((ap) = (va_list)( (sizeof(type) <= 4) ? ((uint32_t)((ap) + 2*4 - 1) & (~3)) : ((uint32_t)((ap) + 2*8 -1) & (~7)) )))[-1]) |
#define va_end(ap) |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/mips32/include/types.h |
---|
0,0 → 1,56 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcmips32 |
* @{ |
*/ |
/** @file |
* @ingroup libcmips32eb |
*/ |
#ifndef LIBC_mips32_TYPES_H_ |
#define LIBC_mips32_TYPES_H_ |
typedef unsigned int sysarg_t; |
typedef char int8_t; |
typedef short int int16_t; |
typedef long int int32_t; |
typedef long long int int64_t; |
typedef unsigned char uint8_t; |
typedef unsigned short int uint16_t; |
typedef unsigned long int uint32_t; |
typedef unsigned long long int uint64_t; |
typedef uint32_t uintptr_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/mips32/include/fibril.h |
---|
0,0 → 1,90 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcmips32 |
* @{ |
*/ |
/** @file |
* @ingroup libcmips32eb |
*/ |
#ifndef LIBC_mips32_FIBRIL_H_ |
#define LIBC_mips32_FIBRIL_H_ |
#include <sys/types.h> |
/* We define our own context_set, because we need to set |
* the TLS pointer to the tcb+0x7000 |
* |
* See tls_set in thread.h |
*/ |
#define context_set(c, _pc, stack, size, ptls) \ |
(c)->pc = (sysarg_t) (_pc); \ |
(c)->sp = ((sysarg_t) (stack)) + (size) - SP_DELTA; \ |
(c)->tls = ((sysarg_t)(ptls)) + 0x7000 + sizeof(tcb_t); |
/* +16 is just for sure that the called function |
* have space to store it's arguments |
*/ |
#define SP_DELTA (8+16) |
typedef struct { |
uint32_t sp; |
uint32_t pc; |
uint32_t s0; |
uint32_t s1; |
uint32_t s2; |
uint32_t s3; |
uint32_t s4; |
uint32_t s5; |
uint32_t s6; |
uint32_t s7; |
uint32_t s8; |
uint32_t gp; |
uint32_t tls; /* Thread local storage(=k1) */ |
uint32_t f20; |
uint32_t f21; |
uint32_t f22; |
uint32_t f23; |
uint32_t f24; |
uint32_t f25; |
uint32_t f26; |
uint32_t f27; |
uint32_t f28; |
uint32_t f29; |
uint32_t f30; |
} context_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/mips32/include/atomic.h |
---|
0,0 → 1,77 |
/* |
* Copyright (c) 2005 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcmips32 |
* @{ |
*/ |
/** @file |
* @ingroup libcmips32eb |
*/ |
#ifndef LIBC_mips32_ATOMIC_H_ |
#define LIBC_mips32_ATOMIC_H_ |
#define atomic_inc(x) ((void) atomic_add(x, 1)) |
#define atomic_dec(x) ((void) atomic_add(x, -1)) |
#define atomic_postinc(x) (atomic_add(x, 1) - 1) |
#define atomic_postdec(x) (atomic_add(x, -1) + 1) |
#define atomic_preinc(x) atomic_add(x, 1) |
#define atomic_predec(x) atomic_add(x, -1) |
/* Atomic addition of immediate value. |
* |
* @param val Memory location to which will be the immediate value added. |
* @param i Signed immediate that will be added to *val. |
* |
* @return Value after addition. |
*/ |
static inline long atomic_add(atomic_t *val, int i) |
{ |
long tmp, v; |
asm volatile ( |
"1:\n" |
" ll %0, %1\n" |
" addiu %0, %0, %3\n" /* same as addi, but never traps on overflow */ |
" move %2, %0\n" |
" sc %0, %1\n" |
" beq %0, %4, 1b\n" /* if the atomic operation failed, try again */ |
/* nop */ /* nop is inserted automatically by compiler */ |
: "=r" (tmp), "=m" (val->count), "=r" (v) |
: "i" (i), "i" (0) |
); |
return v; |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/mips32/include/syscall.h |
---|
0,0 → 1,44 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** |
* @file |
*/ |
#ifndef LIBC_mips32_SYSCALL_H_ |
#define LIBC_mips32_SYSCALL_H_ |
#include <syscall.h> |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/mips32/include/endian.h |
---|
0,0 → 1,49 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcmips32 mips32 |
* @brief mips32 architecture dependent parts of libc |
* @ingroup lc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_mips32_ENDIAN_H_ |
#define LIBC_mips32_ENDIAN_H_ |
#ifndef LIBC_ENDIAN_H_ |
# error "Never use <libarch/endian.h> directly - use <endian.h> instead." |
#endif |
#define __BYTE_ORDER __LITTLE_ENDIAN |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/mips32/include/faddr.h |
---|
0,0 → 1,45 |
/* |
* Copyright (c) 2005 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcmips32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_mips32_FADDR_H_ |
#define LIBC_mips32_FADDR_H_ |
#include <libarch/types.h> |
#define FADDR(fptr) ((uintptr_t) (fptr)) |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/mips32/include/limits.h |
---|
0,0 → 1,47 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcmips32 |
* @{ |
*/ |
/** @file |
* @ingroup libcmips32eb |
*/ |
#ifndef LIBC_mips32__LIMITS_H_ |
#define LIBC_mips32__LIMITS_H_ |
# define LONG_MIN MIN_INT32 |
# define LONG_MAX MAX_INT32 |
# define ULONG_MIN MIN_UINT32 |
# define ULONG_MAX MAX_UINT32 |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/mips32/include/config.h |
---|
0,0 → 1,45 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcmips32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_mips32_CONFIG_H_ |
#define LIBC_mips32_CONFIG_H_ |
#define PAGE_WIDTH 14 |
#define PAGE_SIZE (1<<PAGE_WIDTH) |
#define PAGE_COLOR_BITS 0 /* dummy */ |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/mips32/src/fibril.S |
---|
0,0 → 1,55 |
# |
# Copyright (c) 2003-2004 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
.text |
.set noat |
.set noreorder |
#include <arch/context_offset.h> |
.global context_save |
.global context_restore |
context_save: |
CONTEXT_SAVE_ARCH_CORE $a0 |
# context_save returns 1 |
j $ra |
li $v0, 1 |
context_restore: |
CONTEXT_RESTORE_ARCH_CORE $a0 |
# Just for the jump into first function, but one instruction |
# should not bother us |
move $t9, $ra |
# context_restore returns 0 |
j $ra |
xor $v0, $v0 |
/tags/0.3.0/uspace/lib/libc/arch/mips32/src/syscall.c |
---|
0,0 → 1,68 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcmips32 |
* @{ |
*/ |
/** @file |
* @ingroup libcmips32eb |
*/ |
#include <libc.h> |
sysarg_t __syscall(const sysarg_t p1, const sysarg_t p2, const sysarg_t p3, |
const sysarg_t p4, const sysarg_t p5, const sysarg_t p6, const syscall_t id) |
{ |
register sysarg_t __mips_reg_a0 asm("$4") = p1; |
register sysarg_t __mips_reg_a1 asm("$5") = p2; |
register sysarg_t __mips_reg_a2 asm("$6") = p3; |
register sysarg_t __mips_reg_a3 asm("$7") = p4; |
register sysarg_t __mips_reg_t0 asm("$8") = p5; |
register sysarg_t __mips_reg_t1 asm("$9") = p6; |
register sysarg_t __mips_reg_v0 asm("$2") = id; |
asm volatile ( |
"syscall\n" |
: "=r" (__mips_reg_v0) |
: "r" (__mips_reg_a0), |
"r" (__mips_reg_a1), |
"r" (__mips_reg_a2), |
"r" (__mips_reg_a3), |
"r" (__mips_reg_t0), |
"r" (__mips_reg_t1), |
"r" (__mips_reg_v0) |
: "%ra" /* We are a function call, although C does not |
* know it */ |
); |
return __mips_reg_v0; |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/mips32/src/tls.c |
---|
0,0 → 1,50 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcmips32 |
* @{ |
*/ |
/** @file |
* @ingroup libcmips32eb |
*/ |
#include <tls.h> |
#include <sys/types.h> |
tcb_t * __alloc_tls(void **data, size_t size) |
{ |
return tls_alloc_variant_1(data, size); |
} |
void __free_tls_arch(tcb_t *tcb, size_t size) |
{ |
tls_free_variant_1(tcb, size); |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/mips32/src/entry.s |
---|
0,0 → 1,89 |
# |
# Copyright (c) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
.text |
.section .init, "ax" |
.global __entry |
.global __entry_driver |
.set noreorder |
.option pic2 |
## User-space task entry point |
# |
# |
.ent __entry |
__entry: |
.frame $sp, 32, $31 |
.cpload $25 |
# Mips o32 may store its arguments on stack, make space (16 bytes), |
# so that it could work with -O0 |
# Make space additional 16 bytes for the stack frame |
addiu $sp, -32 |
.cprestore 16 # Allow PIC code |
jal __main |
nop |
jal __io_init |
nop |
jal main |
nop |
jal __exit |
nop |
.end |
.ent __entry_driver |
__entry_driver: |
.frame $sp, 32, $31 |
.cpload $25 |
# Mips o32 may store its arguments on stack, make space (16 bytes), |
# so that it could work with -O0 |
# Make space additional 16 bytes for the stack frame |
addiu $sp, -32 |
.cprestore 16 # Allow PIC code |
jal __main |
nop |
jal main |
nop |
jal __exit |
nop |
.end |
# Alignment of output section data to 0x4000 |
.section .data |
.align 14 |
/tags/0.3.0/uspace/lib/libc/arch/mips32/src/thread_entry.s |
---|
0,0 → 1,59 |
# |
# Copyright (c) 2006 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
.text |
.set noat |
.set noreorder |
.option pic2 |
.globl __thread_entry |
## User-space thread entry point for all but the first threads. |
# |
# |
.ent __thread_entry |
__thread_entry: |
.frame $sp, 32, $31 |
.cpload $25 |
# |
# v0 contains address of uarg. |
# |
add $4, $2, 0 |
# Mips o32 may store its arguments on stack, make space |
addiu $sp, -32 |
.cprestore 16 |
jal __thread_main |
nop |
# |
# Not reached. |
# |
.end __thread_entry |
/tags/0.3.0/uspace/lib/libc/arch/mips32/Makefile.inc |
---|
0,0 → 1,47 |
# |
# Copyright (c) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
## Toolchain configuration |
# |
TARGET = mipsel-linux-gnu |
TOOLCHAIN_DIR = /usr/local/mipsel/bin |
CFLAGS += -mips3 |
-include ../../Makefile.config |
ifeq ($(CONFIG_MIPS_FPU),y) |
CFLAGS += -DCONFIG_MIPS_FPU |
endif |
ARCH_SOURCES += arch/$(ARCH)/src/syscall.c \ |
arch/$(ARCH)/src/fibril.S \ |
arch/$(ARCH)/src/tls.c |
BFD_ARCH = mips |
BFD_NAME = elf32-tradlittlemips |
/tags/0.3.0/uspace/lib/libc/arch/mips32/_link.ld.in |
---|
0,0 → 1,57 |
STARTUP(LIBC_PREFIX/arch/ARCH/src/entry.o) |
ENTRY(__entry) |
PHDRS { |
text PT_LOAD FLAGS(5); |
data PT_LOAD FLAGS(6); |
} |
SECTIONS { |
. = 0x4000; |
.init ALIGN(0x4000) : SUBALIGN(0x4000) { |
*(.init); |
} :text |
.text : { |
*(.text); |
*(.rodata*); |
} :text |
.data : { |
*(.data); |
*(.data.rel*); |
} :data |
.got : { |
_gp = .; |
*(.got); |
} :data |
.tdata : { |
_tdata_start = .; |
*(.tdata); |
_tdata_end = .; |
} :data |
.tbss : { |
_tbss_start = .; |
*(.tbss); |
_tbss_end = .; |
} :data |
_tls_alignment = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss)); |
.sbss : { |
*(.scommon); |
*(.sbss); |
} |
.bss : { |
*(.bss); |
*(COMMON); |
} :data |
. = ALIGN(0x4000); |
_heap = .; |
/DISCARD/ : { |
*(*); |
} |
} |
/tags/0.3.0/uspace/lib/libc/arch/ia32/src/setjmp.S |
---|
0,0 → 1,57 |
# |
# Copyright (c) 2008 Josef Cejka |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
#include <kernel/arch/context_offset.h> |
.text |
.global setjmp |
.global longjmp |
.type setjmp,@function |
setjmp: |
movl 0(%esp),%eax # save pc value into eax |
movl 4(%esp),%edx # address of the jmp_buf structure to save context to |
# save registers to the jmp_buf structure |
CONTEXT_SAVE_ARCH_CORE %edx %eax |
xorl %eax,%eax # set_jmp returns 0 |
ret |
.type longjmp,@function |
longjmp: |
movl 4(%esp), %ecx # put address of jmp_buf into ecx |
movl 8(%esp), %eax # put return value into eax |
# restore registers from the jmp_buf structure |
CONTEXT_RESTORE_ARCH_CORE %ecx %edx |
movl %edx,0(%esp) # put saved pc on stack |
ret |
/tags/0.3.0/uspace/lib/libc/arch/ia32/src/fibril.S |
---|
0,0 → 1,79 |
# |
# Copyright (c) 2001-2004 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
#include <kernel/arch/context_offset.h> |
.text |
.global context_save |
.global context_restore |
## Save current CPU context |
# |
# Save CPU context to the context_t variable |
# pointed by the 1st argument. Returns 1 in EAX. |
# |
context_save: |
movl 0(%esp),%eax # the caller's return %eip |
movl 4(%esp),%edx # address of the context variable to save context to |
# save registers to the context structure |
CONTEXT_SAVE_ARCH_CORE %edx %eax |
# Save TLS |
movl %gs:0, %eax |
movl %eax, OFFSET_TLS(%edx) # tls -> ctx->tls |
xorl %eax,%eax # context_save returns 1 |
incl %eax |
ret |
## Restore saved CPU context |
# |
# Restore CPU context from context_t variable |
# pointed by the 1st argument. Returns 0 in EAX. |
# |
context_restore: |
movl 4(%esp),%eax # address of the context variable to restore context from |
# restore registers from the context structure |
CONTEXT_RESTORE_ARCH_CORE %eax %edx |
movl %edx,0(%esp) # ctx->pc -> saver's return %eip |
# Set thread local storage |
pushl %edx |
movl OFFSET_TLS(%eax), %edx # Set arg1 to TLS addr |
movl $1, %eax # Syscall SYS_TLS_SET |
int $0x30 |
popl %edx |
xorl %eax,%eax # context_restore returns 0 |
ret |
/tags/0.3.0/uspace/lib/libc/arch/ia32/src/syscall.S |
---|
0,0 → 1,56 |
# |
# Copyright (c) 2007 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
.text |
/** Syscall wrapper. |
* |
* Mind the order of arguments. First two arguments and the syscall number go to |
* scratch registers. An optimized version of this wrapper for fewer arguments |
* could benefit from this and not save unused registers on the stack. |
*/ |
.global __syscall |
__syscall: |
pushl %ebx |
pushl %esi |
pushl %edi |
pushl %ebp |
movl 20(%esp), %edx # First argument. |
movl 24(%esp), %ecx # Second argument. |
movl 28(%esp), %ebx # Third argument. |
movl 32(%esp), %esi # Fourth argument. |
movl 36(%esp), %edi # Fifth argument. |
movl 40(%esp), %ebp # Sixth argument. |
movl 44(%esp), %eax # Syscall number. |
int $0x30 |
popl %ebp |
popl %edi |
popl %esi |
popl %ebx |
ret |
/tags/0.3.0/uspace/lib/libc/arch/ia32/src/tls.c |
---|
0,0 → 1,51 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcamd64 amd64 |
* @ingroup lc |
* @{ |
*/ |
/** @file |
* @ingroup libcia32 |
*/ |
#include <tls.h> |
#include <sys/types.h> |
tcb_t * __alloc_tls(void **data, size_t size) |
{ |
return tls_alloc_variant_2(data, size); |
} |
void __free_tls_arch(tcb_t *tcb, size_t size) |
{ |
tls_free_variant_2(tcb, size); |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/ia32/src/entry.s |
---|
0,0 → 1,60 |
# |
# Copyright (c) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
.section .init, "ax" |
.org 0 |
.globl __entry |
.globl __entry_driver |
## User-space task entry point |
# |
# |
__entry: |
mov %ss, %ax |
mov %ax, %ds |
mov %ax, %es |
mov %ax, %fs |
# Do not set %gs, it contains descriptor that can see TLS |
call __main |
call __io_init |
call main |
call __exit |
__entry_driver: |
mov %ss, %ax |
mov %ax, %ds |
mov %ax, %es |
mov %ax, %fs |
# Do not set %gs, it contains descriptor that can see TLS |
call __main |
call main |
call __exit |
/tags/0.3.0/uspace/lib/libc/arch/ia32/src/thread_entry.s |
---|
0,0 → 1,53 |
# |
# Copyright (c) 2006 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
.text |
.globl __thread_entry |
## User-space thread entry point for all but the first threads. |
# |
# |
__thread_entry: |
mov %ss, %dx |
mov %dx, %ds |
mov %dx, %es |
mov %dx, %fs |
# Do not set %gs, it contains descriptor that can see TLS |
# |
# EAX contains address of uarg. |
# |
pushl %eax |
call __thread_main |
# |
# Not reached. |
# |
.end __thread_entry |
/tags/0.3.0/uspace/lib/libc/arch/ia32/include/tls.h |
---|
0,0 → 1,63 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcia32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_ia32_TLS_H_ |
#define LIBC_ia32_TLS_H_ |
#define CONFIG_TLS_VARIANT_2 |
#include <libc.h> |
typedef struct { |
void *self; |
void *fibril_data; |
} tcb_t; |
static inline void __tcb_set(tcb_t *tcb) |
{ |
__SYSCALL1(SYS_TLS_SET, (sysarg_t) tcb); |
} |
static inline tcb_t * __tcb_get(void) |
{ |
void *retval; |
asm ("movl %%gs:0, %0" : "=r"(retval)); |
return retval; |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/ia32/include/thread.h |
---|
0,0 → 1,41 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcia32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_ia32_THREAD_H_ |
#define LIBC_ia32_THREAD_H_ |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/ia32/include/stackarg.h |
---|
0,0 → 1,66 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcia32 |
* @{ |
*/ |
/** @file |
*/ |
/* |
* Variable argument list manipulation macros |
* for architectures using stack to pass arguments. |
*/ |
#ifndef LIBC_ia32_STACKARG_H_ |
#define LIBC_ia32_STACKARG_H_ |
#include <sys/types.h> |
/* dont allow to define it second time in stdarg.h */ |
#define __VARARGS_DEFINED |
typedef struct va_list { |
int pos; |
uint8_t *last; |
} va_list; |
#define va_start(ap, lst) \ |
(ap).pos = sizeof(lst); \ |
(ap).last = (uint8_t *) &(lst) |
#define va_arg(ap, type) \ |
(*((type *)((ap).last + ((ap).pos += sizeof(type) ) - sizeof(type)))) |
#define va_end(ap) |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/ia32/include/types.h |
---|
0,0 → 1,55 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcia32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_ia32_TYPES_H_ |
#define LIBC_ia32_TYPES_H_ |
typedef unsigned int sysarg_t; |
typedef char int8_t; |
typedef short int int16_t; |
typedef int int32_t; |
typedef long long int int64_t; |
typedef unsigned char uint8_t; |
typedef unsigned short int uint16_t; |
typedef unsigned int uint32_t; |
typedef unsigned long long int uint64_t; |
typedef uint32_t uintptr_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/ia32/include/fibril.h |
---|
0,0 → 1,64 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcia32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_ia32_FIBRIL_H_ |
#define LIBC_ia32_FIBRIL_H_ |
#include <sys/types.h> |
/* According to ABI the stack MUST be aligned on |
* 16-byte boundary. If it is not, the va_arg calling will |
* panic sooner or later |
*/ |
#define SP_DELTA (12) |
/* We include only registers that must be preserved |
* during function call |
*/ |
typedef struct { |
uint32_t sp; |
uint32_t pc; |
uint32_t ebx; |
uint32_t esi; |
uint32_t edi; |
uint32_t ebp; |
uint32_t tls; |
} context_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/ia32/include/atomic.h |
---|
0,0 → 1,78 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcia32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_ia32_ATOMIC_H_ |
#define LIBC_ia32_ATOMIC_H_ |
static inline void atomic_inc(atomic_t *val) { |
asm volatile ("lock incl %0\n" : "=m" (val->count)); |
} |
static inline void atomic_dec(atomic_t *val) { |
asm volatile ("lock decl %0\n" : "=m" (val->count)); |
} |
static inline long atomic_postinc(atomic_t *val) |
{ |
long r; |
asm volatile ( |
"movl $1, %0\n" |
"lock xaddl %0, %1\n" |
: "=r" (r), "=m" (val->count) |
); |
return r; |
} |
static inline long atomic_postdec(atomic_t *val) |
{ |
long r; |
asm volatile ( |
"movl $-1, %0\n" |
"lock xaddl %0, %1\n" |
: "=r" (r), "=m" (val->count) |
); |
return r; |
} |
#define atomic_preinc(val) (atomic_postinc(val)+1) |
#define atomic_predec(val) (atomic_postdec(val)-1) |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/ia32/include/syscall.h |
---|
0,0 → 1,44 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** |
* @file |
*/ |
#ifndef LIBC_ia32_SYSCALL_H_ |
#define LIBC_ia32_SYSCALL_H_ |
#include <syscall.h> |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/ia32/include/endian.h |
---|
0,0 → 1,47 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcia32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_ia32_ENDIAN_H_ |
#define LIBC_ia32_ENDIAN_H_ |
#ifndef LIBC_ENDIAN_H_ |
# error "Never use <libarch/endian.h> directly - use <endian.h> instead." |
#endif |
#define __BYTE_ORDER __LITTLE_ENDIAN |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/ia32/include/ddi.h |
---|
0,0 → 1,75 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @file |
* @ingroup libcia32, libcamd64 |
*/ |
#ifndef LIBC_ia32_DDI_H_ |
#define LIBC_ia32_DDI_H_ |
static inline void outb(int16_t port, uint8_t b) |
{ |
asm volatile ("outb %0, %1\n" :: "a" (b), "d" (port)); |
} |
static inline void outw(int16_t port, int16_t w) |
{ |
asm volatile ("outw %0, %1\n" :: "a" (w), "d" (port)); |
} |
static inline void outl(int16_t port, uint32_t l) |
{ |
asm volatile ("outl %0, %1\n" :: "a" (l), "d" (port)); |
} |
static inline uint8_t inb(int16_t port) |
{ |
uint8_t val; |
asm volatile ("inb %1, %0 \n" : "=a" (val) : "d"(port)); |
return val; |
} |
static inline int16_t inw(int16_t port) |
{ |
int16_t val; |
asm volatile ("inw %1, %0 \n" : "=a" (val) : "d"(port)); |
return val; |
} |
static inline uint32_t inl(int16_t port) |
{ |
uint32_t val; |
asm volatile ("inl %1, %0 \n" : "=a" (val) : "d"(port)); |
return val; |
} |
#endif |
/tags/0.3.0/uspace/lib/libc/arch/ia32/include/faddr.h |
---|
0,0 → 1,45 |
/* |
* Copyright (c) 2005 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcia32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_ia32_FADDR_H_ |
#define LIBC_ia32_FADDR_H_ |
#include <libarch/types.h> |
#define FADDR(fptr) ((uintptr_t) (fptr)) |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/ia32/include/limits.h |
---|
0,0 → 1,46 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcia32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_ia32__LIMITS_H_ |
#define LIBC_ia32__LIMITS_H_ |
# define LONG_MIN MIN_INT32 |
# define LONG_MAX MAX_INT32 |
# define ULONG_MIN MIN_UINT32 |
# define ULONG_MAX MAX_UINT32 |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/ia32/include/config.h |
---|
0,0 → 1,45 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcia32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_ia32_CONFIG_H_ |
#define LIBC_ia32_CONFIG_H_ |
#define PAGE_WIDTH 12 |
#define PAGE_SIZE (1<<PAGE_WIDTH) |
#define PAGE_COLOR_BITS 0 /* dummy */ |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/ia32/Makefile.inc |
---|
0,0 → 1,43 |
# |
# Copyright (c) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
## Toolchain configuration |
# |
TARGET = i686-pc-linux-gnu |
TOOLCHAIN_DIR = /usr/local/i686/bin |
ARCH_SOURCES += arch/$(ARCH)/src/syscall.S \ |
arch/$(ARCH)/src/fibril.S \ |
arch/$(ARCH)/src/tls.c \ |
arch/$(ARCH)/src/setjmp.S |
LFLAGS += -N |
BFD_NAME = elf32-i386 |
BFD_ARCH = i386 |
/tags/0.3.0/uspace/lib/libc/arch/ia32/_link.ld.in |
---|
0,0 → 1,46 |
STARTUP(LIBC_PREFIX/arch/ARCH/src/entry.o) |
ENTRY(__entry) |
PHDRS { |
text PT_LOAD FLAGS(5); |
data PT_LOAD FLAGS(6); |
} |
SECTIONS { |
. = 0x1000; |
.init ALIGN(0x1000) : SUBALIGN(0x1000) { |
*(.init); |
} :text |
.text : { |
*(.text); |
*(.rodata*); |
} :text |
.data ALIGN(0x1000) : SUBALIGN(0x1000) { |
*(.data); |
} :data |
.tdata : { |
_tdata_start = .; |
*(.tdata); |
_tdata_end = .; |
} :data |
.tbss : { |
_tbss_start = .; |
*(.tbss); |
_tbss_end = .; |
} :data |
_tls_alignment = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss)); |
.bss : { |
*(COMMON); |
*(.bss); |
} :data |
. = ALIGN(0x1000); |
_heap = .; |
/DISCARD/ : { |
*(*); |
} |
} |
/tags/0.3.0/uspace/lib/libc/arch/amd64/include/tls.h |
---|
0,0 → 1,63 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcamd64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_amd64_TLS_H_ |
#define LIBC_amd64_TLS_H_ |
#define CONFIG_TLS_VARIANT_2 |
#include <libc.h> |
typedef struct { |
void *self; |
void *fibril_data; |
} tcb_t; |
static inline void __tcb_set(tcb_t *tcb) |
{ |
__SYSCALL1(SYS_TLS_SET, (sysarg_t) tcb); |
} |
static inline tcb_t * __tcb_get(void) |
{ |
void * retval; |
asm ("movq %%fs:0, %0" : "=r"(retval)); |
return retval; |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/amd64/include/thread.h |
---|
0,0 → 1,41 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcamd64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_amd64_THREAD_H_ |
#define LIBC_amd64_THREAD_H_ |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/amd64/include/types.h |
---|
0,0 → 1,55 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcamd64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_amd64_TYPES_H_ |
#define LIBC_amd64_TYPES_H_ |
typedef unsigned long long sysarg_t; |
typedef signed char int8_t; |
typedef short int int16_t; |
typedef int int32_t; |
typedef long long int int64_t; |
typedef unsigned char uint8_t; |
typedef unsigned short int uint16_t; |
typedef unsigned int uint32_t; |
typedef unsigned long long int uint64_t; |
typedef uint64_t uintptr_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/amd64/include/fibril.h |
---|
0,0 → 1,67 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcamd64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_amd64_FIBRIL_H_ |
#define LIBC_amd64_FIBRIL_H_ |
#include <sys/types.h> |
/* According to ABI the stack MUST be aligned on |
* 16-byte boundary. If it is not, the va_arg calling will |
* panic sooner or later |
*/ |
#define SP_DELTA 16 |
/* We include only registers that must be preserved |
* during function call |
*/ |
typedef struct { |
uint64_t sp; |
uint64_t pc; |
uint64_t rbx; |
uint64_t rbp; |
uint64_t r12; |
uint64_t r13; |
uint64_t r14; |
uint64_t r15; |
uint64_t tls; |
} context_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/amd64/include/atomic.h |
---|
0,0 → 1,80 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcamd64 amd64 |
* @ingroup lc |
* @brief amd64 architecture dependent parts of libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_amd64_ATOMIC_H_ |
#define LIBC_amd64_ATOMIC_H_ |
static inline void atomic_inc(atomic_t *val) { |
asm volatile ("lock incq %0\n" : "=m" (val->count)); |
} |
static inline void atomic_dec(atomic_t *val) { |
asm volatile ("lock decq %0\n" : "=m" (val->count)); |
} |
static inline long atomic_postinc(atomic_t *val) |
{ |
long r; |
asm volatile ( |
"movq $1, %0\n" |
"lock xaddq %0, %1\n" |
: "=r" (r), "=m" (val->count) |
); |
return r; |
} |
static inline long atomic_postdec(atomic_t *val) |
{ |
long r; |
asm volatile ( |
"movq $-1, %0\n" |
"lock xaddq %0, %1\n" |
: "=r" (r), "=m" (val->count) |
); |
return r; |
} |
#define atomic_preinc(val) (atomic_postinc(val)+1) |
#define atomic_predec(val) (atomic_postdec(val)-1) |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/amd64/include/syscall.h |
---|
0,0 → 1,44 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** |
* @file |
*/ |
#ifndef LIBC_amd64_SYSCALL_H_ |
#define LIBC_amd64_SYSCALL_H_ |
#include <syscall.h> |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/amd64/include/endian.h |
---|
0,0 → 1,49 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcamd64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_amd64_ENDIAN_H_ |
#define LIBC_amd64_ENDIAN_H_ |
#ifndef LIBC_ENDIAN_H_ |
# error "Never use <libarch/endian.h> directly - use <endian.h> instead." |
#endif |
#define __BYTE_ORDER __LITTLE_ENDIAN |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/amd64/include/stackarg.h |
---|
0,0 → 1,41 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcamd64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_STACKARG_H_ |
#define LIBC_STACKARG_H_ |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/amd64/include/faddr.h |
---|
0,0 → 1,45 |
/* |
* Copyright (c) 2005 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcamd64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_amd64_FADDR_H_ |
#define LIBC_amd64_FADDR_H_ |
#include <libarch/types.h> |
#define FADDR(fptr) ((uintptr_t) (fptr)) |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/amd64/include/limits.h |
---|
0,0 → 1,46 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcamd64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_amd64_LIMITS_H_ |
#define LIBC_amd64_LIMITS_H_ |
# define LONG_MIN MIN_INT64 |
# define LONG_MAX MAX_INT64 |
# define ULONG_MIN MIN_UINT64 |
# define ULONG_MAX MAX_UINT64 |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/amd64/include/config.h |
---|
0,0 → 1,45 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcamd64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_amd64_CONFIG_H_ |
#define LIBC_amd64_CONFIG_H_ |
#define PAGE_WIDTH 12 |
#define PAGE_SIZE (1<<PAGE_WIDTH) |
#define PAGE_COLOR_BITS 0 /* dummy */ |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/amd64/include/ddi.h |
---|
0,0 → 1,0 |
link ../../ia32/include/ddi.h |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/uspace/lib/libc/arch/amd64/src/fibril.S |
---|
0,0 → 1,73 |
# |
# Copyright (c) 2001-2004 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
.text |
.global context_save |
.global context_restore |
#include <kernel/arch/context_offset.h> |
## Save current CPU context |
# |
# Save CPU context to context_t variable |
# pointed by the 1st argument. Returns 1 in EAX. |
# |
context_save: |
movq (%rsp), %rdx # the caller's return %eip |
# In %edi is passed 1st argument |
CONTEXT_SAVE_ARCH_CORE %rdi %rdx |
# Save TLS |
movq %fs:0, %rax |
movq %rax, OFFSET_TLS(%rdi) |
xorq %rax,%rax # context_save returns 1 |
incq %rax |
ret |
## Restore current CPU context |
# |
# Restore CPU context from context_t variable |
# pointed by the 1st argument. Returns 0 in EAX. |
# |
context_restore: |
CONTEXT_RESTORE_ARCH_CORE %rdi %rdx |
movq %rdx,(%rsp) |
# Set thread local storage |
movq OFFSET_TLS(%rdi), %rdi # Set arg1 to TLS addr |
movq $1, %rax # SYS_TLS_SET |
syscall |
xorq %rax,%rax # context_restore returns 0 |
ret |
/tags/0.3.0/uspace/lib/libc/arch/amd64/src/syscall.S |
---|
0,0 → 1,57 |
# |
# Copyright (c) 2006 Ondrej Palkovsky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
.text |
.global __syscall |
## Make a system call. |
# |
# @param rdi First argument. |
# @param rsi Second argument. |
# @param rdx Third argument. |
# @param rcx Fourth argument. |
# @param r8 Fifth argument. |
# @param r9 Sixth argument. |
# @param 8(%rsp) Syscall number. |
# |
# @return The return value will be stored in RAX. |
# |
__syscall: |
# |
# Move the syscall number into RAX. |
movslq 8(%rsp), %rax |
# |
# Save RCX, the 4th argument, aside because RCX gets rewritten by the |
# SYSCALL instruction. |
# |
movq %rcx, %r10 |
syscall |
ret |
/tags/0.3.0/uspace/lib/libc/arch/amd64/src/tls.c |
---|
0,0 → 1,51 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcamd64 amd64 |
* @ingroup lc |
* @{ |
*/ |
/** @file |
* @ingroup libcia32 |
*/ |
#include <tls.h> |
#include <sys/types.h> |
tcb_t * __alloc_tls(void **data, size_t size) |
{ |
return tls_alloc_variant_2(data, size); |
} |
void __free_tls_arch(tcb_t *tcb, size_t size) |
{ |
tls_free_variant_2(tcb, size); |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/amd64/src/entry.s |
---|
0,0 → 1,48 |
# |
# Copyright (c) 2006 Ondrej Palkovsky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
.section .init, "ax" |
.org 0 |
.globl __entry |
.globl __entry_driver |
## User-space task entry point |
# |
# |
__entry: |
call __main |
call __io_init |
call main |
call __exit |
__entry_driver: |
call __main |
call main |
call __exit |
/tags/0.3.0/uspace/lib/libc/arch/amd64/src/thread_entry.s |
---|
0,0 → 1,43 |
# |
# Copyright (c) 2006 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
.text |
.globl __thread_entry |
## User-space thread entry point for all but the first threads. |
# |
# |
__thread_entry: |
# |
# RAX contains address of uarg |
# |
movq %rax, %rdi |
call __thread_main |
.end __thread_entry |
/tags/0.3.0/uspace/lib/libc/arch/amd64/Makefile.inc |
---|
0,0 → 1,42 |
# |
# Copyright (c) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
## Toolchain configuration |
# |
TARGET = amd64-linux-gnu |
TOOLCHAIN_DIR = /usr/local/amd64/bin |
ARCH_SOURCES += arch/$(ARCH)/src/syscall.S \ |
arch/$(ARCH)/src/fibril.S \ |
arch/$(ARCH)/src/tls.c |
LFLAGS += -N |
BFD_NAME = elf64-x86-64 |
BFD_ARCH = i386:x86-64 |
/tags/0.3.0/uspace/lib/libc/arch/amd64/_link.ld.in |
---|
0,0 → 1,46 |
STARTUP(LIBC_PREFIX/arch/ARCH/src/entry.o) |
ENTRY(__entry) |
PHDRS { |
text PT_LOAD FLAGS(5); |
data PT_LOAD FLAGS(6); |
} |
SECTIONS { |
. = 0x1000; |
.init ALIGN(0x1000) : SUBALIGN(0x1000) { |
*(.init); |
} :text |
.text : { |
*(.text); |
*(.rodata*); |
} :text |
.data ALIGN(0x1000) : SUBALIGN(0x1000) { |
*(.data); |
} :data |
.tdata : { |
_tdata_start = .; |
*(.tdata); |
_tdata_end = .; |
} :data |
.tbss : { |
_tbss_start = .; |
*(.tbss); |
_tbss_end = .; |
} :data |
_tls_alignment = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss)); |
.bss : { |
*(COMMON); |
*(.bss); |
} :data |
. = ALIGN(0x1000); |
_heap = .; |
/DISCARD/ : { |
*(*); |
} |
} |
/tags/0.3.0/uspace/lib/libc/arch/ppc64/src/syscall.c |
---|
0,0 → 1,66 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcppc64 ppc64 |
* @brief ppc64 architecture dependent parts of libc |
* @ingroup lc |
* @{ |
*/ |
/** @file |
*/ |
#include <libc.h> |
sysarg_t __syscall(const sysarg_t p1, const sysarg_t p2, const sysarg_t p3, |
const sysarg_t p4, const sysarg_t p5, const sysarg_t p6, const syscall_t id) |
{ |
register sysarg_t __ppc32_reg_r3 asm("3") = p1; |
register sysarg_t __ppc32_reg_r4 asm("4") = p2; |
register sysarg_t __ppc32_reg_r5 asm("5") = p3; |
register sysarg_t __ppc32_reg_r6 asm("6") = p4; |
register sysarg_t __ppc32_reg_r7 asm("7") = p5; |
register sysarg_t __ppc32_reg_r8 asm("8") = p6; |
register sysarg_t __ppc32_reg_r9 asm("9") = id; |
asm volatile ( |
"sc\n" |
: "=r" (__ppc32_reg_r3) |
: "r" (__ppc32_reg_r3), |
"r" (__ppc32_reg_r4), |
"r" (__ppc32_reg_r5), |
"r" (__ppc32_reg_r6), |
"r" (__ppc32_reg_r7), |
"r" (__ppc32_reg_r8), |
"r" (__ppc32_reg_r9) |
); |
return __ppc32_reg_r3; |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/ppc64/src/tls.c |
---|
0,0 → 1,60 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcppc64 |
* @{ |
*/ |
/** @file |
*/ |
#include <tls.h> |
#include <malloc.h> |
/** Allocate TLS & TCB for initial module threads |
* |
* @param data Start of data section |
* @return pointer to tcb_t structure |
* |
*/ |
tcb_t * __alloc_tls(void **data, size_t size) |
{ |
tcb_t *tcb; |
*data = malloc(sizeof(tcb_t) + size); |
tcb = (tcb_t *) (*data + size); |
return tcb; |
} |
void __free_tls_arch(tcb_t *tcb, size_t size) |
{ |
void *start = ((void *) tcb) - size; |
free(start); |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/ppc64/src/fibril.S |
---|
0,0 → 1,110 |
# |
# Copyright (c) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
.text |
.global context_save |
.global context_restore |
#include <libarch/regname.h> |
#include <libarch/context_offset.h> |
.macro CONTEXT_STORE r |
stw sp, OFFSET_SP(\r) |
stw r2, OFFSET_R2(\r) |
stw r13, OFFSET_R13(\r) |
stw r14, OFFSET_R14(\r) |
stw r15, OFFSET_R15(\r) |
stw r16, OFFSET_R16(\r) |
stw r17, OFFSET_R17(\r) |
stw r18, OFFSET_R18(\r) |
stw r19, OFFSET_R19(\r) |
stw r20, OFFSET_R20(\r) |
stw r21, OFFSET_R21(\r) |
stw r22, OFFSET_R22(\r) |
stw r23, OFFSET_R23(\r) |
stw r24, OFFSET_R24(\r) |
stw r25, OFFSET_R25(\r) |
stw r26, OFFSET_R26(\r) |
stw r27, OFFSET_R27(\r) |
stw r28, OFFSET_R28(\r) |
stw r29, OFFSET_R29(\r) |
stw r30, OFFSET_R30(\r) |
stw r31, OFFSET_R31(\r) |
.endm |
.macro CONTEXT_LOAD r |
lwz sp, OFFSET_SP(\r) |
lwz r2, OFFSET_R2(\r) |
lwz r13, OFFSET_R13(\r) |
lwz r14, OFFSET_R14(\r) |
lwz r15, OFFSET_R15(\r) |
lwz r16, OFFSET_R16(\r) |
lwz r17, OFFSET_R17(\r) |
lwz r18, OFFSET_R18(\r) |
lwz r19, OFFSET_R19(\r) |
lwz r20, OFFSET_R20(\r) |
lwz r21, OFFSET_R21(\r) |
lwz r22, OFFSET_R22(\r) |
lwz r23, OFFSET_R23(\r) |
lwz r24, OFFSET_R24(\r) |
lwz r25, OFFSET_R25(\r) |
lwz r26, OFFSET_R26(\r) |
lwz r27, OFFSET_R27(\r) |
lwz r28, OFFSET_R28(\r) |
lwz r29, OFFSET_R29(\r) |
lwz r30, OFFSET_R30(\r) |
lwz r31, OFFSET_R31(\r) |
.endm |
context_save: |
CONTEXT_STORE r3 |
mflr r4 |
stw r4, OFFSET_PC(r3) |
mfcr r4 |
stw r4, OFFSET_CR(r3) |
# context_save returns 1 |
li r3, 1 |
blr |
context_restore: |
CONTEXT_LOAD r3 |
lwz r4, OFFSET_CR(r3) |
mtcr r4 |
lwz r4, OFFSET_PC(r3) |
mtlr r4 |
# context_restore returns 0 |
li r3, 0 |
blr |
/tags/0.3.0/uspace/lib/libc/arch/ppc64/src/entry.s |
---|
0,0 → 1,48 |
# |
# Copyright (c) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
.section .init, "ax" |
.org 0 |
.globl __entry |
.globl __entry_driver |
## User-space task entry point |
# |
# |
__entry: |
bl __main |
bl __io_init |
bl main |
bl __exit |
__entry_driver: |
bl __main |
bl main |
bl __exit |
/tags/0.3.0/uspace/lib/libc/arch/ppc64/src/thread_entry.s |
---|
0,0 → 1,39 |
# |
# Copyright (c) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
.text |
.globl __thread_entry |
## User-space thread entry point for all but the first threads. |
# |
# |
__thread_entry: |
b __thread_main |
.end __thread_entry |
/tags/0.3.0/uspace/lib/libc/arch/ppc64/include/tls.h |
---|
0,0 → 1,73 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcppc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_ppc64_TLS_H_ |
#define LIBC_ppc64_TLS_H_ |
#define CONFIG_TLS_VARIANT_1 |
#define PPC_TP_OFFSET 0x7000 |
typedef struct { |
void *fibril_data; |
} tcb_t; |
static inline void __tcb_set(tcb_t *tcb) |
{ |
void *tp = tcb; |
tp += PPC_TP_OFFSET + sizeof(tcb_t); |
asm volatile ( |
"mr %%r2, %0\n" |
: |
: "r" (tp) |
); |
} |
static inline tcb_t * __tcb_get(void) |
{ |
void * retval; |
asm volatile ( |
"mr %0, %%r2\n" |
: "=r" (retval) |
); |
return (tcb_t *)(retval - PPC_TP_OFFSET - sizeof(tcb_t)); |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/ppc64/include/thread.h |
---|
0,0 → 1,41 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcppc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_ppc64_THREAD_H_ |
#define LIBC_ppc64_THREAD_H_ |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/ppc64/include/types.h |
---|
0,0 → 1,55 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcppc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_ppc64_TYPES_H_ |
#define LIBC_ppc64_TYPES_H_ |
typedef unsigned long sysarg_t; |
typedef char int8_t; |
typedef short int int16_t; |
typedef int int32_t; |
typedef long int int64_t; |
typedef unsigned char uint8_t; |
typedef unsigned short int uint16_t; |
typedef unsigned int uint32_t; |
typedef unsigned long int uint64_t; |
typedef uint64_t uintptr_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/ppc64/include/fibril.h |
---|
0,0 → 1,83 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcppc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_ppc64_FIBRIL_H_ |
#define LIBC_ppc64_FIBRIL_H_ |
#include <sys/types.h> |
/* We define our own context_set, because we need to set |
* the TLS pointer to the tcb+0x7000 |
* |
* See tls_set in thread.h |
*/ |
#define context_set(c, _pc, stack, size, ptls) \ |
(c)->pc = (sysarg_t) (_pc); \ |
(c)->sp = ((sysarg_t) (stack)) + (size) - SP_DELTA; \ |
(c)->tls = ((sysarg_t) (ptls)) + 0x7000 + sizeof(tcb_t); |
#define SP_DELTA 16 |
typedef struct { |
uint64_t sp; |
uint64_t pc; |
uint64_t tls; |
uint64_t r13; |
uint64_t r14; |
uint64_t r15; |
uint64_t r16; |
uint64_t r17; |
uint64_t r18; |
uint64_t r19; |
uint64_t r20; |
uint64_t r21; |
uint64_t r22; |
uint64_t r23; |
uint64_t r24; |
uint64_t r25; |
uint64_t r26; |
uint64_t r27; |
uint64_t r28; |
uint64_t r29; |
uint64_t r30; |
uint64_t r31; |
uint64_t cr; |
} __attribute__ ((packed)) context_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/ppc64/include/atomic.h |
---|
0,0 → 1,95 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcppc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_ppc64_ATOMIC_H_ |
#define LIBC_ppc64_ATOMIC_H_ |
static inline void atomic_inc(atomic_t *val) |
{ |
long tmp; |
asm volatile ( |
"1:\n" |
"lwarx %0, 0, %2\n" |
"addic %0, %0, 1\n" |
"stwcx. %0, 0, %2\n" |
"bne- 1b" |
: "=&r" (tmp), "=m" (val->count) |
: "r" (&val->count), "m" (val->count) |
: "cc"); |
} |
static inline void atomic_dec(atomic_t *val) |
{ |
long tmp; |
asm volatile ( |
"1:\n" |
"lwarx %0, 0, %2\n" |
"addic %0, %0, -1\n" |
"stwcx. %0, 0, %2\n" |
"bne- 1b" |
: "=&r" (tmp), "=m" (val->count) |
: "r" (&val->count), "m" (val->count) |
: "cc"); |
} |
static inline long atomic_postinc(atomic_t *val) |
{ |
atomic_inc(val); |
return val->count - 1; |
} |
static inline long atomic_postdec(atomic_t *val) |
{ |
atomic_dec(val); |
return val->count + 1; |
} |
static inline long atomic_preinc(atomic_t *val) |
{ |
atomic_inc(val); |
return val->count; |
} |
static inline long atomic_predec(atomic_t *val) |
{ |
atomic_dec(val); |
return val->count; |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/ppc64/include/syscall.h |
---|
0,0 → 1,44 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** |
* @file |
*/ |
#ifndef LIBC_ppc64_SYSCALL_H_ |
#define LIBC_ppc64_SYSCALL_H_ |
#include <syscall.h> |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/ppc64/include/endian.h |
---|
0,0 → 1,47 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcppc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_ppc64_ENDIAN_H_ |
#define LIBC_ppc64_ENDIAN_H_ |
#ifndef LIBC_ENDIAN_H_ |
# error "Never use <libarch/endian.h> directly - use <endian.h> instead." |
#endif |
#define __BYTE_ORDER __BIG_ENDIAN |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/ppc64/include/regname.h |
---|
0,0 → 1,188 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcppc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_ppc64_REGNAME_H_ |
#define LIBC_ppc64_REGNAME_H_ |
/* Condition Register Bit Fields */ |
#define cr0 0 |
#define cr1 1 |
#define cr2 2 |
#define cr3 3 |
#define cr4 4 |
#define cr5 5 |
#define cr6 6 |
#define cr7 7 |
/* General Purpose Registers (GPRs) */ |
#define r0 0 |
#define r1 1 |
#define r2 2 |
#define r3 3 |
#define r4 4 |
#define r5 5 |
#define r6 6 |
#define r7 7 |
#define r8 8 |
#define r9 9 |
#define r10 10 |
#define r11 11 |
#define r12 12 |
#define r13 13 |
#define r14 14 |
#define r15 15 |
#define r16 16 |
#define r17 17 |
#define r18 18 |
#define r19 19 |
#define r20 20 |
#define r21 21 |
#define r22 22 |
#define r23 23 |
#define r24 24 |
#define r25 25 |
#define r26 26 |
#define r27 27 |
#define r28 28 |
#define r29 29 |
#define r30 30 |
#define r31 31 |
/* GPR Aliases */ |
#define sp 1 |
/* Floating Point Registers (FPRs) */ |
#define fr0 0 |
#define fr1 1 |
#define fr2 2 |
#define fr3 3 |
#define fr4 4 |
#define fr5 5 |
#define fr6 6 |
#define fr7 7 |
#define fr8 8 |
#define fr9 9 |
#define fr10 10 |
#define fr11 11 |
#define fr12 12 |
#define fr13 13 |
#define fr14 14 |
#define fr15 15 |
#define fr16 16 |
#define fr17 17 |
#define fr18 18 |
#define fr19 19 |
#define fr20 20 |
#define fr21 21 |
#define fr22 22 |
#define fr23 23 |
#define fr24 24 |
#define fr25 25 |
#define fr26 26 |
#define fr27 27 |
#define fr28 28 |
#define fr29 29 |
#define fr30 30 |
#define fr31 31 |
#define vr0 0 |
#define vr1 1 |
#define vr2 2 |
#define vr3 3 |
#define vr4 4 |
#define vr5 5 |
#define vr6 6 |
#define vr7 7 |
#define vr8 8 |
#define vr9 9 |
#define vr10 10 |
#define vr11 11 |
#define vr12 12 |
#define vr13 13 |
#define vr14 14 |
#define vr15 15 |
#define vr16 16 |
#define vr17 17 |
#define vr18 18 |
#define vr19 19 |
#define vr20 20 |
#define vr21 21 |
#define vr22 22 |
#define vr23 23 |
#define vr24 24 |
#define vr25 25 |
#define vr26 26 |
#define vr27 27 |
#define vr28 28 |
#define vr29 29 |
#define vr30 30 |
#define vr31 31 |
#define evr0 0 |
#define evr1 1 |
#define evr2 2 |
#define evr3 3 |
#define evr4 4 |
#define evr5 5 |
#define evr6 6 |
#define evr7 7 |
#define evr8 8 |
#define evr9 9 |
#define evr10 10 |
#define evr11 11 |
#define evr12 12 |
#define evr13 13 |
#define evr14 14 |
#define evr15 15 |
#define evr16 16 |
#define evr17 17 |
#define evr18 18 |
#define evr19 19 |
#define evr20 20 |
#define evr21 21 |
#define evr22 22 |
#define evr23 23 |
#define evr24 24 |
#define evr25 25 |
#define evr26 26 |
#define evr27 27 |
#define evr28 28 |
#define evr29 29 |
#define evr30 30 |
#define evr31 31 |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/ppc64/include/stackarg.h |
---|
0,0 → 1,41 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcppc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_STACKARG_H_ |
#define LIBC_STACKARG_H_ |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/ppc64/include/faddr.h |
---|
0,0 → 1,45 |
/* |
* Copyright (c) 2005 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcppc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_ppc64_FADDR_H_ |
#define LIBC_ppc64_FADDR_H_ |
#include <libarch/types.h> |
#define FADDR(fptr) ((uintptr_t) (fptr)) |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/ppc64/include/limits.h |
---|
0,0 → 1,46 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcppc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_ppc64_LIMITS_H_ |
#define LIBC_ppc64_LIMITS_H_ |
#define LONG_MIN MIN_INT64 |
#define LONG_MAX MAX_INT64 |
#define ULONG_MIN MIN_UINT64 |
#define ULONG_MAX MAX_UINT64 |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/ppc64/include/config.h |
---|
0,0 → 1,45 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libppc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_ppc64_CONFIG_H_ |
#define LIBC_ppc64_CONFIG_H_ |
#define PAGE_WIDTH 12 |
#define PAGE_SIZE (1<<PAGE_WIDTH) |
#define PAGE_COLOR_BITS 0 /* dummy */ |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/ppc64/include/context_offset.h |
---|
0,0 → 1,24 |
/* struct context */ |
#define OFFSET_SP 0x0 |
#define OFFSET_PC 0x4 |
#define OFFSET_R2 0x8 |
#define OFFSET_R13 0xc |
#define OFFSET_R14 0x10 |
#define OFFSET_R15 0x14 |
#define OFFSET_R16 0x18 |
#define OFFSET_R17 0x1c |
#define OFFSET_R18 0x20 |
#define OFFSET_R19 0x24 |
#define OFFSET_R20 0x28 |
#define OFFSET_R21 0x2c |
#define OFFSET_R22 0x30 |
#define OFFSET_R23 0x34 |
#define OFFSET_R24 0x38 |
#define OFFSET_R25 0x3c |
#define OFFSET_R26 0x40 |
#define OFFSET_R27 0x44 |
#define OFFSET_R28 0x48 |
#define OFFSET_R29 0x4c |
#define OFFSET_R30 0x50 |
#define OFFSET_R31 0x54 |
#define OFFSET_CR 0x58 |
/tags/0.3.0/uspace/lib/libc/arch/ppc64/Makefile.inc |
---|
0,0 → 1,44 |
# |
# Copyright (c) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
## Toolchain configuration |
# |
TARGET = ppc64-linux-gnu |
TOOLCHAIN_DIR = /usr/local/ppc64/bin |
ARCH_SOURCES += arch/$(ARCH)/src/syscall.c \ |
arch/$(ARCH)/src/fibril.S \ |
arch/$(ARCH)/src/tls.c |
CFLAGS += -mcpu=powerpc64 -msoft-float -m64 |
AFLAGS += -a64 |
LFLAGS += -N |
BFD_NAME = elf64-powerpc |
BFD_ARCH = powerpc:common64 |
/tags/0.3.0/uspace/lib/libc/arch/ppc64/_link.ld.in |
---|
0,0 → 1,50 |
STARTUP(LIBC_PREFIX/arch/ARCH/src/entry.o) |
ENTRY(__entry) |
PHDRS { |
text PT_LOAD FLAGS(5); |
data PT_LOAD FLAGS(6); |
} |
SECTIONS { |
. = 0x1000; |
.init ALIGN(0x1000) : SUBALIGN(0x1000) { |
*(.init); |
} :text |
.text : { |
*(.text); |
*(.toc); |
*(.rodata*); |
} :text |
.data ALIGN(0x1000) : SUBALIGN(0x1000) { |
*(.opd); |
*(.data*); |
*(.sdata); |
} :data |
.tdata : { |
_tdata_start = .; |
*(.tdata); |
_tdata_end = .; |
} :data |
.tbss : { |
_tbss_start = .; |
*(.tbss); |
_tbss_end = .; |
} :data |
_tls_alignment = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss)); |
.bss : { |
*(.sbss); |
*(COMMON); |
*(.bss); |
} :data |
. = ALIGN(0x1000); |
_heap = .; |
/DISCARD/ : { |
*(*); |
} |
} |
/tags/0.3.0/uspace/lib/libc/arch/arm32/src/syscall.c |
---|
0,0 → 1,78 |
/* |
* Copyright (c) 2007 Pavel Jancik |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcarm32 |
* @{ |
*/ |
/** @file |
* @brief Syscall routine. |
*/ |
#include <libc.h> |
/** Syscall routine. |
* |
* Stores p1-p4, id to r0-r4 registers and calls <code>swi</code> |
* instruction. Returned value is read from r0 register. |
* |
* @param p1 Parameter 1. |
* @param p2 Parameter 2. |
* @param p3 Parameter 3. |
* @param p4 Parameter 4. |
* @param id Number of syscall. |
* |
* @return Syscall return value. |
*/ |
sysarg_t __syscall(const sysarg_t p1, const sysarg_t p2, const sysarg_t p3, |
const sysarg_t p4, const sysarg_t p5, const sysarg_t p6, const syscall_t id) |
{ |
register sysarg_t __arm_reg_r0 asm("r0") = p1; |
register sysarg_t __arm_reg_r1 asm("r1") = p2; |
register sysarg_t __arm_reg_r2 asm("r2") = p3; |
register sysarg_t __arm_reg_r3 asm("r3") = p4; |
register sysarg_t __arm_reg_r4 asm("r4") = p5; |
register sysarg_t __arm_reg_r5 asm("r5") = p6; |
register sysarg_t __arm_reg_r6 asm("r6") = id; |
asm volatile ( "swi" |
: "=r" (__arm_reg_r0) |
: "r" (__arm_reg_r0), |
"r" (__arm_reg_r1), |
"r" (__arm_reg_r2), |
"r" (__arm_reg_r3), |
"r" (__arm_reg_r4), |
"r" (__arm_reg_r5), |
"r" (__arm_reg_r6) |
); |
return __arm_reg_r0; |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/arm32/src/tls.c |
---|
0,0 → 1,51 |
/* |
* Copyright (c) 2007 Pavel Jancik |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcarm32 arm32 |
* @brief arm32 architecture dependent parts of libc |
* @ingroup lc |
* @{ |
*/ |
/** @file |
*/ |
#include <tls.h> |
#include <sys/types.h> |
tcb_t * __alloc_tls(void **data, size_t size) |
{ |
return tls_alloc_variant_1(data, size); |
} |
void __free_tls_arch(tcb_t *tcb, size_t size) |
{ |
tls_free_variant_1(tcb, size); |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/arm32/src/fibril.S |
---|
0,0 → 1,49 |
# |
# Copyright (c) 2007 Michal Kebrt |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
.text |
.global context_save |
.global context_restore |
context_save: |
stmia r0!, {sp, lr} |
stmia r0!, {r4-r11} |
# return 1 |
mov r0, #1 |
mov pc, lr |
context_restore: |
ldmia r0!, {sp, lr} |
ldmia r0!, {r4-r11} |
#return 0 |
mov r0, #0 |
mov pc, lr |
/tags/0.3.0/uspace/lib/libc/arch/arm32/src/eabi.S |
---|
0,0 → 1,35 |
# |
# Copyright (c) 2007 Pavel Jancik |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
.text |
.global __aeabi_read_tp |
__aeabi_read_tp: |
mov r0, r9 |
mov pc, lr |
/tags/0.3.0/uspace/lib/libc/arch/arm32/src/entry.s |
---|
0,0 → 1,49 |
# |
# Copyright (c) 2007 Michal Kebrt, Pavel Jancik |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
.section .init, "ax" |
.org 0 |
.global __entry |
.global __entry_driver |
## User-space task entry point |
# |
# |
__entry: |
bl __main |
bl __io_init |
bl main |
bl __exit |
__entry_driver: |
bl __main |
bl main |
bl __exit |
/tags/0.3.0/uspace/lib/libc/arch/arm32/src/thread_entry.s |
---|
0,0 → 1,37 |
# |
# Copyright (c) 2006 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
.text |
.global __thread_entry |
## User-space thread entry point for all but the first threads. |
# |
# |
__thread_entry: |
b __thread_main |
/tags/0.3.0/uspace/lib/libc/arch/arm32/include/tls.h |
---|
0,0 → 1,99 |
/* |
* Copyright (c) 2007 Pavel Jancik |
* Copyright (c) 2007 Michal Kebrt |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcarm32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_arm32_TLS_H_ |
#define LIBC_arm32_TLS_H_ |
#include <sys/types.h> |
#define CONFIG_TLS_VARIANT_1 |
/** Offsets for accessing __thread variables are shifted 8 bytes higher. */ |
#define ARM_TP_OFFSET (-8) |
/** TCB (Thread Control Block) struct. |
* |
* TLS starts just after this struct. |
*/ |
typedef struct { |
/** Fibril data. */ |
void *fibril_data; |
} tcb_t; |
/** Sets TLS address to the r9 register. |
* |
* @param tcb TCB (TLS starts behind) |
*/ |
static inline void __tcb_set(tcb_t *tcb) |
{ |
void *tls = (void *) tcb; |
tls += sizeof(tcb_t) + ARM_TP_OFFSET; |
asm volatile ( |
"mov r9, %0" |
: |
: "r" (tls) |
); |
} |
/** Returns TCB address. |
* |
* @return TCB address (starts before TLS which address is stored |
* in r9 register). |
*/ |
static inline tcb_t *__tcb_get(void) |
{ |
void *ret; |
asm volatile ( |
"mov %0, r9" |
: "=r"(ret) |
); |
return (tcb_t *) (ret - ARM_TP_OFFSET - sizeof(tcb_t)); |
} |
/** Returns TLS address stored. |
* |
* Implemented in assembly. |
* |
* @return TLS address stored in r9 register |
*/ |
extern uintptr_t __aeabi_read_tp(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/arm32/include/thread.h |
---|
0,0 → 1,42 |
/* |
* Copyright (c) 2007 Pavel Jancik |
* Copyright (c) 2007 Michal Kebrt |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcarm32 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_arm32_THREAD_H_ |
#define LIBC_arm32_THREAD_H_ |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/arm32/include/types.h |
---|
0,0 → 1,56 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcarm32 |
* @{ |
*/ |
/** @file |
* @brief Definitions of basic types like #uintptr_t. |
*/ |
#ifndef LIBC_arm32_TYPES_H_ |
#define LIBC_arm32_TYPES_H_ |
typedef unsigned int sysarg_t; |
typedef char int8_t; |
typedef short int int16_t; |
typedef long int int32_t; |
typedef long long int int64_t; |
typedef unsigned char uint8_t; |
typedef unsigned short int uint16_t; |
typedef unsigned long int uint32_t; |
typedef unsigned long long int uint64_t; |
typedef uint32_t uintptr_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/arm32/include/fibril.h |
---|
0,0 → 1,90 |
/* |
* Copyright (c) 2007 Michal Kebrt |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcarm32 |
* @{ |
*/ |
/** @file |
* @brief Fibrils related declarations. |
*/ |
#ifndef LIBC_arm32_FIBRIL_H_ |
#define LIBC_arm32_FIBRIL_H_ |
#include <sys/types.h> |
#include <align.h> |
#include "thread.h" |
/** Size of a stack item */ |
#define STACK_ITEM_SIZE 4 |
/** Stack alignment - see <a href="http://www.arm.com/support/faqdev/14269.html">ABI</a> for details */ |
#define STACK_ALIGNMENT 8 |
#define SP_DELTA (0 + ALIGN_UP(STACK_ITEM_SIZE, STACK_ALIGNMENT)) |
/** Sets data to the context. |
* |
* @param c Context (#context_t). |
* @param _pc Program counter. |
* @param stack Stack address. |
* @param size Stack size. |
* @param ptls Pointer to the TCB. |
*/ |
#define context_set(c, _pc, stack, size, ptls) \ |
(c)->pc = (sysarg_t) (_pc); \ |
(c)->sp = ((sysarg_t) (stack)) + (size) - SP_DELTA; \ |
(c)->tls = ((sysarg_t)(ptls)) + sizeof(tcb_t) + ARM_TP_OFFSET; |
/** Fibril context. |
* |
* Only registers preserved accross function calls are included. r9 is used |
* to store a TLS address. -ffixed-r9 gcc forces gcc not to use this |
* register. -mtp=soft forces gcc to use #__aeabi_read_tp to obtain |
* TLS address. |
*/ |
typedef struct { |
uint32_t sp; |
uint32_t pc; |
uint32_t r4; |
uint32_t r5; |
uint32_t r6; |
uint32_t r7; |
uint32_t r8; |
uint32_t tls; |
uint32_t r10; |
uint32_t r11; |
} context_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/arm32/include/atomic.h |
---|
0,0 → 1,136 |
/* |
* Copyright (c) 2007 Michal Kebrt |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcarm32 |
* @{ |
*/ |
/** @file |
* @brief Atomic operations. |
*/ |
#ifndef LIBC_arm32_ATOMIC_H_ |
#define LIBC_arm32_ATOMIC_H_ |
/** Atomic addition. |
* |
* @param val Where to add. |
* @param i Value to be added. |
* |
* @return Value after addition. |
*/ |
static inline long atomic_add(atomic_t *val, int i) |
{ |
int ret; |
volatile long * mem = &(val->count); |
asm volatile ( |
"1:\n" |
"ldr r2, [%1]\n" |
"add r3, r2, %2\n" |
"str r3, %0\n" |
"swp r3, r3, [%1]\n" |
"cmp r3, r2\n" |
"bne 1b\n" |
: "=m" (ret) |
: "r" (mem), "r" (i) |
: "r3", "r2" |
); |
return ret; |
} |
/** Atomic increment. |
* |
* @param val Variable to be incremented. |
*/ |
static inline void atomic_inc(atomic_t *val) |
{ |
atomic_add(val, 1); |
} |
/** Atomic decrement. |
* |
* @param val Variable to be decremented. |
*/ |
static inline void atomic_dec(atomic_t *val) |
{ |
atomic_add(val, -1); |
} |
/** Atomic pre-increment. |
* |
* @param val Variable to be incremented. |
* @return Value after incrementation. |
*/ |
static inline long atomic_preinc(atomic_t *val) |
{ |
return atomic_add(val, 1); |
} |
/** Atomic pre-decrement. |
* |
* @param val Variable to be decremented. |
* @return Value after decrementation. |
*/ |
static inline long atomic_predec(atomic_t *val) |
{ |
return atomic_add(val, -1); |
} |
/** Atomic post-increment. |
* |
* @param val Variable to be incremented. |
* @return Value before incrementation. |
*/ |
static inline long atomic_postinc(atomic_t *val) |
{ |
return atomic_add(val, 1) - 1; |
} |
/** Atomic post-decrement. |
* |
* @param val Variable to be decremented. |
* @return Value before decrementation. |
*/ |
static inline long atomic_postdec(atomic_t *val) |
{ |
return atomic_add(val, -1) + 1; |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/arm32/include/syscall.h |
---|
0,0 → 1,44 |
/* |
* Copyright (c) 2007 Michal Kebrt |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcarm32 |
* @{ |
*/ |
/** @file |
* @brief Empty. |
*/ |
#ifndef LIBC_arm32_SYSCALL_H_ |
#define LIBC_arm32_SYSCALL_H_ |
#include <syscall.h> |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/arm32/include/endian.h |
---|
0,0 → 1,48 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcarm32 |
* @{ |
*/ |
/** @file |
* @brief Endianness definition. |
*/ |
#ifndef LIBC_arm32_ENDIAN_H_ |
#define LIBC_arm32_ENDIAN_H_ |
#ifndef LIBC_ENDIAN_H_ |
# error "Never use <libarch/endian.h> directly - use <endian.h> instead." |
#endif |
#define __BYTE_ORDER __LITTLE_ENDIAN |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/arm32/include/stackarg.h |
---|
0,0 → 1,43 |
/* |
* Copyright (c) 2007 Michal Kebrt |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcarm32 |
* @{ |
*/ |
/** @file |
* @brief Empty. |
*/ |
#ifndef LIBC_arm32_STACKARG_H_ |
#define LIBC_arm32_STACKARG_H_ |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/arm32/include/faddr.h |
---|
0,0 → 1,50 |
/* |
* Copyright (c) 2007 Michal Kebrt |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcarm32 |
* @{ |
*/ |
/** @file |
* @brief Function address conversion. |
*/ |
#ifndef LIBC_arm32_FADDR_H_ |
#define LIBC_arm32_FADDR_H_ |
#include <libarch/types.h> |
/** Calculate absolute address of function referenced by fptr pointer. |
* |
* @param f Function pointer. |
*/ |
#define FADDR(f) (f) |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/arm32/include/limits.h |
---|
0,0 → 1,47 |
/* |
* Copyright (c) 2007 Michal Kebrt |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcarm32 |
* @{ |
*/ |
/** @file |
* @brief Limits declarations. |
*/ |
#ifndef LIBC_arm32__LIMITS_H_ |
#define LIBC_arm32__LIMITS_H_ |
#define LONG_MIN MIN_INT32 |
#define LONG_MAX MAX_INT32 |
#define ULONG_MIN MIN_UINT32 |
#define ULONG_MAX MAX_UINT32 |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/arm32/include/config.h |
---|
0,0 → 1,46 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcarm32 |
* @{ |
*/ |
/** @file |
* @brief Configuration constants. |
*/ |
#ifndef LIBC_arm32_CONFIG_H_ |
#define LIBC_arm32_CONFIG_H_ |
#define PAGE_WIDTH 12 |
#define PAGE_SIZE (1 << PAGE_WIDTH) |
#define PAGE_COLOR_BITS 0 /* dummy */ |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/arm32/Makefile.inc |
---|
0,0 → 1,45 |
# |
# Copyright (c) 2007 Michal Kebrt |
# Copyright (c) 2007 Pavel Jancik |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
## Toolchain configuration |
# |
TARGET = arm-linux-gnu |
TOOLCHAIN_DIR = /usr/local/arm/bin |
CFLAGS += -ffixed-r9 -mtp=soft |
LFLAGS += -N $(SOFTINT_PREFIX)/libsoftint.a |
AFLAGS += |
ARCH_SOURCES += arch/$(ARCH)/src/syscall.c \ |
arch/$(ARCH)/src/fibril.S \ |
arch/$(ARCH)/src/tls.c \ |
arch/$(ARCH)/src/eabi.S |
BFD_NAME = elf32-littlearm |
BFD_ARCH = arm |
/tags/0.3.0/uspace/lib/libc/arch/arm32/_link.ld.in |
---|
0,0 → 1,50 |
STARTUP(LIBC_PREFIX/arch/ARCH/src/entry.o) |
ENTRY(__entry) |
PHDRS { |
text PT_LOAD FLAGS(5); |
data PT_LOAD FLAGS(6); |
} |
SECTIONS { |
. = 0x1000; |
.init ALIGN(0x1000): SUBALIGN(0x1000) { |
*(.init); |
} : text |
.text : { |
*(.text); |
*(.rodata*); |
} :text |
.data ALIGN(0x1000) : SUBALIGN(0x1000) { |
*(.opd); |
*(.data .data.*); |
*(.sdata); |
} :data |
.tdata : { |
_tdata_start = .; |
*(.tdata); |
_tdata_end = .; |
} :data |
.tbss : { |
_tbss_start = .; |
*(.tbss); |
_tbss_end = .; |
} :data |
_tls_alignment = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss)); |
.bss : { |
*(.sbss); |
*(.scommon); |
*(COMMON); |
*(.bss); |
} :data |
. = ALIGN(0x1000); |
_heap = .; |
/DISCARD/ : { |
*(*); |
} |
} |
/tags/0.3.0/uspace/lib/libc/arch/sparc64/include/syscall.h |
---|
0,0 → 1,66 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcsparc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_sparc64_SYSCALL_H_ |
#define LIBC_sparc64_SYSCALL_H_ |
#include <sys/types.h> |
#include <kernel/syscall/syscall.h> |
static inline sysarg_t |
__syscall(const sysarg_t p1, const sysarg_t p2, const sysarg_t p3, |
const sysarg_t p4, const sysarg_t p5, const sysarg_t p6, const syscall_t id) |
{ |
register uint64_t a1 asm("o0") = p1; |
register uint64_t a2 asm("o1") = p2; |
register uint64_t a3 asm("o2") = p3; |
register uint64_t a4 asm("o3") = p4; |
register uint64_t a5 asm("o4") = p5; |
register uint64_t a6 asm("o5") = p6; |
asm volatile ( |
"ta %7\n" |
: "=r" (a1) |
: "r" (a1), "r" (a2), "r" (a3), "r" (a4), "r" (a5), "r" (a6), |
"i" (id) |
: "memory" |
); |
return a1; |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/sparc64/include/tls.h |
---|
0,0 → 1,65 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcsparc64 |
* @{ |
*/ |
/** |
* @file |
* @brief sparc64 TLS functions. |
*/ |
#ifndef LIBC_sparc64_TLS_H_ |
#define LIBC_sparc64_TLS_H_ |
#define CONFIG_TLS_VARIANT_2 |
typedef struct { |
void *self; |
void *fibril_data; |
} tcb_t; |
static inline void __tcb_set(tcb_t *tcb) |
{ |
asm volatile ("mov %0, %%g7\n" : : "r" (tcb) : "g7"); |
} |
static inline tcb_t * __tcb_get(void) |
{ |
void *retval; |
asm volatile ("mov %%g7, %0\n" : "=r" (retval)); |
return retval; |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/sparc64/include/thread.h |
---|
0,0 → 1,40 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcsparc64 |
* @{ |
*/ |
#ifndef LIBC_sparc64_THREAD_H_ |
#define LIBC_sparc64_THREAD_H_ |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/sparc64/include/atomic.h |
---|
0,0 → 1,97 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcsparc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_sparc64_ATOMIC_H_ |
#define LIBC_sparc64_ATOMIC_H_ |
#include <sys/types.h> |
/** Atomic add operation. |
* |
* Use atomic compare and swap operation to atomically add signed value. |
* |
* @param val Atomic variable. |
* @param i Signed value to be added. |
* |
* @return Value of the atomic variable as it existed before addition. |
*/ |
static inline long atomic_add(atomic_t *val, int i) |
{ |
uint64_t a, b; |
do { |
volatile uintptr_t x = (uint64_t) &val->count; |
a = *((uint64_t *) x); |
b = a + i; |
asm volatile ("casx %0, %2, %1\n" : "+m" (*((uint64_t *)x)), "+r" (b) : "r" (a)); |
} while (a != b); |
return a; |
} |
static inline long atomic_preinc(atomic_t *val) |
{ |
return atomic_add(val, 1) + 1; |
} |
static inline long atomic_postinc(atomic_t *val) |
{ |
return atomic_add(val, 1); |
} |
static inline long atomic_predec(atomic_t *val) |
{ |
return atomic_add(val, -1) - 1; |
} |
static inline long atomic_postdec(atomic_t *val) |
{ |
return atomic_add(val, -1); |
} |
static inline void atomic_inc(atomic_t *val) |
{ |
(void) atomic_add(val, 1); |
} |
static inline void atomic_dec(atomic_t *val) |
{ |
(void) atomic_add(val, -1); |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/sparc64/include/types.h |
---|
0,0 → 1,55 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcsparc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_sparc64_TYPES_H_ |
#define LIBC_sparc64_TYPES_H_ |
typedef unsigned long sysarg_t; |
typedef signed char int8_t; |
typedef short int int16_t; |
typedef int int32_t; |
typedef long int int64_t; |
typedef unsigned char uint8_t; |
typedef unsigned short int uint16_t; |
typedef unsigned int uint32_t; |
typedef unsigned long int uint64_t; |
typedef uint64_t uintptr_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/sparc64/include/fibril.h |
---|
0,0 → 1,84 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcsparc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_sparc64_FIBRIL_H_ |
#define LIBC_sparc64_FIBRIL_H_ |
#include <libarch/stack.h> |
#include <sys/types.h> |
#include <align.h> |
#define SP_DELTA STACK_WINDOW_SAVE_AREA_SIZE |
#ifdef context_set |
#undef context_set |
#endif |
#define context_set(c, _pc, stack, size, ptls) \ |
(c)->pc = ((uintptr_t) _pc) - 8; \ |
(c)->sp = ((uintptr_t) stack) + ALIGN_UP((size), \ |
STACK_ALIGNMENT) - (STACK_BIAS + SP_DELTA); \ |
(c)->fp = -STACK_BIAS; \ |
(c)->tp = ptls |
/* |
* Save only registers that must be preserved across |
* function calls. |
*/ |
typedef struct { |
uintptr_t sp; /* %o6 */ |
uintptr_t pc; /* %o7 */ |
uint64_t i0; |
uint64_t i1; |
uint64_t i2; |
uint64_t i3; |
uint64_t i4; |
uint64_t i5; |
uintptr_t fp; /* %i6 */ |
uintptr_t i7; |
uint64_t l0; |
uint64_t l1; |
uint64_t l2; |
uint64_t l3; |
uint64_t l4; |
uint64_t l5; |
uint64_t l6; |
uint64_t l7; |
uint64_t tp; /* %g7 */ |
} context_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/sparc64/include/config.h |
---|
0,0 → 1,45 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcsparc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_sparc64_CONFIG_H_ |
#define LIBC_sparc64_CONFIG_H_ |
#define PAGE_WIDTH 14 |
#define PAGE_SIZE (1 << PAGE_WIDTH) |
#define PAGE_COLOR_BITS 0 /**< Only one page color. */ |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/sparc64/include/stack.h |
---|
0,0 → 1,56 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcsparc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_sparc64_STACK_H_ |
#define LIBC_sparc64_STACK_H_ |
#define STACK_ITEM_SIZE 8 |
/** According to SPARC Compliance Definition, every stack frame is 16-byte aligned. */ |
#define STACK_ALIGNMENT 16 |
/** |
* 16-extended-word save area for %i[0-7] and %l[0-7] registers. |
*/ |
#define STACK_WINDOW_SAVE_AREA_SIZE (16 * STACK_ITEM_SIZE) |
/** |
* By convention, the actual top of the stack is %sp + STACK_BIAS. |
*/ |
#define STACK_BIAS 2047 |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/sparc64/include/endian.h |
---|
0,0 → 1,47 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcsparc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_sparc64_ENDIAN_H_ |
#define LIBC_sparc64_ENDIAN_H_ |
#ifndef LIBC_ENDIAN_H_ |
# error "Never use <libarch/endian.h> directly - use <endian.h> instead." |
#endif |
#define __BYTE_ORDER __BIG_ENDIAN |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/sparc64/include/stackarg.h |
---|
0,0 → 1,41 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcsparc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_sparc64_STACKARG_H_ |
#define LIBC_sparc64_STACKARG_H_ |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/sparc64/include/faddr.h |
---|
0,0 → 1,45 |
/* |
* Copyright (c) 2005 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcsparc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_sparc64_FADDR_H_ |
#define LIBC_sparc64_FADDR_H_ |
#include <libarch/types.h> |
#define FADDR(fptr) ((uintptr_t) (fptr)) |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/sparc64/include/limits.h |
---|
0,0 → 1,46 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcsparc64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_sparc64_LIMITS_H_ |
#define LIBC_sparc64_LIMITS_H_ |
#define LONG_MIN MIN_INT64 |
#define LONG_MAX MAX_INT64 |
#define ULONG_MIN MIN_UINT64 |
#define ULONG_MAX MAX_UINT64 |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/sparc64/include/context_offset.h |
---|
0,0 → 1,21 |
/* This file is automatically generated by gencontext.c. */ |
/* struct context */ |
#define OFFSET_SP 0x0 |
#define OFFSET_PC 0x8 |
#define OFFSET_I0 0x10 |
#define OFFSET_I1 0x18 |
#define OFFSET_I2 0x20 |
#define OFFSET_I3 0x28 |
#define OFFSET_I4 0x30 |
#define OFFSET_I5 0x38 |
#define OFFSET_FP 0x40 |
#define OFFSET_I7 0x48 |
#define OFFSET_L0 0x50 |
#define OFFSET_L1 0x58 |
#define OFFSET_L2 0x60 |
#define OFFSET_L3 0x68 |
#define OFFSET_L4 0x70 |
#define OFFSET_L5 0x78 |
#define OFFSET_L6 0x80 |
#define OFFSET_L7 0x88 |
#define OFFSET_TP 0x90 |
/tags/0.3.0/uspace/lib/libc/arch/sparc64/Makefile.inc |
---|
0,0 → 1,42 |
# |
# Copyright (c) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
## Toolchain configuration |
# |
TARGET = sparc64-linux-gnu |
TOOLCHAIN_DIR = /usr/local/sparc64/bin |
ARCH_SOURCES += arch/$(ARCH)/src/fibril.S \ |
arch/$(ARCH)/src/tls.c |
CFLAGS += -mcpu=ultrasparc -m64 |
LFLAGS += -no-check-sections -N |
BFD_NAME = elf64-sparc |
BFD_ARCH = sparc |
/tags/0.3.0/uspace/lib/libc/arch/sparc64/src/tls.c |
---|
0,0 → 1,51 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcsparc64 sparc64 |
* @ingroup lc |
* @{ |
*/ |
/** @file |
* |
*/ |
#include <tls.h> |
#include <sys/types.h> |
tcb_t * __alloc_tls(void **data, size_t size) |
{ |
return tls_alloc_variant_2(data, size); |
} |
void __free_tls_arch(tcb_t *tcb, size_t size) |
{ |
tls_free_variant_2(tcb, size); |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/sparc64/src/fibril.S |
---|
0,0 → 1,97 |
# |
# Copyright (c) 2005 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
#include <libarch/context_offset.h> |
.text |
.global context_save |
.global context_restore |
.macro CONTEXT_STORE r |
stx %sp, [\r + OFFSET_SP] |
stx %o7, [\r + OFFSET_PC] |
stx %i0, [\r + OFFSET_I0] |
stx %i1, [\r + OFFSET_I1] |
stx %i2, [\r + OFFSET_I2] |
stx %i3, [\r + OFFSET_I3] |
stx %i4, [\r + OFFSET_I4] |
stx %i5, [\r + OFFSET_I5] |
stx %fp, [\r + OFFSET_FP] |
stx %i7, [\r + OFFSET_I7] |
stx %l0, [\r + OFFSET_L0] |
stx %l1, [\r + OFFSET_L1] |
stx %l2, [\r + OFFSET_L2] |
stx %l3, [\r + OFFSET_L3] |
stx %l4, [\r + OFFSET_L4] |
stx %l5, [\r + OFFSET_L5] |
stx %l6, [\r + OFFSET_L6] |
stx %l7, [\r + OFFSET_L7] |
stx %g7, [\r + OFFSET_TP] |
.endm |
.macro CONTEXT_LOAD r |
ldx [\r + OFFSET_SP], %sp |
ldx [\r + OFFSET_PC], %o7 |
ldx [\r + OFFSET_I0], %i0 |
ldx [\r + OFFSET_I1], %i1 |
ldx [\r + OFFSET_I2], %i2 |
ldx [\r + OFFSET_I3], %i3 |
ldx [\r + OFFSET_I4], %i4 |
ldx [\r + OFFSET_I5], %i5 |
ldx [\r + OFFSET_FP], %fp |
ldx [\r + OFFSET_I7], %i7 |
ldx [\r + OFFSET_L0], %l0 |
ldx [\r + OFFSET_L1], %l1 |
ldx [\r + OFFSET_L2], %l2 |
ldx [\r + OFFSET_L3], %l3 |
ldx [\r + OFFSET_L4], %l4 |
ldx [\r + OFFSET_L5], %l5 |
ldx [\r + OFFSET_L6], %l6 |
ldx [\r + OFFSET_L7], %l7 |
ldx [\r + OFFSET_TP], %g7 |
.endm |
context_save: |
CONTEXT_STORE %o0 |
retl |
mov 1, %o0 ! context_save_arch returns 1 |
context_restore: |
# |
# Flush all active windows. |
# This is essential, because CONTEXT_LOAD overwrites |
# %sp of CWP - 1 with the value written to %fp of CWP. |
# Flushing all active windows mitigates this problem |
# as CWP - 1 becomes the overlap window. |
# |
flushw |
CONTEXT_LOAD %o0 |
retl |
xor %o0, %o0, %o0 ! context_restore_arch returns 0 |
/tags/0.3.0/uspace/lib/libc/arch/sparc64/src/thread_entry.s |
---|
0,0 → 1,43 |
# |
# Copyright (c) 2006 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
.text |
.globl __thread_entry |
## User-space thread entry point for all but the first threads. |
# |
# |
__thread_entry: |
sethi %hi(_gp), %l7 |
call __thread_main ! %o0 contains address of uarg |
or %l7, %lo(_gp), %l7 |
! not reached |
.end __thread_entry |
/tags/0.3.0/uspace/lib/libc/arch/sparc64/src/entry.s |
---|
0,0 → 1,57 |
# |
# Copyright (c) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
.section .init, "ax" |
.org 0 |
.globl __entry |
.globl __entry_driver |
## User-space task entry point |
# |
# |
__entry: |
sethi %hi(_gp), %l7 |
call __main |
or %l7, %lo(_gp), %l7 |
call __io_init |
nop |
call main |
nop |
call __exit |
nop |
__entry_driver: |
sethi %hi(_gp), %l7 |
call __main |
or %l7, %lo(_gp), %l7 |
call main |
nop |
call __exit |
nop |
/tags/0.3.0/uspace/lib/libc/arch/sparc64/_link.ld.in |
---|
0,0 → 1,52 |
STARTUP(LIBC_PREFIX/arch/ARCH/src/entry.o) |
ENTRY(__entry) |
PHDRS { |
text PT_LOAD FLAGS(5); |
data PT_LOAD FLAGS(6); |
} |
SECTIONS { |
. = 0x4000; |
.init ALIGN(0x4000) : SUBALIGN(0x4000) { |
*(.init); |
} :text |
.text : { |
*(.text); |
*(.rodata*); |
} :text |
.got ALIGN(0x4000) : SUBALIGN(0x4000) { |
_gp = .; |
*(.got*); |
} :data |
.data ALIGN(0x4000) : SUBALIGN(0x4000) { |
*(.data); |
*(.sdata); |
} :data |
.tdata : { |
_tdata_start = .; |
*(.tdata); |
_tdata_end = .; |
} :data |
.tbss : { |
_tbss_start = .; |
*(.tbss); |
_tbss_end = .; |
} :data |
_tls_alignment = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss)); |
.bss : { |
*(.sbss); |
*(COMMON); |
*(.bss); |
} :data |
. = ALIGN(0x4000); |
_heap = .; |
/DISCARD/ : { |
*(*); |
} |
} |
/tags/0.3.0/uspace/lib/libc/arch/ia64/src/syscall.S |
---|
0,0 → 1,44 |
# |
# Copyright (c) 2006 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
/** |
* Immediate operand for break instruction. |
* Be carefull about the value as Ski simulator |
* is somewhat sensitive to its value. |
* |
* 0 will be confused with Ski breakpoint. |
* And higher values will be confused with SSC's. |
*/ |
#define SYSCALL_IMM 1 |
.global __syscall |
__syscall: |
alloc r14 = ar.pfs, 7, 0, 0, 0 ;; |
break SYSCALL_IMM |
mov ar.pfs = r14 ;; |
br.ret.sptk.many b0 |
/tags/0.3.0/uspace/lib/libc/arch/ia64/src/tls.c |
---|
0,0 → 1,51 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcia64 ia64 |
* @brief ia64 architecture dependent parts of libc |
* @ingroup lc |
* @{ |
*/ |
/** @file |
*/ |
#include <tls.h> |
#include <malloc.h> |
tcb_t * __alloc_tls(void **data, size_t size) |
{ |
return tls_alloc_variant_1(data, size); |
} |
void __free_tls_arch(tcb_t *tcb, size_t size) |
{ |
tls_free_variant_1(tcb, size); |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/ia64/src/fibril.S |
---|
0,0 → 1,246 |
# |
# Copyright (c) 2005 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
.text |
.global context_save |
.global context_restore |
context_save: |
alloc loc0 = ar.pfs, 1, 8, 0, 0 |
mov loc1 = ar.unat ;; |
/* loc2 */ |
mov loc3 = ar.rsc |
.auto |
/* |
* Flush dirty registers to backing store. |
* After this ar.bsp and ar.bspstore are equal. |
*/ |
flushrs |
mov loc4 = ar.bsp |
/* |
* Put RSE to enforced lazy mode. |
* So that ar.rnat can be read. |
*/ |
and loc5 = ~3, loc3 |
mov ar.rsc = loc5 |
mov loc5 = ar.rnat |
.explicit |
mov loc6 = ar.lc |
/* |
* Save application registers |
*/ |
st8 [in0] = loc0, 8 ;; /* save ar.pfs */ |
st8 [in0] = loc1, 8 ;; /* save ar.unat (caller) */ |
mov loc2 = in0 ;; |
add in0 = 8, in0 ;; /* skip ar.unat (callee) */ |
st8 [in0] = loc3, 8 ;; /* save ar.rsc */ |
st8 [in0] = loc4, 8 ;; /* save ar.bsp */ |
st8 [in0] = loc5, 8 ;; /* save ar.rnat */ |
st8 [in0] = loc6, 8 ;; /* save ar.lc */ |
/* |
* Save general registers including NaT bits |
*/ |
st8.spill [in0] = r1, 8 ;; |
st8.spill [in0] = r4, 8 ;; |
st8.spill [in0] = r5, 8 ;; |
st8.spill [in0] = r6, 8 ;; |
st8.spill [in0] = r7, 8 ;; |
st8.spill [in0] = r12, 8 ;; /* save sp */ |
st8.spill [in0] = r13, 8 ;; /* save tp */ |
mov loc3 = ar.unat ;; |
st8 [loc2] = loc3 /* save ar.unat (callee) */ |
/* |
* Save branch registers |
*/ |
mov loc2 = b0 ;; |
st8 [in0] = loc2, 8 /* save pc */ |
mov loc3 = b1 ;; |
st8 [in0] = loc3, 8 |
mov loc4 = b2 ;; |
st8 [in0] = loc4, 8 |
mov loc5 = b3 ;; |
st8 [in0] = loc5, 8 |
mov loc6 = b4 ;; |
st8 [in0] = loc6, 8 |
mov loc7 = b5 ;; |
st8 [in0] = loc7, 8 |
/* |
* Save predicate registers |
*/ |
mov loc2 = pr ;; |
st8 [in0] = loc2, 16;; /* Next fpu registers should be spilled to 16B aligned address */ |
/* |
* Save floating-point registers. |
*/ |
stf.spill [in0] = f2, 16 ;; |
stf.spill [in0] = f3, 16 ;; |
stf.spill [in0] = f4, 16 ;; |
stf.spill [in0] = f5, 16 ;; |
stf.spill [in0] = f16, 16 ;; |
stf.spill [in0] = f17, 16 ;; |
stf.spill [in0] = f18, 16 ;; |
stf.spill [in0] = f19, 16 ;; |
stf.spill [in0] = f20, 16 ;; |
stf.spill [in0] = f21, 16 ;; |
stf.spill [in0] = f22, 16 ;; |
stf.spill [in0] = f23, 16 ;; |
stf.spill [in0] = f24, 16 ;; |
stf.spill [in0] = f25, 16 ;; |
stf.spill [in0] = f26, 16 ;; |
stf.spill [in0] = f27, 16 ;; |
stf.spill [in0] = f28, 16 ;; |
stf.spill [in0] = f29, 16 ;; |
stf.spill [in0] = f30, 16 ;; |
stf.spill [in0] = f31, 16 ;; |
mov ar.unat = loc1 |
add r8 = r0, r0, 1 /* context_save returns 1 */ |
br.ret.sptk.many b0 |
context_restore: |
alloc loc0 = ar.pfs, 1, 9, 0, 0 ;; |
ld8 loc0 = [in0], 8 ;; /* load ar.pfs */ |
ld8 loc1 = [in0], 8 ;; /* load ar.unat (caller) */ |
ld8 loc2 = [in0], 8 ;; /* load ar.unat (callee) */ |
ld8 loc3 = [in0], 8 ;; /* load ar.rsc */ |
ld8 loc4 = [in0], 8 ;; /* load ar.bsp */ |
ld8 loc5 = [in0], 8 ;; /* load ar.rnat */ |
ld8 loc6 = [in0], 8 ;; /* load ar.lc */ |
.auto |
/* |
* Invalidate the ALAT |
*/ |
invala |
/* |
* Put RSE to enforced lazy mode. |
* So that ar.bspstore and ar.rnat can be written. |
*/ |
movl loc8 = ~3 |
and loc8 = loc3, loc8 |
mov ar.rsc = loc8 |
/* |
* Flush dirty registers to backing store. |
* We do this because we want the following move |
* to ar.bspstore to assign the same value to ar.bsp. |
*/ |
flushrs |
/* |
* Restore application registers |
*/ |
mov ar.bspstore = loc4 /* rse.bspload = ar.bsp = ar.bspstore = loc4 */ |
mov ar.rnat = loc5 |
mov ar.pfs = loc0 |
mov ar.rsc = loc3 |
.explicit |
mov ar.unat = loc2 ;; |
mov ar.lc = loc6 |
/* |
* Restore general registers including NaT bits |
*/ |
ld8.fill r1 = [in0], 8 ;; |
ld8.fill r4 = [in0], 8 ;; |
ld8.fill r5 = [in0], 8 ;; |
ld8.fill r6 = [in0], 8 ;; |
ld8.fill r7 = [in0], 8 ;; |
ld8.fill r12 = [in0], 8 ;; /* restore sp */ |
ld8.fill r13 = [in0], 8 ;; |
/* |
* Restore branch registers |
*/ |
ld8 loc2 = [in0], 8 ;; /* restore pc */ |
mov b0 = loc2 |
ld8 loc3 = [in0], 8 ;; |
mov b1 = loc3 |
ld8 loc4 = [in0], 8 ;; |
mov b2 = loc4 |
ld8 loc5 = [in0], 8 ;; |
mov b3 = loc5 |
ld8 loc6 = [in0], 8 ;; |
mov b4 = loc6 |
ld8 loc7 = [in0], 8 ;; |
mov b5 = loc7 |
/* |
* Restore predicate registers |
*/ |
ld8 loc2 = [in0], 16 ;; |
mov pr = loc2, ~0 |
/* |
* Restore floating-point registers. |
*/ |
ldf.fill f2 = [in0], 16 ;; |
ldf.fill f3 = [in0], 16 ;; |
ldf.fill f4 = [in0], 16 ;; |
ldf.fill f5 = [in0], 16 ;; |
ldf.fill f16 = [in0], 16 ;; |
ldf.fill f17 = [in0], 16 ;; |
ldf.fill f18 = [in0], 16 ;; |
ldf.fill f19 = [in0], 16 ;; |
ldf.fill f20 = [in0], 16 ;; |
ldf.fill f21 = [in0], 16 ;; |
ldf.fill f22 = [in0], 16 ;; |
ldf.fill f23 = [in0], 16 ;; |
ldf.fill f24 = [in0], 16 ;; |
ldf.fill f25 = [in0], 16 ;; |
ldf.fill f26 = [in0], 16 ;; |
ldf.fill f27 = [in0], 16 ;; |
ldf.fill f28 = [in0], 16 ;; |
ldf.fill f29 = [in0], 16 ;; |
ldf.fill f30 = [in0], 16 ;; |
ldf.fill f31 = [in0], 16 ;; |
mov ar.unat = loc1 |
mov r8 = r0 /* context_restore returns 0 */ |
br.ret.sptk.many b0 |
/tags/0.3.0/uspace/lib/libc/arch/ia64/src/entry.s |
---|
0,0 → 1,57 |
# |
# Copyright (c) 2006 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
.section .init, "ax" |
.org 0 |
.globl __entry |
.globl __entry_driver |
## User-space task entry point |
# |
# |
__entry: |
alloc loc0 = ar.pfs, 0, 1, 2, 0 |
mov r1 = _gp |
br.call.sptk.many b0 = __main |
0: |
br.call.sptk.many b0 = __io_init |
1: |
br.call.sptk.many b0 = main |
2: |
br.call.sptk.many b0 = __exit |
__entry_driver: |
alloc loc0 = ar.pfs, 0, 1, 2, 0 |
mov r1 = _gp |
br.call.sptk.many b0 = __main |
0: |
br.call.sptk.many b0 = main |
1: |
br.call.sptk.many b0 = __exit |
/tags/0.3.0/uspace/lib/libc/arch/ia64/src/thread_entry.s |
---|
0,0 → 1,52 |
# |
# Copyright (c) 2006 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
.text |
.globl __thread_entry |
## User-space thread entry point for all but the first threads. |
# |
# |
__thread_entry: |
alloc loc0 = ar.pfs, 0, 1, 1, 0 |
mov r1 = _gp |
# |
# r8 contains address of uarg structure. |
# |
mov out0 = r8 |
br.call.sptk.many b0 = __thread_main |
# |
# Not reached. |
# |
.end __thread_entry |
/tags/0.3.0/uspace/lib/libc/arch/ia64/Makefile.inc |
---|
0,0 → 1,43 |
# |
# Copyright (c) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
## Toolchain configuration |
# |
TARGET = ia64-pc-linux-gnu |
TOOLCHAIN_DIR = /usr/local/ia64/bin |
CFLAGS += -fno-unwind-tables -DMALLOC_ALIGNMENT_16 |
LFLAGS += -N $(SOFTINT_PREFIX)/libsoftint.a |
AFLAGS += |
ARCH_SOURCES += arch/$(ARCH)/src/syscall.S \ |
arch/$(ARCH)/src/fibril.S \ |
arch/$(ARCH)/src/tls.c |
BFD_NAME = elf64-ia64-little |
BFD_ARCH = ia64-elf64 |
/tags/0.3.0/uspace/lib/libc/arch/ia64/include/tls.h |
---|
0,0 → 1,65 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcia64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_ia64_TLS_H_ |
#define LIBC_ia64_TLS_H_ |
#define CONFIG_TLS_VARIANT_1 |
#include <sys/types.h> |
/* This structure must be exactly 16 bytes long */ |
typedef struct { |
void *dtv; /* unused in static linking*/ |
void *fibril_data; |
} tcb_t; |
static inline void __tcb_set(tcb_t *tcb) |
{ |
asm volatile ("mov r13 = %0\n" : : "r" (tcb) : "r13"); |
} |
static inline tcb_t *__tcb_get(void) |
{ |
void *retval; |
asm volatile ("mov %0 = r13\n" : "=r" (retval)); |
return retval; |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/ia64/include/thread.h |
---|
0,0 → 1,43 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcia64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_ia64_THREAD_H_ |
#define LIBC_ia64_THREAD_H_ |
#define THREAD_INITIAL_STACK_PAGES_NO 2 |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/ia64/include/types.h |
---|
0,0 → 1,65 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcia64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_ia64_TYPES_H_ |
#define LIBC_ia64_TYPES_H_ |
typedef unsigned long long sysarg_t; |
typedef char int8_t; |
typedef short int int16_t; |
typedef int int32_t; |
typedef long int int64_t; |
typedef unsigned char uint8_t; |
typedef unsigned short int uint16_t; |
typedef unsigned int uint32_t; |
typedef unsigned long int uint64_t; |
typedef uint64_t uintptr_t; |
typedef unsigned char __r8; /* Reserve byte */ |
typedef unsigned short __r16; |
typedef unsigned int __r32; |
typedef unsigned long __r64; |
typedef struct __r128{ |
__r64 lo; |
__r64 hi; |
} __r128; |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/ia64/include/fibril.h |
---|
0,0 → 1,139 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcia64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_ia64_FIBRIL_H_ |
#define LIBC_ia64_FIBRIL_H_ |
#include <sys/types.h> |
#include <align.h> |
#include <libarch/stack.h> |
#include <libarch/types.h> |
/* |
* context_save() and context_restore() are both leaf procedures. |
* No need to allocate scratch area. |
*/ |
#define SP_DELTA (0 + ALIGN_UP(STACK_ITEM_SIZE, STACK_ALIGNMENT)) |
#define PFM_MASK (~0x3fffffffff) |
#define PSTHREAD_INITIAL_STACK_PAGES_NO 2 |
/* Stack is divided into two equal parts (for memory stack and register stack). */ |
#define PSTHREAD_INITIAL_STACK_DIVISION 2 |
#ifdef context_set |
#undef context_set |
#endif |
#define context_set(c, _pc, stack, size, tls) \ |
do { \ |
(c)->pc = (uint64_t) _pc; \ |
(c)->bsp = ((uint64_t) stack) + size / PSTHREAD_INITIAL_STACK_DIVISION; \ |
(c)->ar_pfs &= PFM_MASK; \ |
(c)->sp = ((uint64_t) stack) + ALIGN_UP((size / PSTHREAD_INITIAL_STACK_DIVISION), STACK_ALIGNMENT) - SP_DELTA; \ |
(c)->tp = (uint64_t) tls; \ |
} while (0); |
/* |
* Only save registers that must be preserved across |
* function calls. |
*/ |
typedef struct context { |
/* |
* Application registers |
*/ |
uint64_t ar_pfs; |
uint64_t ar_unat_caller; |
uint64_t ar_unat_callee; |
uint64_t ar_rsc; |
uint64_t bsp; /* ar_bsp */ |
uint64_t ar_rnat; |
uint64_t ar_lc; |
/* |
* General registers |
*/ |
uint64_t r1; |
uint64_t r4; |
uint64_t r5; |
uint64_t r6; |
uint64_t r7; |
uint64_t sp; /* r12 */ |
uint64_t tp; /* r13 */ |
/* |
* Branch registers |
*/ |
uint64_t pc; /* b0 */ |
uint64_t b1; |
uint64_t b2; |
uint64_t b3; |
uint64_t b4; |
uint64_t b5; |
/* |
* Predicate registers |
*/ |
uint64_t pr; |
__r128 f2 __attribute__ ((aligned(16))); |
__r128 f3; |
__r128 f4; |
__r128 f5; |
__r128 f16; |
__r128 f17; |
__r128 f18; |
__r128 f19; |
__r128 f20; |
__r128 f21; |
__r128 f22; |
__r128 f23; |
__r128 f24; |
__r128 f25; |
__r128 f26; |
__r128 f27; |
__r128 f28; |
__r128 f29; |
__r128 f30; |
__r128 f31; |
} context_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/ia64/include/atomic.h |
---|
0,0 → 1,66 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcia64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_ia64_ATOMIC_H_ |
#define LIBC_ia64_ATOMIC_H_ |
/** Atomic addition. |
* |
* @param val Atomic value. |
* @param imm Value to add. |
* |
* @return Value before addition. |
*/ |
static inline long atomic_add(atomic_t *val, int imm) |
{ |
long v; |
asm volatile ("fetchadd8.rel %0 = %1, %2\n" : "=r" (v), "+m" (val->count) : "i" (imm)); |
return v; |
} |
static inline void atomic_inc(atomic_t *val) { atomic_add(val, 1); } |
static inline void atomic_dec(atomic_t *val) { atomic_add(val, -1); } |
static inline long atomic_preinc(atomic_t *val) { return atomic_add(val, 1) + 1; } |
static inline long atomic_predec(atomic_t *val) { return atomic_add(val, -1) - 1; } |
static inline long atomic_postinc(atomic_t *val) { return atomic_add(val, 1); } |
static inline long atomic_postdec(atomic_t *val) { return atomic_add(val, -1); } |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/ia64/include/syscall.h |
---|
0,0 → 1,44 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** |
* @file |
*/ |
#ifndef LIBC_ia64_SYSCALL_H_ |
#define LIBC_ia64_SYSCALL_H_ |
#include <syscall.h> |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/ia64/include/endian.h |
---|
0,0 → 1,47 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcia64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_ia64_ENDIAN_H_ |
#define LIBC_ia64_ENDIAN_H_ |
#ifndef LIBC_ENDIAN_H_ |
# error "Never use <libarch/endian.h> directly - use <endian.h> instead." |
#endif |
#define __BYTE_ORDER __LITTLE_ENDIAN |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/ia64/include/stackarg.h |
---|
0,0 → 1,43 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcia64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_STACKARG_H_ |
#define LIBC_STACKARG_H_ |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/ia64/include/faddr.h |
---|
0,0 → 1,53 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcia64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_ia64_FADDR_H_ |
#define LIBC_ia64_FADDR_H_ |
#include <libarch/types.h> |
/** |
* |
* Calculate absolute address of function |
* referenced by fptr pointer. |
* |
* @param f Function pointer. |
* |
*/ |
#define FADDR(f) (*((uintptr_t *)(f))); |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/ia64/include/limits.h |
---|
0,0 → 1,46 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcia64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_ia64_LIMITS_H_ |
#define LIBC_ia64_LIMITS_H_ |
# define LONG_MIN MIN_INT64 |
# define LONG_MAX MAX_INT64 |
# define ULONG_MIN MIN_UINT64 |
# define ULONG_MAX MAX_UINT64 |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/ia64/include/config.h |
---|
0,0 → 1,45 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcia64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_ia64_CONFIG_H_ |
#define LIBC_ia64_CONFIG_H_ |
#define PAGE_WIDTH 14 |
#define PAGE_SIZE (1<<PAGE_WIDTH) |
#define PAGE_COLOR_BITS 0 /* dummy */ |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/ia64/include/stack.h |
---|
0,0 → 1,46 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcia64 |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_ia64_STACK_H_ |
#define LIBC_ia64_STACK_H_ |
#define STACK_ITEM_SIZE 8 |
#define STACK_ALIGNMENT 16 |
#define STACK_SCRATCH_AREA_SIZE 16 |
#define REGISTER_STACK_ALIGNMENT 8 |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/arch/ia64/_link.ld.in |
---|
0,0 → 1,53 |
STARTUP(LIBC_PREFIX/arch/ARCH/src/entry.o) |
ENTRY(__entry) |
PHDRS { |
text PT_LOAD FLAGS(5); |
data PT_LOAD FLAGS(6); |
} |
SECTIONS { |
. = 0x4000; |
.init ALIGN(0x4000): SUBALIGN(0x4000) { |
*(.init); |
} : text |
.text : { |
*(.text); |
*(.rodata*); |
} :text |
.got ALIGN(0x4000) : SUBALIGN(0x4000) { |
_gp = .; |
*(.got*); |
} :data |
.data : { |
*(.opd); |
*(.data .data.*); |
*(.sdata); |
} :data |
.tdata : { |
_tdata_start = .; |
*(.tdata); |
_tdata_end = .; |
} :data |
.tbss : { |
_tbss_start = .; |
*(.tbss); |
_tbss_end = .; |
} :data |
_tls_alignment = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss)); |
.bss : { |
*(.sbss); |
*(.scommon); |
*(COMMON); |
*(.bss); |
} :data |
. = ALIGN(0x4000); |
_heap = .; |
/DISCARD/ : { |
*(*); |
} |
} |
/tags/0.3.0/uspace/lib/libc/include/setjmp.h |
---|
0,0 → 1,49 |
/* |
* Copyright (c) 2008 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_SETJMP_H_ |
#define LIBC_SETJMP_H_ |
#include <libarch/fibril.h> |
typedef context_t jmp_buf; |
extern int setjmp(jmp_buf env); |
extern void longjmp(jmp_buf env,int val) __attribute__((__noreturn__)); |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/include/unistd.h |
---|
0,0 → 1,69 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_UNISTD_H_ |
#define LIBC_UNISTD_H_ |
#include <sys/types.h> |
#include <libarch/config.h> |
#ifndef NULL |
#define NULL 0 |
#endif |
#define getpagesize() (PAGE_SIZE) |
#define SEEK_SET 0 |
#define SEEK_CUR 1 |
#define SEEK_END 2 |
extern ssize_t write(int, const void *, size_t); |
extern ssize_t read(int, void *, size_t); |
extern off_t lseek(int, off_t, int); |
extern int ftruncate(int, off_t); |
extern int close(int); |
extern int unlink(const char *); |
extern int rmdir(const char *); |
extern int chdir(const char *); |
extern char *getcwd(char *buf, size_t); |
extern void _exit(int status); |
extern void *sbrk(ssize_t incr); |
extern int usleep(unsigned long usec); |
extern unsigned int sleep(unsigned int seconds); |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/include/stdio.h |
---|
0,0 → 1,75 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_STDIO_H_ |
#define LIBC_STDIO_H_ |
#include <sys/types.h> |
#include <stdarg.h> |
#define EOF (-1) |
#include <string.h> |
#include <io/stream.h> |
#define DEBUG(fmt, ...) \ |
{ \ |
char buf[256]; \ |
int n; \ |
n = snprintf(buf, sizeof(buf), fmt, ##__VA_ARGS__); \ |
if (n > 0) \ |
(void) __SYSCALL3(SYS_IO, 1, (sysarg_t) buf, strlen(buf)); \ |
} |
extern int getchar(void); |
extern int puts(const char * str); |
extern int putchar(int c); |
extern int printf(const char *fmt, ...); |
extern int sprintf(char *str, const char *fmt, ...); |
extern int snprintf(char *str, size_t size, const char *fmt, ...); |
extern int vprintf(const char *fmt, va_list ap); |
extern int vsprintf(char *str, const char *fmt, va_list ap); |
extern int vsnprintf(char *str, size_t size, const char *fmt, va_list ap); |
#define fprintf(f, fmt, ...) printf(fmt, ##__VA_ARGS__) |
extern int rename(const char *, const char *); |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/include/errno.h |
---|
0,0 → 1,53 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_ERRNO_H_ |
#define LIBC_ERRNO_H_ |
#include <kernel/errno.h> |
#define ENAMETOOLONG (-256) |
#define EISDIR (-257) |
#define ENOTDIR (-258) |
#define ENOSPC (-259) |
#define EEXIST (-260) |
#define ENOTEMPTY (-261) |
#define EBADF (-262) |
#define ERANGE (-263) |
#define EXDEV (-264) |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/include/libadt/hash_table.h |
---|
0,0 → 1,94 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_HASH_TABLE_H_ |
#define LIBC_HASH_TABLE_H_ |
#include <libadt/list.h> |
#include <unistd.h> |
typedef unsigned long hash_count_t; |
typedef unsigned long hash_index_t; |
typedef struct hash_table hash_table_t; |
typedef struct hash_table_operations hash_table_operations_t; |
/** Hash table structure. */ |
struct hash_table { |
link_t *entry; |
hash_count_t entries; |
hash_count_t max_keys; |
hash_table_operations_t *op; |
}; |
/** Set of operations for hash table. */ |
struct hash_table_operations { |
/** Hash function. |
* |
* @param key Array of keys needed to compute hash index. All keys |
* must be passed. |
* |
* @return Index into hash table. |
*/ |
hash_index_t (* hash)(unsigned long key[]); |
/** Hash table item comparison function. |
* |
* @param key Array of keys that will be compared with item. It is |
* not necessary to pass all keys. |
* |
* @return true if the keys match, false otherwise. |
*/ |
int (*compare)(unsigned long key[], hash_count_t keys, link_t *item); |
/** Hash table item removal callback. |
* |
* @param item Item that was removed from the hash table. |
*/ |
void (*remove_callback)(link_t *item); |
}; |
#define hash_table_get_instance(item, type, member) \ |
list_get_instance((item), type, member) |
extern int hash_table_create(hash_table_t *, hash_count_t, hash_count_t, |
hash_table_operations_t *); |
extern void hash_table_insert(hash_table_t *, unsigned long [], link_t *); |
extern link_t *hash_table_find(hash_table_t *, unsigned long []); |
extern void hash_table_remove(hash_table_t *, unsigned long [], hash_count_t); |
extern void hash_table_destroy(hash_table_t *); |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/include/libadt/list.h |
---|
0,0 → 1,194 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_LIST_H_ |
#define LIBC_LIST_H_ |
#include <unistd.h> |
#ifndef true |
# define true 1 |
#endif |
#ifndef false |
# define false 0 |
#endif |
typedef struct link link_t; |
/** Doubly linked list head and link type. */ |
struct link { |
link_t *prev; /**< Pointer to the previous item in the list. */ |
link_t *next; /**< Pointer to the next item in the list. */ |
}; |
/** Declare and initialize statically allocated list. |
* |
* @param name Name of the new statically allocated list. |
*/ |
#define LIST_INITIALIZE(name) link_t name = { .prev = &name, .next = &name } |
/** Initialize doubly-linked circular list link |
* |
* Initialize doubly-linked list link. |
* |
* @param link Pointer to link_t structure to be initialized. |
*/ |
static inline void link_initialize(link_t *link) |
{ |
link->prev = NULL; |
link->next = NULL; |
} |
/** Initialize doubly-linked circular list |
* |
* Initialize doubly-linked circular list. |
* |
* @param head Pointer to link_t structure representing head of the list. |
*/ |
static inline void list_initialize(link_t *head) |
{ |
head->prev = head; |
head->next = head; |
} |
/** Add item to the beginning of doubly-linked circular list |
* |
* Add item to the beginning of doubly-linked circular list. |
* |
* @param link Pointer to link_t structure to be added. |
* @param head Pointer to link_t structure representing head of the list. |
*/ |
static inline void list_prepend(link_t *link, link_t *head) |
{ |
link->next = head->next; |
link->prev = head; |
head->next->prev = link; |
head->next = link; |
} |
/** Add item to the end of doubly-linked circular list |
* |
* Add item to the end of doubly-linked circular list. |
* |
* @param link Pointer to link_t structure to be added. |
* @param head Pointer to link_t structure representing head of the list. |
*/ |
static inline void list_append(link_t *link, link_t *head) |
{ |
link->prev = head->prev; |
link->next = head; |
head->prev->next = link; |
head->prev = link; |
} |
/** Remove item from doubly-linked circular list |
* |
* Remove item from doubly-linked circular list. |
* |
* @param link Pointer to link_t structure to be removed from the list it is contained in. |
*/ |
static inline void list_remove(link_t *link) |
{ |
link->next->prev = link->prev; |
link->prev->next = link->next; |
link_initialize(link); |
} |
/** Query emptiness of doubly-linked circular list |
* |
* Query emptiness of doubly-linked circular list. |
* |
* @param head Pointer to link_t structure representing head of the list. |
*/ |
static inline int list_empty(link_t *head) |
{ |
return head->next == head ? true : false; |
} |
/** Split or concatenate headless doubly-linked circular list |
* |
* Split or concatenate headless doubly-linked circular list. |
* |
* Note that the algorithm works both directions: |
* concatenates splitted lists and splits concatenated lists. |
* |
* @param part1 Pointer to link_t structure leading the first (half of the headless) list. |
* @param part2 Pointer to link_t structure leading the second (half of the headless) list. |
*/ |
static inline void headless_list_split_or_concat(link_t *part1, link_t *part2) |
{ |
link_t *hlp; |
part1->prev->next = part2; |
part2->prev->next = part1; |
hlp = part1->prev; |
part1->prev = part2->prev; |
part2->prev = hlp; |
} |
/** Split headless doubly-linked circular list |
* |
* Split headless doubly-linked circular list. |
* |
* @param part1 Pointer to link_t structure leading the first half of the headless list. |
* @param part2 Pointer to link_t structure leading the second half of the headless list. |
*/ |
static inline void headless_list_split(link_t *part1, link_t *part2) |
{ |
headless_list_split_or_concat(part1, part2); |
} |
/** Concatenate two headless doubly-linked circular lists |
* |
* Concatenate two headless doubly-linked circular lists. |
* |
* @param part1 Pointer to link_t structure leading the first headless list. |
* @param part2 Pointer to link_t structure leading the second headless list. |
*/ |
static inline void headless_list_concat(link_t *part1, link_t *part2) |
{ |
headless_list_split_or_concat(part1, part2); |
} |
#define list_get_instance(link,type,member) (type *)(((char *)(link))-((char *)&(((type *)NULL)->member))) |
extern int list_member(const link_t *link, const link_t *head); |
extern void list_concat(link_t *head1, link_t *head2); |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/include/libadt/fifo.h |
---|
0,0 → 1,127 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
/* |
* This implementation of FIFO stores values in an array |
* (static or dynamic). As such, these FIFOs have upper bound |
* on number of values they can store. Push and pop operations |
* are done via accessing the array through head and tail indices. |
* Because of better operation ordering in fifo_pop(), the access |
* policy for these two indices is to 'increment (mod size of FIFO) |
* and use'. |
*/ |
#ifndef LIBC_FIFO_H_ |
#define LIBC_FIFO_H_ |
#include <malloc.h> |
typedef unsigned long fifo_count_t; |
typedef unsigned long fifo_index_t; |
#define FIFO_CREATE_STATIC(name, t, itms) \ |
struct { \ |
t fifo[(itms)]; \ |
fifo_count_t items; \ |
fifo_index_t head; \ |
fifo_index_t tail; \ |
} name |
/** Create and initialize static FIFO. |
* |
* FIFO is allocated statically. |
* This macro is suitable for creating smaller FIFOs. |
* |
* @param name Name of FIFO. |
* @param t Type of values stored in FIFO. |
* @param itms Number of items that can be stored in FIFO. |
*/ |
#define FIFO_INITIALIZE_STATIC(name, t, itms) \ |
FIFO_CREATE_STATIC(name, t, itms) = { \ |
.items = (itms), \ |
.head = 0, \ |
.tail = 0 \ |
} |
/** Create and prepare dynamic FIFO. |
* |
* FIFO is allocated dynamically. |
* This macro is suitable for creating larger FIFOs. |
* |
* @param name Name of FIFO. |
* @param t Type of values stored in FIFO. |
* @param itms Number of items that can be stored in FIFO. |
*/ |
#define FIFO_INITIALIZE_DYNAMIC(name, t, itms) \ |
struct { \ |
t *fifo; \ |
fifo_count_t items; \ |
fifo_index_t head; \ |
fifo_index_t tail; \ |
} name = { \ |
.fifo = NULL, \ |
.items = (itms), \ |
.head = 0, \ |
.tail = 0 \ |
} |
/** Pop value from head of FIFO. |
* |
* @param name FIFO name. |
* |
* @return Leading value in FIFO. |
*/ |
#define fifo_pop(name) \ |
name.fifo[name.head = (name.head + 1) < name.items ? (name.head + 1) : 0] |
/** Push value to tail of FIFO. |
* |
* @param name FIFO name. |
* @param value Value to be appended to FIFO. |
* |
*/ |
#define fifo_push(name, value) \ |
name.fifo[name.tail = (name.tail + 1) < name.items ? (name.tail + 1) : 0] = (value) |
/** Allocate memory for dynamic FIFO. |
* |
* @param name FIFO name. |
*/ |
#define fifo_create(name) \ |
name.fifo = malloc(sizeof(*name.fifo) * name.items) |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/include/vfs/vfs.h |
---|
0,0 → 1,43 |
/* |
* Copyright (c) 2007 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_VFS_H_ |
#define LIBC_VFS_H_ |
extern int mount(const char *, const char *, const char *); |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/include/vfs/canonify.h |
---|
0,0 → 1,45 |
/* |
* Copyright (c) 2008 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_VFS_CANONIFY_H_ |
#define LIBC_VFS_CANONIFY_H_ |
#include <sys/types.h> |
extern char *canonify(char *, size_t *); |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/include/string.h |
---|
0,0 → 1,67 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_STRING_H_ |
#define LIBC_STRING_H_ |
#include <sys/types.h> |
#define bzero(ptr, len) memset((ptr), 0, (len)) |
extern void * memset(void *, int, size_t); |
extern void * memcpy(void *, const void *, size_t); |
extern void * memmove(void *, const void *, size_t); |
extern int bcmp(const char *, const char *, size_t); |
extern int strcmp(const char *, const char *); |
extern int strncmp(const char *, const char *, size_t); |
extern char *strcpy(char *, const char *); |
extern char *strncpy(char *, const char *, size_t); |
extern char *strcat(char *, const char *); |
extern size_t strlen(const char *); |
extern char *strchr(const char *, int); |
extern char *strrchr(const char *, int); |
extern long int strtol(const char *, char **, int); |
extern unsigned long strtoul(const char *, char **, int); |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/include/fcntl.h |
---|
0,0 → 1,51 |
/* |
* Copyright (c) 2007 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_FCNTL_H_ |
#define LIBC_FCNTL_H_ |
#define O_CREAT 1 |
#define O_EXCL 2 |
#define O_TRUNC 4 |
#define O_APPEND 8 |
#define O_RDONLY 16 |
#define O_RDWR 32 |
#define O_WRONLY 64 |
extern int open(const char *, int, ...); |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/include/sys/stat.h |
---|
0,0 → 1,45 |
/* |
* Copyright (c) 2008 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_SYS_STAT_H_ |
#define LIBC_SYS_STAT_H_ |
#include <sys/types.h> |
extern int mkdir(const char *, mode_t); |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/include/sys/types.h |
---|
0,0 → 1,48 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_SYS_TYPES_H_ |
#define LIBC_SYS_TYPES_H_ |
#include <libarch/types.h> |
typedef unsigned long size_t; |
typedef signed long ssize_t; |
typedef long off_t; |
typedef int mode_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/include/sys/time.h |
---|
0,0 → 1,64 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_SYS_TIME_H_ |
#define LIBC_SYS_TIME_H_ |
#include <sys/types.h> |
#define DST_NONE 0 |
typedef long time_t; |
typedef long suseconds_t; |
struct timeval { |
time_t tv_sec; /* seconds */ |
suseconds_t tv_usec; /* microseconds */ |
}; |
struct timezone { |
int tz_minuteswest; /* minutes W of Greenwich */ |
int tz_dsttime; /* type of dst correction */ |
}; |
extern void tv_add(struct timeval *tv, suseconds_t usecs); |
extern suseconds_t tv_sub(struct timeval *tv1, struct timeval *tv2); |
extern int tv_gt(struct timeval *tv1, struct timeval *tv2); |
extern int tv_gteq(struct timeval *tv1, struct timeval *tv2); |
extern int gettimeofday(struct timeval *tv, struct timezone *tz); |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/include/sys/mman.h |
---|
0,0 → 1,59 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_MMAN_H_ |
#define LIBC_MMAN_H_ |
#include <as.h> |
#include <sys/types.h> |
#define MAP_FAILED ((void *) -1) |
#define MAP_SHARED (1 << 0) |
#define MAP_PRIVATE (1 << 1) |
#define MAP_FIXED (1 << 2) |
#define MAP_ANONYMOUS (1 << 3) |
#define PROTO_READ AS_AREA_READ |
#define PROTO_WRITE AS_AREA_WRITE |
#define PROTO_EXEC AS_AREA_EXEC |
extern void *mmap(void *start, size_t length, int prot, int flags, int fd, |
off_t offset); |
extern int munmap(void *start, size_t length); |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/include/dirent.h |
---|
0,0 → 1,58 |
/* |
* Copyright (c) 2008 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_DIRENT_H_ |
#define LIBC_DIRENT_H_ |
#define NAME_MAX 256 |
struct dirent { |
char d_name[NAME_MAX + 1]; |
}; |
typedef struct { |
int fd; |
struct dirent res; |
} DIR; |
extern DIR *opendir(const char *); |
extern struct dirent *readdir(DIR *); |
extern void rewinddir(DIR *); |
extern int closedir(DIR *); |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/include/rwlock.h |
---|
0,0 → 1,59 |
/* |
* Copyright (c) 2008 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** |
* @file |
* @brief This file contains rwlock API and provides its fake |
* implementation based on futexes. |
*/ |
#ifndef LIBC_RWLOCK_H_ |
#define LIBC_RWLOCK_H_ |
#include <atomic.h> |
#include <sys/types.h> |
#include <futex.h> |
typedef atomic_t rwlock_t; |
#define RWLOCK_INITIALIZE(rwlock) \ |
rwlock_t rwlock = FUTEX_INITIALIZER |
#define rwlock_initialize(rwlock) futex_initialize((rwlock), 1) |
#define rwlock_read_lock(rwlock) futex_down((rwlock)) |
#define rwlock_write_lock(rwlock) futex_down((rwlock)) |
#define rwlock_read_unlock(rwlock) futex_up((rwlock)) |
#define rwlock_write_unlock(rwlock) futex_up((rwlock)) |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/include/futex.h |
---|
0,0 → 1,54 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_FUTEX_H_ |
#define LIBC_FUTEX_H_ |
#include <atomic.h> |
#include <sys/types.h> |
#define FUTEX_INITIALIZER {1} |
typedef atomic_t futex_t; |
extern void futex_initialize(futex_t *futex, int value); |
extern int futex_down(futex_t *futex); |
extern int futex_trydown(futex_t *futex); |
extern int futex_down_timeout(futex_t *futex, uint32_t usec, int flags); |
extern int futex_up(futex_t *futex); |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/include/ipc/ipc.h |
---|
0,0 → 1,294 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcipc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBIPC_IPC_H_ |
#define LIBIPC_IPC_H_ |
#include <kernel/ipc/ipc.h> |
#include <kernel/ddi/irq.h> |
#include <sys/types.h> |
#include <kernel/synch/synch.h> |
typedef sysarg_t ipcarg_t; |
typedef struct { |
ipcarg_t args[IPC_CALL_LEN]; |
ipcarg_t in_phone_hash; |
} ipc_call_t; |
typedef sysarg_t ipc_callid_t; |
typedef void (* ipc_async_callback_t)(void *private, int retval, |
ipc_call_t *data); |
/* |
* User-friendly wrappers for ipc_call_sync_fast() and ipc_call_sync_slow(). |
* They are in the form ipc_call_sync_m_n(), where m denotes the number of |
* arguments of payload and n denotes number of return values. Whenever |
* possible, the fast version is used. |
*/ |
#define ipc_call_sync_0_0(phoneid, method) \ |
ipc_call_sync_fast((phoneid), (method), 0, 0, 0, 0, 0, 0, 0, 0) |
#define ipc_call_sync_0_1(phoneid, method, res1) \ |
ipc_call_sync_fast((phoneid), (method), 0, 0, 0, (res1), 0, 0, 0, 0) |
#define ipc_call_sync_0_2(phoneid, method, res1, res2) \ |
ipc_call_sync_fast((phoneid), (method), 0, 0, 0, (res1), (res2), 0, 0, 0) |
#define ipc_call_sync_0_3(phoneid, method, res1, res2, res3) \ |
ipc_call_sync_fast((phoneid), (method), 0, 0, 0, (res1), (res2), (res3), \ |
0, 0) |
#define ipc_call_sync_0_4(phoneid, method, res1, res2, res3, res4) \ |
ipc_call_sync_fast((phoneid), (method), 0, 0, 0, (res1), (res2), (res3), \ |
(res4), 0) |
#define ipc_call_sync_0_5(phoneid, method, res1, res2, res3, res4, res5) \ |
ipc_call_sync_fast((phoneid), (method), 0, 0, 0, (res1), (res2), (res3), \ |
(res4), (res5)) |
#define ipc_call_sync_1_0(phoneid, method, arg1) \ |
ipc_call_sync_fast((phoneid), (method), (arg1), 0, 0, 0, 0, 0, 0, 0) |
#define ipc_call_sync_1_1(phoneid, method, arg1, res1) \ |
ipc_call_sync_fast((phoneid), (method), (arg1), 0, 0, (res1), 0, 0, 0, 0) |
#define ipc_call_sync_1_2(phoneid, method, arg1, res1, res2) \ |
ipc_call_sync_fast((phoneid), (method), (arg1), 0, 0, (res1), (res2), 0, \ |
0, 0) |
#define ipc_call_sync_1_3(phoneid, method, arg1, res1, res2, res3) \ |
ipc_call_sync_fast((phoneid), (method), (arg1), 0, 0, (res1), (res2), \ |
(res3), 0, 0) |
#define ipc_call_sync_1_4(phoneid, method, arg1, res1, res2, res3, res4) \ |
ipc_call_sync_fast((phoneid), (method), (arg1), 0, 0, (res1), (res2), \ |
(res3), (res4), 0) |
#define ipc_call_sync_1_5(phoneid, method, arg1, res1, res2, res3, res4, \ |
res5) \ |
ipc_call_sync_fast((phoneid), (method), (arg1), 0, 0, (res1), (res2), \ |
(res3), (res4), (res5)) |
#define ipc_call_sync_2_0(phoneid, method, arg1, arg2) \ |
ipc_call_sync_fast((phoneid), (method), (arg1), (arg2), 0, 0, 0, 0, \ |
0, 0) |
#define ipc_call_sync_2_1(phoneid, method, arg1, arg2, res1) \ |
ipc_call_sync_fast((phoneid), (method), (arg1), (arg2), 0, (res1), 0, 0, \ |
0, 0) |
#define ipc_call_sync_2_2(phoneid, method, arg1, arg2, res1, res2) \ |
ipc_call_sync_fast((phoneid), (method), (arg1), (arg2), 0, (res1), \ |
(res2), 0, 0, 0) |
#define ipc_call_sync_2_3(phoneid, method, arg1, arg2, res1, res2, res3) \ |
ipc_call_sync_fast((phoneid), (method), (arg1), (arg2), 0, (res1), \ |
(res2), (res3), 0, 0) |
#define ipc_call_sync_2_4(phoneid, method, arg1, arg2, res1, res2, res3, \ |
res4) \ |
ipc_call_sync_fast((phoneid), (method), (arg1), (arg2), 0, (res1), \ |
(res2), (res3), (res4), 0) |
#define ipc_call_sync_2_5(phoneid, method, arg1, arg2, res1, res2, res3, \ |
res4, res5)\ |
ipc_call_sync_fast((phoneid), (method), (arg1), (arg2), 0, (res1), \ |
(res2), (res3), (res4), (res5)) |
#define ipc_call_sync_3_0(phoneid, method, arg1, arg2, arg3) \ |
ipc_call_sync_fast((phoneid), (method), (arg1), (arg2), (arg3), 0, 0, 0, \ |
0, 0) |
#define ipc_call_sync_3_1(phoneid, method, arg1, arg2, arg3, res1) \ |
ipc_call_sync_fast((phoneid), (method), (arg1), (arg2), (arg3), (res1), \ |
0, 0, 0, 0) |
#define ipc_call_sync_3_2(phoneid, method, arg1, arg2, arg3, res1, res2) \ |
ipc_call_sync_fast((phoneid), (method), (arg1), (arg2), (arg3), (res1), \ |
(res2), 0, 0, 0) |
#define ipc_call_sync_3_3(phoneid, method, arg1, arg2, arg3, res1, res2, \ |
res3) \ |
ipc_call_sync_fast((phoneid), (method), (arg1), (arg2), (arg3), \ |
(res1), (res2), (res3), 0, 0) |
#define ipc_call_sync_3_4(phoneid, method, arg1, arg2, arg3, res1, res2, \ |
res3, res4) \ |
ipc_call_sync_fast((phoneid), (method), (arg1), (arg2), (arg3), \ |
(res1), (res2), (res3), (res4), 0) |
#define ipc_call_sync_3_5(phoneid, method, arg1, arg2, arg3, res1, res2, \ |
res3, res4, res5) \ |
ipc_call_sync_fast((phoneid), (method), (arg1), (arg2), (arg3), \ |
(res1), (res2), (res3), (res4), (res5)) |
#define ipc_call_sync_4_0(phoneid, method, arg1, arg2, arg3, arg4) \ |
ipc_call_sync_slow((phoneid), (method), (arg1), (arg2), (arg3), (arg4), \ |
0, 0, 0, 0, 0) |
#define ipc_call_sync_4_1(phoneid, method, arg1, arg2, arg3, arg4, res1) \ |
ipc_call_sync_slow((phoneid), (method), (arg1), (arg2), (arg3), (arg4), \ |
(res1), 0, 0, 0, 0) |
#define ipc_call_sync_4_2(phoneid, method, arg1, arg2, arg3, arg4, res1, res2) \ |
ipc_call_sync_slow((phoneid), (method), (arg1), (arg2), (arg3), (arg4), \ |
(res1), (res2), 0, 0, 0) |
#define ipc_call_sync_4_3(phoneid, method, arg1, arg2, arg3, arg4, res1, res2, \ |
res3) \ |
ipc_call_sync_slow((phoneid), (method), (arg1), (arg2), (arg3), \ |
(arg4), (res1), (res2), (res3), 0, 0) |
#define ipc_call_sync_4_4(phoneid, method, arg1, arg2, arg3, arg4, res1, res2, \ |
res3, res4) \ |
ipc_call_sync_slow((phoneid), (method), (arg1), (arg2), (arg3), \ |
(arg4), (res1), (res2), (res3), (res4), 0) |
#define ipc_call_sync_4_5(phoneid, method, arg1, arg2, arg3, arg4, res1, res2, \ |
res3, res4, res5) \ |
ipc_call_sync_slow((phoneid), (method), (arg1), (arg2), (arg3), \ |
(arg4), (res1), (res2), (res3), (res4), (res5)) |
#define ipc_call_sync_5_0(phoneid, method, arg1, arg2, arg3, arg4, arg5) \ |
ipc_call_sync_slow((phoneid), (method), (arg1), (arg2), (arg3), (arg4), \ |
(arg5), 0, 0, 0, 0, 0) |
#define ipc_call_sync_5_1(phoneid, method, arg1, arg2, arg3, arg4, arg5, res1) \ |
ipc_call_sync_slow((phoneid), (method), (arg1), (arg2), (arg3), (arg4), \ |
(arg5), (res1), 0, 0, 0, 0) |
#define ipc_call_sync_5_2(phoneid, method, arg1, arg2, arg3, arg4, arg5, res1, \ |
res2) \ |
ipc_call_sync_slow((phoneid), (method), (arg1), (arg2), (arg3), \ |
(arg4), (arg5), (res1), (res2), 0, 0, 0) |
#define ipc_call_sync_5_3(phoneid, method, arg1, arg2, arg3, arg4, arg5, res1, \ |
res2, res3) \ |
ipc_call_sync_slow((phoneid), (method), (arg1), (arg2), (arg3), \ |
(arg4), (arg5), (res1), (res2), (res3), 0, 0) |
#define ipc_call_sync_5_4(phoneid, method, arg1, arg2, arg3, arg4, arg5, res1, \ |
res2, res3, res4) \ |
ipc_call_sync_slow((phoneid), (method), (arg1), (arg2), (arg3), \ |
(arg4), (arg5), (res1), (res2), (res3), (res4), 0) |
#define ipc_call_sync_5_5(phoneid, method, arg1, arg2, arg3, arg4, arg5, res1, \ |
res2, res3, res4, res5) \ |
ipc_call_sync_slow((phoneid), (method), (arg1), (arg2), (arg3), \ |
(arg4), (arg5), (res1), (res2), (res3), (res4), (res5)) |
extern int ipc_call_sync_fast(int phoneid, ipcarg_t method, ipcarg_t arg1, |
ipcarg_t arg2, ipcarg_t arg3, ipcarg_t *result1, ipcarg_t *result2, |
ipcarg_t *result3, ipcarg_t *result4, ipcarg_t *result5); |
extern int ipc_call_sync_slow(int phoneid, ipcarg_t method, ipcarg_t arg1, |
ipcarg_t arg2, ipcarg_t arg3, ipcarg_t arg4, ipcarg_t arg5, |
ipcarg_t *result1, ipcarg_t *result2, ipcarg_t *result3, ipcarg_t *result4, |
ipcarg_t *result5); |
extern ipc_callid_t ipc_wait_cycle(ipc_call_t *call, uint32_t usec, int flags); |
extern ipc_callid_t ipc_wait_for_call_timeout(ipc_call_t *data, uint32_t usec); |
static inline ipc_callid_t ipc_wait_for_call(ipc_call_t *data) |
{ |
return ipc_wait_for_call_timeout(data, SYNCH_NO_TIMEOUT); |
} |
extern ipc_callid_t ipc_trywait_for_call(ipc_call_t *data); |
/* |
* User-friendly wrappers for ipc_answer_fast() and ipc_answer_slow(). |
* They are in the form of ipc_answer_m(), where m is the number of return |
* arguments. The macros decide between the fast and the slow version according |
* to m. |
*/ |
#define ipc_answer_0(callid, retval) \ |
ipc_answer_fast((callid), (retval), 0, 0, 0, 0) |
#define ipc_answer_1(callid, retval, arg1) \ |
ipc_answer_fast((callid), (retval), (arg1), 0, 0, 0) |
#define ipc_answer_2(callid, retval, arg1, arg2) \ |
ipc_answer_fast((callid), (retval), (arg1), (arg2), 0, 0) |
#define ipc_answer_3(callid, retval, arg1, arg2, arg3) \ |
ipc_answer_fast((callid), (retval), (arg1), (arg2), (arg3), 0) |
#define ipc_answer_4(callid, retval, arg1, arg2, arg3, arg4) \ |
ipc_answer_fast((callid), (retval), (arg1), (arg2), (arg3), (arg4)) |
#define ipc_answer_5(callid, retval, arg1, arg2, arg3, arg4, arg5) \ |
ipc_answer_slow((callid), (retval), (arg1), (arg2), (arg3), (arg4), (arg5)) |
extern ipcarg_t ipc_answer_fast(ipc_callid_t callid, ipcarg_t retval, |
ipcarg_t arg1, ipcarg_t arg2, ipcarg_t arg3, ipcarg_t arg4); |
extern ipcarg_t ipc_answer_slow(ipc_callid_t callid, ipcarg_t retval, |
ipcarg_t arg1, ipcarg_t arg2, ipcarg_t arg3, ipcarg_t arg4, ipcarg_t arg5); |
/* |
* User-friendly wrappers for ipc_call_async_fast() and ipc_call_async_slow(). |
* They are in the form of ipc_call_async_m(), where m is the number of payload |
* arguments. The macros decide between the fast and the slow version according |
* to m. |
*/ |
#define ipc_call_async_0(phoneid, method, private, callback, \ |
can_preempt) \ |
ipc_call_async_fast((phoneid), (method), 0, 0, 0, 0, (private), \ |
(callback), (can_preempt)) |
#define ipc_call_async_1(phoneid, method, arg1, private, callback, \ |
can_preempt) \ |
ipc_call_async_fast((phoneid), (method), (arg1), 0, 0, 0, (private), \ |
(callback), (can_preempt)) |
#define ipc_call_async_2(phoneid, method, arg1, arg2, private, callback, \ |
can_preempt) \ |
ipc_call_async_fast((phoneid), (method), (arg1), (arg2), 0, 0, \ |
(private), (callback), (can_preempt)) |
#define ipc_call_async_3(phoneid, method, arg1, arg2, arg3, private, callback, \ |
can_preempt) \ |
ipc_call_async_fast((phoneid), (method), (arg1), (arg2), (arg3), 0, \ |
(private), (callback), (can_preempt)) |
#define ipc_call_async_4(phoneid, method, arg1, arg2, arg3, arg4, private, \ |
callback, can_preempt) \ |
ipc_call_async_fast((phoneid), (method), (arg1), (arg2), (arg3), \ |
(arg4), (private), (callback), (can_preempt)) |
#define ipc_call_async_5(phoneid, method, arg1, arg2, arg3, arg4, arg5, \ |
private, callback, can_preempt) \ |
ipc_call_async_slow((phoneid), (method), (arg1), (arg2), (arg3), \ |
(arg4), (arg5), (private), (callback), (can_preempt)) |
extern void ipc_call_async_fast(int phoneid, ipcarg_t method, ipcarg_t arg1, |
ipcarg_t arg2, ipcarg_t arg3, ipcarg_t arg4, void *private, |
ipc_async_callback_t callback, int can_preempt); |
extern void ipc_call_async_slow(int phoneid, ipcarg_t method, ipcarg_t arg1, |
ipcarg_t arg2, ipcarg_t arg3, ipcarg_t arg4, ipcarg_t arg5, void *private, |
ipc_async_callback_t callback, int can_preempt); |
extern int ipc_connect_to_me(int phoneid, int arg1, int arg2, int arg3, |
ipcarg_t *phone); |
extern int ipc_connect_me_to(int phoneid, int arg1, int arg2, int arg3); |
extern int ipc_hangup(int phoneid); |
extern int ipc_register_irq(int inr, int devno, int method, irq_code_t *code); |
extern int ipc_unregister_irq(int inr, int devno); |
extern int ipc_forward_fast(ipc_callid_t callid, int phoneid, int method, |
ipcarg_t arg1, ipcarg_t arg2, int mode); |
/* |
* User-friendly wrappers for ipc_share_in_start(). |
*/ |
#define ipc_share_in_start_0_0(phoneid, dst, size) \ |
ipc_share_in_start((phoneid), (dst), (size), 0, NULL) |
#define ipc_share_in_start_0_1(phoneid, dst, size, flags) \ |
ipc_share_in_start((phoneid), (dst), (size), 0, (flags)) |
#define ipc_share_in_start_1_0(phoneid, dst, size, arg) \ |
ipc_share_in_start((phoneid), (dst), (size), (arg), NULL) |
#define ipc_share_in_start_1_1(phoneid, dst, size, arg, flags) \ |
ipc_share_in_start((phoneid), (dst), (size), (arg), (flags)) |
extern int ipc_share_in_start(int phoneid, void *dst, size_t size, ipcarg_t arg, |
int *flags); |
extern int ipc_share_in_receive(ipc_callid_t *callid, size_t *size); |
extern int ipc_share_in_finalize(ipc_callid_t callid, void *src, int flags); |
extern int ipc_share_out_start(int phoneid, void *src, int flags); |
extern int ipc_share_out_receive(ipc_callid_t *callid, size_t *size, int *flags); |
extern int ipc_share_out_finalize(ipc_callid_t callid, void *dst); |
extern int ipc_data_read_start(int phoneid, void *dst, size_t size); |
extern int ipc_data_read_receive(ipc_callid_t *callid, size_t *size); |
extern int ipc_data_read_finalize(ipc_callid_t callid, void *src, size_t size); |
extern int ipc_data_write_start(int phoneid, void *src, size_t size); |
extern int ipc_data_write_receive(ipc_callid_t *callid, size_t *size); |
extern int ipc_data_write_finalize(ipc_callid_t callid, void *dst, size_t size); |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/include/ipc/fb.h |
---|
0,0 → 1,76 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcipc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_FB_H_ |
#define LIBC_FB_H_ |
#include <ipc/ipc.h> |
typedef enum { |
FB_PUTCHAR = IPC_FIRST_USER_METHOD, |
FB_CLEAR, |
FB_GET_CSIZE, |
FB_CURSOR_VISIBILITY, |
FB_CURSOR_GOTO, |
FB_SCROLL, |
FB_VIEWPORT_SWITCH, |
FB_VIEWPORT_CREATE, |
FB_VIEWPORT_DELETE, |
FB_SET_STYLE, |
FB_GET_RESOLUTION, |
FB_DRAW_TEXT_DATA, |
FB_FLUSH, |
FB_VIEWPORT_DB, |
FB_DRAW_PPM, |
FB_PREPARE_SHM, |
FB_DROP_SHM, |
FB_SHM2PIXMAP, |
FB_VP_DRAW_PIXMAP, |
FB_VP2PIXMAP, |
FB_DROP_PIXMAP, |
FB_TRANS_PUTCHAR, |
FB_ANIM_CREATE, |
FB_ANIM_DROP, |
FB_ANIM_ADDPIXMAP, |
FB_ANIM_CHGVP, |
FB_ANIM_START, |
FB_ANIM_STOP, |
FB_POINTER_MOVE |
} fb_request_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/include/ipc/services.h |
---|
0,0 → 1,57 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcipc |
* @{ |
*/ |
/** |
* @file services.h |
* @brief List of all known services and their codes. |
*/ |
#ifndef LIBIPC_SERVICES_H_ |
#define LIBIPC_SERVICES_H_ |
typedef enum { |
SERVICE_PCI = 1, |
SERVICE_KEYBOARD, |
SERVICE_VIDEO, |
SERVICE_CONSOLE, |
SERVICE_RD, |
SERVICE_VFS, |
SERVICE_DEVMAP |
} services_t; |
/* Memory area to be received from NS */ |
#define SERVICE_MEM_REALTIME 1 |
#define SERVICE_MEM_KLOG 2 |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/include/ipc/ns.h |
---|
0,0 → 1,41 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libcipc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBIPC_NS_H_ |
#define LIBIPC_NS_H_ |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/include/io/stream.h |
---|
0,0 → 1,54 |
/* |
* Copyright (c) 2006 Jakub Vana |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_STREAM_H_ |
#define LIBC_STREAM_H_ |
#include <libarch/types.h> |
#define EMFILE -17 |
extern void open_stdin(void); |
extern void open_stdout(void); |
extern ssize_t read_stdin(void *, size_t); |
extern ssize_t write_stdout(const void *, size_t); |
extern ssize_t write_stderr(const void *, size_t); |
extern int get_cons_phone(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/include/io/printf_core.h |
---|
0,0 → 1,57 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_PRINTF_CORE_H_ |
#define LIBC_PRINTF_CORE_H_ |
#include <sys/types.h> |
#include <stdarg.h> |
/** Structure for specifying output methods for different printf clones. */ |
struct printf_spec { |
/* Output function, returns count of printed characters or EOF */ |
int (*write)(void *, size_t, void *); |
/* Support data - output stream specification, its state, locks,... */ |
void *data; |
}; |
int printf_core(const char *fmt, struct printf_spec *ps ,va_list ap); |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/include/io/io.h |
---|
0,0 → 1,50 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_IO_H_ |
#define LIBC_IO_H_ |
#include <sys/types.h> |
int putnchars(const char * buf, size_t count); |
int putstr(const char * str); |
int putchar(int c); |
int getchar(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/include/async.h |
---|
0,0 → 1,263 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_ASYNC_H_ |
#define LIBC_ASYNC_H_ |
#include <ipc/ipc.h> |
#include <fibril.h> |
#include <sys/time.h> |
#include <atomic.h> |
#include <bool.h> |
typedef ipc_callid_t aid_t; |
typedef void (*async_client_conn_t)(ipc_callid_t callid, ipc_call_t *call); |
static inline void async_manager(void) |
{ |
fibril_switch(FIBRIL_TO_MANAGER); |
} |
ipc_callid_t async_get_call_timeout(ipc_call_t *call, suseconds_t usecs); |
static inline ipc_callid_t async_get_call(ipc_call_t *data) |
{ |
return async_get_call_timeout(data, 0); |
} |
/* |
* User-friendly wrappers for async_send_fast() and async_send_slow(). The |
* macros are in the form async_send_m(), where m denotes the number of payload |
* arguments. Each macros chooses between the fast and the slow version based |
* on m. |
*/ |
#define async_send_0(phoneid, method, dataptr) \ |
async_send_fast((phoneid), (method), 0, 0, 0, 0, (dataptr)) |
#define async_send_1(phoneid, method, arg1, dataptr) \ |
async_send_fast((phoneid), (method), (arg1), 0, 0, 0, (dataptr)) |
#define async_send_2(phoneid, method, arg1, arg2, dataptr) \ |
async_send_fast((phoneid), (method), (arg1), (arg2), 0, 0, (dataptr)) |
#define async_send_3(phoneid, method, arg1, arg2, arg3, dataptr) \ |
async_send_fast((phoneid), (method), (arg1), (arg2), (arg3), 0, (dataptr)) |
#define async_send_4(phoneid, method, arg1, arg2, arg3, arg4, dataptr) \ |
async_send_fast((phoneid), (method), (arg1), (arg2), (arg3), (arg4), \ |
(dataptr)) |
#define async_send_5(phoneid, method, arg1, arg2, arg3, arg4, arg5, dataptr) \ |
async_send_slow((phoneid), (method), (arg1), (arg2), (arg3), (arg4), \ |
(arg5), (dataptr)) |
extern aid_t async_send_fast(int phoneid, ipcarg_t method, ipcarg_t arg1, |
ipcarg_t arg2, ipcarg_t arg3, ipcarg_t arg4, ipc_call_t *dataptr); |
extern aid_t async_send_slow(int phoneid, ipcarg_t method, ipcarg_t arg1, |
ipcarg_t arg2, ipcarg_t arg3, ipcarg_t arg4, ipcarg_t arg5, |
ipc_call_t *dataptr); |
extern void async_wait_for(aid_t amsgid, ipcarg_t *result); |
extern int async_wait_timeout(aid_t amsgid, ipcarg_t *retval, |
suseconds_t timeout); |
fid_t async_new_connection(ipcarg_t in_phone_hash,ipc_callid_t callid, |
ipc_call_t *call, void (*cthread)(ipc_callid_t,ipc_call_t *)); |
void async_usleep(suseconds_t timeout); |
void async_create_manager(void); |
void async_destroy_manager(void); |
int _async_init(void); |
extern void async_set_client_connection(async_client_conn_t conn); |
extern void async_set_interrupt_received(async_client_conn_t conn); |
/* Wrappers for simple communication */ |
#define async_msg_0(phone, method) \ |
ipc_call_async_0((phone), (method), NULL, NULL, !in_interrupt_handler()) |
#define async_msg_1(phone, method, arg1) \ |
ipc_call_async_1((phone), (method), (arg1), NULL, NULL, \ |
!in_interrupt_handler()) |
#define async_msg_2(phone, method, arg1, arg2) \ |
ipc_call_async_2((phone), (method), (arg1), (arg2), NULL, NULL, \ |
!in_interrupt_handler()) |
#define async_msg_3(phone, method, arg1, arg2, arg3) \ |
ipc_call_async_3((phone), (method), (arg1), (arg2), (arg3), NULL, NULL, \ |
!in_interrupt_handler()) |
#define async_msg_4(phone, method, arg1, arg2, arg3, arg4) \ |
ipc_call_async_4((phone), (method), (arg1), (arg2), (arg3), (arg4), NULL, \ |
NULL, !in_interrupt_handler()) |
#define async_msg_5(phone, method, arg1, arg2, arg3, arg4, arg5) \ |
ipc_call_async_5((phone), (method), (arg1), (arg2), (arg3), (arg4), \ |
(arg5), NULL, NULL, !in_interrupt_handler()) |
/* |
* User-friendly wrappers for async_req_fast() and async_req_slow(). The macros |
* are in the form async_req_m_n(), where m is the number of payload arguments |
* and n is the number of return arguments. The macros decidce between the fast |
* and slow verion based on m. |
*/ |
#define async_req_0_0(phoneid, method) \ |
async_req_fast((phoneid), (method), 0, 0, 0, 0, NULL, NULL, NULL, NULL, \ |
NULL) |
#define async_req_0_1(phoneid, method, r1) \ |
async_req_fast((phoneid), (method), 0, 0, 0, 0, (r1), NULL, NULL, NULL, \ |
NULL) |
#define async_req_0_2(phoneid, method, r1, r2) \ |
async_req_fast((phoneid), (method), 0, 0, 0, 0, (r1), (r2), NULL, NULL, \ |
NULL) |
#define async_req_0_3(phoneid, method, r1, r2, r3) \ |
async_req_fast((phoneid), (method), 0, 0, 0, 0, (r1), (r2), (r3), NULL, \ |
NULL) |
#define async_req_0_4(phoneid, method, r1, r2, r3, r4) \ |
async_req_fast((phoneid), (method), 0, 0, 0, 0, (r1), (r2), (r3), (r4), \ |
NULL) |
#define async_req_0_5(phoneid, method, r1, r2, r3, r4, r5) \ |
async_req_fast((phoneid), (method), 0, 0, 0, 0, (r1), (r2), (r3), (r4), \ |
(r5)) |
#define async_req_1_0(phoneid, method, arg1) \ |
async_req_fast((phoneid), (method), (arg1), 0, 0, 0, NULL, NULL, NULL, \ |
NULL, NULL) |
#define async_req_1_1(phoneid, method, arg1, rc1) \ |
async_req_fast((phoneid), (method), (arg1), 0, 0, 0, (rc1), NULL, NULL, \ |
NULL, NULL) |
#define async_req_1_2(phoneid, method, arg1, rc1, rc2) \ |
async_req_fast((phoneid), (method), (arg1), 0, 0, 0, (rc1), (rc2), NULL, \ |
NULL, NULL) |
#define async_req_1_3(phoneid, method, arg1, rc1, rc2, rc3) \ |
async_req_fast((phoneid), (method), (arg1), 0, 0, 0, (rc1), (rc2), (rc3), \ |
NULL, NULL) |
#define async_req_1_4(phoneid, method, arg1, rc1, rc2, rc3, rc4) \ |
async_req_fast((phoneid), (method), (arg1), 0, 0, 0, (rc1), (rc2), (rc3), \ |
(rc4), NULL) |
#define async_req_1_5(phoneid, method, arg1, rc1, rc2, rc3, rc4, rc5) \ |
async_req_fast((phoneid), (method), (arg1), 0, 0, 0, (rc1), (rc2), (rc3), \ |
(rc4), (rc5)) |
#define async_req_2_0(phoneid, method, arg1, arg2) \ |
async_req_fast((phoneid), (method), (arg1), (arg2), 0, 0, NULL, NULL, \ |
NULL, NULL, NULL) |
#define async_req_2_1(phoneid, method, arg1, arg2, rc1) \ |
async_req_fast((phoneid), (method), (arg1), (arg2), 0, 0, (rc1), NULL, \ |
NULL, NULL, NULL) |
#define async_req_2_2(phoneid, method, arg1, arg2, rc1, rc2) \ |
async_req_fast((phoneid), (method), (arg1), (arg2), 0, 0, (rc1), (rc2), \ |
NULL, NULL, NULL) |
#define async_req_2_3(phoneid, method, arg1, arg2, rc1, rc2, rc3) \ |
async_req_fast((phoneid), (method), (arg1), (arg2), 0, 0, (rc1), (rc2), \ |
(rc3), NULL, NULL) |
#define async_req_2_4(phoneid, method, arg1, arg2, rc1, rc2, rc3, rc4) \ |
async_req_fast((phoneid), (method), (arg1), (arg2), 0, 0, (rc1), (rc2), \ |
(rc3), (rc4), NULL) |
#define async_req_2_5(phoneid, method, arg1, arg2, rc1, rc2, rc3, rc4, rc5) \ |
async_req_fast((phoneid), (method), (arg1), (arg2), 0, 0, (rc1), (rc2), \ |
(rc3), (rc4), (rc5)) |
#define async_req_3_0(phoneid, method, arg1, arg2, arg3) \ |
async_req_fast((phoneid), (method), (arg1), (arg2), (arg3), 0, NULL, NULL, \ |
NULL, NULL, NULL) |
#define async_req_3_1(phoneid, method, arg1, arg2, arg3, rc1) \ |
async_req_fast((phoneid), (method), (arg1), (arg2), (arg3), 0, (rc1), \ |
NULL, NULL, NULL, NULL) |
#define async_req_3_2(phoneid, method, arg1, arg2, arg3, rc1, rc2) \ |
async_req_fast((phoneid), (method), (arg1), (arg2), (arg3), 0, (rc1), \ |
(rc2), NULL, NULL, NULL) |
#define async_req_3_3(phoneid, method, arg1, arg2, arg3, rc1, rc2, rc3) \ |
async_req_fast((phoneid), (method), (arg1), (arg2), (arg3), 0, (rc1), \ |
(rc2), (rc3), NULL, NULL) |
#define async_req_3_4(phoneid, method, arg1, arg2, arg3, rc1, rc2, rc3, rc4) \ |
async_req_fast((phoneid), (method), (arg1), (arg2), (arg3), 0, (rc1), \ |
(rc2), (rc3), (rc4), NULL) |
#define async_req_3_5(phoneid, method, arg1, arg2, arg3, rc1, rc2, rc3, rc4, \ |
rc5) \ |
async_req_fast((phoneid), (method), (arg1), (arg2), (arg3), 0, (rc1), \ |
(rc2), (rc3), (rc4), (rc5)) |
#define async_req_4_0(phoneid, method, arg1, arg2, arg3, arg4) \ |
async_req_fast((phoneid), (method), (arg1), (arg2), (arg3), (arg4), NULL, \ |
NULL, NULL, NULL, NULL) |
#define async_req_4_1(phoneid, method, arg1, arg2, arg3, arg4, rc1) \ |
async_req_fast((phoneid), (method), (arg1), (arg2), (arg3), (arg4), (rc1), \ |
NULL, NULL, NULL, NULL) |
#define async_req_4_2(phoneid, method, arg1, arg2, arg3, arg4, rc1, rc2) \ |
async_req_fast((phoneid), (method), (arg1), (arg2), (arg3), (arg4), (rc1), \ |
(rc2), NULL, NULL, NULL) |
#define async_req_4_3(phoneid, method, arg1, arg2, arg3, arg4, rc1, rc2, rc3) \ |
async_req_fast((phoneid), (method), (arg1), (arg2), (arg3), (arg4), (rc1), \ |
(rc2), (rc3), NULL, NULL) |
#define async_req_4_4(phoneid, method, arg1, arg2, arg3, arg4, rc1, rc2, rc3, \ |
rc4) \ |
async_req_fast((phoneid), (method), (arg1), (arg2), (arg3), (arg4), \ |
(rc1), (rc2), (rc3), (rc4), NULL) |
#define async_req_4_5(phoneid, method, arg1, arg2, arg3, arg4, rc1, rc2, rc3, \ |
rc4, rc5) \ |
async_req_fast((phoneid), (method), (arg1), (arg2), (arg3), (arg4), \ |
(rc1), (rc2), (rc3), (rc4), (rc5)) |
#define async_req_5_0(phoneid, method, arg1, arg2, arg3, arg4, arg5) \ |
async_req_slow((phoneid), (method), (arg1), (arg2), (arg3), (arg4), \ |
(arg5), NULL, NULL, NULL, NULL, NULL) |
#define async_req_5_1(phoneid, method, arg1, arg2, arg3, arg4, arg5, rc1) \ |
async_req_slow((phoneid), (method), (arg1), (arg2), (arg3), (arg4), \ |
(arg5), (rc1), NULL, NULL, NULL, NULL) |
#define async_req_5_2(phoneid, method, arg1, arg2, arg3, arg4, arg5, rc1, rc2) \ |
async_req_slow((phoneid), (method), (arg1), (arg2), (arg3), (arg4), \ |
(arg5), (rc1), (rc2), NULL, NULL, NULL) |
#define async_req_5_3(phoneid, method, arg1, arg2, arg3, arg4, arg5, rc1, rc2, \ |
rc3) \ |
async_req_slow((phoneid), (method), (arg1), (arg2), (arg3), (arg4), \ |
(arg5), (rc1), (rc2), (rc3), NULL, NULL) |
#define async_req_5_4(phoneid, method, arg1, arg2, arg3, arg4, arg5, rc1, rc2, \ |
rc3, rc4) \ |
async_req_slow((phoneid), (method), (arg1), (arg2), (arg3), (arg4), \ |
(arg5), (rc1), (rc2), (rc3), (rc4), NULL) |
#define async_req_5_5(phoneid, method, arg1, arg2, arg3, arg4, arg5, rc1, rc2, \ |
rc3, rc4, rc5) \ |
async_req_slow((phoneid), (method), (arg1), (arg2), (arg3), (arg4), \ |
(arg5), (rc1), (rc2), (rc3), (rc4), (rc5)) |
extern ipcarg_t async_req_fast(int phoneid, ipcarg_t method, ipcarg_t arg1, |
ipcarg_t arg2, ipcarg_t arg3, ipcarg_t arg4, ipcarg_t *r1, ipcarg_t *r2, |
ipcarg_t *r3, ipcarg_t *r4, ipcarg_t *r5); |
extern ipcarg_t async_req_slow(int phoneid, ipcarg_t method, ipcarg_t arg1, |
ipcarg_t arg2, ipcarg_t arg3, ipcarg_t arg4, ipcarg_t arg5, ipcarg_t *r1, |
ipcarg_t *r2, ipcarg_t *r3, ipcarg_t *r4, ipcarg_t *r5); |
static inline void async_serialize_start(void) |
{ |
fibril_inc_sercount(); |
} |
static inline void async_serialize_end(void) |
{ |
fibril_dec_sercount(); |
} |
extern bool in_interrupt_handler(void); |
extern atomic_t async_futex; |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/include/syscall.h |
---|
0,0 → 1,51 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** |
* @file |
* @brief Syscall function declaration for architectures that don't |
* inline syscalls. |
*/ |
#ifndef LIBC_SYSCALL_H_ |
#define LIBC_SYSCALL_H_ |
#include <sys/types.h> |
#include <kernel/syscall/syscall.h> |
extern sysarg_t __syscall(const sysarg_t p1, const sysarg_t p2, |
const sysarg_t p3, const sysarg_t p4, const sysarg_t p5, const sysarg_t p6, |
const syscall_t id); |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/include/libc.h |
---|
0,0 → 1,58 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_LIBC_H_ |
#define LIBC_LIBC_H_ |
#include <sys/types.h> |
#include <kernel/syscall/syscall.h> |
#include <libarch/syscall.h> |
#define __SYSCALL0(id) __syscall(0, 0, 0, 0, 0, 0, id) |
#define __SYSCALL1(id, p1) __syscall(p1, 0, 0, 0, 0, 0, id) |
#define __SYSCALL2(id, p1, p2) __syscall(p1, p2, 0, 0, 0, 0, id) |
#define __SYSCALL3(id, p1, p2, p3) __syscall(p1, p2, p3, 0, 0, 0, id) |
#define __SYSCALL4(id, p1, p2, p3, p4) __syscall(p1, p2, p3, p4, 0, 0, id) |
#define __SYSCALL5(id, p1, p2, p3, p4, p5) __syscall(p1, p2, p3, p4, p5, 0, id) |
#define __SYSCALL6(id, p1, p2, p3, p4, p5, p6) \ |
__syscall(p1, p2, p3, p4, p5, p6,id) |
extern void __main(void); |
extern void __io_init(void); |
extern void __exit(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/include/assert.h |
---|
0,0 → 1,61 |
/* |
* Copyright (c) 2005 Martin Decky |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_ASSERT_H_ |
#define LIBC_ASSERT_H_ |
/** Debugging assert macro |
* |
* If NDEBUG is not set, the assert() macro |
* evaluates expr and if it is false prints |
* error message and terminate program. |
* |
* @param expr Expression which is expected to be true. |
* |
*/ |
#include <stdio.h> |
#include <stdlib.h> |
#ifndef NDEBUG |
# define assert(expr) if (!(expr)) { printf("Assertion failed (%s) at file '%s', line %d.\n", #expr, __FILE__, __LINE__); abort();} |
#else |
# define assert(expr) |
#endif |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/include/tls.h |
---|
0,0 → 1,67 |
/* |
* Copyright (c) 2007 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_TLS_H_ |
#define LIBC_TLS_H_ |
#include <libarch/tls.h> |
#include <sys/types.h> |
/* |
* Symbols defined in the respective linker script. |
*/ |
extern char _tls_alignment; |
extern char _tdata_start; |
extern char _tdata_end; |
extern char _tbss_start; |
extern char _tbss_end; |
extern tcb_t *__make_tls(void); |
extern tcb_t *__alloc_tls(void **, size_t); |
extern void __free_tls(tcb_t *); |
extern void __free_tls_arch(tcb_t *, size_t); |
#ifdef CONFIG_TLS_VARIANT_1 |
extern tcb_t *tls_alloc_variant_1(void **, size_t); |
extern void tls_free_variant_1(tcb_t *, size_t); |
#endif |
#ifdef CONFIG_TLS_VARIANT_2 |
extern tcb_t *tls_alloc_variant_2(void **, size_t); |
extern void tls_free_variant_2(tcb_t *, size_t); |
#endif |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/include/thread.h |
---|
0,0 → 1,56 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_THREAD_H_ |
#define LIBC_THREAD_H_ |
#include <kernel/proc/uarg.h> |
#include <libarch/thread.h> |
#include <sys/types.h> |
typedef uint64_t thread_id_t; |
extern void __thread_entry(void); |
extern void __thread_main(uspace_arg_t *); |
extern int thread_create(void (*)(void *), void *, char *, thread_id_t *); |
extern void thread_exit(int); |
extern void thread_detach(thread_id_t); |
extern int thread_join(thread_id_t); |
extern thread_id_t thread_get_id(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/include/fibril.h |
---|
0,0 → 1,95 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_FIBRIL_H_ |
#define LIBC_FIBRIL_H_ |
#include <libarch/fibril.h> |
#include <libadt/list.h> |
#include <libarch/tls.h> |
#ifndef context_set |
#define context_set(c, _pc, stack, size, ptls) \ |
(c)->pc = (sysarg_t) (_pc); \ |
(c)->sp = ((sysarg_t) (stack)) + (size) - SP_DELTA; \ |
(c)->tls = (sysarg_t) (ptls); |
#endif /* context_set */ |
#define FIBRIL_SERIALIZED 1 |
typedef enum { |
FIBRIL_PREEMPT, |
FIBRIL_TO_MANAGER, |
FIBRIL_FROM_MANAGER, |
FIBRIL_FROM_DEAD |
} fibril_switch_type_t; |
typedef sysarg_t fid_t; |
struct fibril { |
link_t link; |
context_t ctx; |
void *stack; |
void *arg; |
int (*func)(void *); |
tcb_t *tcb; |
struct fibril *clean_after_me; |
int retval; |
int flags; |
}; |
typedef struct fibril fibril_t; |
extern int context_save(context_t *c); |
extern void context_restore(context_t *c) __attribute__ ((noreturn)); |
extern fid_t fibril_create(int (*func)(void *), void *arg); |
extern fibril_t *fibril_setup(void); |
extern void fibril_teardown(fibril_t *f); |
extern int fibril_switch(fibril_switch_type_t stype); |
extern void fibril_add_ready(fid_t fid); |
extern void fibril_add_manager(fid_t fid); |
extern void fibril_remove_manager(void); |
extern fid_t fibril_get_id(void); |
extern void fibril_inc_sercount(void); |
extern void fibril_dec_sercount(void); |
static inline int fibril_yield(void) { |
return fibril_switch(FIBRIL_PREEMPT); |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/include/time.h |
---|
0,0 → 1,45 |
/* |
* Copyright (c) 2007 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_TIME_H_ |
#define LIBC_TIME_H_ |
#include <sys/time.h> |
extern time_t time(time_t *); |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/include/as.h |
---|
0,0 → 1,52 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_AS_H_ |
#define LIBC_AS_H_ |
#include <sys/types.h> |
#include <task.h> |
#include <kernel/mm/as.h> |
#include <libarch/config.h> |
extern void *as_area_create(void *address, size_t size, int flags); |
extern int as_area_resize(void *address, size_t size, int flags); |
extern int as_area_destroy(void *address); |
extern void *set_maxheapsize(size_t mhs); |
extern void * as_get_mappable_page(size_t sz); |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/include/stdint.h |
---|
0,0 → 1,64 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_STDINT_H_ |
#define LIBC_STDINT_H_ |
/* Definitions of types with fixed size */ |
#include <libarch/types.h> |
#define MAX_INT8 (0x7F) |
#define MIN_INT8 (0x80) |
#define MAX_UINT8 (0xFFu) |
#define MIN_UINT8 (0u) |
#define MAX_INT16 (0x7FFF) |
#define MIN_INT16 (0x8000) |
#define MAX_UINT16 (0xFFFFu) |
#define MIN_UINT16 (0u) |
#define MAX_INT32 (0x7FFFFFFF) |
#define MIN_INT32 (0x80000000) |
#define MAX_UINT32 (0xFFFFFFFFu) |
#define MIN_UINT32 (0u) |
#define MAX_INT64 (0x7FFFFFFFFFFFFFFFll) |
#define MIN_INT64 (0x8000000000000000ll) |
#define MAX_UINT64 (0xFFFFFFFFFFFFFFFFull) |
#define MIN_UINT64 (0ull) |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/include/stddef.h |
---|
0,0 → 1,43 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_STDDEF_H_ |
#define LIBC_STDDEF_H_ |
#include <sys/types.h> |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/include/bitops.h |
---|
0,0 → 1,94 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_BITOPS_H_ |
#define LIBC_BITOPS_H_ |
#include <sys/types.h> |
/** Return position of first non-zero bit from left (i.e. [log_2(arg)]). |
* |
* If number is zero, it returns 0 |
*/ |
static inline int fnzb32(uint32_t arg) |
{ |
int n = 0; |
if (arg >> 16) { |
arg >>= 16; |
n += 16; |
} |
if (arg >> 8) { |
arg >>= 8; |
n += 8; |
} |
if (arg >> 4) { |
arg >>= 4; |
n += 4; |
} |
if (arg >> 2) { |
arg >>= 2; |
n += 2; |
} |
if (arg >> 1) { |
arg >>= 1; |
n += 1; |
} |
return n; |
} |
static inline int fnzb64(uint64_t arg) |
{ |
int n = 0; |
if (arg >> 32) { |
arg >>= 32; |
n += 32; |
} |
return n + fnzb32((uint32_t) arg); |
} |
#define fnzb(x) fnzb32(x) |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/include/task.h |
---|
0,0 → 1,47 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_TASK_H_ |
#define LIBC_TASK_H_ |
#include <sys/types.h> |
typedef uint64_t task_id_t; |
extern task_id_t task_get_id(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/include/stdarg.h |
---|
0,0 → 1,55 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_STDARG_H_ |
#define LIBC_STDARG_H_ |
#include <sys/types.h> |
#include <libarch/stackarg.h> |
#ifndef __VARARGS_DEFINED |
# define __VARARGS_DEFINED |
typedef __builtin_va_list va_list; |
# define va_start(ap, last) __builtin_va_start(ap, last) |
# define va_arg(ap, type) __builtin_va_arg(ap, type) |
# define va_end(ap) __builtin_va_end(ap) |
# endif |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/include/ctype.h |
---|
0,0 → 1,82 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_CTYPE_H_ |
#define LIBC_CTYPE_H_ |
static inline int islower(int c) |
{ |
return ((c >= 'a') && (c <= 'z')); |
} |
static inline int isupper(int c) |
{ |
return ((c >= 'A') && (c <= 'Z')); |
} |
static inline int isalpha(int c) |
{ |
return (islower(c) || isupper(c)); |
} |
static inline int isdigit(int c) |
{ |
return ((c >= '0') && (c <= '9')); |
} |
static inline int isalnum(int c) |
{ |
return (isalpha(c) || isdigit(c)); |
} |
static inline int isspace(int c) |
{ |
switch (c) { |
case ' ': |
case '\n': |
case '\t': |
case '\f': |
case '\r': |
case '\v': |
return 1; |
break; |
default: |
return 0; |
} |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/include/align.h |
---|
0,0 → 1,56 |
/* |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_ALIGN_H_ |
#define LIBC_ALIGN_H_ |
/** Align to the nearest lower address. |
* |
* @param s Address or size to be aligned. |
* @param a Size of alignment, must be power of 2. |
*/ |
#define ALIGN_DOWN(s, a) ((s) & ~((a) - 1)) |
/** Align to the nearest higher address. |
* |
* @param s Address or size to be aligned. |
* @param a Size of alignment, must be power of 2. |
*/ |
#define ALIGN_UP(s, a) ((long)((s) + ((a) - 1)) & ~((long) (a) - 1)) |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/include/endian.h |
---|
0,0 → 1,47 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_ENDIAN_H_ |
#define LIBC_ENDIAN_H_ |
#define __LITTLE_ENDIAN 1234 |
#define __BIG_ENDIAN 4321 |
#define __PDP_ENDIAN 3412 |
#include <libarch/endian.h> |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/include/ddi.h |
---|
0,0 → 1,47 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_DDI_H_ |
#define LIBC_DDI_H_ |
#include <task.h> |
extern int physmem_map(void *pf, void *vp, unsigned long pages, int flags); |
extern int iospace_enable(task_id_t id, void *ioaddr, unsigned long size); |
extern int preemption_control(int enable); |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/include/limits.h |
---|
0,0 → 1,74 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_LIMITS_H_ |
#define LIBC_LIMITS_H_ |
#include <stdint.h> |
#include <libarch/limits.h> |
/* char */ |
#define SCHAR_MIN MIN_INT8 |
#define SCHAR_MAX MAX_INT8 |
#define UCHAR_MIN MIN_UINT8 |
#define UCHAR_MAX MAX_UINT8 |
#ifdef __CHAR_UNSIGNED__ |
# define CHAR_MIN UCHAR_MIN |
# define CHAR_MAX UCHAR_MAX |
#else |
# define CHAR_MIN SCHAR_MIN |
# define CHAR_MAX SCHAR_MAX |
#endif |
/* short int */ |
#define SHRT_MIN MIN_INT16 |
#define SHRT_MAX MAX_INT16 |
#define USHRT_MIN MIN_UINT16 |
#define USHRT_MAX MAX_UINT16 |
#define INT_MIN MIN_INT32 |
#define INT_MAX MAX_INT32 |
#define UINT_MIN MIN_UINT32 |
#define UINT_MAX MAX_UINT32 |
#define LLONG_MIN MIN_INT64 |
#define LLONG_MAX MAX_INT64 |
#define ULLONG_MIN MIN_UINT64 |
#define ULLONG_MAX MAX_UINT64 |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/include/stdlib.h |
---|
0,0 → 1,61 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_STDLIB_H_ |
#define LIBC_STDLIB_H_ |
#include <unistd.h> |
#include <malloc.h> |
#define abort() _exit(1) |
#define exit(status) _exit((status)) |
#define RAND_MAX 714025 |
extern long int random(void); |
extern void srandom(unsigned int seed); |
static inline int rand(void) |
{ |
return random(); |
} |
static inline void srand(unsigned int seed) |
{ |
srandom(seed); |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/include/err.h |
---|
0,0 → 1,46 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_ERR_H_ |
#define LIBC_ERR_H_ |
#define errx(status, fmt, ...) { \ |
printf((fmt), ##__VA_ARGS__); \ |
_exit(status); \ |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/include/sysinfo.h |
---|
0,0 → 1,47 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_SYSINFO_H_ |
#define LIBC_SYSINFO_H_ |
#include <libc.h> |
#include <sysinfo.h> |
#include <string.h> |
sysarg_t sysinfo_value(char *name); |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/include/bool.h |
---|
0,0 → 1,46 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_BOOL_H_ |
#define LIBC_BOOL_H_ |
#define false 0 |
#define true 1 |
typedef short bool; |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/include/cap.h |
---|
0,0 → 1,46 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIB_CAP_H_ |
#define LIB_CAP_H_ |
#include <task.h> |
extern int cap_grant(task_id_t id, unsigned int caps); |
extern int cap_revoke(task_id_t id, unsigned int caps); |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/include/atomic.h |
---|
0,0 → 1,57 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#ifndef LIBC_ATOMIC_H_ |
#define LIBC_ATOMIC_H_ |
typedef struct atomic { |
volatile long count; |
} atomic_t; |
#include <libarch/atomic.h> |
static inline void atomic_set(atomic_t *val, long i) |
{ |
val->count = i; |
} |
static inline long atomic_get(atomic_t *val) |
{ |
return val->count; |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/include/malloc.h |
---|
0,0 → 1,537 |
/* |
Default header file for malloc-2.8.x, written by Doug Lea |
and released to the public domain, as explained at |
http://creativecommons.org/licenses/publicdomain. |
last update: Mon Aug 15 08:55:52 2005 Doug Lea (dl at gee) |
This header is for ANSI C/C++ only. You can set any of |
the following #defines before including: |
* If USE_DL_PREFIX is defined, it is assumed that malloc.c |
was also compiled with this option, so all routines |
have names starting with "dl". |
* If HAVE_USR_INCLUDE_MALLOC_H is defined, it is assumed that this |
file will be #included AFTER <malloc.h>. This is needed only if |
your system defines a struct mallinfo that is incompatible with the |
standard one declared here. Otherwise, you can include this file |
INSTEAD of your system system <malloc.h>. At least on ANSI, all |
declarations should be compatible with system versions |
* If MSPACES is defined, declarations for mspace versions are included. |
*/ |
#ifndef MALLOC_280_H |
#define MALLOC_280_H |
#ifdef __cplusplus |
extern "C" { |
#endif |
#include <stddef.h> /* for size_t */ |
#if !ONLY_MSPACES |
#ifndef USE_DL_PREFIX |
#define dlcalloc calloc |
#define dlfree free |
#define dlmalloc malloc |
#define dlmemalign memalign |
#define dlrealloc realloc |
#define dlvalloc valloc |
#define dlpvalloc pvalloc |
#define dlmallinfo mallinfo |
#define dlmallopt mallopt |
#define dlmalloc_trim malloc_trim |
#define dlmalloc_stats malloc_stats |
#define dlmalloc_usable_size malloc_usable_size |
#define dlmalloc_footprint malloc_footprint |
#define dlmalloc_max_footprint malloc_max_footprint |
#define dlindependent_calloc independent_calloc |
#define dlindependent_comalloc independent_comalloc |
#endif /* USE_DL_PREFIX */ |
/* |
malloc(size_t n) |
Returns a pointer to a newly allocated chunk of at least n bytes, or |
null if no space is available, in which case errno is set to ENOMEM |
on ANSI C systems. |
If n is zero, malloc returns a minimum-sized chunk. (The minimum |
size is 16 bytes on most 32bit systems, and 32 bytes on 64bit |
systems.) Note that size_t is an unsigned type, so calls with |
arguments that would be negative if signed are interpreted as |
requests for huge amounts of space, which will often fail. The |
maximum supported value of n differs across systems, but is in all |
cases less than the maximum representable value of a size_t. |
*/ |
void* dlmalloc(size_t); |
/* |
free(void* p) |
Releases the chunk of memory pointed to by p, that had been previously |
allocated using malloc or a related routine such as realloc. |
It has no effect if p is null. If p was not malloced or already |
freed, free(p) will by default cuase the current program to abort. |
*/ |
void dlfree(void*); |
/* |
calloc(size_t n_elements, size_t element_size); |
Returns a pointer to n_elements * element_size bytes, with all locations |
set to zero. |
*/ |
void* dlcalloc(size_t, size_t); |
/* |
realloc(void* p, size_t n) |
Returns a pointer to a chunk of size n that contains the same data |
as does chunk p up to the minimum of (n, p's size) bytes, or null |
if no space is available. |
The returned pointer may or may not be the same as p. The algorithm |
prefers extending p in most cases when possible, otherwise it |
employs the equivalent of a malloc-copy-free sequence. |
If p is null, realloc is equivalent to malloc. |
If space is not available, realloc returns null, errno is set (if on |
ANSI) and p is NOT freed. |
if n is for fewer bytes than already held by p, the newly unused |
space is lopped off and freed if possible. realloc with a size |
argument of zero (re)allocates a minimum-sized chunk. |
The old unix realloc convention of allowing the last-free'd chunk |
to be used as an argument to realloc is not supported. |
*/ |
void* dlrealloc(void*, size_t); |
/* |
memalign(size_t alignment, size_t n); |
Returns a pointer to a newly allocated chunk of n bytes, aligned |
in accord with the alignment argument. |
The alignment argument should be a power of two. If the argument is |
not a power of two, the nearest greater power is used. |
8-byte alignment is guaranteed by normal malloc calls, so don't |
bother calling memalign with an argument of 8 or less. |
Overreliance on memalign is a sure way to fragment space. |
*/ |
void* dlmemalign(size_t, size_t); |
/* |
valloc(size_t n); |
Equivalent to memalign(pagesize, n), where pagesize is the page |
size of the system. If the pagesize is unknown, 4096 is used. |
*/ |
void* dlvalloc(size_t); |
/* |
mallopt(int parameter_number, int parameter_value) |
Sets tunable parameters The format is to provide a |
(parameter-number, parameter-value) pair. mallopt then sets the |
corresponding parameter to the argument value if it can (i.e., so |
long as the value is meaningful), and returns 1 if successful else |
0. SVID/XPG/ANSI defines four standard param numbers for mallopt, |
normally defined in malloc.h. None of these are use in this malloc, |
so setting them has no effect. But this malloc also supports other |
options in mallopt: |
Symbol param # default allowed param values |
M_TRIM_THRESHOLD -1 2*1024*1024 any (-1U disables trimming) |
M_GRANULARITY -2 page size any power of 2 >= page size |
M_MMAP_THRESHOLD -3 256*1024 any (or 0 if no MMAP support) |
*/ |
int dlmallopt(int, int); |
#define M_TRIM_THRESHOLD (-1) |
#define M_GRANULARITY (-2) |
#define M_MMAP_THRESHOLD (-3) |
/* |
malloc_footprint(); |
Returns the number of bytes obtained from the system. The total |
number of bytes allocated by malloc, realloc etc., is less than this |
value. Unlike mallinfo, this function returns only a precomputed |
result, so can be called frequently to monitor memory consumption. |
Even if locks are otherwise defined, this function does not use them, |
so results might not be up to date. |
*/ |
size_t dlmalloc_footprint(void); |
size_t dlmalloc_max_footprint(void); |
#if !NO_MALLINFO |
/* |
mallinfo() |
Returns (by copy) a struct containing various summary statistics: |
arena: current total non-mmapped bytes allocated from system |
ordblks: the number of free chunks |
smblks: always zero. |
hblks: current number of mmapped regions |
hblkhd: total bytes held in mmapped regions |
usmblks: the maximum total allocated space. This will be greater |
than current total if trimming has occurred. |
fsmblks: always zero |
uordblks: current total allocated space (normal or mmapped) |
fordblks: total free space |
keepcost: the maximum number of bytes that could ideally be released |
back to system via malloc_trim. ("ideally" means that |
it ignores page restrictions etc.) |
Because these fields are ints, but internal bookkeeping may |
be kept as longs, the reported values may wrap around zero and |
thus be inaccurate. |
*/ |
#ifndef HAVE_USR_INCLUDE_MALLOC_H |
#ifndef _MALLOC_H |
#ifndef MALLINFO_FIELD_TYPE |
#define MALLINFO_FIELD_TYPE size_t |
#endif /* MALLINFO_FIELD_TYPE */ |
struct mallinfo { |
MALLINFO_FIELD_TYPE arena; /* non-mmapped space allocated from system */ |
MALLINFO_FIELD_TYPE ordblks; /* number of free chunks */ |
MALLINFO_FIELD_TYPE smblks; /* always 0 */ |
MALLINFO_FIELD_TYPE hblks; /* always 0 */ |
MALLINFO_FIELD_TYPE hblkhd; /* space in mmapped regions */ |
MALLINFO_FIELD_TYPE usmblks; /* maximum total allocated space */ |
MALLINFO_FIELD_TYPE fsmblks; /* always 0 */ |
MALLINFO_FIELD_TYPE uordblks; /* total allocated space */ |
MALLINFO_FIELD_TYPE fordblks; /* total free space */ |
MALLINFO_FIELD_TYPE keepcost; /* releasable (via malloc_trim) space */ |
}; |
#endif /* _MALLOC_H */ |
#endif /* HAVE_USR_INCLUDE_MALLOC_H */ |
struct mallinfo dlmallinfo(void); |
#endif /* NO_MALLINFO */ |
/* |
independent_calloc(size_t n_elements, size_t element_size, void* chunks[]); |
independent_calloc is similar to calloc, but instead of returning a |
single cleared space, it returns an array of pointers to n_elements |
independent elements that can hold contents of size elem_size, each |
of which starts out cleared, and can be independently freed, |
realloc'ed etc. The elements are guaranteed to be adjacently |
allocated (this is not guaranteed to occur with multiple callocs or |
mallocs), which may also improve cache locality in some |
applications. |
The "chunks" argument is optional (i.e., may be null, which is |
probably the most typical usage). If it is null, the returned array |
is itself dynamically allocated and should also be freed when it is |
no longer needed. Otherwise, the chunks array must be of at least |
n_elements in length. It is filled in with the pointers to the |
chunks. |
In either case, independent_calloc returns this pointer array, or |
null if the allocation failed. If n_elements is zero and "chunks" |
is null, it returns a chunk representing an array with zero elements |
(which should be freed if not wanted). |
Each element must be individually freed when it is no longer |
needed. If you'd like to instead be able to free all at once, you |
should instead use regular calloc and assign pointers into this |
space to represent elements. (In this case though, you cannot |
independently free elements.) |
independent_calloc simplifies and speeds up implementations of many |
kinds of pools. It may also be useful when constructing large data |
structures that initially have a fixed number of fixed-sized nodes, |
but the number is not known at compile time, and some of the nodes |
may later need to be freed. For example: |
struct Node { int item; struct Node* next; }; |
struct Node* build_list() { |
struct Node** pool; |
int n = read_number_of_nodes_needed(); |
if (n <= 0) return 0; |
pool = (struct Node**)(independent_calloc(n, sizeof(struct Node), 0); |
if (pool == 0) die(); |
// organize into a linked list... |
struct Node* first = pool[0]; |
for (i = 0; i < n-1; ++i) |
pool[i]->next = pool[i+1]; |
free(pool); // Can now free the array (or not, if it is needed later) |
return first; |
} |
*/ |
void** dlindependent_calloc(size_t, size_t, void**); |
/* |
independent_comalloc(size_t n_elements, size_t sizes[], void* chunks[]); |
independent_comalloc allocates, all at once, a set of n_elements |
chunks with sizes indicated in the "sizes" array. It returns |
an array of pointers to these elements, each of which can be |
independently freed, realloc'ed etc. The elements are guaranteed to |
be adjacently allocated (this is not guaranteed to occur with |
multiple callocs or mallocs), which may also improve cache locality |
in some applications. |
The "chunks" argument is optional (i.e., may be null). If it is null |
the returned array is itself dynamically allocated and should also |
be freed when it is no longer needed. Otherwise, the chunks array |
must be of at least n_elements in length. It is filled in with the |
pointers to the chunks. |
In either case, independent_comalloc returns this pointer array, or |
null if the allocation failed. If n_elements is zero and chunks is |
null, it returns a chunk representing an array with zero elements |
(which should be freed if not wanted). |
Each element must be individually freed when it is no longer |
needed. If you'd like to instead be able to free all at once, you |
should instead use a single regular malloc, and assign pointers at |
particular offsets in the aggregate space. (In this case though, you |
cannot independently free elements.) |
independent_comallac differs from independent_calloc in that each |
element may have a different size, and also that it does not |
automatically clear elements. |
independent_comalloc can be used to speed up allocation in cases |
where several structs or objects must always be allocated at the |
same time. For example: |
struct Head { ... } |
struct Foot { ... } |
void send_message(char* msg) { |
int msglen = strlen(msg); |
size_t sizes[3] = { sizeof(struct Head), msglen, sizeof(struct Foot) }; |
void* chunks[3]; |
if (independent_comalloc(3, sizes, chunks) == 0) |
die(); |
struct Head* head = (struct Head*)(chunks[0]); |
char* body = (char*)(chunks[1]); |
struct Foot* foot = (struct Foot*)(chunks[2]); |
// ... |
} |
In general though, independent_comalloc is worth using only for |
larger values of n_elements. For small values, you probably won't |
detect enough difference from series of malloc calls to bother. |
Overuse of independent_comalloc can increase overall memory usage, |
since it cannot reuse existing noncontiguous small chunks that |
might be available for some of the elements. |
*/ |
void** dlindependent_comalloc(size_t, size_t*, void**); |
/* |
pvalloc(size_t n); |
Equivalent to valloc(minimum-page-that-holds(n)), that is, |
round up n to nearest pagesize. |
*/ |
void* dlpvalloc(size_t); |
/* |
malloc_trim(size_t pad); |
If possible, gives memory back to the system (via negative arguments |
to sbrk) if there is unused memory at the `high' end of the malloc |
pool or in unused MMAP segments. You can call this after freeing |
large blocks of memory to potentially reduce the system-level memory |
requirements of a program. However, it cannot guarantee to reduce |
memory. Under some allocation patterns, some large free blocks of |
memory will be locked between two used chunks, so they cannot be |
given back to the system. |
The `pad' argument to malloc_trim represents the amount of free |
trailing space to leave untrimmed. If this argument is zero, only |
the minimum amount of memory to maintain internal data structures |
will be left. Non-zero arguments can be supplied to maintain enough |
trailing space to service future expected allocations without having |
to re-obtain memory from the system. |
Malloc_trim returns 1 if it actually released any memory, else 0. |
*/ |
int dlmalloc_trim(size_t); |
/* |
malloc_usable_size(void* p); |
Returns the number of bytes you can actually use in |
an allocated chunk, which may be more than you requested (although |
often not) due to alignment and minimum size constraints. |
You can use this many bytes without worrying about |
overwriting other allocated objects. This is not a particularly great |
programming practice. malloc_usable_size can be more useful in |
debugging and assertions, for example: |
p = malloc(n); |
assert(malloc_usable_size(p) >= 256); |
*/ |
size_t dlmalloc_usable_size(void*); |
/* |
malloc_stats(); |
Prints on stderr the amount of space obtained from the system (both |
via sbrk and mmap), the maximum amount (which may be more than |
current if malloc_trim and/or munmap got called), and the current |
number of bytes allocated via malloc (or realloc, etc) but not yet |
freed. Note that this is the number of bytes allocated, not the |
number requested. It will be larger than the number requested |
because of alignment and bookkeeping overhead. Because it includes |
alignment wastage as being in use, this figure may be greater than |
zero even when no user-level chunks are allocated. |
The reported current and maximum system memory can be inaccurate if |
a program makes other calls to system memory allocation functions |
(normally sbrk) outside of malloc. |
malloc_stats prints only the most commonly interesting statistics. |
More information can be obtained by calling mallinfo. |
*/ |
void dlmalloc_stats(void); |
#endif /* !ONLY_MSPACES */ |
#if MSPACES |
/* |
mspace is an opaque type representing an independent |
region of space that supports mspace_malloc, etc. |
*/ |
typedef void* mspace; |
/* |
create_mspace creates and returns a new independent space with the |
given initial capacity, or, if 0, the default granularity size. It |
returns null if there is no system memory available to create the |
space. If argument locked is non-zero, the space uses a separate |
lock to control access. The capacity of the space will grow |
dynamically as needed to service mspace_malloc requests. You can |
control the sizes of incremental increases of this space by |
compiling with a different DEFAULT_GRANULARITY or dynamically |
setting with mallopt(M_GRANULARITY, value). |
*/ |
mspace create_mspace(size_t capacity, int locked); |
/* |
destroy_mspace destroys the given space, and attempts to return all |
of its memory back to the system, returning the total number of |
bytes freed. After destruction, the results of access to all memory |
used by the space become undefined. |
*/ |
size_t destroy_mspace(mspace msp); |
/* |
create_mspace_with_base uses the memory supplied as the initial base |
of a new mspace. Part (less than 128*sizeof(size_t) bytes) of this |
space is used for bookkeeping, so the capacity must be at least this |
large. (Otherwise 0 is returned.) When this initial space is |
exhausted, additional memory will be obtained from the system. |
Destroying this space will deallocate all additionally allocated |
space (if possible) but not the initial base. |
*/ |
mspace create_mspace_with_base(void* base, size_t capacity, int locked); |
/* |
mspace_malloc behaves as malloc, but operates within |
the given space. |
*/ |
void* mspace_malloc(mspace msp, size_t bytes); |
/* |
mspace_free behaves as free, but operates within |
the given space. |
If compiled with FOOTERS==1, mspace_free is not actually needed. |
free may be called instead of mspace_free because freed chunks from |
any space are handled by their originating spaces. |
*/ |
void mspace_free(mspace msp, void* mem); |
/* |
mspace_realloc behaves as realloc, but operates within |
the given space. |
If compiled with FOOTERS==1, mspace_realloc is not actually |
needed. realloc may be called instead of mspace_realloc because |
realloced chunks from any space are handled by their originating |
spaces. |
*/ |
void* mspace_realloc(mspace msp, void* mem, size_t newsize); |
/* |
mspace_calloc behaves as calloc, but operates within |
the given space. |
*/ |
void* mspace_calloc(mspace msp, size_t n_elements, size_t elem_size); |
/* |
mspace_memalign behaves as memalign, but operates within |
the given space. |
*/ |
void* mspace_memalign(mspace msp, size_t alignment, size_t bytes); |
/* |
mspace_independent_calloc behaves as independent_calloc, but |
operates within the given space. |
*/ |
void** mspace_independent_calloc(mspace msp, size_t n_elements, |
size_t elem_size, void* chunks[]); |
/* |
mspace_independent_comalloc behaves as independent_comalloc, but |
operates within the given space. |
*/ |
void** mspace_independent_comalloc(mspace msp, size_t n_elements, |
size_t sizes[], void* chunks[]); |
/* |
mspace_footprint() returns the number of bytes obtained from the |
system for this space. |
*/ |
size_t mspace_footprint(mspace msp); |
#if !NO_MALLINFO |
/* |
mspace_mallinfo behaves as mallinfo, but reports properties of |
the given space. |
*/ |
struct mallinfo mspace_mallinfo(mspace msp); |
#endif /* NO_MALLINFO */ |
/* |
mspace_malloc_stats behaves as malloc_stats, but reports |
properties of the given space. |
*/ |
void mspace_malloc_stats(mspace msp); |
/* |
mspace_trim behaves as malloc_trim, but |
operates within the given space. |
*/ |
int mspace_trim(mspace msp, size_t pad); |
/* |
An alias for mallopt. |
*/ |
int mspace_mallopt(int, int); |
#endif /* MSPACES */ |
#ifdef __cplusplus |
}; /* end of extern "C" */ |
#endif |
#endif /* MALLOC_280_H */ |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/generic/vfs/vfs.c |
---|
0,0 → 1,557 |
/* |
* Copyright (c) 2008 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#include <vfs/vfs.h> |
#include <vfs/canonify.h> |
#include <stdlib.h> |
#include <unistd.h> |
#include <dirent.h> |
#include <fcntl.h> |
#include <sys/stat.h> |
#include <stdio.h> |
#include <sys/types.h> |
#include <ipc/ipc.h> |
#include <ipc/services.h> |
#include <async.h> |
#include <atomic.h> |
#include <futex.h> |
#include <errno.h> |
#include <string.h> |
#include "../../srv/vfs/vfs.h" |
int vfs_phone = -1; |
futex_t vfs_phone_futex = FUTEX_INITIALIZER; |
futex_t cwd_futex = FUTEX_INITIALIZER; |
DIR *cwd_dir = NULL; |
char *cwd_path = NULL; |
size_t cwd_len = 0; |
static char *absolutize(const char *path, size_t *retlen) |
{ |
char *ncwd_path; |
futex_down(&cwd_futex); |
size_t len = strlen(path); |
if (*path != '/') { |
if (!cwd_path) { |
futex_up(&cwd_futex); |
return NULL; |
} |
ncwd_path = malloc(len + cwd_len + 1); |
if (!ncwd_path) { |
futex_up(&cwd_futex); |
return NULL; |
} |
strcpy(ncwd_path, cwd_path); |
ncwd_path[cwd_len] = '/'; |
ncwd_path[cwd_len + 1] = '\0'; |
} else { |
ncwd_path = malloc(len + 1); |
if (!ncwd_path) { |
futex_up(&cwd_futex); |
return NULL; |
} |
ncwd_path[0] = '\0'; |
} |
strcat(ncwd_path, path); |
if (!canonify(ncwd_path, retlen)) { |
futex_up(&cwd_futex); |
free(ncwd_path); |
return NULL; |
} |
futex_up(&cwd_futex); |
return ncwd_path; |
} |
static int vfs_connect(void) |
{ |
if (vfs_phone < 0) |
vfs_phone = ipc_connect_me_to(PHONE_NS, SERVICE_VFS, 0, 0); |
return vfs_phone; |
} |
int mount(const char *fs_name, const char *mp, const char *dev) |
{ |
int res; |
ipcarg_t rc; |
aid_t req; |
dev_handle_t dev_handle = 0; /* TODO */ |
size_t mpa_len; |
char *mpa = absolutize(mp, &mpa_len); |
if (!mpa) |
return ENOMEM; |
futex_down(&vfs_phone_futex); |
async_serialize_start(); |
if (vfs_phone < 0) { |
res = vfs_connect(); |
if (res < 0) { |
async_serialize_end(); |
futex_up(&vfs_phone_futex); |
free(mpa); |
return res; |
} |
} |
req = async_send_1(vfs_phone, VFS_MOUNT, dev_handle, NULL); |
rc = ipc_data_write_start(vfs_phone, (void *)fs_name, strlen(fs_name)); |
if (rc != EOK) { |
async_wait_for(req, NULL); |
async_serialize_end(); |
futex_up(&vfs_phone_futex); |
free(mpa); |
return (int) rc; |
} |
rc = ipc_data_write_start(vfs_phone, (void *)mpa, mpa_len); |
if (rc != EOK) { |
async_wait_for(req, NULL); |
async_serialize_end(); |
futex_up(&vfs_phone_futex); |
free(mpa); |
return (int) rc; |
} |
async_wait_for(req, &rc); |
async_serialize_end(); |
futex_up(&vfs_phone_futex); |
free(mpa); |
return (int) rc; |
} |
static int _open(const char *path, int lflag, int oflag, ...) |
{ |
int res; |
ipcarg_t rc; |
ipc_call_t answer; |
aid_t req; |
size_t pa_len; |
char *pa = absolutize(path, &pa_len); |
if (!pa) |
return ENOMEM; |
futex_down(&vfs_phone_futex); |
async_serialize_start(); |
if (vfs_phone < 0) { |
res = vfs_connect(); |
if (res < 0) { |
async_serialize_end(); |
futex_up(&vfs_phone_futex); |
free(pa); |
return res; |
} |
} |
req = async_send_3(vfs_phone, VFS_OPEN, lflag, oflag, 0, &answer); |
rc = ipc_data_write_start(vfs_phone, pa, pa_len); |
if (rc != EOK) { |
async_wait_for(req, NULL); |
async_serialize_end(); |
futex_up(&vfs_phone_futex); |
free(pa); |
return (int) rc; |
} |
async_wait_for(req, &rc); |
async_serialize_end(); |
futex_up(&vfs_phone_futex); |
free(pa); |
return (int) IPC_GET_ARG1(answer); |
} |
int open(const char *path, int oflag, ...) |
{ |
return _open(path, L_FILE, oflag); |
} |
int close(int fildes) |
{ |
int res; |
ipcarg_t rc; |
futex_down(&vfs_phone_futex); |
async_serialize_start(); |
if (vfs_phone < 0) { |
res = vfs_connect(); |
if (res < 0) { |
async_serialize_end(); |
futex_up(&vfs_phone_futex); |
return res; |
} |
} |
rc = async_req_1_0(vfs_phone, VFS_CLOSE, fildes); |
async_serialize_end(); |
futex_up(&vfs_phone_futex); |
return (int)rc; |
} |
ssize_t read(int fildes, void *buf, size_t nbyte) |
{ |
int res; |
ipcarg_t rc; |
ipc_call_t answer; |
aid_t req; |
futex_down(&vfs_phone_futex); |
async_serialize_start(); |
if (vfs_phone < 0) { |
res = vfs_connect(); |
if (res < 0) { |
async_serialize_end(); |
futex_up(&vfs_phone_futex); |
return res; |
} |
} |
req = async_send_1(vfs_phone, VFS_READ, fildes, &answer); |
rc = ipc_data_read_start(vfs_phone, (void *)buf, nbyte); |
if (rc != EOK) { |
async_wait_for(req, NULL); |
async_serialize_end(); |
futex_up(&vfs_phone_futex); |
return (ssize_t) rc; |
} |
async_wait_for(req, &rc); |
async_serialize_end(); |
futex_up(&vfs_phone_futex); |
if (rc == EOK) |
return (ssize_t) IPC_GET_ARG1(answer); |
else |
return -1; |
} |
ssize_t write(int fildes, const void *buf, size_t nbyte) |
{ |
int res; |
ipcarg_t rc; |
ipc_call_t answer; |
aid_t req; |
futex_down(&vfs_phone_futex); |
async_serialize_start(); |
if (vfs_phone < 0) { |
res = vfs_connect(); |
if (res < 0) { |
async_serialize_end(); |
futex_up(&vfs_phone_futex); |
return res; |
} |
} |
req = async_send_1(vfs_phone, VFS_WRITE, fildes, &answer); |
rc = ipc_data_write_start(vfs_phone, (void *)buf, nbyte); |
if (rc != EOK) { |
async_wait_for(req, NULL); |
async_serialize_end(); |
futex_up(&vfs_phone_futex); |
return (ssize_t) rc; |
} |
async_wait_for(req, &rc); |
async_serialize_end(); |
futex_up(&vfs_phone_futex); |
if (rc == EOK) |
return (ssize_t) IPC_GET_ARG1(answer); |
else |
return -1; |
} |
off_t lseek(int fildes, off_t offset, int whence) |
{ |
int res; |
ipcarg_t rc; |
futex_down(&vfs_phone_futex); |
async_serialize_start(); |
if (vfs_phone < 0) { |
res = vfs_connect(); |
if (res < 0) { |
async_serialize_end(); |
futex_up(&vfs_phone_futex); |
return res; |
} |
} |
off_t newoffs; |
rc = async_req_3_1(vfs_phone, VFS_SEEK, fildes, offset, whence, |
(ipcarg_t)&newoffs); |
async_serialize_end(); |
futex_up(&vfs_phone_futex); |
if (rc != EOK) |
return (off_t) -1; |
return newoffs; |
} |
int ftruncate(int fildes, off_t length) |
{ |
int res; |
ipcarg_t rc; |
futex_down(&vfs_phone_futex); |
async_serialize_start(); |
if (vfs_phone < 0) { |
res = vfs_connect(); |
if (res < 0) { |
async_serialize_end(); |
futex_up(&vfs_phone_futex); |
return res; |
} |
} |
rc = async_req_2_0(vfs_phone, VFS_TRUNCATE, fildes, length); |
async_serialize_end(); |
futex_up(&vfs_phone_futex); |
return (int) rc; |
} |
DIR *opendir(const char *dirname) |
{ |
DIR *dirp = malloc(sizeof(DIR)); |
if (!dirp) |
return NULL; |
dirp->fd = _open(dirname, L_DIRECTORY, 0); |
if (dirp->fd < 0) { |
free(dirp); |
return NULL; |
} |
return dirp; |
} |
struct dirent *readdir(DIR *dirp) |
{ |
ssize_t len = read(dirp->fd, &dirp->res.d_name[0], NAME_MAX + 1); |
if (len <= 0) |
return NULL; |
return &dirp->res; |
} |
void rewinddir(DIR *dirp) |
{ |
(void) lseek(dirp->fd, 0, SEEK_SET); |
} |
int closedir(DIR *dirp) |
{ |
(void) close(dirp->fd); |
free(dirp); |
return 0; |
} |
int mkdir(const char *path, mode_t mode) |
{ |
int res; |
ipcarg_t rc; |
aid_t req; |
size_t pa_len; |
char *pa = absolutize(path, &pa_len); |
if (!pa) |
return ENOMEM; |
futex_down(&vfs_phone_futex); |
async_serialize_start(); |
if (vfs_phone < 0) { |
res = vfs_connect(); |
if (res < 0) { |
async_serialize_end(); |
futex_up(&vfs_phone_futex); |
free(pa); |
return res; |
} |
} |
req = async_send_1(vfs_phone, VFS_MKDIR, mode, NULL); |
rc = ipc_data_write_start(vfs_phone, pa, pa_len); |
if (rc != EOK) { |
async_wait_for(req, NULL); |
async_serialize_end(); |
futex_up(&vfs_phone_futex); |
free(pa); |
return (int) rc; |
} |
async_wait_for(req, &rc); |
async_serialize_end(); |
futex_up(&vfs_phone_futex); |
free(pa); |
return rc; |
} |
static int _unlink(const char *path, int lflag) |
{ |
int res; |
ipcarg_t rc; |
aid_t req; |
size_t pa_len; |
char *pa = absolutize(path, &pa_len); |
if (!pa) |
return ENOMEM; |
futex_down(&vfs_phone_futex); |
async_serialize_start(); |
if (vfs_phone < 0) { |
res = vfs_connect(); |
if (res < 0) { |
async_serialize_end(); |
futex_up(&vfs_phone_futex); |
free(pa); |
return res; |
} |
} |
req = async_send_0(vfs_phone, VFS_UNLINK, NULL); |
rc = ipc_data_write_start(vfs_phone, pa, pa_len); |
if (rc != EOK) { |
async_wait_for(req, NULL); |
async_serialize_end(); |
futex_up(&vfs_phone_futex); |
free(pa); |
return (int) rc; |
} |
async_wait_for(req, &rc); |
async_serialize_end(); |
futex_up(&vfs_phone_futex); |
free(pa); |
return rc; |
} |
int unlink(const char *path) |
{ |
return _unlink(path, L_NONE); |
} |
int rmdir(const char *path) |
{ |
return _unlink(path, L_DIRECTORY); |
} |
int rename(const char *old, const char *new) |
{ |
int res; |
ipcarg_t rc; |
aid_t req; |
size_t olda_len; |
char *olda = absolutize(old, &olda_len); |
if (!olda) |
return ENOMEM; |
size_t newa_len; |
char *newa = absolutize(new, &newa_len); |
if (!newa) { |
free(olda); |
return ENOMEM; |
} |
futex_down(&vfs_phone_futex); |
async_serialize_start(); |
if (vfs_phone < 0) { |
res = vfs_connect(); |
if (res < 0) { |
async_serialize_end(); |
futex_up(&vfs_phone_futex); |
free(olda); |
free(newa); |
return res; |
} |
} |
req = async_send_0(vfs_phone, VFS_RENAME, NULL); |
rc = ipc_data_write_start(vfs_phone, olda, olda_len); |
if (rc != EOK) { |
async_wait_for(req, NULL); |
async_serialize_end(); |
futex_up(&vfs_phone_futex); |
free(olda); |
free(newa); |
return (int) rc; |
} |
rc = ipc_data_write_start(vfs_phone, newa, newa_len); |
if (rc != EOK) { |
async_wait_for(req, NULL); |
async_serialize_end(); |
futex_up(&vfs_phone_futex); |
free(olda); |
free(newa); |
return (int) rc; |
} |
async_wait_for(req, &rc); |
async_serialize_end(); |
futex_up(&vfs_phone_futex); |
free(olda); |
free(newa); |
return rc; |
} |
int chdir(const char *path) |
{ |
size_t pa_len; |
char *pa = absolutize(path, &pa_len); |
if (!pa) |
return ENOMEM; |
DIR *d = opendir(pa); |
if (!d) { |
free(pa); |
return ENOENT; |
} |
futex_down(&cwd_futex); |
if (cwd_dir) { |
closedir(cwd_dir); |
cwd_dir = NULL; |
free(cwd_path); |
cwd_path = NULL; |
cwd_len = 0; |
} |
cwd_dir = d; |
cwd_path = pa; |
cwd_len = pa_len; |
futex_up(&cwd_futex); |
} |
char *getcwd(char *buf, size_t size) |
{ |
if (!size) |
return NULL; |
futex_down(&cwd_futex); |
if (size < cwd_len + 1) { |
futex_up(&cwd_futex); |
return NULL; |
} |
strcpy(buf, cwd_path); |
futex_up(&cwd_futex); |
return buf; |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/generic/vfs/canonify.c |
---|
0,0 → 1,339 |
/* |
* Copyright (c) 2008 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** |
* @file |
* @brief |
*/ |
#include <stdlib.h> |
/** Token types used for tokenization of path. */ |
typedef enum { |
TK_INVALID, |
TK_SLASH, |
TK_DOT, |
TK_DOTDOT, |
TK_COMP, |
TK_NUL |
} tokval_t; |
typedef struct { |
tokval_t kind; |
char *start; |
char *stop; |
} token_t; |
/** Fake up the TK_SLASH token. */ |
static token_t slash_token(char *start) |
{ |
token_t ret; |
ret.kind = TK_SLASH; |
ret.start = start; |
ret.stop = start; |
return ret; |
} |
/** Given a token, return the next token. */ |
static token_t next_token(token_t *cur) |
{ |
token_t ret; |
if (cur->stop[1] == '\0') { |
ret.kind = TK_NUL; |
ret.start = cur->stop + 1; |
ret.stop = ret.start; |
return ret; |
} |
if (cur->stop[1] == '/') { |
ret.kind = TK_SLASH; |
ret.start = cur->stop + 1; |
ret.stop = ret.start; |
return ret; |
} |
if (cur->stop[1] == '.' && (!cur->stop[2] || cur->stop[2] == '/')) { |
ret.kind = TK_DOT; |
ret.start = cur->stop + 1; |
ret.stop = ret.start; |
return ret; |
} |
if (cur->stop[1] == '.' && cur->stop[2] == '.' && |
(!cur->stop[3] || cur->stop[3] == '/')) { |
ret.kind = TK_DOTDOT; |
ret.start = cur->stop + 1; |
ret.stop = cur->stop + 2; |
return ret; |
} |
unsigned i; |
for (i = 1; cur->stop[i] && cur->stop[i] != '/'; i++) |
; |
ret.kind = TK_COMP; |
ret.start = &cur->stop[1]; |
ret.stop = &cur->stop[i - 1]; |
return ret; |
} |
/** States used by canonify(). */ |
typedef enum { |
S_INI, |
S_A, |
S_B, |
S_C, |
S_ACCEPT, |
S_RESTART, |
S_REJECT |
} state_t; |
typedef struct { |
state_t s; |
void (* f)(token_t *, token_t *, token_t *); |
} change_state_t; |
/* |
* Actions that can be performed when transitioning from one |
* state of canonify() to another. |
*/ |
static void set_first_slash(token_t *t, token_t *tfsl, token_t *tlcomp) |
{ |
*tfsl = *t; |
} |
static void save_component(token_t *t, token_t *tfsl, token_t *tlcomp) |
{ |
*tlcomp = *t; |
} |
static void terminate_slash(token_t *t, token_t *tfsl, token_t *tlcomp) |
{ |
if (tfsl->stop[1]) /* avoid writing to a well-formatted path */ |
tfsl->stop[1] = '\0'; |
} |
static void remove_trailing_slash(token_t *t, token_t *tfsl, token_t *tlcomp) |
{ |
t->start[-1] = '\0'; |
} |
/** Eat the extra '/'.. |
* |
* @param t The current TK_SLASH token. |
*/ |
static void shift_slash(token_t *t, token_t *tfsl, token_t *tlcomp) |
{ |
char *p = t->start; |
char *q = t->stop + 1; |
while ((*p++ = *q++)) |
; |
} |
/** Eat the extra '.'. |
* |
* @param t The current TK_DOT token. |
*/ |
static void shift_dot(token_t *t, token_t *tfsl, token_t *tlcomp) |
{ |
char *p = t->start; |
char *q = t->stop + 1; |
while ((*p++ = *q++)) |
; |
} |
/** Collapse the TK_COMP TK_SLASH TK_DOTDOT pattern. |
* |
* @param t The current TK_DOTDOT token. |
* @param tlcomp The last TK_COMP token. |
*/ |
static void shift_dotdot(token_t *t, token_t *tfsl, token_t *tlcomp) |
{ |
char *p = tlcomp->start; |
char *q = t->stop + 1; |
while ((*p++ = *q++)) |
; |
} |
/** Transition function for canonify(). */ |
static change_state_t trans[4][6] = { |
[S_INI] = { |
[TK_SLASH] = { |
.s = S_A, |
.f = set_first_slash, |
}, |
[TK_DOT] = { |
.s = S_REJECT, |
.f = NULL, |
}, |
[TK_DOTDOT] = { |
.s = S_REJECT, |
.f = NULL, |
}, |
[TK_COMP] = { |
.s = S_REJECT, |
.f = NULL, |
}, |
[TK_NUL] = { |
.s = S_REJECT, |
.f = NULL, |
}, |
[TK_INVALID] = { |
.s = S_REJECT, |
.f = NULL, |
}, |
}, |
[S_A] = { |
[TK_SLASH] = { |
.s = S_A, |
.f = set_first_slash, |
}, |
[TK_DOT] = { |
.s = S_A, |
.f = NULL, |
}, |
[TK_DOTDOT] = { |
.s = S_A, |
.f = NULL, |
}, |
[TK_COMP] = { |
.s = S_B, |
.f = save_component, |
}, |
[TK_NUL] = { |
.s = S_ACCEPT, |
.f = terminate_slash, |
}, |
[TK_INVALID] = { |
.s = S_REJECT, |
.f = NULL, |
}, |
}, |
[S_B] = { |
[TK_SLASH] = { |
.s = S_C, |
.f = NULL, |
}, |
[TK_DOT] = { |
.s = S_REJECT, |
.f = NULL, |
}, |
[TK_DOTDOT] = { |
.s = S_REJECT, |
.f = NULL, |
}, |
[TK_COMP] = { |
.s = S_REJECT, |
.f = NULL, |
}, |
[TK_NUL] = { |
.s = S_ACCEPT, |
.f = NULL, |
}, |
[TK_INVALID] = { |
.s = S_REJECT, |
.f = NULL, |
}, |
}, |
[S_C] = { |
[TK_SLASH] = { |
.s = S_RESTART, |
.f = shift_slash, |
}, |
[TK_DOT] = { |
.s = S_RESTART, |
.f = shift_dot, |
}, |
[TK_DOTDOT] = { |
.s = S_RESTART, |
.f = shift_dotdot, |
}, |
[TK_COMP] = { |
.s = S_B, |
.f = save_component, |
}, |
[TK_NUL] = { |
.s = S_ACCEPT, |
.f = remove_trailing_slash, |
}, |
[TK_INVALID] = { |
.s = S_REJECT, |
.f = NULL, |
}, |
} |
}; |
/** Canonify a file system path. |
* |
* A file system path is canonical, if the following holds: |
* 1) the path is absolute (i.e. a/b/c is not canonical) |
* 2) there is no trailing slash in the path (i.e. /a/b/c is not canonical) |
* 3) there is no extra slash in the path (i.e. /a//b/c is not canonical) |
* 4) there is no '.' component in the path (i.e. /a/./b/c is not canonical) |
* 5) there is no '..' component in the path (i.e. /a/b/../c is not canonical) |
* |
* This function makes a potentially non-canonical file system path canonical. |
* It works in-place and requires a NULL-terminated input string. |
* |
* @param path Path to be canonified. |
* @param lenp Pointer where the length of the final path will be |
* stored. Can be NULL. |
* |
* @return Canonified path or NULL on failure. |
*/ |
char *canonify(char *path, size_t *lenp) |
{ |
state_t state; |
token_t t; |
token_t tfsl; /* first slash */ |
token_t tlcomp; /* last component */ |
if (*path != '/') |
return NULL; |
tfsl = slash_token(path); |
restart: |
state = S_INI; |
t = tfsl; |
tlcomp = tfsl; |
while (state != S_ACCEPT && state != S_RESTART && state != S_REJECT) { |
if (trans[state][t.kind].f) |
trans[state][t.kind].f(&t, &tfsl, &tlcomp); |
state = trans[state][t.kind].s; |
t = next_token(&t); |
} |
switch (state) { |
case S_RESTART: |
goto restart; |
case S_REJECT: |
return NULL; |
case S_ACCEPT: |
if (lenp) |
*lenp = (size_t)((tlcomp.stop - tfsl.start) + 1); |
return tfsl.start; |
default: |
abort(); |
} |
} |
/** |
* @} |
*/ |
/tags/0.3.0/uspace/lib/libc/generic/libadt/hash_table.c |
---|
0,0 → 1,196 |
/* |
* Copyright (c) 2008 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
/* |
* This is an implementation of generic chained hash table. |
*/ |
#include <libadt/hash_table.h> |
#include <libadt/list.h> |
#include <unistd.h> |
#include <malloc.h> |
#include <assert.h> |
#include <stdio.h> |
#include <string.h> |
/** Create chained hash table. |
* |
* @param h Hash table structure. Will be initialized by this call. |
* @param m Number of hash table buckets. |
* @param max_keys Maximal number of keys needed to identify an item. |
* @param op Hash table operations structure. |
* @return True on success |
*/ |
int hash_table_create(hash_table_t *h, hash_count_t m, hash_count_t max_keys, |
hash_table_operations_t *op) |
{ |
hash_count_t i; |
assert(h); |
assert(op && op->hash && op->compare); |
assert(max_keys > 0); |
h->entry = malloc(m * sizeof(link_t)); |
if (!h->entry) { |
printf("cannot allocate memory for hash table\n"); |
return false; |
} |
memset((void *) h->entry, 0, m * sizeof(link_t)); |
for (i = 0; i < m; i++) |
list_initialize(&h->entry[i]); |
h->entries = m; |
h->max_keys = max_keys; |
h->op = op; |
return true; |
} |
/** Destroy a hash table instance. |
* |
* @param h Hash table to be destroyed. |
*/ |
void hash_table_destroy(hash_table_t *h) |
{ |
assert(h); |
assert(h->entry); |
free(h->entry); |
} |
/** Insert item into a hash table. |
* |
* @param h Hash table. |
* @param key Array of all keys necessary to compute hash index. |
* @param item Item to be inserted into the hash table. |
*/ |
void hash_table_insert(hash_table_t *h, unsigned long key[], link_t *item) |
{ |
hash_index_t chain; |
assert(item); |
assert(h && h->op && h->op->hash && h->op->compare); |
chain = h->op->hash(key); |
assert(chain < h->entries); |
list_append(item, &h->entry[chain]); |
} |
/** Search hash table for an item matching keys. |
* |
* @param h Hash table. |
* @param key Array of all keys needed to compute hash index. |
* |
* @return Matching item on success, NULL if there is no such item. |
*/ |
link_t *hash_table_find(hash_table_t *h, unsigned long key[]) |
{ |
link_t *cur; |
hash_index_t chain; |
assert(h && h->op && h->op->hash && h->op->compare); |
chain = h->op->hash(key); |
assert(chain < h->entries); |
for (cur = h->entry[chain].next; cur != &h->entry[chain]; |
cur = cur->next) { |
if (h->op->compare(key, h->max_keys, cur)) { |
/* |
* The entry is there. |
*/ |
return cur; |
} |
} |
return NULL; |
} |
/** Remove all matching items from hash table. |
* |
* For each removed item, h->remove_callback() is called. |
* |
* @param h Hash table. |
* @param key Array of keys that will be compared against items of |
* the hash table. |
* @param keys Number of keys in the 'key' array. |
*/ |
void hash_table_remove(hash_table_t *h, unsigned long key[], hash_count_t keys) |
{ |
hash_index_t chain; |
link_t *cur; |
assert(h && h->op && h->op->hash && h->op->compare && |
h->op->remove_callback); |
assert(keys <= h->max_keys); |
if (keys == h->max_keys) { |
/* |
* All keys are known, hash_table_find() can be used to find the |
* entry. |
*/ |
cur = hash_table_find(h, key); |
if (cur) { |
list_remove(cur); |
h->op->remove_callback(cur); |
} |
return; |
} |
/* |
* Fewer keys were passed. |
* Any partially matching entries are to be removed. |
*/ |
for (chain = 0; chain < h->entries; chain++) { |
for (cur = h->entry[chain].next; cur != &h->entry[chain]; |
cur = cur->next) { |
if (h->op->compare(key, keys, cur)) { |
link_t *hlp; |
hlp = cur; |
cur = cur->prev; |
list_remove(hlp); |
h->op->remove_callback(hlp); |
continue; |
} |
} |
} |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/generic/libadt/list.c |
---|
0,0 → 1,89 |
/* |
* Copyright (c) 2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#include <libadt/list.h> |
/** Check for membership |
* |
* Check whether link is contained in the list head. |
* The membership is defined as pointer equivalence. |
* |
* @param link Item to look for. |
* @param head List to look in. |
* |
* @return true if link is contained in head, false otherwise. |
* |
*/ |
int list_member(const link_t *link, const link_t *head) |
{ |
int found = false; |
link_t *hlp = head->next; |
while (hlp != head) { |
if (hlp == link) { |
found = true; |
break; |
} |
hlp = hlp->next; |
} |
return found; |
} |
/** Concatenate two lists |
* |
* Concatenate lists head1 and head2, producing a single |
* list head1 containing items from both (in head1, head2 |
* order) and empty list head2. |
* |
* @param head1 First list and concatenated output |
* @param head2 Second list and empty output. |
* |
*/ |
void list_concat(link_t *head1, link_t *head2) |
{ |
if (list_empty(head2)) |
return; |
head2->next->prev = head1->prev; |
head2->prev->next = head1; |
head1->prev->next = head2->next; |
head1->prev = head2->prev; |
list_initialize(head2); |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/generic/string.c |
---|
0,0 → 1,357 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#include <string.h> |
#include <unistd.h> |
#include <ctype.h> |
#include <limits.h> |
#include <align.h> |
#include <sys/types.h> |
/* Dummy implementation of mem/ functions */ |
void *memset(void *s, int c, size_t n) |
{ |
char *os = s; |
while (n--) |
*(os++) = c; |
return s; |
} |
struct along { |
unsigned long n; |
} __attribute__ ((packed)); |
static void *unaligned_memcpy(void *dst, const void *src, size_t n) |
{ |
int i, j; |
struct along *adst = dst; |
const struct along *asrc = src; |
for (i = 0; i < n / sizeof(unsigned long); i++) |
adst[i].n = asrc[i].n; |
for (j = 0; j < n % sizeof(unsigned long); j++) |
((unsigned char *) (((unsigned long *) dst) + i))[j] = ((unsigned char *) (((unsigned long *) src) + i))[j]; |
return (char *) src; |
} |
void *memcpy(void *dst, const void *src, size_t n) |
{ |
int i, j; |
if (((long) dst & (sizeof(long) - 1)) || ((long) src & (sizeof(long) - 1))) |
return unaligned_memcpy(dst, src, n); |
for (i = 0; i < n / sizeof(unsigned long); i++) |
((unsigned long *) dst)[i] = ((unsigned long *) src)[i]; |
for (j = 0; j < n % sizeof(unsigned long); j++) |
((unsigned char *) (((unsigned long *) dst) + i))[j] = ((unsigned char *) (((unsigned long *) src) + i))[j]; |
return (char *) src; |
} |
void *memmove(void *dst, const void *src, size_t n) |
{ |
int i, j; |
if (src > dst) |
return memcpy(dst, src, n); |
for (j = (n % sizeof(unsigned long)) - 1; j >= 0; j--) |
((unsigned char *) ((unsigned long *) dst))[j] = ((unsigned char *) ((unsigned long *) src))[j]; |
for (i = n / sizeof(unsigned long) - 1; i >=0 ; i--) |
((unsigned long *) dst)[i] = ((unsigned long *) src)[i]; |
return (char *) src; |
} |
/** Compare two memory areas. |
* |
* @param s1 Pointer to the first area to compare. |
* @param s2 Pointer to the second area to compare. |
* @param len Size of the first area in bytes. Both areas must have the same |
* length. |
* @return If len is 0, return zero. If the areas match, return zero. |
* Otherwise return non-zero. |
*/ |
int bcmp(const char *s1, const char *s2, size_t len) |
{ |
for (; len && *s1++ == *s2++; len--) |
; |
return len; |
} |
/** Count the number of characters in the string, not including terminating 0. |
* @param str string |
* @return number of characters in string. |
*/ |
size_t strlen(const char *str) |
{ |
size_t counter = 0; |
while (str[counter] != 0) |
counter++; |
return counter; |
} |
int strcmp(const char *a, const char *b) |
{ |
int c = 0; |
while (a[c] && b[c] && (!(a[c] - b[c]))) |
c++; |
return (a[c] - b[c]); |
} |
int strncmp(const char *a, const char *b, size_t n) |
{ |
size_t c = 0; |
while (c < n && a[c] && b[c] && (!(a[c] - b[c]))) |
c++; |
return ( c < n ? a[c] - b[c] : 0); |
} |
/** Return pointer to the first occurence of character c in string |
* @param str scanned string |
* @param c searched character (taken as one byte) |
* @return pointer to the matched character or NULL if it is not found in given string. |
*/ |
char *strchr(const char *str, int c) |
{ |
while (*str != '\0') { |
if (*str == (char) c) |
return (char *) str; |
str++; |
} |
return NULL; |
} |
/** Return pointer to the last occurence of character c in string |
* @param str scanned string |
* @param c searched character (taken as one byte) |
* @return pointer to the matched character or NULL if it is not found in given string. |
*/ |
char *strrchr(const char *str, int c) |
{ |
char *retval = NULL; |
while (*str != '\0') { |
if (*str == (char) c) |
retval = (char *) str; |
str++; |
} |
return (char *) retval; |
} |
/** Convert string to a number. |
* Core of strtol and strtoul functions. |
* @param nptr pointer to string |
* @param endptr if not NULL, function stores here pointer to the first invalid character |
* @param base zero or number between 2 and 36 inclusive |
* @param sgn its set to 1 if minus found |
* @return result of conversion. |
*/ |
static unsigned long _strtoul(const char *nptr, char **endptr, int base, char *sgn) |
{ |
unsigned char c; |
unsigned long result = 0; |
unsigned long a, b; |
const char *str = nptr; |
const char *tmpptr; |
while (isspace(*str)) |
str++; |
if (*str == '-') { |
*sgn = 1; |
++str; |
} else if (*str == '+') |
++str; |
if (base) { |
if ((base == 1) || (base > 36)) { |
/* FIXME: set errno to EINVAL */ |
return 0; |
} |
if ((base == 16) && (*str == '0') && ((str[1] == 'x') || (str[1] == 'X'))) { |
str += 2; |
} |
} else { |
base = 10; |
if (*str == '0') { |
base = 8; |
if ((str[1] == 'X') || (str[1] == 'x')) { |
base = 16; |
str += 2; |
} |
} |
} |
tmpptr = str; |
while (*str) { |
c = *str; |
c = (c >= 'a' ? c - 'a' + 10 : (c >= 'A' ? c - 'A' + 10 : (c <= '9' ? c - '0' : 0xff))); |
if (c > base) { |
break; |
} |
a = (result & 0xff) * base + c; |
b = (result >> 8) * base + (a >> 8); |
if (b > (ULONG_MAX >> 8)) { |
/* overflow */ |
/* FIXME: errno = ERANGE*/ |
return ULONG_MAX; |
} |
result = (b << 8) + (a & 0xff); |
++str; |
} |
if (str == tmpptr) { |
/* no number was found => first invalid character is the first character of the string */ |
/* FIXME: set errno to EINVAL */ |
str = nptr; |
result = 0; |
} |
if (endptr) |
*endptr = (char *) str; |
if (nptr == str) { |
/*FIXME: errno = EINVAL*/ |
return 0; |
} |
return result; |
} |
/** Convert initial part of string to long int according to given base. |
* The number may begin with an arbitrary number of whitespaces followed by optional sign (`+' or `-'). |
* If the base is 0 or 16, the prefix `0x' may be inserted and the number will be taken as hexadecimal one. |
* If the base is 0 and the number begin with a zero, number will be taken as octal one (as with base 8). |
* Otherwise the base 0 is taken as decimal. |
* @param nptr pointer to string |
* @param endptr if not NULL, function stores here pointer to the first invalid character |
* @param base zero or number between 2 and 36 inclusive |
* @return result of conversion. |
*/ |
long int strtol(const char *nptr, char **endptr, int base) |
{ |
char sgn = 0; |
unsigned long number = 0; |
number = _strtoul(nptr, endptr, base, &sgn); |
if (number > LONG_MAX) { |
if ((sgn) && (number == (unsigned long) (LONG_MAX) + 1)) { |
/* FIXME: set 0 to errno */ |
return number; |
} |
/* FIXME: set ERANGE to errno */ |
return (sgn ? LONG_MIN : LONG_MAX); |
} |
return (sgn ? -number : number); |
} |
/** Convert initial part of string to unsigned long according to given base. |
* The number may begin with an arbitrary number of whitespaces followed by optional sign (`+' or `-'). |
* If the base is 0 or 16, the prefix `0x' may be inserted and the number will be taken as hexadecimal one. |
* If the base is 0 and the number begin with a zero, number will be taken as octal one (as with base 8). |
* Otherwise the base 0 is taken as decimal. |
* @param nptr pointer to string |
* @param endptr if not NULL, function stores here pointer to the first invalid character |
* @param base zero or number between 2 and 36 inclusive |
* @return result of conversion. |
*/ |
unsigned long strtoul(const char *nptr, char **endptr, int base) |
{ |
char sgn = 0; |
unsigned long number = 0; |
number = _strtoul(nptr, endptr, base, &sgn); |
return (sgn ? -number : number); |
} |
char *strcpy(char *dest, const char *src) |
{ |
char *orig = dest; |
while ((*(dest++) = *(src++))) |
; |
return orig; |
} |
char *strncpy(char *dest, const char *src, size_t n) |
{ |
char *orig = dest; |
while ((*(dest++) = *(src++)) && --n) |
; |
return orig; |
} |
char *strcat(char *dest, const char *src) |
{ |
char *orig = dest; |
while (*dest++) |
; |
--dest; |
while ((*dest++ = *src++)) |
; |
return orig; |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/generic/futex.c |
---|
0,0 → 1,192 |
/* |
* Copyright (c) 2008 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#include <futex.h> |
#include <atomic.h> |
#include <libc.h> |
#include <stdio.h> |
#include <sys/types.h> |
#include <kernel/synch/synch.h> |
/* |
* Note about race conditions. |
* Because of non-atomic nature of operations performed sequentially on the |
* futex counter and the futex wait queue, there is a race condition: |
* |
* (wq->missed_wakeups == 1) && (futex->count = 1) |
* |
* Scenario 1 (wait queue timeout vs. futex_up()): |
* 1. assume wq->missed_wakeups == 0 && futex->count == -1 |
* (ie. thread A sleeping, thread B in the critical section) |
* 2. A receives timeout and gets removed from the wait queue |
* 3. B wants to leave the critical section and calls futex_up() |
* 4. B thus changes futex->count from -1 to 0 |
* 5. B has to call SYS_FUTEX_WAKEUP syscall to wake up the sleeping thread |
* 6. B finds the wait queue empty and changes wq->missed_wakeups from 0 to 1 |
* 7. A fixes futex->count (i.e. the number of waiting threads) by changing it |
* from 0 to 1 |
* |
* Scenario 2 (conditional down operation vs. futex_up) |
* 1. assume wq->missed_wakeups == 0 && futex->count == 0 |
* (i.e. thread A is in the critical section) |
* 2. thread B performs futex_trydown() operation and changes futex->count from |
* 0 to -1 |
* B is now obliged to call SYS_FUTEX_SLEEP syscall |
* 3. A wants to leave the critical section and does futex_up() |
* 4. A thus changes futex->count from -1 to 0 and must call SYS_FUTEX_WAKEUP |
* syscall |
* 5. B finds the wait queue empty and immediatelly aborts the conditional sleep |
* 6. No thread is queueing in the wait queue so wq->missed_wakeups changes from |
* 0 to 1 |
* 6. B fixes futex->count (i.e. the number of waiting threads) by changing it |
* from 0 to 1 |
* |
* Both scenarios allow two threads to be in the critical section |
* simultaneously. One without kernel intervention and the other through |
* wq->missed_wakeups being 1. |
* |
* To mitigate this problem, futex_down_timeout() detects that the syscall |
* didn't sleep in the wait queue, fixes the futex counter and RETRIES the |
* whole operation again. |
*/ |
/** Initialize futex counter. |
* |
* @param futex Futex. |
* @param val Initialization value. |
*/ |
void futex_initialize(futex_t *futex, int val) |
{ |
atomic_set(futex, val); |
} |
int futex_down(futex_t *futex) |
{ |
return futex_down_timeout(futex, SYNCH_NO_TIMEOUT, SYNCH_FLAGS_NONE); |
} |
int futex_trydown(futex_t *futex) |
{ |
return futex_down_timeout(futex, SYNCH_NO_TIMEOUT, |
SYNCH_FLAGS_NON_BLOCKING); |
} |
/** Try to down the futex. |
* |
* @param futex Futex. |
* @param usec Microseconds to wait. Zero value means sleep without |
* timeout. |
* @param flags Select mode of operation. See comment for |
* waitq_sleep_timeout(). |
* |
* @return ENOENT if there is no such virtual address. One of |
* ESYNCH_OK_ATOMIC and ESYNCH_OK_BLOCKED on success or |
* ESYNCH_TIMEOUT if the lock was not acquired because of |
* a timeout or ESYNCH_WOULD_BLOCK if the operation could |
* not be carried out atomically (if requested so). |
*/ |
int futex_down_timeout(futex_t *futex, uint32_t usec, int flags) |
{ |
int rc; |
while (atomic_predec(futex) < 0) { |
rc = __SYSCALL3(SYS_FUTEX_SLEEP, (sysarg_t) &futex->count, |
(sysarg_t) usec, (sysarg_t) flags); |
switch (rc) { |
case ESYNCH_OK_ATOMIC: |
/* |
* Because of a race condition between timeout and |
* futex_up() and between conditional |
* futex_down_timeout() and futex_up(), we have to give |
* up and try again in this special case. |
*/ |
atomic_inc(futex); |
break; |
case ESYNCH_TIMEOUT: |
atomic_inc(futex); |
return ESYNCH_TIMEOUT; |
break; |
case ESYNCH_WOULD_BLOCK: |
/* |
* The conditional down operation should be implemented |
* this way. The userspace-only variant tends to |
* accumulate missed wakeups in the kernel futex wait |
* queue. |
*/ |
atomic_inc(futex); |
return ESYNCH_WOULD_BLOCK; |
break; |
case ESYNCH_OK_BLOCKED: |
/* |
* Enter the critical section. |
* The futex counter has already been incremented for |
* us. |
*/ |
return ESYNCH_OK_BLOCKED; |
break; |
default: |
return rc; |
} |
} |
/* |
* Enter the critical section. |
*/ |
return ESYNCH_OK_ATOMIC; |
} |
/** Up the futex. |
* |
* @param futex Futex. |
* |
* @return ENOENT if there is no such virtual address. Otherwise |
* zero. |
*/ |
int futex_up(futex_t *futex) |
{ |
long val; |
val = atomic_postinc(futex); |
if (val < 0) |
return __SYSCALL1(SYS_FUTEX_WAKEUP, (sysarg_t) &futex->count); |
return 0; |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/generic/time.c |
---|
0,0 → 1,217 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#include <sys/time.h> |
#include <unistd.h> |
#include <ipc/ipc.h> |
#include <stdio.h> |
#include <arch/barrier.h> |
#include <unistd.h> |
#include <atomic.h> |
#include <futex.h> |
#include <sysinfo.h> |
#include <ipc/services.h> |
#include <sysinfo.h> |
#include <as.h> |
#include <ddi.h> |
/* Pointers to public variables with time */ |
struct { |
volatile sysarg_t seconds1; |
volatile sysarg_t useconds; |
volatile sysarg_t seconds2; |
} *ktime = NULL; |
/** Add microseconds to given timeval. |
* |
* @param tv Destination timeval. |
* @param usecs Number of microseconds to add. |
*/ |
void tv_add(struct timeval *tv, suseconds_t usecs) |
{ |
tv->tv_sec += usecs / 1000000; |
tv->tv_usec += usecs % 1000000; |
if (tv->tv_usec > 1000000) { |
tv->tv_sec++; |
tv->tv_usec -= 1000000; |
} |
} |
/** Subtract two timevals. |
* |
* @param tv1 First timeval. |
* @param tv2 Second timeval. |
* |
* @return Return difference between tv1 and tv2 (tv1 - tv2) in |
* microseconds. |
*/ |
suseconds_t tv_sub(struct timeval *tv1, struct timeval *tv2) |
{ |
suseconds_t result; |
result = tv1->tv_usec - tv2->tv_usec; |
result += (tv1->tv_sec - tv2->tv_sec) * 1000000; |
return result; |
} |
/** Decide if one timeval is greater than the other. |
* |
* @param t1 First timeval. |
* @param t2 Second timeval. |
* |
* @return Return true tv1 is greater than tv2. Otherwise return |
* false. |
*/ |
int tv_gt(struct timeval *tv1, struct timeval *tv2) |
{ |
if (tv1->tv_sec > tv2->tv_sec) |
return 1; |
if (tv1->tv_sec == tv2->tv_sec && tv1->tv_usec > tv2->tv_usec) |
return 1; |
return 0; |
} |
/** Decide if one timeval is greater than or equal to the other. |
* |
* @param tv1 First timeval. |
* @param tv2 Second timeval. |
* |
* @return Return true if tv1 is greater than or equal to tv2. |
* Otherwise return false. |
*/ |
int tv_gteq(struct timeval *tv1, struct timeval *tv2) |
{ |
if (tv1->tv_sec > tv2->tv_sec) |
return 1; |
if (tv1->tv_sec == tv2->tv_sec && tv1->tv_usec >= tv2->tv_usec) |
return 1; |
return 0; |
} |
/** POSIX gettimeofday |
* |
* The time variables are memory mapped(RO) from kernel, which updates |
* them periodically. As it is impossible to read 2 values atomically, we |
* use a trick: First read a seconds, then read microseconds, then |
* read seconds again. If a second elapsed in the meantime, set it to zero. |
* This provides assurance, that at least the |
* sequence of subsequent gettimeofday calls is ordered. |
*/ |
int gettimeofday(struct timeval *tv, struct timezone *tz) |
{ |
void *mapping; |
sysarg_t s1, s2; |
int rights; |
int res; |
if (!ktime) { |
mapping = as_get_mappable_page(PAGE_SIZE); |
/* Get the mapping of kernel clock */ |
res = ipc_share_in_start_1_1(PHONE_NS, mapping, PAGE_SIZE, |
SERVICE_MEM_REALTIME, &rights); |
if (res) { |
printf("Failed to initialize timeofday memarea\n"); |
_exit(1); |
} |
if (!(rights & AS_AREA_READ)) { |
printf("Received bad rights on time area: %X\n", |
rights); |
as_area_destroy(mapping); |
_exit(1); |
} |
ktime = mapping; |
} |
if (tz) { |
tz->tz_minuteswest = 0; |
tz->tz_dsttime = DST_NONE; |
} |
s2 = ktime->seconds2; |
read_barrier(); |
tv->tv_usec = ktime->useconds; |
read_barrier(); |
s1 = ktime->seconds1; |
if (s1 != s2) { |
tv->tv_usec = 0; |
tv->tv_sec = s1 > s2 ? s1 : s2; |
} else |
tv->tv_sec = s1; |
return 0; |
} |
time_t time(time_t *tloc) |
{ |
struct timeval tv; |
if (gettimeofday(&tv, NULL)) |
return (time_t) -1; |
if (tloc) |
*tloc = tv.tv_sec; |
return tv.tv_sec; |
} |
/** Wait unconditionally for specified number of microseconds */ |
int usleep(unsigned long usec) |
{ |
atomic_t futex = FUTEX_INITIALIZER; |
futex_initialize(&futex, 0); |
futex_down_timeout(&futex, usec, 0); |
return 0; |
} |
/** Wait unconditionally for specified number of seconds */ |
unsigned int sleep(unsigned int seconds) |
{ |
atomic_t futex = FUTEX_INITIALIZER; |
futex_initialize(&futex, 0); |
/* Sleep in 1000 second steps to support |
full argument range */ |
while (seconds > 0) { |
unsigned int period = (seconds > 1000) ? 1000 : seconds; |
futex_down_timeout(&futex, period * 1000000, 0); |
seconds -= period; |
} |
return 0; |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/generic/ipc.c |
---|
0,0 → 1,914 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
* @} |
*/ |
/** @addtogroup libcipc IPC |
* @brief HelenOS uspace IPC |
* @{ |
* @ingroup libc |
*/ |
/** @file |
*/ |
#include <ipc/ipc.h> |
#include <libc.h> |
#include <malloc.h> |
#include <errno.h> |
#include <libadt/list.h> |
#include <stdio.h> |
#include <unistd.h> |
#include <futex.h> |
#include <kernel/synch/synch.h> |
#include <async.h> |
#include <fibril.h> |
#include <assert.h> |
/** |
* Structures of this type are used for keeping track of sent asynchronous calls |
* and queing unsent calls. |
*/ |
typedef struct { |
link_t list; |
ipc_async_callback_t callback; |
void *private; |
union { |
ipc_callid_t callid; |
struct { |
ipc_call_t data; |
int phoneid; |
} msg; |
} u; |
fid_t fid; /**< Fibril waiting for sending this call. */ |
} async_call_t; |
LIST_INITIALIZE(dispatched_calls); |
/** List of asynchronous calls that were not accepted by kernel. |
* |
* It is protected by async_futex, because if the call cannot be sent into the |
* kernel, the async framework is used automatically. |
*/ |
LIST_INITIALIZE(queued_calls); |
static atomic_t ipc_futex = FUTEX_INITIALIZER; |
/** Make a fast synchronous call. |
* |
* Only three payload arguments can be passed using this function. However, this |
* function is faster than the generic ipc_call_sync_slow() because the payload |
* is passed directly in registers. |
* |
* @param phoneid Phone handle for the call. |
* @param method Requested method. |
* @param arg1 Service-defined payload argument. |
* @param arg2 Service-defined payload argument. |
* @param arg3 Service-defined payload argument. |
* @param result1 If non-NULL, the return ARG1 will be stored there. |
* @param result2 If non-NULL, the return ARG2 will be stored there. |
* @param result3 If non-NULL, the return ARG3 will be stored there. |
* @param result4 If non-NULL, the return ARG4 will be stored there. |
* @param result5 If non-NULL, the return ARG5 will be stored there. |
* |
* @return Negative values represent errors returned by IPC. |
* Otherwise the RETVAL of the answer is returned. |
*/ |
int |
ipc_call_sync_fast(int phoneid, ipcarg_t method, ipcarg_t arg1, ipcarg_t arg2, |
ipcarg_t arg3, ipcarg_t *result1, ipcarg_t *result2, ipcarg_t *result3, |
ipcarg_t *result4, ipcarg_t *result5) |
{ |
ipc_call_t resdata; |
int callres; |
callres = __SYSCALL6(SYS_IPC_CALL_SYNC_FAST, phoneid, method, arg1, |
arg2, arg3, (sysarg_t) &resdata); |
if (callres) |
return callres; |
if (result1) |
*result1 = IPC_GET_ARG1(resdata); |
if (result2) |
*result2 = IPC_GET_ARG2(resdata); |
if (result3) |
*result3 = IPC_GET_ARG3(resdata); |
if (result4) |
*result4 = IPC_GET_ARG4(resdata); |
if (result5) |
*result5 = IPC_GET_ARG5(resdata); |
return IPC_GET_RETVAL(resdata); |
} |
/** Make a synchronous call transmitting 5 arguments of payload. |
* |
* @param phoneid Phone handle for the call. |
* @param method Requested method. |
* @param arg1 Service-defined payload argument. |
* @param arg2 Service-defined payload argument. |
* @param arg3 Service-defined payload argument. |
* @param arg4 Service-defined payload argument. |
* @param arg5 Service-defined payload argument. |
* @param result1 If non-NULL, storage for the first return argument. |
* @param result2 If non-NULL, storage for the second return argument. |
* @param result3 If non-NULL, storage for the third return argument. |
* @param result4 If non-NULL, storage for the fourth return argument. |
* @param result5 If non-NULL, storage for the fifth return argument. |
* |
* @return Negative value means IPC error. |
* Otherwise the RETVAL of the answer. |
*/ |
int |
ipc_call_sync_slow(int phoneid, ipcarg_t method, ipcarg_t arg1, ipcarg_t arg2, |
ipcarg_t arg3, ipcarg_t arg4, ipcarg_t arg5, ipcarg_t *result1, |
ipcarg_t *result2, ipcarg_t *result3, ipcarg_t *result4, ipcarg_t *result5) |
{ |
ipc_call_t data; |
int callres; |
IPC_SET_METHOD(data, method); |
IPC_SET_ARG1(data, arg1); |
IPC_SET_ARG2(data, arg2); |
IPC_SET_ARG3(data, arg3); |
IPC_SET_ARG4(data, arg4); |
IPC_SET_ARG5(data, arg5); |
callres = __SYSCALL3(SYS_IPC_CALL_SYNC_SLOW, phoneid, (sysarg_t) &data, |
(sysarg_t) &data); |
if (callres) |
return callres; |
if (result1) |
*result1 = IPC_GET_ARG1(data); |
if (result2) |
*result2 = IPC_GET_ARG2(data); |
if (result3) |
*result3 = IPC_GET_ARG3(data); |
if (result4) |
*result4 = IPC_GET_ARG4(data); |
if (result5) |
*result5 = IPC_GET_ARG5(data); |
return IPC_GET_RETVAL(data); |
} |
/** Syscall to send asynchronous message. |
* |
* @param phoneid Phone handle for the call. |
* @param data Call data with the request. |
* |
* @return Hash of the call or an error code. |
*/ |
static ipc_callid_t _ipc_call_async(int phoneid, ipc_call_t *data) |
{ |
return __SYSCALL2(SYS_IPC_CALL_ASYNC_SLOW, phoneid, (sysarg_t) data); |
} |
/** Prolog to ipc_call_async_*() functions. |
* |
* @param private Argument for the answer/error callback. |
* @param callback Answer/error callback. |
* |
* @return New, partially initialized async_call structure or NULL. |
*/ |
static inline async_call_t *ipc_prepare_async(void *private, |
ipc_async_callback_t callback) |
{ |
async_call_t *call; |
call = malloc(sizeof(*call)); |
if (!call) { |
if (callback) |
callback(private, ENOMEM, NULL); |
return NULL; |
} |
call->callback = callback; |
call->private = private; |
return call; |
} |
/** Epilogue of ipc_call_async_*() functions. |
* |
* @param callid Value returned by the SYS_IPC_CALL_ASYNC_* syscall. |
* @param phoneid Phone handle through which the call was made. |
* @param call async_call structure returned by ipc_prepare_async(). |
* @param can_preempt If non-zero, the current fibril can be preempted in this |
* call. |
*/ |
static inline void ipc_finish_async(ipc_callid_t callid, int phoneid, |
async_call_t *call, int can_preempt) |
{ |
if (!call) { /* Nothing to do regardless if failed or not */ |
futex_up(&ipc_futex); |
return; |
} |
if (callid == IPC_CALLRET_FATAL) { |
futex_up(&ipc_futex); |
/* Call asynchronous handler with error code */ |
if (call->callback) |
call->callback(call->private, ENOENT, NULL); |
free(call); |
return; |
} |
if (callid == IPC_CALLRET_TEMPORARY) { |
futex_up(&ipc_futex); |
call->u.msg.phoneid = phoneid; |
futex_down(&async_futex); |
list_append(&call->list, &queued_calls); |
if (can_preempt) { |
call->fid = fibril_get_id(); |
fibril_switch(FIBRIL_TO_MANAGER); |
/* Async futex unlocked by previous call */ |
} else { |
call->fid = 0; |
futex_up(&async_futex); |
} |
return; |
} |
call->u.callid = callid; |
/* Add call to the list of dispatched calls */ |
list_append(&call->list, &dispatched_calls); |
futex_up(&ipc_futex); |
} |
/** Make a fast asynchronous call. |
* |
* This function can only handle four arguments of payload. It is, however, |
* faster than the more generic ipc_call_async_slow(). |
* |
* Note that this function is a void function. |
* During normal opertation, answering this call will trigger the callback. |
* In case of fatal error, call the callback handler with the proper error code. |
* If the call cannot be temporarily made, queue it. |
* |
* @param phoneid Phone handle for the call. |
* @param method Requested method. |
* @param arg1 Service-defined payload argument. |
* @param arg2 Service-defined payload argument. |
* @param arg3 Service-defined payload argument. |
* @param arg4 Service-defined payload argument. |
* @param private Argument to be passed to the answer/error callback. |
* @param callback Answer or error callback. |
* @param can_preempt If non-zero, the current fibril will be preempted in |
* case the kernel temporarily refuses to accept more |
* asynchronous calls. |
*/ |
void ipc_call_async_fast(int phoneid, ipcarg_t method, ipcarg_t arg1, |
ipcarg_t arg2, ipcarg_t arg3, ipcarg_t arg4, void *private, |
ipc_async_callback_t callback, int can_preempt) |
{ |
async_call_t *call = NULL; |
ipc_callid_t callid; |
if (callback) { |
call = ipc_prepare_async(private, callback); |
if (!call) |
return; |
} |
/* |
* We need to make sure that we get callid before another thread |
* accesses the queue again. |
*/ |
futex_down(&ipc_futex); |
callid = __SYSCALL6(SYS_IPC_CALL_ASYNC_FAST, phoneid, method, arg1, |
arg2, arg3, arg4); |
if (callid == IPC_CALLRET_TEMPORARY) { |
if (!call) { |
call = ipc_prepare_async(private, callback); |
if (!call) |
return; |
} |
IPC_SET_METHOD(call->u.msg.data, method); |
IPC_SET_ARG1(call->u.msg.data, arg1); |
IPC_SET_ARG2(call->u.msg.data, arg2); |
IPC_SET_ARG3(call->u.msg.data, arg3); |
IPC_SET_ARG4(call->u.msg.data, arg4); |
/* |
* To achieve deterministic behavior, we always zero out the |
* arguments that are beyond the limits of the fast version. |
*/ |
IPC_SET_ARG5(call->u.msg.data, 0); |
} |
ipc_finish_async(callid, phoneid, call, can_preempt); |
} |
/** Make an asynchronous call transmitting the entire payload. |
* |
* Note that this function is a void function. |
* During normal opertation, answering this call will trigger the callback. |
* In case of fatal error, call the callback handler with the proper error code. |
* If the call cannot be temporarily made, queue it. |
* |
* @param phoneid Phone handle for the call. |
* @param method Requested method. |
* @param arg1 Service-defined payload argument. |
* @param arg2 Service-defined payload argument. |
* @param arg3 Service-defined payload argument. |
* @param arg4 Service-defined payload argument. |
* @param arg5 Service-defined payload argument. |
* @param private Argument to be passed to the answer/error callback. |
* @param callback Answer or error callback. |
* @param can_preempt If non-zero, the current fibril will be preempted in |
* case the kernel temporarily refuses to accept more |
* asynchronous calls. |
* |
*/ |
void ipc_call_async_slow(int phoneid, ipcarg_t method, ipcarg_t arg1, |
ipcarg_t arg2, ipcarg_t arg3, ipcarg_t arg4, ipcarg_t arg5, void *private, |
ipc_async_callback_t callback, int can_preempt) |
{ |
async_call_t *call; |
ipc_callid_t callid; |
call = ipc_prepare_async(private, callback); |
if (!call) |
return; |
IPC_SET_METHOD(call->u.msg.data, method); |
IPC_SET_ARG1(call->u.msg.data, arg1); |
IPC_SET_ARG2(call->u.msg.data, arg2); |
IPC_SET_ARG3(call->u.msg.data, arg3); |
IPC_SET_ARG4(call->u.msg.data, arg4); |
IPC_SET_ARG5(call->u.msg.data, arg5); |
/* |
* We need to make sure that we get callid before another thread |
* accesses the queue again. |
*/ |
futex_down(&ipc_futex); |
callid = _ipc_call_async(phoneid, &call->u.msg.data); |
ipc_finish_async(callid, phoneid, call, can_preempt); |
} |
/** Answer a received call - fast version. |
* |
* The fast answer makes use of passing retval and first four arguments in |
* registers. If you need to return more, use the ipc_answer_slow() instead. |
* |
* @param callid Hash of the call being answered. |
* @param retval Return value. |
* @param arg1 First return argument. |
* @param arg2 Second return argument. |
* @param arg3 Third return argument. |
* @param arg4 Fourth return argument. |
* |
* @return Zero on success or a value from @ref errno.h on failure. |
*/ |
ipcarg_t ipc_answer_fast(ipc_callid_t callid, ipcarg_t retval, ipcarg_t arg1, |
ipcarg_t arg2, ipcarg_t arg3, ipcarg_t arg4) |
{ |
return __SYSCALL6(SYS_IPC_ANSWER_FAST, callid, retval, arg1, arg2, arg3, |
arg4); |
} |
/** Answer a received call - slow full version. |
* |
* @param callid Hash of the call being answered. |
* @param retval Return value. |
* @param arg1 First return argument. |
* @param arg2 Second return argument. |
* @param arg3 Third return argument. |
* @param arg4 Fourth return argument. |
* @param arg5 Fifth return argument. |
* |
* @return Zero on success or a value from @ref errno.h on failure. |
*/ |
ipcarg_t ipc_answer_slow(ipc_callid_t callid, ipcarg_t retval, ipcarg_t arg1, |
ipcarg_t arg2, ipcarg_t arg3, ipcarg_t arg4, ipcarg_t arg5) |
{ |
ipc_call_t data; |
IPC_SET_RETVAL(data, retval); |
IPC_SET_ARG1(data, arg1); |
IPC_SET_ARG2(data, arg2); |
IPC_SET_ARG3(data, arg3); |
IPC_SET_ARG4(data, arg4); |
IPC_SET_ARG5(data, arg5); |
return __SYSCALL2(SYS_IPC_ANSWER_SLOW, callid, (sysarg_t) &data); |
} |
/** Try to dispatch queued calls from the async queue. */ |
static void try_dispatch_queued_calls(void) |
{ |
async_call_t *call; |
ipc_callid_t callid; |
/** @todo |
* Integrate intelligently ipc_futex, so that it is locked during |
* ipc_call_async_*(), until it is added to dispatched_calls. |
*/ |
futex_down(&async_futex); |
while (!list_empty(&queued_calls)) { |
call = list_get_instance(queued_calls.next, async_call_t, list); |
callid = _ipc_call_async(call->u.msg.phoneid, |
&call->u.msg.data); |
if (callid == IPC_CALLRET_TEMPORARY) { |
break; |
} |
list_remove(&call->list); |
futex_up(&async_futex); |
if (call->fid) |
fibril_add_ready(call->fid); |
if (callid == IPC_CALLRET_FATAL) { |
if (call->callback) |
call->callback(call->private, ENOENT, NULL); |
free(call); |
} else { |
call->u.callid = callid; |
futex_down(&ipc_futex); |
list_append(&call->list, &dispatched_calls); |
futex_up(&ipc_futex); |
} |
futex_down(&async_futex); |
} |
futex_up(&async_futex); |
} |
/** Handle a received answer. |
* |
* Find the hash of the answer and call the answer callback. |
* |
* @todo Make it use hash table. |
* |
* @param callid Hash of the received answer. |
* The answer has the same hash as the request OR'ed with |
* the IPC_CALLID_ANSWERED bit. |
* @param data Call data of the answer. |
*/ |
static void handle_answer(ipc_callid_t callid, ipc_call_t *data) |
{ |
link_t *item; |
async_call_t *call; |
callid &= ~IPC_CALLID_ANSWERED; |
futex_down(&ipc_futex); |
for (item = dispatched_calls.next; item != &dispatched_calls; |
item = item->next) { |
call = list_get_instance(item, async_call_t, list); |
if (call->u.callid == callid) { |
list_remove(&call->list); |
futex_up(&ipc_futex); |
if (call->callback) |
call->callback(call->private, |
IPC_GET_RETVAL(*data), data); |
free(call); |
return; |
} |
} |
futex_up(&ipc_futex); |
} |
/** Wait for a first call to come. |
* |
* @param call Storage where the incoming call data will be stored. |
* @param usec Timeout in microseconds |
* @param flags Flags passed to SYS_IPC_WAIT (blocking, nonblocking). |
* |
* @return Hash of the call. Note that certain bits have special |
* meaning. IPC_CALLID_ANSWERED will be set in an answer |
* and IPC_CALLID_NOTIFICATION is used for notifications. |
* |
*/ |
ipc_callid_t ipc_wait_cycle(ipc_call_t *call, uint32_t usec, int flags) |
{ |
ipc_callid_t callid; |
callid = __SYSCALL3(SYS_IPC_WAIT, (sysarg_t) call, usec, flags); |
/* Handle received answers */ |
if (callid & IPC_CALLID_ANSWERED) { |
handle_answer(callid, call); |
try_dispatch_queued_calls(); |
} |
return callid; |
} |
/** Wait some time for an IPC call. |
* |
* The call will return after an answer is received. |
* |
* @param call Storage where the incoming call data will be stored. |
* @param usec Timeout in microseconds. |
* |
* @return Hash of the answer. |
*/ |
ipc_callid_t ipc_wait_for_call_timeout(ipc_call_t *call, uint32_t usec) |
{ |
ipc_callid_t callid; |
do { |
callid = ipc_wait_cycle(call, usec, SYNCH_FLAGS_NONE); |
} while (callid & IPC_CALLID_ANSWERED); |
return callid; |
} |
/** Check if there is an IPC call waiting to be picked up. |
* |
* @param call Storage where the incoming call will be stored. |
* @return Hash of the answer. |
*/ |
ipc_callid_t ipc_trywait_for_call(ipc_call_t *call) |
{ |
ipc_callid_t callid; |
do { |
callid = ipc_wait_cycle(call, SYNCH_NO_TIMEOUT, |
SYNCH_FLAGS_NON_BLOCKING); |
} while (callid & IPC_CALLID_ANSWERED); |
return callid; |
} |
/** Ask destination to do a callback connection. |
* |
* @param phoneid Phone handle used for contacting the other side. |
* @param arg1 Service-defined argument. |
* @param arg2 Service-defined argument. |
* @param arg3 Service-defined argument. |
* @param phonehash Storage where the library will store an opaque |
* identifier of the phone that will be used for incoming |
* calls. This identifier can be used for connection |
* tracking. |
* |
* @return Zero on success or a negative error code. |
*/ |
int ipc_connect_to_me(int phoneid, int arg1, int arg2, int arg3, |
ipcarg_t *phonehash) |
{ |
return ipc_call_sync_3_5(phoneid, IPC_M_CONNECT_TO_ME, arg1, arg2, |
arg3, NULL, NULL, NULL, NULL, phonehash); |
} |
/** Ask through phone for a new connection to some service. |
* |
* @param phoneid Phone handle used for contacting the other side. |
* @param arg1 User defined argument. |
* @param arg2 User defined argument. |
* @param arg3 User defined argument. |
* |
* @return New phone handle on success or a negative error code. |
*/ |
int ipc_connect_me_to(int phoneid, int arg1, int arg2, int arg3) |
{ |
ipcarg_t newphid; |
int res; |
res = ipc_call_sync_3_5(phoneid, IPC_M_CONNECT_ME_TO, arg1, arg2, arg3, |
NULL, NULL, NULL, NULL, &newphid); |
if (res) |
return res; |
return newphid; |
} |
/** Hang up a phone. |
* |
* @param phoneid Handle of the phone to be hung up. |
* |
* @return Zero on success or a negative error code. |
*/ |
int ipc_hangup(int phoneid) |
{ |
return __SYSCALL1(SYS_IPC_HANGUP, phoneid); |
} |
/** Register IRQ notification. |
* |
* @param inr IRQ number. |
* @param devno Device number of the device generating inr. |
* @param method Use this method for notifying me. |
* @param ucode Top-half pseudocode handler. |
* |
* @return Value returned by the kernel. |
*/ |
int ipc_register_irq(int inr, int devno, int method, irq_code_t *ucode) |
{ |
return __SYSCALL4(SYS_IPC_REGISTER_IRQ, inr, devno, method, |
(sysarg_t) ucode); |
} |
/** Unregister IRQ notification. |
* |
* @param inr IRQ number. |
* @param devno Device number of the device generating inr. |
* |
* @return Value returned by the kernel. |
*/ |
int ipc_unregister_irq(int inr, int devno) |
{ |
return __SYSCALL2(SYS_IPC_UNREGISTER_IRQ, inr, devno); |
} |
/** Forward a received call to another destination. |
* |
* @param callid Hash of the call to forward. |
* @param phoneid Phone handle to use for forwarding. |
* @param method New method for the forwarded call. |
* @param arg1 New value of the first argument for the forwarded call. |
* @param arg2 New value of the second argument for the forwarded call. |
* @param mode Flags specifying mode of the forward operation. |
* |
* @return Zero on success or an error code. |
* |
* For non-system methods, the old method, arg1 and arg2 are rewritten by the |
* new values. For system methods, the new method, arg1 and arg2 are written |
* to the old arg1, arg2 and arg3, respectivelly. Calls with immutable |
* methods are forwarded verbatim. |
*/ |
int ipc_forward_fast(ipc_callid_t callid, int phoneid, int method, |
ipcarg_t arg1, ipcarg_t arg2, int mode) |
{ |
return __SYSCALL6(SYS_IPC_FORWARD_FAST, callid, phoneid, method, arg1, |
arg2, mode); |
} |
/** Wrapper for making IPC_M_SHARE_IN calls. |
* |
* @param phoneid Phone that will be used to contact the receiving side. |
* @param dst Destination address space area base. |
* @param size Size of the destination address space area. |
* @param arg User defined argument. |
* @param flags Storage where the received flags will be stored. Can be |
* NULL. |
* |
* @return Zero on success or a negative error code from errno.h. |
*/ |
int ipc_share_in_start(int phoneid, void *dst, size_t size, ipcarg_t arg, |
int *flags) |
{ |
int res; |
sysarg_t tmp_flags; |
res = ipc_call_sync_3_2(phoneid, IPC_M_SHARE_IN, (ipcarg_t) dst, |
(ipcarg_t) size, arg, NULL, &tmp_flags); |
if (flags) |
*flags = tmp_flags; |
return res; |
} |
/** Wrapper for receiving the IPC_M_SHARE_IN calls. |
* |
* This wrapper only makes it more comfortable to receive IPC_M_SHARE_IN calls |
* so that the user doesn't have to remember the meaning of each IPC argument. |
* |
* So far, this wrapper is to be used from within a connection fibril. |
* |
* @param callid Storage where the hash of the IPC_M_SHARE_IN call will |
* be stored. |
* @param size Destination address space area size. |
* |
* @return Non-zero on success, zero on failure. |
*/ |
int ipc_share_in_receive(ipc_callid_t *callid, size_t *size) |
{ |
ipc_call_t data; |
assert(callid); |
assert(size); |
*callid = async_get_call(&data); |
if (IPC_GET_METHOD(data) != IPC_M_SHARE_IN) |
return 0; |
*size = (size_t) IPC_GET_ARG2(data); |
return 1; |
} |
/** Wrapper for answering the IPC_M_SHARE_IN calls. |
* |
* This wrapper only makes it more comfortable to answer IPC_M_DATA_READ calls |
* so that the user doesn't have to remember the meaning of each IPC argument. |
* |
* @param callid Hash of the IPC_M_DATA_READ call to answer. |
* @param src Source address space base. |
* @param flags Flags to be used for sharing. Bits can be only cleared. |
* |
* @return Zero on success or a value from @ref errno.h on failure. |
*/ |
int ipc_share_in_finalize(ipc_callid_t callid, void *src, int flags) |
{ |
return ipc_answer_2(callid, EOK, (ipcarg_t) src, (ipcarg_t) flags); |
} |
/** Wrapper for making IPC_M_SHARE_OUT calls. |
* |
* @param phoneid Phone that will be used to contact the receiving side. |
* @param src Source address space area base address. |
* @param flags Flags to be used for sharing. Bits can be only cleared. |
* |
* @return Zero on success or a negative error code from errno.h. |
*/ |
int ipc_share_out_start(int phoneid, void *src, int flags) |
{ |
return ipc_call_sync_3_0(phoneid, IPC_M_SHARE_OUT, (ipcarg_t) src, 0, |
(ipcarg_t) flags); |
} |
/** Wrapper for receiving the IPC_M_SHARE_OUT calls. |
* |
* This wrapper only makes it more comfortable to receive IPC_M_SHARE_OUT calls |
* so that the user doesn't have to remember the meaning of each IPC argument. |
* |
* So far, this wrapper is to be used from within a connection fibril. |
* |
* @param callid Storage where the hash of the IPC_M_SHARE_OUT call will |
* be stored. |
* @param size Storage where the source address space area size will be |
* stored. |
* @param flags Storage where the sharing flags will be stored. |
* |
* @return Non-zero on success, zero on failure. |
*/ |
int ipc_share_out_receive(ipc_callid_t *callid, size_t *size, int *flags) |
{ |
ipc_call_t data; |
assert(callid); |
assert(size); |
assert(flags); |
*callid = async_get_call(&data); |
if (IPC_GET_METHOD(data) != IPC_M_DATA_WRITE) |
return 0; |
*size = (size_t) IPC_GET_ARG2(data); |
*flags = (int) IPC_GET_ARG3(data); |
return 1; |
} |
/** Wrapper for answering the IPC_M_SHARE_OUT calls. |
* |
* This wrapper only makes it more comfortable to answer IPC_M_SHARE_OUT calls |
* so that the user doesn't have to remember the meaning of each IPC argument. |
* |
* @param callid Hash of the IPC_M_DATA_WRITE call to answer. |
* @param dst Destination address space area base address. |
* |
* @return Zero on success or a value from @ref errno.h on failure. |
*/ |
int ipc_share_out_finalize(ipc_callid_t callid, void *dst) |
{ |
return ipc_answer_1(callid, EOK, (ipcarg_t) dst); |
} |
/** Wrapper for making IPC_M_DATA_READ calls. |
* |
* @param phoneid Phone that will be used to contact the receiving side. |
* @param dst Address of the beginning of the destination buffer. |
* @param size Size of the destination buffer. |
* |
* @return Zero on success or a negative error code from errno.h. |
*/ |
int ipc_data_read_start(int phoneid, void *dst, size_t size) |
{ |
return ipc_call_sync_2_0(phoneid, IPC_M_DATA_READ, (ipcarg_t) dst, |
(ipcarg_t) size); |
} |
/** Wrapper for receiving the IPC_M_DATA_READ calls. |
* |
* This wrapper only makes it more comfortable to receive IPC_M_DATA_READ calls |
* so that the user doesn't have to remember the meaning of each IPC argument. |
* |
* So far, this wrapper is to be used from within a connection fibril. |
* |
* @param callid Storage where the hash of the IPC_M_DATA_READ call will |
* be stored. |
* @param size Storage where the maximum size will be stored. Can be |
* NULL. |
* |
* @return Non-zero on success, zero on failure. |
*/ |
int ipc_data_read_receive(ipc_callid_t *callid, size_t *size) |
{ |
ipc_call_t data; |
assert(callid); |
*callid = async_get_call(&data); |
if (IPC_GET_METHOD(data) != IPC_M_DATA_READ) |
return 0; |
if (size) |
*size = (size_t) IPC_GET_ARG2(data); |
return 1; |
} |
/** Wrapper for answering the IPC_M_DATA_READ calls. |
* |
* This wrapper only makes it more comfortable to answer IPC_M_DATA_READ calls |
* so that the user doesn't have to remember the meaning of each IPC argument. |
* |
* @param callid Hash of the IPC_M_DATA_READ call to answer. |
* @param src Source address for the IPC_M_DATA_READ call. |
* @param size Size for the IPC_M_DATA_READ call. Can be smaller than |
* the maximum size announced by the sender. |
* |
* @return Zero on success or a value from @ref errno.h on failure. |
*/ |
int ipc_data_read_finalize(ipc_callid_t callid, void *src, size_t size) |
{ |
return ipc_answer_2(callid, EOK, (ipcarg_t) src, (ipcarg_t) size); |
} |
/** Wrapper for making IPC_M_DATA_WRITE calls. |
* |
* @param phoneid Phone that will be used to contact the receiving side. |
* @param src Address of the beginning of the source buffer. |
* @param size Size of the source buffer. |
* |
* @return Zero on success or a negative error code from errno.h. |
*/ |
int ipc_data_write_start(int phoneid, void *src, size_t size) |
{ |
return ipc_call_sync_2_0(phoneid, IPC_M_DATA_WRITE, (ipcarg_t) src, |
(ipcarg_t) size); |
} |
/** Wrapper for receiving the IPC_M_DATA_WRITE calls. |
* |
* This wrapper only makes it more comfortable to receive IPC_M_DATA_WRITE calls |
* so that the user doesn't have to remember the meaning of each IPC argument. |
* |
* So far, this wrapper is to be used from within a connection fibril. |
* |
* @param callid Storage where the hash of the IPC_M_DATA_WRITE call will |
* be stored. |
* @param size Storage where the suggested size will be stored. May be |
* NULL |
* |
* @return Non-zero on success, zero on failure. |
*/ |
int ipc_data_write_receive(ipc_callid_t *callid, size_t *size) |
{ |
ipc_call_t data; |
assert(callid); |
*callid = async_get_call(&data); |
if (IPC_GET_METHOD(data) != IPC_M_DATA_WRITE) |
return 0; |
if (size) |
*size = (size_t) IPC_GET_ARG2(data); |
return 1; |
} |
/** Wrapper for answering the IPC_M_DATA_WRITE calls. |
* |
* This wrapper only makes it more comfortable to answer IPC_M_DATA_WRITE calls |
* so that the user doesn't have to remember the meaning of each IPC argument. |
* |
* @param callid Hash of the IPC_M_DATA_WRITE call to answer. |
* @param dst Final destination address for the IPC_M_DATA_WRITE call. |
* @param size Final size for the IPC_M_DATA_WRITE call. |
* |
* @return Zero on success or a value from @ref errno.h on failure. |
*/ |
int ipc_data_write_finalize(ipc_callid_t callid, void *dst, size_t size) |
{ |
return ipc_answer_2(callid, EOK, (ipcarg_t) dst, (ipcarg_t) size); |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/generic/libc.c |
---|
0,0 → 1,82 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup lc Libc |
* @brief HelenOS C library |
* @{ |
* @} |
*/ |
/** @addtogroup libc generic |
* @ingroup lc |
* @{ |
*/ |
/** @file |
*/ |
#include <libc.h> |
#include <unistd.h> |
#include <malloc.h> |
#include <tls.h> |
#include <thread.h> |
#include <fibril.h> |
#include <io/stream.h> |
#include <ipc/ipc.h> |
#include <async.h> |
#include <as.h> |
extern char _heap; |
void _exit(int status) |
{ |
thread_exit(status); |
} |
void __main(void) |
{ |
fibril_t *f; |
(void) as_area_create(&_heap, 1, AS_AREA_WRITE | AS_AREA_READ); |
_async_init(); |
f = fibril_setup(); |
__tcb_set(f->tcb); |
} |
void __io_init(void) |
{ |
open_stdin(); |
open_stdout(); |
} |
void __exit(void) |
{ |
fibril_teardown(__tcb_get()->fibril_data); |
_exit(0); |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/generic/io/io.c |
---|
0,0 → 1,107 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#include <libc.h> |
#include <unistd.h> |
#include <stdio.h> |
#include <io/io.h> |
const static char nl = '\n'; |
int puts(const char *str) |
{ |
size_t count; |
if (str == NULL) |
return putnchars("(NULL)", 6); |
for (count = 0; str[count] != 0; count++); |
if (write_stdout((void *) str, count) == count) { |
if (write_stdout(&nl, 1) == 1) |
return 0; |
} |
return EOF; |
} |
/** Put count chars from buffer to stdout without adding newline |
* @param buf Buffer with size at least count bytes - NULL pointer NOT allowed! |
* @param count |
* @return 0 on succes, EOF on fail |
*/ |
int putnchars(const char *buf, size_t count) |
{ |
if (write_stdout((void *) buf, count) == count) |
return 0; |
return EOF; |
} |
/** Same as puts, but does not print newline at end |
* |
*/ |
int putstr(const char *str) |
{ |
size_t count; |
if (str == NULL) |
return putnchars("(NULL)", 6); |
for (count = 0; str[count] != 0; count++); |
if (write_stdout((void *) str, count) == count) |
return 0; |
return EOF; |
} |
int putchar(int c) |
{ |
unsigned char ch = c; |
if (write_stdout((void *) &ch, 1) == 1) |
return c; |
return EOF; |
} |
int getchar(void) |
{ |
unsigned char c; |
if (read_stdin((void *) &c, 1) == 1) |
return c; |
return EOF; |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/generic/io/vprintf.c |
---|
0,0 → 1,76 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#include <stdarg.h> |
#include <stdio.h> |
#include <unistd.h> |
#include <io/printf_core.h> |
#include <futex.h> |
#include <async.h> |
static atomic_t printf_futex = FUTEX_INITIALIZER; |
static int vprintf_write(const char *str, size_t count, void *unused) |
{ |
return write_stdout(str, count); |
} |
/** Print formatted text. |
* @param fmt format string |
* @param ap format parameters |
* \see For more details about format string see printf_core. |
*/ |
int vprintf(const char *fmt, va_list ap) |
{ |
struct printf_spec ps = { |
(int (*)(void *, size_t, void *)) vprintf_write, |
NULL |
}; |
/* |
* Prevent other threads to execute printf_core() |
*/ |
futex_down(&printf_futex); |
/* |
* Prevent other pseudo threads of the same thread |
* to execute printf_core() |
*/ |
async_serialize_start(); |
int ret = printf_core(fmt, &ps, ap); |
async_serialize_end(); |
futex_up(&printf_futex); |
return ret; |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/generic/io/stream.c |
---|
0,0 → 1,109 |
/* |
* Copyright (c) 2006 Josef Cejka |
* Copyright (c) 2006 Jakub Vana |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#include <io/io.h> |
#include <io/stream.h> |
#include <string.h> |
#include <malloc.h> |
#include <libc.h> |
#include <ipc/ipc.h> |
#include <ipc/ns.h> |
#include <ipc/fb.h> |
#include <ipc/services.h> |
#include <console.h> |
#include <unistd.h> |
#include <async.h> |
#include <sys/types.h> |
static int console_phone = -1; |
ssize_t write_stderr(const void *buf, size_t count) |
{ |
return count; |
} |
ssize_t read_stdin(void *buf, size_t count) |
{ |
ipcarg_t r0, r1; |
size_t i = 0; |
while (i < count) { |
if (async_req_0_2(console_phone, CONSOLE_GETCHAR, &r0, |
&r1) < 0) { |
return -1; |
} |
((char *) buf)[i++] = r0; |
} |
return i; |
} |
ssize_t write_stdout(const void *buf, size_t count) |
{ |
int i; |
for (i = 0; i < count; i++) |
async_msg_1(console_phone, CONSOLE_PUTCHAR, |
((const char *) buf)[i]); |
return count; |
} |
void open_stdin(void) |
{ |
if (console_phone < 0) { |
while ((console_phone = ipc_connect_me_to(PHONE_NS, |
SERVICE_CONSOLE, 0, 0)) < 0) { |
usleep(10000); |
} |
} |
} |
void open_stdout(void) |
{ |
if (console_phone < 0) { |
while ((console_phone = ipc_connect_me_to(PHONE_NS, |
SERVICE_CONSOLE, 0, 0)) < 0) { |
usleep(10000); |
} |
} |
} |
int get_cons_phone(void) |
{ |
return console_phone; |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/generic/io/printf_core.c |
---|
0,0 → 1,727 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** |
* @file |
* @brief Printing functions. |
*/ |
#include <unistd.h> |
#include <stdio.h> |
#include <io/printf_core.h> |
#include <ctype.h> |
#include <string.h> |
#define __PRINTF_FLAG_PREFIX 0x00000001 /**< show prefixes 0x or 0*/ |
#define __PRINTF_FLAG_SIGNED 0x00000002 /**< signed / unsigned number */ |
#define __PRINTF_FLAG_ZEROPADDED 0x00000004 /**< print leading zeroes */ |
#define __PRINTF_FLAG_LEFTALIGNED 0x00000010 /**< align to left */ |
#define __PRINTF_FLAG_SHOWPLUS 0x00000020 /**< always show + sign */ |
#define __PRINTF_FLAG_SPACESIGN 0x00000040 /**< print space instead of plus */ |
#define __PRINTF_FLAG_BIGCHARS 0x00000080 /**< show big characters */ |
#define __PRINTF_FLAG_NEGATIVE 0x00000100 /**< number has - sign */ |
#define PRINT_NUMBER_BUFFER_SIZE (64+5) /**< Buffer big enought for 64 bit number |
* printed in base 2, sign, prefix and |
* 0 to terminate string.. (last one is only for better testing |
* end of buffer by zero-filling subroutine) |
*/ |
/** Enumeration of possible arguments types. |
*/ |
typedef enum { |
PrintfQualifierByte = 0, |
PrintfQualifierShort, |
PrintfQualifierInt, |
PrintfQualifierLong, |
PrintfQualifierLongLong, |
PrintfQualifierSizeT, |
PrintfQualifierPointer |
} qualifier_t; |
static char digits_small[] = "0123456789abcdef"; /**< Small hexadecimal characters */ |
static char digits_big[] = "0123456789ABCDEF"; /**< Big hexadecimal characters */ |
/** Print count chars from buffer without adding newline |
* @param buf Buffer with size at least count bytes - NULL pointer NOT allowed! |
* @param count |
* @param ps output method and its data |
* @return number of printed characters |
*/ |
static int printf_putnchars(const char * buf, size_t count, |
struct printf_spec *ps) |
{ |
return ps->write((void *)buf, count, ps->data); |
} |
/** Print string without added newline |
* @param str string to print |
* @param ps write function specification and support data |
* @return number of printed characters |
*/ |
static int printf_putstr(const char * str, struct printf_spec *ps) |
{ |
size_t count; |
if (str == NULL) |
return printf_putnchars("(NULL)", 6, ps); |
for (count = 0; str[count] != 0; count++); |
if (ps->write((void *) str, count, ps->data) == count) |
return 0; |
return EOF; |
} |
/** Print one character to output |
* @param c one character |
* @param ps output method |
* @return number of printed characters |
*/ |
static int printf_putchar(int c, struct printf_spec *ps) |
{ |
unsigned char ch = c; |
return ps->write((void *) &ch, 1, ps->data); |
} |
/** Print one formatted character |
* @param c character to print |
* @param width |
* @param flags |
* @return number of printed characters |
*/ |
static int print_char(char c, int width, uint64_t flags, struct printf_spec *ps) |
{ |
int counter = 0; |
if (!(flags & __PRINTF_FLAG_LEFTALIGNED)) { |
/* |
* One space is consumed by the character itself, hence the |
* predecrement. |
*/ |
while (--width > 0) { |
if (printf_putchar(' ', ps) > 0) |
++counter; |
} |
} |
if (printf_putchar(c, ps) > 0) |
counter++; |
/* |
* One space is consumed by the character itself, hence the |
* predecrement. |
*/ |
while (--width > 0) { |
if (printf_putchar(' ', ps) > 0) |
++counter; |
} |
return ++counter; |
} |
/** Print one string |
* @param s string |
* @param width |
* @param precision |
* @param flags |
* @return number of printed characters |
*/ |
static int print_string(char *s, int width, int precision, uint64_t flags, |
struct printf_spec *ps) |
{ |
int counter = 0; |
size_t size; |
int retval; |
if (s == NULL) { |
return printf_putstr("(NULL)", ps); |
} |
size = strlen(s); |
/* print leading spaces */ |
if (precision == 0) |
precision = size; |
width -= precision; |
if (!(flags & __PRINTF_FLAG_LEFTALIGNED)) { |
while (width-- > 0) { |
if (printf_putchar(' ', ps) == 1) |
counter++; |
} |
} |
if ((retval = printf_putnchars(s, size < precision ? size : precision, |
ps)) < 0) { |
return -counter; |
} |
counter += retval; |
while (width-- > 0) { |
if (printf_putchar(' ', ps) == 1) |
++counter; |
} |
return counter; |
} |
/** Print number in given base |
* |
* Print significant digits of a number in given |
* base. |
* |
* @param num Number to print. |
* @param width |
* @param precision |
* @param base Base to print the number in (should |
* be in range 2 .. 16). |
* @param flags output modifiers |
* @return number of printed characters |
* |
*/ |
static int print_number(uint64_t num, int width, int precision, int base, |
uint64_t flags, struct printf_spec *ps) |
{ |
char *digits = digits_small; |
char d[PRINT_NUMBER_BUFFER_SIZE]; /* this is good enough even for |
* base == 2, prefix and sign */ |
char *ptr = &d[PRINT_NUMBER_BUFFER_SIZE - 1]; |
int size = 0; /* size of number with all prefixes and signs */ |
int number_size; /* size of plain number */ |
char sgn; |
int retval; |
int counter = 0; |
if (flags & __PRINTF_FLAG_BIGCHARS) |
digits = digits_big; |
*ptr-- = 0; /* Put zero at end of string */ |
if (num == 0) { |
*ptr-- = '0'; |
size++; |
} else { |
do { |
*ptr-- = digits[num % base]; |
size++; |
} while (num /= base); |
} |
number_size = size; |
/* |
* Collect sum of all prefixes/signs/... to calculate padding and |
* leading zeroes |
*/ |
if (flags & __PRINTF_FLAG_PREFIX) { |
switch(base) { |
case 2: /* Binary formating is not standard, but usefull */ |
size += 2; |
break; |
case 8: |
size++; |
break; |
case 16: |
size += 2; |
break; |
} |
} |
sgn = 0; |
if (flags & __PRINTF_FLAG_SIGNED) { |
if (flags & __PRINTF_FLAG_NEGATIVE) { |
sgn = '-'; |
size++; |
} else if (flags & __PRINTF_FLAG_SHOWPLUS) { |
sgn = '+'; |
size++; |
} else if (flags & __PRINTF_FLAG_SPACESIGN) { |
sgn = ' '; |
size++; |
} |
} |
if (flags & __PRINTF_FLAG_LEFTALIGNED) { |
flags &= ~__PRINTF_FLAG_ZEROPADDED; |
} |
/* |
* If number is leftaligned or precision is specified then zeropadding |
* is ignored. |
*/ |
if (flags & __PRINTF_FLAG_ZEROPADDED) { |
if ((precision == 0) && (width > size)) { |
precision = width - size + number_size; |
} |
} |
/* print leading spaces */ |
/* We must print whole number not only a part. */ |
if (number_size > precision) |
precision = number_size; |
width -= precision + size - number_size; |
if (!(flags & __PRINTF_FLAG_LEFTALIGNED)) { |
while (width-- > 0) { |
if (printf_putchar(' ', ps) == 1) |
counter++; |
} |
} |
/* print sign */ |
if (sgn) { |
if (printf_putchar(sgn, ps) == 1) |
counter++; |
} |
/* print prefix */ |
if (flags & __PRINTF_FLAG_PREFIX) { |
switch(base) { |
case 2: /* Binary formating is not standard, but usefull */ |
if (printf_putchar('0', ps) == 1) |
counter++; |
if (flags & __PRINTF_FLAG_BIGCHARS) { |
if (printf_putchar('B', ps) == 1) |
counter++; |
} else { |
if (printf_putchar('b', ps) == 1) |
counter++; |
} |
break; |
case 8: |
if (printf_putchar('o', ps) == 1) |
counter++; |
break; |
case 16: |
if (printf_putchar('0', ps) == 1) |
counter++; |
if (flags & __PRINTF_FLAG_BIGCHARS) { |
if (printf_putchar('X', ps) == 1) |
counter++; |
} else { |
if (printf_putchar('x', ps) == 1) |
counter++; |
} |
break; |
} |
} |
/* print leading zeroes */ |
precision -= number_size; |
while (precision-- > 0) { |
if (printf_putchar('0', ps) == 1) |
counter++; |
} |
/* print number itself */ |
if ((retval = printf_putstr(++ptr, ps)) > 0) { |
counter += retval; |
} |
/* print ending spaces */ |
while (width-- > 0) { |
if (printf_putchar(' ', ps) == 1) |
counter++; |
} |
return counter; |
} |
/** Print formatted string. |
* |
* Print string formatted according to the fmt parameter and variadic arguments. |
* Each formatting directive must have the following form: |
* |
* \% [ FLAGS ] [ WIDTH ] [ .PRECISION ] [ TYPE ] CONVERSION |
* |
* FLAGS:@n |
* - "#" Force to print prefix. |
* For conversion \%o the prefix is 0, for %x and \%X prefixes are 0x and |
* 0X and for conversion \%b the prefix is 0b. |
* |
* - "-" Align to left. |
* |
* - "+" Print positive sign just as negative. |
* |
* - " " If the printed number is positive and "+" flag is not set, |
* print space in place of sign. |
* |
* - "0" Print 0 as padding instead of spaces. Zeroes are placed between |
* sign and the rest of the number. This flag is ignored if "-" |
* flag is specified. |
* |
* WIDTH:@n |
* - Specify minimal width of printed argument. If it is bigger, width is |
* ignored. If width is specified with a "*" character instead of number, |
* width is taken from parameter list. And integer parameter is expected |
* before parameter for processed conversion specification. If this value |
* is negative its absolute value is taken and the "-" flag is set. |
* |
* PRECISION:@n |
* - Value precision. For numbers it specifies minimum valid numbers. |
* Smaller numbers are printed with leading zeroes. Bigger numbers are |
* not affected. Strings with more than precision characters are cut off. |
* Just as with width, an "*" can be used used instead of a number. An |
* integer value is then expected in parameters. When both width and |
* precision are specified using "*", the first parameter is used for |
* width and the second one for precision. |
* |
* TYPE:@n |
* - "hh" Signed or unsigned char.@n |
* - "h" Signed or usigned short.@n |
* - "" Signed or usigned int (default value).@n |
* - "l" Signed or usigned long int.@n |
* - "ll" Signed or usigned long long int.@n |
* - "z" Type size_t.@n |
* |
* |
* CONVERSION:@n |
* - % Print percentile character itself. |
* |
* - c Print single character. |
* |
* - s Print zero terminated string. If a NULL value is passed as |
* value, "(NULL)" is printed instead. |
* |
* - P, p Print value of a pointer. Void * value is expected and it is |
* printed in hexadecimal notation with prefix (as with '\%#X' or |
* '\%#x' for 32bit or '\%#X' or '\%#x' for 64bit long pointers). |
* |
* - b Print value as unsigned binary number. Prefix is not printed by |
* default. (Nonstandard extension.) |
* |
* - o Print value as unsigned octal number. Prefix is not printed by |
* default. |
* |
* - d, i Print signed decimal number. There is no difference between d |
* and i conversion. |
* |
* - u Print unsigned decimal number. |
* |
* - X, x Print hexadecimal number with upper- or lower-case. Prefix is |
* not printed by default. |
* |
* All other characters from fmt except the formatting directives are printed in |
* verbatim. |
* |
* @param fmt Formatting NULL terminated string. |
* @return Number of printed characters or negative value on failure. |
*/ |
int printf_core(const char *fmt, struct printf_spec *ps, va_list ap) |
{ |
/* i is the index of the currently processed char from fmt */ |
int i = 0; |
/* j is the index to the first not printed nonformating character */ |
int j = 0; |
int end; |
int counter; /* counter of printed characters */ |
int retval; /* used to store return values from called functions */ |
char c; |
qualifier_t qualifier; /* type of argument */ |
int base; /* base in which will be a numeric parameter printed */ |
uint64_t number; /* argument value */ |
size_t size; /* byte size of integer parameter */ |
int width, precision; |
uint64_t flags; |
counter = 0; |
while ((c = fmt[i])) { |
/* control character */ |
if (c == '%' ) { |
/* print common characters if any processed */ |
if (i > j) { |
if ((retval = printf_putnchars(&fmt[j], |
(size_t)(i - j), ps)) < 0) { /* error */ |
goto minus_out; |
} |
counter += retval; |
} |
j = i; |
/* parse modifiers */ |
flags = 0; |
end = 0; |
do { |
++i; |
switch (c = fmt[i]) { |
case '#': |
flags |= __PRINTF_FLAG_PREFIX; |
break; |
case '-': |
flags |= __PRINTF_FLAG_LEFTALIGNED; |
break; |
case '+': |
flags |= __PRINTF_FLAG_SHOWPLUS; |
break; |
case ' ': |
flags |= __PRINTF_FLAG_SPACESIGN; |
break; |
case '0': |
flags |= __PRINTF_FLAG_ZEROPADDED; |
break; |
default: |
end = 1; |
}; |
} while (end == 0); |
/* width & '*' operator */ |
width = 0; |
if (isdigit(fmt[i])) { |
while (isdigit(fmt[i])) { |
width *= 10; |
width += fmt[i++] - '0'; |
} |
} else if (fmt[i] == '*') { |
/* get width value from argument list*/ |
i++; |
width = (int)va_arg(ap, int); |
if (width < 0) { |
/* negative width sets '-' flag */ |
width *= -1; |
flags |= __PRINTF_FLAG_LEFTALIGNED; |
} |
} |
/* precision and '*' operator */ |
precision = 0; |
if (fmt[i] == '.') { |
++i; |
if (isdigit(fmt[i])) { |
while (isdigit(fmt[i])) { |
precision *= 10; |
precision += fmt[i++] - '0'; |
} |
} else if (fmt[i] == '*') { |
/* get precision value from argument */ |
i++; |
precision = (int)va_arg(ap, int); |
if (precision < 0) { |
/* negative precision ignored */ |
precision = 0; |
} |
} |
} |
switch (fmt[i++]) { |
/** @todo unimplemented qualifiers: |
* t ptrdiff_t - ISO C 99 |
*/ |
case 'h': /* char or short */ |
qualifier = PrintfQualifierShort; |
if (fmt[i] == 'h') { |
i++; |
qualifier = PrintfQualifierByte; |
} |
break; |
case 'l': /* long or long long*/ |
qualifier = PrintfQualifierLong; |
if (fmt[i] == 'l') { |
i++; |
qualifier = PrintfQualifierLongLong; |
} |
break; |
case 'z': /* size_t */ |
qualifier = PrintfQualifierSizeT; |
break; |
default: |
/* set default type */ |
qualifier = PrintfQualifierInt; |
--i; |
} |
base = 10; |
switch (c = fmt[i]) { |
/* |
* String and character conversions. |
*/ |
case 's': |
if ((retval = print_string(va_arg(ap, char*), |
width, precision, flags, ps)) < 0) { |
goto minus_out; |
} |
counter += retval; |
j = i + 1; |
goto next_char; |
case 'c': |
c = va_arg(ap, unsigned int); |
retval = print_char(c, width, flags, ps); |
if (retval < 0) { |
goto minus_out; |
} |
counter += retval; |
j = i + 1; |
goto next_char; |
/* |
* Integer values |
*/ |
case 'P': /* pointer */ |
flags |= __PRINTF_FLAG_BIGCHARS; |
case 'p': |
flags |= __PRINTF_FLAG_PREFIX; |
base = 16; |
qualifier = PrintfQualifierPointer; |
break; |
case 'b': |
base = 2; |
break; |
case 'o': |
base = 8; |
break; |
case 'd': |
case 'i': |
flags |= __PRINTF_FLAG_SIGNED; |
case 'u': |
break; |
case 'X': |
flags |= __PRINTF_FLAG_BIGCHARS; |
case 'x': |
base = 16; |
break; |
/* percentile itself */ |
case '%': |
j = i; |
goto next_char; |
/* |
* Bad formatting. |
*/ |
default: |
/* |
* Unknown format. Now, j is the index of '%', |
* so we will print the whole bad format |
* sequence. |
*/ |
goto next_char; |
} |
/* Print integers */ |
switch (qualifier) { |
case PrintfQualifierByte: |
size = sizeof(unsigned char); |
number = (uint64_t)va_arg(ap, unsigned int); |
break; |
case PrintfQualifierShort: |
size = sizeof(unsigned short); |
number = (uint64_t)va_arg(ap, unsigned int); |
break; |
case PrintfQualifierInt: |
size = sizeof(unsigned int); |
number = (uint64_t)va_arg(ap, unsigned int); |
break; |
case PrintfQualifierLong: |
size = sizeof(unsigned long); |
number = (uint64_t)va_arg(ap, unsigned long); |
break; |
case PrintfQualifierLongLong: |
size = sizeof(unsigned long long); |
number = (uint64_t)va_arg(ap, |
unsigned long long); |
break; |
case PrintfQualifierPointer: |
size = sizeof(void *); |
number = (uint64_t)(unsigned long)va_arg(ap, |
void *); |
break; |
case PrintfQualifierSizeT: |
size = sizeof(size_t); |
number = (uint64_t)va_arg(ap, size_t); |
break; |
default: /* Unknown qualifier */ |
goto minus_out; |
} |
if (flags & __PRINTF_FLAG_SIGNED) { |
if (number & (0x1 << (size * 8 - 1))) { |
flags |= __PRINTF_FLAG_NEGATIVE; |
if (size == sizeof(uint64_t)) { |
number = -((int64_t)number); |
} else { |
number = ~number; |
number &= |
~(0xFFFFFFFFFFFFFFFFll << |
(size * 8)); |
number++; |
} |
} |
} |
if ((retval = print_number(number, width, precision, |
base, flags, ps)) < 0 ) { |
goto minus_out; |
} |
counter += retval; |
j = i + 1; |
} |
next_char: |
++i; |
} |
if (i > j) { |
retval = printf_putnchars(&fmt[j], (size_t)(i - j), ps); |
if (retval < 0) { /* error */ |
goto minus_out; |
} |
counter += retval; |
} |
return counter; |
minus_out: |
return -counter; |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/generic/io/printf.c |
---|
0,0 → 1,58 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#include <io/printf_core.h> |
#include <stdio.h> |
#include <stdio.h> |
/** Print formatted text. |
* @param fmt format string |
* \see For more details about format string see printf_core. |
*/ |
int printf(const char *fmt, ...) |
{ |
int ret; |
va_list args; |
va_start(args, fmt); |
ret = vprintf(fmt, args); |
va_end(args); |
return ret; |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/generic/io/vsnprintf.c |
---|
0,0 → 1,109 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#include <stdarg.h> |
#include <stdio.h> |
#include <string.h> |
#include <io/printf_core.h> |
struct vsnprintf_data { |
size_t size; /* total space for string */ |
size_t len; /* count of currently used characters */ |
char *string; /* destination string */ |
}; |
/** Write string to given buffer. |
* Write at most data->size characters including trailing zero. According to C99 has snprintf to return number |
* of characters that would have been written if enough space had been available. Hence the return value is not |
* number of really printed characters but size of input string. Number of really used characters |
* is stored in data->len. |
* @param str source string to print |
* @param count size of source string |
* @param data structure with destination string, counter of used space and total string size. |
* @return number of characters to print (not characters really printed!) |
*/ |
static int vsnprintf_write(const char *str, size_t count, struct vsnprintf_data *data) |
{ |
size_t i; |
i = data->size - data->len; |
if (i == 0) { |
return count; |
} |
if (i == 1) { |
/* We have only one free byte left in buffer => write there trailing zero */ |
data->string[data->size - 1] = 0; |
data->len = data->size; |
return count; |
} |
if (i <= count) { |
/* We have not enought space for whole string with the trailing zero => print only a part of string */ |
memcpy((void *)(data->string + data->len), (void *)str, i - 1); |
data->string[data->size - 1] = 0; |
data->len = data->size; |
return count; |
} |
/* Buffer is big enought to print whole string */ |
memcpy((void *)(data->string + data->len), (void *)str, count); |
data->len += count; |
/* Put trailing zero at end, but not count it into data->len so it could be rewritten next time */ |
data->string[data->len] = 0; |
return count; |
} |
/** Print formatted to the given buffer with limited size. |
* @param str buffer |
* @param size buffer size |
* @param fmt format string |
* \see For more details about format string see printf_core. |
*/ |
int vsnprintf(char *str, size_t size, const char *fmt, va_list ap) |
{ |
struct vsnprintf_data data = {size, 0, str}; |
struct printf_spec ps = {(int(*)(void *, size_t, void *)) vsnprintf_write, &data}; |
/* Print 0 at end of string - fix the case that nothing will be printed */ |
if (size > 0) |
str[0] = 0; |
/* vsnprintf_write ensures that str will be terminated by zero. */ |
return printf_core(fmt, &ps, ap); |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/generic/io/vsprintf.c |
---|
0,0 → 1,51 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#include <stdarg.h> |
#include <stdio.h> |
#include <io/printf_core.h> |
/** Print formatted to the given buffer. |
* @param str buffer |
* @param fmt format string |
* @param ap argument list |
* \see For more details about format string see printf_core. |
*/ |
int vsprintf(char *str, const char *fmt, va_list ap) |
{ |
return vsnprintf(str, (size_t) - 1, fmt, ap); |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/generic/io/snprintf.c |
---|
0,0 → 1,59 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#include <stdarg.h> |
#include <stdio.h> |
#include <io/printf_core.h> |
/** Print formatted to the given buffer with limited size. |
* @param str buffer |
* @param size buffer size |
* @param fmt format string |
* \see For more details about format string see printf_core. |
*/ |
int snprintf(char *str, size_t size, const char *fmt, ...) |
{ |
int ret; |
va_list args; |
va_start(args, fmt); |
ret = vsnprintf(str, size, fmt, args); |
va_end(args); |
return ret; |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/generic/io/sprintf.c |
---|
0,0 → 1,58 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#include <stdarg.h> |
#include <stdio.h> |
#include <io/printf_core.h> |
/** Print formatted to the given buffer. |
* @param str buffer |
* @param fmt format string |
* \see For more details about format string see printf_core. |
*/ |
int sprintf(char *str, const char *fmt, ...) |
{ |
int ret; |
va_list args; |
va_start(args, fmt); |
ret = vsprintf(str, fmt, args); |
va_end(args); |
return ret; |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/generic/async.c |
---|
0,0 → 1,1015 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
/** |
* Asynchronous library |
* |
* The aim of this library is facilitating writing programs utilizing the |
* asynchronous nature of HelenOS IPC, yet using a normal way of programming. |
* |
* You should be able to write very simple multithreaded programs, the async |
* framework will automatically take care of most synchronization problems. |
* |
* Default semantics: |
* - async_send_*(): send asynchronously. If the kernel refuses to send |
* more messages, [ try to get responses from kernel, if |
* nothing found, might try synchronous ] |
* |
* Example of use (pseudo C): |
* |
* 1) Multithreaded client application |
* |
* fibril_create(fibril1, ...); |
* fibril_create(fibril2, ...); |
* ... |
* |
* int fibril1(void *arg) |
* { |
* conn = ipc_connect_me_to(); |
* c1 = async_send(conn); |
* c2 = async_send(conn); |
* async_wait_for(c1); |
* async_wait_for(c2); |
* ... |
* } |
* |
* |
* 2) Multithreaded server application |
* main() |
* { |
* async_manager(); |
* } |
* |
* |
* my_client_connection(icallid, *icall) |
* { |
* if (want_refuse) { |
* ipc_answer_0(icallid, ELIMIT); |
* return; |
* } |
* ipc_answer_0(icallid, EOK); |
* |
* callid = async_get_call(&call); |
* handle_call(callid, call); |
* ipc_answer_2(callid, 1, 2, 3); |
* |
* callid = async_get_call(&call); |
* .... |
* } |
* |
*/ |
#include <futex.h> |
#include <async.h> |
#include <fibril.h> |
#include <stdio.h> |
#include <libadt/hash_table.h> |
#include <libadt/list.h> |
#include <ipc/ipc.h> |
#include <assert.h> |
#include <errno.h> |
#include <sys/time.h> |
#include <arch/barrier.h> |
#include <bool.h> |
atomic_t async_futex = FUTEX_INITIALIZER; |
static hash_table_t conn_hash_table; |
static LIST_INITIALIZE(timeout_list); |
/** Structures of this type represent a waiting fibril. */ |
typedef struct { |
/** Expiration time. */ |
struct timeval expires; |
/** If true, this struct is in the timeout list. */ |
int inlist; |
/** Timeout list link. */ |
link_t link; |
/** Identification of and link to the waiting fibril. */ |
fid_t fid; |
/** If true, this fibril is currently active. */ |
int active; |
/** If true, we have timed out. */ |
int timedout; |
} awaiter_t; |
typedef struct { |
awaiter_t wdata; |
/** If reply was received. */ |
int done; |
/** Pointer to where the answer data is stored. */ |
ipc_call_t *dataptr; |
ipcarg_t retval; |
} amsg_t; |
/** |
* Structures of this type are used to group information about a call and a |
* message queue link. |
*/ |
typedef struct { |
link_t link; |
ipc_callid_t callid; |
ipc_call_t call; |
} msg_t; |
typedef struct { |
awaiter_t wdata; |
/** Hash table link. */ |
link_t link; |
/** Incoming phone hash. */ |
ipcarg_t in_phone_hash; |
/** Messages that should be delivered to this fibril. */ |
link_t msg_queue; |
/** Identification of the opening call. */ |
ipc_callid_t callid; |
/** Call data of the opening call. */ |
ipc_call_t call; |
/** Identification of the closing call. */ |
ipc_callid_t close_callid; |
/** Fibril function that will be used to handle the connection. */ |
void (*cfibril)(ipc_callid_t, ipc_call_t *); |
} connection_t; |
/** Identifier of the incoming connection handled by the current fibril. */ |
__thread connection_t *FIBRIL_connection; |
/** |
* If true, it is forbidden to use async_req functions and all preemption is |
* disabled. |
*/ |
__thread int _in_interrupt_handler; |
static void default_client_connection(ipc_callid_t callid, ipc_call_t *call); |
static void default_interrupt_received(ipc_callid_t callid, ipc_call_t *call); |
/** |
* Pointer to a fibril function that will be used to handle connections. |
*/ |
static async_client_conn_t client_connection = default_client_connection; |
/** |
* Pointer to a fibril function that will be used to handle interrupt |
* notifications. |
*/ |
static async_client_conn_t interrupt_received = default_interrupt_received; |
/* |
* Getter for _in_interrupt_handler. We need to export the value of this thread |
* local variable to other modules, but the binutils 2.18 linkers die on an |
* attempt to export this symbol in the header file. For now, consider this as a |
* workaround. |
*/ |
bool in_interrupt_handler(void) |
{ |
return _in_interrupt_handler; |
} |
#define CONN_HASH_TABLE_CHAINS 32 |
/** Compute hash into the connection hash table based on the source phone hash. |
* |
* @param key Pointer to source phone hash. |
* |
* @return Index into the connection hash table. |
*/ |
static hash_index_t conn_hash(unsigned long *key) |
{ |
assert(key); |
return ((*key) >> 4) % CONN_HASH_TABLE_CHAINS; |
} |
/** Compare hash table item with a key. |
* |
* @param key Array containing the source phone hash as the only item. |
* @param keys Expected 1 but ignored. |
* @param item Connection hash table item. |
* |
* @return True on match, false otherwise. |
*/ |
static int conn_compare(unsigned long key[], hash_count_t keys, link_t *item) |
{ |
connection_t *hs; |
hs = hash_table_get_instance(item, connection_t, link); |
return key[0] == hs->in_phone_hash; |
} |
/** Connection hash table removal callback function. |
* |
* This function is called whenever a connection is removed from the connection |
* hash table. |
* |
* @param item Connection hash table item being removed. |
*/ |
static void conn_remove(link_t *item) |
{ |
free(hash_table_get_instance(item, connection_t, link)); |
} |
/** Operations for the connection hash table. */ |
static hash_table_operations_t conn_hash_table_ops = { |
.hash = conn_hash, |
.compare = conn_compare, |
.remove_callback = conn_remove |
}; |
/** Sort in current fibril's timeout request. |
* |
* @param wd Wait data of the current fibril. |
*/ |
static void insert_timeout(awaiter_t *wd) |
{ |
link_t *tmp; |
awaiter_t *cur; |
wd->timedout = 0; |
wd->inlist = 1; |
tmp = timeout_list.next; |
while (tmp != &timeout_list) { |
cur = list_get_instance(tmp, awaiter_t, link); |
if (tv_gteq(&cur->expires, &wd->expires)) |
break; |
tmp = tmp->next; |
} |
list_append(&wd->link, tmp); |
} |
/** Try to route a call to an appropriate connection fibril. |
* |
* If the proper connection fibril is found, a message with the call is added to |
* its message queue. If the fibril was not active, it is activated and all |
* timeouts are unregistered. |
* |
* @param callid Hash of the incoming call. |
* @param call Data of the incoming call. |
* |
* @return Zero if the call doesn't match any connection. |
* One if the call was passed to the respective connection |
* fibril. |
*/ |
static int route_call(ipc_callid_t callid, ipc_call_t *call) |
{ |
connection_t *conn; |
msg_t *msg; |
link_t *hlp; |
unsigned long key; |
futex_down(&async_futex); |
key = call->in_phone_hash; |
hlp = hash_table_find(&conn_hash_table, &key); |
if (!hlp) { |
futex_up(&async_futex); |
return 0; |
} |
conn = hash_table_get_instance(hlp, connection_t, link); |
msg = malloc(sizeof(*msg)); |
msg->callid = callid; |
msg->call = *call; |
list_append(&msg->link, &conn->msg_queue); |
if (IPC_GET_METHOD(*call) == IPC_M_PHONE_HUNGUP) |
conn->close_callid = callid; |
/* If the connection fibril is waiting for an event, activate it */ |
if (!conn->wdata.active) { |
/* If in timeout list, remove it */ |
if (conn->wdata.inlist) { |
conn->wdata.inlist = 0; |
list_remove(&conn->wdata.link); |
} |
conn->wdata.active = 1; |
fibril_add_ready(conn->wdata.fid); |
} |
futex_up(&async_futex); |
return 1; |
} |
/** Return new incoming message for the current (fibril-local) connection. |
* |
* @param call Storage where the incoming call data will be stored. |
* @param usecs Timeout in microseconds. Zero denotes no timeout. |
* |
* @return If no timeout was specified, then a hash of the |
* incoming call is returned. If a timeout is specified, |
* then a hash of the incoming call is returned unless |
* the timeout expires prior to receiving a message. In |
* that case zero is returned. |
*/ |
ipc_callid_t async_get_call_timeout(ipc_call_t *call, suseconds_t usecs) |
{ |
msg_t *msg; |
ipc_callid_t callid; |
connection_t *conn; |
assert(FIBRIL_connection); |
/* GCC 4.1.0 coughs on FIBRIL_connection-> dereference, |
* GCC 4.1.1 happilly puts the rdhwr instruction in delay slot. |
* I would never expect to find so many errors in |
* a compiler *($&$(*&$ |
*/ |
conn = FIBRIL_connection; |
futex_down(&async_futex); |
if (usecs) { |
gettimeofday(&conn->wdata.expires, NULL); |
tv_add(&conn->wdata.expires, usecs); |
} else { |
conn->wdata.inlist = 0; |
} |
/* If nothing in queue, wait until something arrives */ |
while (list_empty(&conn->msg_queue)) { |
if (usecs) |
insert_timeout(&conn->wdata); |
conn->wdata.active = 0; |
/* |
* Note: the current fibril will be rescheduled either due to a |
* timeout or due to an arriving message destined to it. In the |
* former case, handle_expired_timeouts() and, in the latter |
* case, route_call() will perform the wakeup. |
*/ |
fibril_switch(FIBRIL_TO_MANAGER); |
/* |
* Futex is up after getting back from async_manager get it |
* again. |
*/ |
futex_down(&async_futex); |
if (usecs && conn->wdata.timedout && |
list_empty(&conn->msg_queue)) { |
/* If we timed out -> exit */ |
futex_up(&async_futex); |
return 0; |
} |
} |
msg = list_get_instance(conn->msg_queue.next, msg_t, link); |
list_remove(&msg->link); |
callid = msg->callid; |
*call = msg->call; |
free(msg); |
futex_up(&async_futex); |
return callid; |
} |
/** Default fibril function that gets called to handle new connection. |
* |
* This function is defined as a weak symbol - to be redefined in user code. |
* |
* @param callid Hash of the incoming call. |
* @param call Data of the incoming call. |
*/ |
static void default_client_connection(ipc_callid_t callid, ipc_call_t *call) |
{ |
ipc_answer_0(callid, ENOENT); |
} |
/** Default fibril function that gets called to handle interrupt notifications. |
* |
* @param callid Hash of the incoming call. |
* @param call Data of the incoming call. |
*/ |
static void default_interrupt_received(ipc_callid_t callid, ipc_call_t *call) |
{ |
} |
/** Wrapper for client connection fibril. |
* |
* When a new connection arrives, a fibril with this implementing function is |
* created. It calls client_connection() and does the final cleanup. |
* |
* @param arg Connection structure pointer. |
* |
* @return Always zero. |
*/ |
static int connection_fibril(void *arg) |
{ |
unsigned long key; |
msg_t *msg; |
int close_answered = 0; |
/* Setup fibril-local connection pointer */ |
FIBRIL_connection = (connection_t *) arg; |
FIBRIL_connection->cfibril(FIBRIL_connection->callid, |
&FIBRIL_connection->call); |
/* Remove myself from the connection hash table */ |
futex_down(&async_futex); |
key = FIBRIL_connection->in_phone_hash; |
hash_table_remove(&conn_hash_table, &key, 1); |
futex_up(&async_futex); |
/* Answer all remaining messages with EHANGUP */ |
while (!list_empty(&FIBRIL_connection->msg_queue)) { |
msg = list_get_instance(FIBRIL_connection->msg_queue.next, |
msg_t, link); |
list_remove(&msg->link); |
if (msg->callid == FIBRIL_connection->close_callid) |
close_answered = 1; |
ipc_answer_0(msg->callid, EHANGUP); |
free(msg); |
} |
if (FIBRIL_connection->close_callid) |
ipc_answer_0(FIBRIL_connection->close_callid, EOK); |
return 0; |
} |
/** Create a new fibril for a new connection. |
* |
* Creates new fibril for connection, fills in connection structures and inserts |
* it into the hash table, so that later we can easily do routing of messages to |
* particular fibrils. |
* |
* @param in_phone_hash Identification of the incoming connection. |
* @param callid Hash of the opening IPC_M_CONNECT_ME_TO call. |
* If callid is zero, the connection was opened by |
* accepting the IPC_M_CONNECT_TO_ME call and this function |
* is called directly by the server. |
* @param call Call data of the opening call. |
* @param cfibril Fibril function that should be called upon opening the |
* connection. |
* |
* @return New fibril id or NULL on failure. |
*/ |
fid_t async_new_connection(ipcarg_t in_phone_hash, ipc_callid_t callid, |
ipc_call_t *call, void (*cfibril)(ipc_callid_t, ipc_call_t *)) |
{ |
connection_t *conn; |
unsigned long key; |
conn = malloc(sizeof(*conn)); |
if (!conn) { |
if (callid) |
ipc_answer_0(callid, ENOMEM); |
return NULL; |
} |
conn->in_phone_hash = in_phone_hash; |
list_initialize(&conn->msg_queue); |
conn->callid = callid; |
conn->close_callid = 0; |
if (call) |
conn->call = *call; |
conn->wdata.active = 1; /* We will activate the fibril ASAP */ |
conn->cfibril = cfibril; |
conn->wdata.fid = fibril_create(connection_fibril, conn); |
if (!conn->wdata.fid) { |
free(conn); |
if (callid) |
ipc_answer_0(callid, ENOMEM); |
return NULL; |
} |
/* Add connection to the connection hash table */ |
key = conn->in_phone_hash; |
futex_down(&async_futex); |
hash_table_insert(&conn_hash_table, &key, &conn->link); |
futex_up(&async_futex); |
fibril_add_ready(conn->wdata.fid); |
return conn->wdata.fid; |
} |
/** Handle a call that was received. |
* |
* If the call has the IPC_M_CONNECT_ME_TO method, a new connection is created. |
* Otherwise the call is routed to its connection fibril. |
* |
* @param callid Hash of the incoming call. |
* @param call Data of the incoming call. |
*/ |
static void handle_call(ipc_callid_t callid, ipc_call_t *call) |
{ |
/* Unrouted call - do some default behaviour */ |
if ((callid & IPC_CALLID_NOTIFICATION)) { |
_in_interrupt_handler = 1; |
(*interrupt_received)(callid, call); |
_in_interrupt_handler = 0; |
return; |
} |
switch (IPC_GET_METHOD(*call)) { |
case IPC_M_CONNECT_ME_TO: |
/* Open new connection with fibril etc. */ |
async_new_connection(IPC_GET_ARG5(*call), callid, call, |
client_connection); |
return; |
} |
/* Try to route the call through the connection hash table */ |
if (route_call(callid, call)) |
return; |
/* Unknown call from unknown phone - hang it up */ |
ipc_answer_0(callid, EHANGUP); |
} |
/** Fire all timeouts that expired. */ |
static void handle_expired_timeouts(void) |
{ |
struct timeval tv; |
awaiter_t *waiter; |
link_t *cur; |
gettimeofday(&tv, NULL); |
futex_down(&async_futex); |
cur = timeout_list.next; |
while (cur != &timeout_list) { |
waiter = list_get_instance(cur, awaiter_t, link); |
if (tv_gt(&waiter->expires, &tv)) |
break; |
cur = cur->next; |
list_remove(&waiter->link); |
waiter->inlist = 0; |
waiter->timedout = 1; |
/* |
* Redundant condition? |
* The fibril should not be active when it gets here. |
*/ |
if (!waiter->active) { |
waiter->active = 1; |
fibril_add_ready(waiter->fid); |
} |
} |
futex_up(&async_futex); |
} |
/** Endless loop dispatching incoming calls and answers. |
* |
* @return Never returns. |
*/ |
static int async_manager_worker(void) |
{ |
ipc_call_t call; |
ipc_callid_t callid; |
int timeout; |
awaiter_t *waiter; |
struct timeval tv; |
while (1) { |
if (fibril_switch(FIBRIL_FROM_MANAGER)) { |
futex_up(&async_futex); |
/* |
* async_futex is always held when entering a manager |
* fibril. |
*/ |
continue; |
} |
futex_down(&async_futex); |
if (!list_empty(&timeout_list)) { |
waiter = list_get_instance(timeout_list.next, awaiter_t, |
link); |
gettimeofday(&tv, NULL); |
if (tv_gteq(&tv, &waiter->expires)) { |
futex_up(&async_futex); |
handle_expired_timeouts(); |
continue; |
} else |
timeout = tv_sub(&waiter->expires, &tv); |
} else |
timeout = SYNCH_NO_TIMEOUT; |
futex_up(&async_futex); |
callid = ipc_wait_cycle(&call, timeout, SYNCH_FLAGS_NONE); |
if (!callid) { |
handle_expired_timeouts(); |
continue; |
} |
if (callid & IPC_CALLID_ANSWERED) { |
continue; |
} |
handle_call(callid, &call); |
} |
return 0; |
} |
/** Function to start async_manager as a standalone fibril. |
* |
* When more kernel threads are used, one async manager should exist per thread. |
* |
* @param arg Unused. |
* |
* @return Never returns. |
*/ |
static int async_manager_fibril(void *arg) |
{ |
futex_up(&async_futex); |
/* |
* async_futex is always locked when entering manager |
*/ |
async_manager_worker(); |
return 0; |
} |
/** Add one manager to manager list. */ |
void async_create_manager(void) |
{ |
fid_t fid; |
fid = fibril_create(async_manager_fibril, NULL); |
fibril_add_manager(fid); |
} |
/** Remove one manager from manager list */ |
void async_destroy_manager(void) |
{ |
fibril_remove_manager(); |
} |
/** Initialize the async framework. |
* |
* @return Zero on success or an error code. |
*/ |
int _async_init(void) |
{ |
if (!hash_table_create(&conn_hash_table, CONN_HASH_TABLE_CHAINS, 1, |
&conn_hash_table_ops)) { |
printf("%s: cannot create hash table\n", "async"); |
return ENOMEM; |
} |
return 0; |
} |
/** Reply received callback. |
* |
* This function is called whenever a reply for an asynchronous message sent out |
* by the asynchronous framework is received. |
* |
* Notify the fibril which is waiting for this message that it has arrived. |
* |
* @param private Pointer to the asynchronous message record. |
* @param retval Value returned in the answer. |
* @param data Call data of the answer. |
*/ |
static void reply_received(void *private, int retval, ipc_call_t *data) |
{ |
amsg_t *msg = (amsg_t *) private; |
msg->retval = retval; |
futex_down(&async_futex); |
/* Copy data after futex_down, just in case the call was detached */ |
if (msg->dataptr) |
*msg->dataptr = *data; |
write_barrier(); |
/* Remove message from timeout list */ |
if (msg->wdata.inlist) |
list_remove(&msg->wdata.link); |
msg->done = 1; |
if (!msg->wdata.active) { |
msg->wdata.active = 1; |
fibril_add_ready(msg->wdata.fid); |
} |
futex_up(&async_futex); |
} |
/** Send message and return id of the sent message. |
* |
* The return value can be used as input for async_wait() to wait for |
* completion. |
* |
* @param phoneid Handle of the phone that will be used for the send. |
* @param method Service-defined method. |
* @param arg1 Service-defined payload argument. |
* @param arg2 Service-defined payload argument. |
* @param arg3 Service-defined payload argument. |
* @param arg4 Service-defined payload argument. |
* @param dataptr If non-NULL, storage where the reply data will be |
* stored. |
* |
* @return Hash of the sent message. |
*/ |
aid_t async_send_fast(int phoneid, ipcarg_t method, ipcarg_t arg1, |
ipcarg_t arg2, ipcarg_t arg3, ipcarg_t arg4, ipc_call_t *dataptr) |
{ |
amsg_t *msg; |
if (_in_interrupt_handler) { |
printf("Cannot send asynchronous request in interrupt " |
"handler.\n"); |
_exit(1); |
} |
msg = malloc(sizeof(*msg)); |
msg->done = 0; |
msg->dataptr = dataptr; |
/* We may sleep in the next method, but it will use its own mechanism */ |
msg->wdata.active = 1; |
ipc_call_async_4(phoneid, method, arg1, arg2, arg3, arg4, msg, |
reply_received, 1); |
return (aid_t) msg; |
} |
/** Send message and return id of the sent message |
* |
* The return value can be used as input for async_wait() to wait for |
* completion. |
* |
* @param phoneid Handle of the phone that will be used for the send. |
* @param method Service-defined method. |
* @param arg1 Service-defined payload argument. |
* @param arg2 Service-defined payload argument. |
* @param arg3 Service-defined payload argument. |
* @param arg4 Service-defined payload argument. |
* @param arg5 Service-defined payload argument. |
* @param dataptr If non-NULL, storage where the reply data will be |
* stored. |
* |
* @return Hash of the sent message. |
*/ |
aid_t async_send_slow(int phoneid, ipcarg_t method, ipcarg_t arg1, |
ipcarg_t arg2, ipcarg_t arg3, ipcarg_t arg4, ipcarg_t arg5, |
ipc_call_t *dataptr) |
{ |
amsg_t *msg; |
if (_in_interrupt_handler) { |
printf("Cannot send asynchronous request in interrupt " |
"handler.\n"); |
_exit(1); |
} |
msg = malloc(sizeof(*msg)); |
msg->done = 0; |
msg->dataptr = dataptr; |
/* We may sleep in next method, but it will use its own mechanism */ |
msg->wdata.active = 1; |
ipc_call_async_5(phoneid, method, arg1, arg2, arg3, arg4, arg5, msg, |
reply_received, 1); |
return (aid_t) msg; |
} |
/** Wait for a message sent by the async framework. |
* |
* @param amsgid Hash of the message to wait for. |
* @param retval Pointer to storage where the retval of the answer will |
* be stored. |
*/ |
void async_wait_for(aid_t amsgid, ipcarg_t *retval) |
{ |
amsg_t *msg = (amsg_t *) amsgid; |
futex_down(&async_futex); |
if (msg->done) { |
futex_up(&async_futex); |
goto done; |
} |
msg->wdata.fid = fibril_get_id(); |
msg->wdata.active = 0; |
msg->wdata.inlist = 0; |
/* Leave the async_futex locked when entering this function */ |
fibril_switch(FIBRIL_TO_MANAGER); |
/* futex is up automatically after fibril_switch...*/ |
done: |
if (retval) |
*retval = msg->retval; |
free(msg); |
} |
/** Wait for a message sent by the async framework, timeout variant. |
* |
* @param amsgid Hash of the message to wait for. |
* @param retval Pointer to storage where the retval of the answer will |
* be stored. |
* @param timeout Timeout in microseconds. |
* |
* @return Zero on success, ETIMEOUT if the timeout has expired. |
*/ |
int async_wait_timeout(aid_t amsgid, ipcarg_t *retval, suseconds_t timeout) |
{ |
amsg_t *msg = (amsg_t *) amsgid; |
/* TODO: Let it go through the event read at least once */ |
if (timeout < 0) |
return ETIMEOUT; |
futex_down(&async_futex); |
if (msg->done) { |
futex_up(&async_futex); |
goto done; |
} |
gettimeofday(&msg->wdata.expires, NULL); |
tv_add(&msg->wdata.expires, timeout); |
msg->wdata.fid = fibril_get_id(); |
msg->wdata.active = 0; |
insert_timeout(&msg->wdata); |
/* Leave the async_futex locked when entering this function */ |
fibril_switch(FIBRIL_TO_MANAGER); |
/* futex is up automatically after fibril_switch...*/ |
if (!msg->done) |
return ETIMEOUT; |
done: |
if (retval) |
*retval = msg->retval; |
free(msg); |
return 0; |
} |
/** Wait for specified time. |
* |
* The current fibril is suspended but the thread continues to execute. |
* |
* @param timeout Duration of the wait in microseconds. |
*/ |
void async_usleep(suseconds_t timeout) |
{ |
amsg_t *msg; |
if (_in_interrupt_handler) { |
printf("Cannot call async_usleep in interrupt handler.\n"); |
_exit(1); |
} |
msg = malloc(sizeof(*msg)); |
if (!msg) |
return; |
msg->wdata.fid = fibril_get_id(); |
msg->wdata.active = 0; |
gettimeofday(&msg->wdata.expires, NULL); |
tv_add(&msg->wdata.expires, timeout); |
futex_down(&async_futex); |
insert_timeout(&msg->wdata); |
/* Leave the async_futex locked when entering this function */ |
fibril_switch(FIBRIL_TO_MANAGER); |
/* futex is up automatically after fibril_switch()...*/ |
free(msg); |
} |
/** Setter for client_connection function pointer. |
* |
* @param conn Function that will implement a new connection fibril. |
*/ |
void async_set_client_connection(async_client_conn_t conn) |
{ |
client_connection = conn; |
} |
/** Setter for interrupt_received function pointer. |
* |
* @param conn Function that will implement a new interrupt |
* notification fibril. |
*/ |
void async_set_interrupt_received(async_client_conn_t conn) |
{ |
interrupt_received = conn; |
} |
/** Pseudo-synchronous message sending - fast version. |
* |
* Send message asynchronously and return only after the reply arrives. |
* |
* This function can only transfer 4 register payload arguments. For |
* transferring more arguments, see the slower async_req_slow(). |
* |
* @param phoneid Hash of the phone through which to make the call. |
* @param method Method of the call. |
* @param arg1 Service-defined payload argument. |
* @param arg2 Service-defined payload argument. |
* @param arg3 Service-defined payload argument. |
* @param arg4 Service-defined payload argument. |
* @param r1 If non-NULL, storage for the 1st reply argument. |
* @param r2 If non-NULL, storage for the 2nd reply argument. |
* @param r3 If non-NULL, storage for the 3rd reply argument. |
* @param r4 If non-NULL, storage for the 4th reply argument. |
* @param r5 If non-NULL, storage for the 5th reply argument. |
* @return Return code of the reply or a negative error code. |
*/ |
ipcarg_t async_req_fast(int phoneid, ipcarg_t method, ipcarg_t arg1, |
ipcarg_t arg2, ipcarg_t arg3, ipcarg_t arg4, ipcarg_t *r1, ipcarg_t *r2, |
ipcarg_t *r3, ipcarg_t *r4, ipcarg_t *r5) |
{ |
ipc_call_t result; |
ipcarg_t rc; |
aid_t eid = async_send_4(phoneid, method, arg1, arg2, arg3, arg4, |
&result); |
async_wait_for(eid, &rc); |
if (r1) |
*r1 = IPC_GET_ARG1(result); |
if (r2) |
*r2 = IPC_GET_ARG2(result); |
if (r3) |
*r3 = IPC_GET_ARG3(result); |
if (r4) |
*r4 = IPC_GET_ARG4(result); |
if (r5) |
*r5 = IPC_GET_ARG5(result); |
return rc; |
} |
/** Pseudo-synchronous message sending - slow version. |
* |
* Send message asynchronously and return only after the reply arrives. |
* |
* @param phoneid Hash of the phone through which to make the call. |
* @param method Method of the call. |
* @param arg1 Service-defined payload argument. |
* @param arg2 Service-defined payload argument. |
* @param arg3 Service-defined payload argument. |
* @param arg4 Service-defined payload argument. |
* @param arg5 Service-defined payload argument. |
* @param r1 If non-NULL, storage for the 1st reply argument. |
* @param r2 If non-NULL, storage for the 2nd reply argument. |
* @param r3 If non-NULL, storage for the 3rd reply argument. |
* @param r4 If non-NULL, storage for the 4th reply argument. |
* @param r5 If non-NULL, storage for the 5th reply argument. |
* @return Return code of the reply or a negative error code. |
*/ |
ipcarg_t async_req_slow(int phoneid, ipcarg_t method, ipcarg_t arg1, |
ipcarg_t arg2, ipcarg_t arg3, ipcarg_t arg4, ipcarg_t arg5, ipcarg_t *r1, |
ipcarg_t *r2, ipcarg_t *r3, ipcarg_t *r4, ipcarg_t *r5) |
{ |
ipc_call_t result; |
ipcarg_t rc; |
aid_t eid = async_send_5(phoneid, method, arg1, arg2, arg3, arg4, arg5, |
&result); |
async_wait_for(eid, &rc); |
if (r1) |
*r1 = IPC_GET_ARG1(result); |
if (r2) |
*r2 = IPC_GET_ARG2(result); |
if (r3) |
*r3 = IPC_GET_ARG3(result); |
if (r4) |
*r4 = IPC_GET_ARG4(result); |
if (r5) |
*r5 = IPC_GET_ARG5(result); |
return rc; |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/generic/tls.c |
---|
0,0 → 1,141 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
* |
* Support for thread-local storage, as described in: |
* Drepper U.: ELF Handling For Thread-Local Storage, 2005 |
* |
* Only static model is supported. |
*/ |
#include <tls.h> |
#include <malloc.h> |
#include <string.h> |
#include <align.h> |
/** Create TLS (Thread Local Storage) data structures. |
* |
* The code requires, that sections .tdata and .tbss are adjacent. It may be |
* changed in the future. |
* |
* @return Pointer to TCB. |
*/ |
tcb_t *__make_tls(void) |
{ |
void *data; |
tcb_t *tcb; |
size_t tls_size = &_tbss_end - &_tdata_start; |
tcb = __alloc_tls(&data, tls_size); |
/* |
* Copy thread local data from the initialization image. |
*/ |
memcpy(data, &_tdata_start, &_tdata_end - &_tdata_start); |
/* |
* Zero out the thread local uninitialized data. |
*/ |
memset(data + (&_tbss_start - &_tdata_start), 0, |
&_tbss_end - &_tbss_start); |
return tcb; |
} |
void __free_tls(tcb_t *tcb) |
{ |
size_t tls_size = &_tbss_end - &_tdata_start; |
__free_tls_arch(tcb, tls_size); |
} |
#ifdef CONFIG_TLS_VARIANT_1 |
/** Allocate TLS variant 1 data structures. |
* |
* @param data Start of TLS section. This is an output argument. |
* @param size Size of tdata + tbss section. |
* @return Pointer to tcb_t structure. |
*/ |
tcb_t *tls_alloc_variant_1(void **data, size_t size) |
{ |
tcb_t *result; |
result = malloc(sizeof(tcb_t) + size); |
*data = ((void *)result) + sizeof(tcb_t); |
return result; |
} |
/** Free TLS variant I data structures. |
* |
* @param tcb Pointer to TCB structure. |
* @param size This argument is ignored. |
*/ |
void tls_free_variant_1(tcb_t *tcb, size_t size) |
{ |
free(tcb); |
} |
#endif |
#ifdef CONFIG_TLS_VARIANT_2 |
/** Allocate TLS variant II data structures. |
* |
* @param data Pointer to pointer to thread local data. This is |
* actually an output argument. |
* @param size Size of thread local data. |
* @return Pointer to TCB structure. |
*/ |
tcb_t * tls_alloc_variant_2(void **data, size_t size) |
{ |
tcb_t *tcb; |
size = ALIGN_UP(size, &_tls_alignment); |
*data = memalign(&_tls_alignment, sizeof(tcb_t) + size); |
tcb = (tcb_t *) (*data + size); |
tcb->self = tcb; |
return tcb; |
} |
/** Free TLS variant II data structures. |
* |
* @param tcb Pointer to TCB structure. |
* @param size Size of thread local data. |
*/ |
void tls_free_variant_2(tcb_t *tcb, size_t size) |
{ |
size = ALIGN_UP(size, &_tls_alignment); |
void *start = ((void *) tcb) - size; |
free(start); |
} |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/generic/fibril.c |
---|
0,0 → 1,345 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* Copyright (c) 2007 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#include <libadt/list.h> |
#include <fibril.h> |
#include <thread.h> |
#include <tls.h> |
#include <malloc.h> |
#include <unistd.h> |
#include <stdio.h> |
#include <libarch/faddr.h> |
#include <futex.h> |
#include <assert.h> |
#include <async.h> |
#ifndef FIBRIL_INITIAL_STACK_PAGES_NO |
#define FIBRIL_INITIAL_STACK_PAGES_NO 1 |
#endif |
/** This futex serializes access to ready_list, serialized_list and manage_list. |
*/ |
static atomic_t fibril_futex = FUTEX_INITIALIZER; |
static LIST_INITIALIZE(ready_list); |
static LIST_INITIALIZE(serialized_list); |
static LIST_INITIALIZE(manager_list); |
static void fibril_main(void); |
/** Number of fibrils that are in async_serialized mode */ |
static int serialized_fibrils; /* Protected by async_futex */ |
/** Thread-local count of serialization. If >0, we must not preempt */ |
static __thread int serialization_count; |
/** Counter for fibrils residing in async_manager */ |
static int fibrils_in_manager; |
/** Setup fibril information into TCB structure */ |
fibril_t *fibril_setup(void) |
{ |
fibril_t *f; |
tcb_t *tcb; |
tcb = __make_tls(); |
if (!tcb) |
return NULL; |
f = malloc(sizeof(fibril_t)); |
if (!f) { |
__free_tls(tcb); |
return NULL; |
} |
tcb->fibril_data = f; |
f->tcb = tcb; |
f->func = NULL; |
f->arg = NULL; |
f->stack = NULL; |
f->clean_after_me = NULL; |
f->retval = 0; |
f->flags = 0; |
return f; |
} |
void fibril_teardown(fibril_t *f) |
{ |
__free_tls(f->tcb); |
free(f); |
} |
/** Function that spans the whole life-cycle of a fibril. |
* |
* Each fibril begins execution in this function. Then the function implementing |
* the fibril logic is called. After its return, the return value is saved. |
* The fibril then switches to another fibril, which cleans up after it. |
*/ |
void fibril_main(void) |
{ |
fibril_t *f = __tcb_get()->fibril_data; |
/* Call the implementing function. */ |
f->retval = f->func(f->arg); |
fibril_switch(FIBRIL_FROM_DEAD); |
/* not reached */ |
} |
/** Switch from the current fibril. |
* |
* If calling with FIBRIL_TO_MANAGER parameter, the async_futex should be |
* held. |
* |
* @param stype Switch type. One of FIBRIL_PREEMPT, FIBRIL_TO_MANAGER, |
* FIBRIL_FROM_MANAGER, FIBRIL_FROM_DEAD. The parameter |
* describes the circumstances of the switch. |
* @return Return 0 if there is no ready fibril, |
* return 1 otherwise. |
*/ |
int fibril_switch(fibril_switch_type_t stype) |
{ |
fibril_t *srcf, *dstf; |
int retval = 0; |
futex_down(&fibril_futex); |
if (stype == FIBRIL_PREEMPT && list_empty(&ready_list)) |
goto ret_0; |
if (stype == FIBRIL_FROM_MANAGER) { |
if (list_empty(&ready_list) && list_empty(&serialized_list)) |
goto ret_0; |
/* |
* Do not preempt if there is not sufficient count of fibril |
* managers. |
*/ |
if (list_empty(&serialized_list) && |
fibrils_in_manager <= serialized_fibrils) { |
goto ret_0; |
} |
} |
/* If we are going to manager and none exists, create it */ |
if (stype == FIBRIL_TO_MANAGER || stype == FIBRIL_FROM_DEAD) { |
while (list_empty(&manager_list)) { |
futex_up(&fibril_futex); |
async_create_manager(); |
futex_down(&fibril_futex); |
} |
} |
srcf = __tcb_get()->fibril_data; |
if (stype != FIBRIL_FROM_DEAD) { |
/* Save current state */ |
if (!context_save(&srcf->ctx)) { |
if (serialization_count) |
srcf->flags &= ~FIBRIL_SERIALIZED; |
if (srcf->clean_after_me) { |
/* |
* Cleanup after the dead fibril from which we |
* restored context here. |
*/ |
void *stack = srcf->clean_after_me->stack; |
if (stack) { |
/* |
* This check is necessary because a |
* thread could have exited like a |
* normal fibril using the |
* FIBRIL_FROM_DEAD switch type. In that |
* case, its fibril will not have the |
* stack member filled. |
*/ |
free(stack); |
} |
fibril_teardown(srcf->clean_after_me); |
srcf->clean_after_me = NULL; |
} |
return 1; /* futex_up already done here */ |
} |
/* Save myself to the correct run list */ |
if (stype == FIBRIL_PREEMPT) |
list_append(&srcf->link, &ready_list); |
else if (stype == FIBRIL_FROM_MANAGER) { |
list_append(&srcf->link, &manager_list); |
fibrils_in_manager--; |
} else { |
/* |
* If stype == FIBRIL_TO_MANAGER, don't put ourselves to |
* any list, we should already be somewhere, or we will |
* be lost. |
*/ |
} |
} |
/* Choose a new fibril to run */ |
if (stype == FIBRIL_TO_MANAGER || stype == FIBRIL_FROM_DEAD) { |
dstf = list_get_instance(manager_list.next, fibril_t, link); |
if (serialization_count && stype == FIBRIL_TO_MANAGER) { |
serialized_fibrils++; |
srcf->flags |= FIBRIL_SERIALIZED; |
} |
fibrils_in_manager++; |
if (stype == FIBRIL_FROM_DEAD) |
dstf->clean_after_me = srcf; |
} else { |
if (!list_empty(&serialized_list)) { |
dstf = list_get_instance(serialized_list.next, fibril_t, |
link); |
serialized_fibrils--; |
} else { |
dstf = list_get_instance(ready_list.next, fibril_t, |
link); |
} |
} |
list_remove(&dstf->link); |
futex_up(&fibril_futex); |
context_restore(&dstf->ctx); |
/* not reached */ |
ret_0: |
futex_up(&fibril_futex); |
return retval; |
} |
/** Create a new fibril. |
* |
* @param func Implementing function of the new fibril. |
* @param arg Argument to pass to func. |
* |
* @return Return 0 on failure or TLS of the new fibril. |
*/ |
fid_t fibril_create(int (*func)(void *), void *arg) |
{ |
fibril_t *f; |
f = fibril_setup(); |
if (!f) |
return 0; |
f->stack = (char *) malloc(FIBRIL_INITIAL_STACK_PAGES_NO * |
getpagesize()); |
if (!f->stack) { |
fibril_teardown(f); |
return 0; |
} |
f->func = func; |
f->arg = arg; |
context_save(&f->ctx); |
context_set(&f->ctx, FADDR(fibril_main), f->stack, |
FIBRIL_INITIAL_STACK_PAGES_NO * getpagesize(), f->tcb); |
return (fid_t) f; |
} |
/** Add a fibril to the ready list. |
* |
* @param fid Pinter to the fibril structure of the fibril to be |
* added. |
*/ |
void fibril_add_ready(fid_t fid) |
{ |
fibril_t *f; |
f = (fibril_t *) fid; |
futex_down(&fibril_futex); |
if ((f->flags & FIBRIL_SERIALIZED)) |
list_append(&f->link, &serialized_list); |
else |
list_append(&f->link, &ready_list); |
futex_up(&fibril_futex); |
} |
/** Add a fibril to the manager list. |
* |
* @param fid Pinter to the fibril structure of the fibril to be added. |
*/ |
void fibril_add_manager(fid_t fid) |
{ |
fibril_t *f; |
f = (fibril_t *) fid; |
futex_down(&fibril_futex); |
list_append(&f->link, &manager_list); |
futex_up(&fibril_futex); |
} |
/** Remove one manager from the manager list. */ |
void fibril_remove_manager(void) |
{ |
futex_down(&fibril_futex); |
if (list_empty(&manager_list)) { |
futex_up(&fibril_futex); |
return; |
} |
list_remove(manager_list.next); |
futex_up(&fibril_futex); |
} |
/** Return fibril id of the currently running fibril. |
* |
* @return Fibril ID of the currently running pseudo thread. |
*/ |
fid_t fibril_get_id(void) |
{ |
return (fid_t) __tcb_get()->fibril_data; |
} |
/** Disable preemption |
* |
* If the fibril wants to send several message in a row and does not want to be |
* preempted, it should start async_serialize_start() in the beginning of |
* communication and async_serialize_end() in the end. If it is a true |
* multithreaded application, it should protect the communication channel by a |
* futex as well. Interrupt messages can still be preempted. |
*/ |
void fibril_inc_sercount(void) |
{ |
serialization_count++; |
} |
/** Restore the preemption counter to the previous state. */ |
void fibril_dec_sercount(void) |
{ |
serialization_count--; |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/generic/thread.c |
---|
0,0 → 1,171 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#include <thread.h> |
#include <libc.h> |
#include <stdlib.h> |
#include <libarch/faddr.h> |
#include <kernel/proc/uarg.h> |
#include <fibril.h> |
#include <string.h> |
#include <async.h> |
#ifndef THREAD_INITIAL_STACK_PAGES_NO |
#define THREAD_INITIAL_STACK_PAGES_NO 1 |
#endif |
/** Main thread function. |
* |
* This function is called from __thread_entry() and is used |
* to call the thread's implementing function and perform cleanup |
* and exit when thread returns back. Do not call this function |
* directly. |
* |
* @param uarg Pointer to userspace argument structure. |
*/ |
void __thread_main(uspace_arg_t *uarg) |
{ |
fibril_t *f; |
f = fibril_setup(); |
__tcb_set(f->tcb); |
uarg->uspace_thread_function(uarg->uspace_thread_arg); |
/* XXX: we cannot free the userspace stack while running on it */ |
// free(uarg->uspace_stack); |
// free(uarg); |
/* If there is a manager, destroy it */ |
async_destroy_manager(); |
fibril_teardown(f); |
thread_exit(0); |
} |
/** Create userspace thread. |
* |
* This function creates new userspace thread and allocates userspace |
* stack and userspace argument structure for it. |
* |
* @param function Function implementing the thread. |
* @param arg Argument to be passed to thread. |
* @param name Symbolic name of the thread. |
* @param tid Thread ID of the newly created thread. |
* |
* @return Zero on success or a code from @ref errno.h on failure. |
*/ |
int thread_create(void (* function)(void *), void *arg, char *name, |
thread_id_t *tid) |
{ |
char *stack; |
uspace_arg_t *uarg; |
int rc; |
stack = (char *) malloc(getpagesize() * THREAD_INITIAL_STACK_PAGES_NO); |
if (!stack) |
return -1; |
uarg = (uspace_arg_t *) malloc(sizeof(uspace_arg_t)); |
if (!uarg) { |
free(stack); |
return -1; |
} |
uarg->uspace_entry = (void *) FADDR(__thread_entry); |
uarg->uspace_stack = (void *) stack; |
uarg->uspace_thread_function = function; |
uarg->uspace_thread_arg = arg; |
uarg->uspace_uarg = uarg; |
rc = __SYSCALL3(SYS_THREAD_CREATE, (sysarg_t) uarg, (sysarg_t) name, |
(sysarg_t) tid); |
if (rc) { |
/* |
* Failed to create a new thread. |
* Free up the allocated structures. |
*/ |
free(uarg); |
free(stack); |
} |
return rc; |
} |
/** Terminate current thread. |
* |
* @param status Exit status. Currently not used. |
*/ |
void thread_exit(int status) |
{ |
__SYSCALL1(SYS_THREAD_EXIT, (sysarg_t) status); |
} |
/** Detach thread. |
* |
* Currently not implemented. |
* |
* @param thread TID. |
*/ |
void thread_detach(thread_id_t thread) |
{ |
} |
/** Join thread. |
* |
* Currently not implemented. |
* |
* @param thread TID. |
* |
* @return Thread exit status. |
*/ |
int thread_join(thread_id_t thread) |
{ |
} |
/** Get current thread ID. |
* |
* @return Current thread ID. |
*/ |
thread_id_t thread_get_id(void) |
{ |
thread_id_t thread_id; |
(void) __SYSCALL1(SYS_THREAD_GET_ID, (sysarg_t) &thread_id); |
return thread_id; |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/generic/as.c |
---|
0,0 → 1,186 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#include <as.h> |
#include <libc.h> |
#include <unistd.h> |
#include <align.h> |
#include <sys/types.h> |
#include <bitops.h> |
/** |
* Either 4*256M on 32-bit architecures or 16*256M on 64-bit architectures. |
*/ |
#define MAX_HEAP_SIZE (sizeof(uintptr_t)<<28) |
/** Create address space area. |
* |
* @param address Virtual address where to place new address space area. |
* @param size Size of the area. |
* @param flags Flags describing type of the area. |
* |
* @return address on success, (void *) -1 otherwise. |
*/ |
void *as_area_create(void *address, size_t size, int flags) |
{ |
return (void *) __SYSCALL3(SYS_AS_AREA_CREATE, (sysarg_t ) address, |
(sysarg_t) size, (sysarg_t) flags); |
} |
/** Resize address space area. |
* |
* @param address Virtual address pointing into already existing address space |
* area. |
* @param size New requested size of the area. |
* @param flags Currently unused. |
* |
* @return Zero on success or a code from @ref errno.h on failure. |
*/ |
int as_area_resize(void *address, size_t size, int flags) |
{ |
return __SYSCALL3(SYS_AS_AREA_RESIZE, (sysarg_t ) address, |
(sysarg_t) size, (sysarg_t) flags); |
} |
/** Destroy address space area. |
* |
* @param address Virtual address pointing into the address space area being |
* destroyed. |
* |
* @return Zero on success or a code from @ref errno.h on failure. |
*/ |
int as_area_destroy(void *address) |
{ |
return __SYSCALL1(SYS_AS_AREA_DESTROY, (sysarg_t ) address); |
} |
static size_t heapsize = 0; |
static size_t maxheapsize = (size_t) (-1); |
static void * last_allocated = 0; |
/* Start of heap linker symbol */ |
extern char _heap; |
/** Sbrk emulation |
* |
* @param incr New area that should be allocated or negative, |
if it should be shrinked |
* @return Pointer to newly allocated area |
*/ |
void *sbrk(ssize_t incr) |
{ |
int rc; |
void *res; |
/* Check for invalid values */ |
if (incr < 0 && -incr > heapsize) |
return NULL; |
/* Check for too large value */ |
if (incr > 0 && incr+heapsize < heapsize) |
return NULL; |
/* Check for too small values */ |
if (incr < 0 && incr+heapsize > heapsize) |
return NULL; |
/* Check for user limit */ |
if ((maxheapsize != (size_t) (-1)) && (heapsize + incr) > maxheapsize) |
return NULL; |
rc = as_area_resize(&_heap, heapsize + incr, 0); |
if (rc != 0) |
return NULL; |
/* Compute start of new area */ |
res = (void *) &_heap + heapsize; |
heapsize += incr; |
return res; |
} |
/** Set maximum heap size and return pointer just after the heap */ |
void *set_maxheapsize(size_t mhs) |
{ |
maxheapsize = mhs; |
/* Return pointer to area not managed by sbrk */ |
return ((void *) &_heap + maxheapsize); |
} |
/** Return pointer to some unmapped area, where fits new as_area |
* |
* @param sz Requested size of the allocation. |
* |
* @return Pointer to the beginning |
* |
* TODO: make some first_fit/... algorithm, we are now just incrementing |
* the pointer to last area |
*/ |
void *as_get_mappable_page(size_t sz) |
{ |
void *res; |
uint64_t asz; |
int i; |
if (!sz) |
return NULL; |
asz = 1 << (fnzb64(sz - 1) + 1); |
/* Set heapsize to some meaningful value */ |
if (maxheapsize == -1) |
set_maxheapsize(MAX_HEAP_SIZE); |
/* |
* Make sure we allocate from naturally aligned address. |
*/ |
i = 0; |
if (!last_allocated) { |
last_allocated = (void *) ALIGN_UP((void *) &_heap + |
maxheapsize, asz); |
} else { |
last_allocated = (void *) ALIGN_UP(((uintptr_t) |
last_allocated) + (int) (i > 0), asz); |
} |
res = last_allocated; |
last_allocated += ALIGN_UP(sz, PAGE_SIZE); |
return res; |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/generic/mman.c |
---|
0,0 → 1,60 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#include <sys/mman.h> |
#include <sys/types.h> |
#include <as.h> |
#include <unistd.h> |
void *mmap(void *start, size_t length, int prot, int flags, int fd, |
off_t offset) |
{ |
if (!start) |
start = as_get_mappable_page(length); |
// if (! ((flags & MAP_SHARED) ^ (flags & MAP_PRIVATE))) |
// return MAP_FAILED; |
if (! (flags & MAP_ANONYMOUS)) |
return MAP_FAILED; |
return as_area_create(start, length, prot); |
} |
int munmap(void *start, size_t length) |
{ |
return as_area_destroy(start); |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/generic/ddi.c |
---|
0,0 → 1,91 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#include <ddi.h> |
#include <libc.h> |
#include <task.h> |
#include <kernel/ddi/ddi_arg.h> |
/** Map piece of physical memory to task. |
* |
* Caller of this function must have the CAP_MEM_MANAGER capability. |
* |
* @param pf Physical address of the starting frame. |
* @param vp Virtual address of the sterting page. |
* @param pages Number of pages to map. |
* @param flags Flags for the new address space area. |
* |
* @return 0 on success, EPERM if the caller lacks the CAP_MEM_MANAGER capability, |
* ENOENT if there is no task with specified ID and ENOMEM if there |
* was some problem in creating address space area. |
*/ |
int physmem_map(void *pf, void *vp, unsigned long pages, int flags) |
{ |
return __SYSCALL4(SYS_PHYSMEM_MAP, (sysarg_t) pf, (sysarg_t) vp, pages, flags); |
} |
/** Enable I/O space range to task. |
* |
* Caller of this function must have the IO_MEM_MANAGER capability. |
* |
* @param id Task ID. |
* @param ioaddr Starting address of the I/O range. |
* @param size Size of the range. |
* |
* @return 0 on success, EPERM if the caller lacks the CAP_IO_MANAGER capability, |
* ENOENT if there is no task with specified ID and ENOMEM if there |
* was some problem in allocating memory. |
*/ |
int iospace_enable(task_id_t id, void *ioaddr, unsigned long size) |
{ |
ddi_ioarg_t arg; |
arg.task_id = id; |
arg.ioaddr = ioaddr; |
arg.size = size; |
return __SYSCALL1(SYS_IOSPACE_ENABLE, (sysarg_t) &arg); |
} |
/** Interrupt control |
* |
* @param enable 1 - enable interrupts, 0 - disable interrupts |
*/ |
int preemption_control(int enable) |
{ |
return __SYSCALL1(SYS_PREEMPT_CONTROL, (sysarg_t) enable); |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/generic/task.c |
---|
0,0 → 1,48 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#include <task.h> |
#include <libc.h> |
task_id_t task_get_id(void) |
{ |
task_id_t task_id; |
(void) __SYSCALL1(SYS_TASK_GET_ID, (sysarg_t) &task_id); |
return task_id; |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/generic/cap.c |
---|
0,0 → 1,75 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** |
* @file cap.c |
* @brief Functions to grant/revoke capabilities to/from a task. |
*/ |
#include <cap.h> |
#include <task.h> |
#include <libc.h> |
#include <kernel/syscall/sysarg64.h> |
/** Grant capabilities to a task. |
* |
* @param id Destination task ID. |
* @param caps Capabilities to grant. |
* |
* @return Zero on success or a value from @ref errno.h on failure. |
*/ |
int cap_grant(task_id_t id, unsigned int caps) |
{ |
sysarg64_t arg; |
arg.value = (unsigned long long) id; |
return __SYSCALL2(SYS_CAP_GRANT, (sysarg_t) &arg, (sysarg_t) caps); |
} |
/** Revoke capabilities from a task. |
* |
* @param id Destination task ID. |
* @param caps Capabilities to revoke. |
* |
* @return Zero on success or a value from @ref errno.h on failure. |
*/ |
int cap_revoke(task_id_t id, unsigned int caps) |
{ |
sysarg64_t arg; |
arg.value = (unsigned long long) id; |
return __SYSCALL2(SYS_CAP_REVOKE, (sysarg_t) &arg, (sysarg_t) caps); |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/generic/stdlib.c |
---|
0,0 → 1,50 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#include <stdlib.h> |
static long glbl_seed = 1; |
long int random(void) |
{ |
return glbl_seed = ((1366*glbl_seed + 150889) % RAND_MAX); |
} |
void srandom(unsigned int seed) |
{ |
glbl_seed = seed; |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/generic/err.c |
---|
0,0 → 1,46 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#include <stdio.h> |
#include <stdlib.h> |
/* TODO |
void errx(int __status, __const char *__format, ...) |
{ |
_exit(0); |
} |
*/ |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/generic/sysinfo.c |
---|
0,0 → 1,45 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libc |
* @{ |
*/ |
/** @file |
*/ |
#include <libc.h> |
#include <sysinfo.h> |
#include <string.h> |
sysarg_t sysinfo_value(char *name) |
{ |
return __SYSCALL2(SYS_SYSINFO_VALUE, (sysarg_t ) name, (sysarg_t) strlen(name)); |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/Makefile |
---|
0,0 → 1,118 |
# |
# Copyright (c) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
## Common compiler flags |
# |
LIBC_PREFIX = $(shell pwd) |
SOFTINT_PREFIX = ../softint |
CONSOLE_PREFIX = ../../srv/console |
## Setup toolchain |
# |
include $(LIBC_PREFIX)/Makefile.toolchain |
CFLAGS += -I$(CONSOLE_PREFIX) |
## Sources |
# |
GENERIC_SOURCES = \ |
generic/libc.c \ |
generic/ddi.c \ |
generic/as.c \ |
generic/cap.c \ |
generic/string.c \ |
generic/fibril.c \ |
generic/thread.c \ |
generic/tls.c \ |
generic/task.c \ |
generic/futex.c \ |
generic/io/io.c \ |
generic/io/printf.c \ |
generic/io/stream.c \ |
generic/io/sprintf.c \ |
generic/io/snprintf.c \ |
generic/io/vprintf.c \ |
generic/io/vsprintf.c \ |
generic/io/vsnprintf.c \ |
generic/io/printf_core.c \ |
malloc/malloc.c \ |
generic/sysinfo.c \ |
generic/ipc.c \ |
generic/async.c \ |
generic/libadt/list.o \ |
generic/libadt/hash_table.o \ |
generic/time.c \ |
generic/err.c \ |
generic/stdlib.c \ |
generic/mman.c \ |
generic/vfs/vfs.c \ |
generic/vfs/canonify.c |
ARCH_SOURCES += \ |
arch/$(ARCH)/src/entry.s \ |
arch/$(ARCH)/src/thread_entry.s |
GENERIC_OBJECTS := $(addsuffix .o,$(basename $(GENERIC_SOURCES))) |
ARCH_OBJECTS := $(addsuffix .o,$(basename $(ARCH_SOURCES))) |
.PHONY: all clean depend kerninc |
all: kerninc libc.a arch/$(ARCH)/_link.ld |
kerninc: |
ln -sfn ../../../../kernel/generic/include include/kernel |
ln -sfn kernel/arch include/arch |
ln -sfn ../arch/$(ARCH)/include include/libarch |
-include Makefile.depend |
clean: |
-rm -f include/kernel include/arch include/libarch libc.a arch/$(ARCH)/_link.ld Makefile.depend |
find generic/ arch/$(ARCH)/ -name '*.o' -follow -exec rm \{\} \; |
depend: kerninc |
-makedepend $(DEFS) $(CFLAGS) -f - $(ARCH_SOURCES) $(GENERIC_SOURCES) > Makefile.depend 2> /dev/null |
libc.a: depend $(ARCH_OBJECTS) $(GENERIC_OBJECTS) |
$(AR) rc libc.a $(LIBS) $(ARCH_OBJECTS) $(GENERIC_OBJECTS) |
arch/$(ARCH)/_link.ld: arch/$(ARCH)/_link.ld.in |
$(CC) $(DEFS) $(CFLAGS) -DLIBC_PREFIX=$(LIBC_PREFIX) -E -x c $< | grep -v "^\#" > $@ |
%.o: %.S |
$(CC) $(DEFS) $(AFLAGS) $(CFLAGS) -D__ASM__ -c $< -o $@ |
%.o: %.s |
$(AS) $(AFLAGS) $< -o $@ |
%.o: %.c |
$(CC) $(DEFS) $(CFLAGS) -c $< -o $@ |
/tags/0.3.0/uspace/lib/libc/malloc/malloc.c |
---|
0,0 → 1,4431 |
#include <stdio.h> |
#include <libc.h> |
/* |
This is a version (aka dlmalloc) of malloc/free/realloc written by |
Doug Lea and released to the public domain, as explained at |
http://creativecommons.org/licenses/publicdomain. Send questions, |
comments, complaints, performance data, etc to dl@cs.oswego.edu |
* Version 2.8.3 Thu Sep 22 11:16:15 2005 Doug Lea (dl at gee) |
Note: There may be an updated version of this malloc obtainable at |
ftp://gee.cs.oswego.edu/pub/misc/malloc.c |
Check before installing! |
* Quickstart |
This library is all in one file to simplify the most common usage: |
ftp it, compile it (-O3), and link it into another program. All of |
the compile-time options default to reasonable values for use on |
most platforms. You might later want to step through various |
compile-time and dynamic tuning options. |
For convenience, an include file for code using this malloc is at: |
ftp://gee.cs.oswego.edu/pub/misc/malloc-2.8.3.h |
You don't really need this .h file unless you call functions not |
defined in your system include files. The .h file contains only the |
excerpts from this file needed for using this malloc on ANSI C/C++ |
systems, so long as you haven't changed compile-time options about |
naming and tuning parameters. If you do, then you can create your |
own malloc.h that does include all settings by cutting at the point |
indicated below. Note that you may already by default be using a C |
library containing a malloc that is based on some version of this |
malloc (for example in linux). You might still want to use the one |
in this file to customize settings or to avoid overheads associated |
with library versions. |
* Vital statistics: |
Supported pointer/size_t representation: 4 or 8 bytes |
size_t MUST be an unsigned type of the same width as |
pointers. (If you are using an ancient system that declares |
size_t as a signed type, or need it to be a different width |
than pointers, you can use a previous release of this malloc |
(e.g. 2.7.2) supporting these.) |
Alignment: 8 bytes (default) |
This suffices for nearly all current machines and C compilers. |
However, you can define MALLOC_ALIGNMENT to be wider than this |
if necessary (up to 128bytes), at the expense of using more space. |
Minimum overhead per allocated chunk: 4 or 8 bytes (if 4byte sizes) |
8 or 16 bytes (if 8byte sizes) |
Each malloced chunk has a hidden word of overhead holding size |
and status information, and additional cross-check word |
if FOOTERS is defined. |
Minimum allocated size: 4-byte ptrs: 16 bytes (including overhead) |
8-byte ptrs: 32 bytes (including overhead) |
Even a request for zero bytes (i.e., malloc(0)) returns a |
pointer to something of the minimum allocatable size. |
The maximum overhead wastage (i.e., number of extra bytes |
allocated than were requested in malloc) is less than or equal |
to the minimum size, except for requests >= mmap_threshold that |
are serviced via mmap(), where the worst case wastage is about |
32 bytes plus the remainder from a system page (the minimal |
mmap unit); typically 4096 or 8192 bytes. |
Security: static-safe; optionally more or less |
The "security" of malloc refers to the ability of malicious |
code to accentuate the effects of errors (for example, freeing |
space that is not currently malloc'ed or overwriting past the |
ends of chunks) in code that calls malloc. This malloc |
guarantees not to modify any memory locations below the base of |
heap, i.e., static variables, even in the presence of usage |
errors. The routines additionally detect most improper frees |
and reallocs. All this holds as long as the static bookkeeping |
for malloc itself is not corrupted by some other means. This |
is only one aspect of security -- these checks do not, and |
cannot, detect all possible programming errors. |
If FOOTERS is defined nonzero, then each allocated chunk |
carries an additional check word to verify that it was malloced |
from its space. These check words are the same within each |
execution of a program using malloc, but differ across |
executions, so externally crafted fake chunks cannot be |
freed. This improves security by rejecting frees/reallocs that |
could corrupt heap memory, in addition to the checks preventing |
writes to statics that are always on. This may further improve |
security at the expense of time and space overhead. (Note that |
FOOTERS may also be worth using with MSPACES.) |
By default detected errors cause the program to abort (calling |
"abort()"). You can override this to instead proceed past |
errors by defining PROCEED_ON_ERROR. In this case, a bad free |
has no effect, and a malloc that encounters a bad address |
caused by user overwrites will ignore the bad address by |
dropping pointers and indices to all known memory. This may |
be appropriate for programs that should continue if at all |
possible in the face of programming errors, although they may |
run out of memory because dropped memory is never reclaimed. |
If you don't like either of these options, you can define |
CORRUPTION_ERROR_ACTION and USAGE_ERROR_ACTION to do anything |
else. And if if you are sure that your program using malloc has |
no errors or vulnerabilities, you can define INSECURE to 1, |
which might (or might not) provide a small performance improvement. |
Thread-safety: NOT thread-safe unless USE_LOCKS defined |
When USE_LOCKS is defined, each public call to malloc, free, |
etc is surrounded with either a pthread mutex or a win32 |
spinlock (depending on WIN32). This is not especially fast, and |
can be a major bottleneck. It is designed only to provide |
minimal protection in concurrent environments, and to provide a |
basis for extensions. If you are using malloc in a concurrent |
program, consider instead using ptmalloc, which is derived from |
a version of this malloc. (See http://www.malloc.de). |
System requirements: Any combination of MORECORE and/or MMAP/MUNMAP |
This malloc can use unix sbrk or any emulation (invoked using |
the CALL_MORECORE macro) and/or mmap/munmap or any emulation |
(invoked using CALL_MMAP/CALL_MUNMAP) to get and release system |
memory. On most unix systems, it tends to work best if both |
MORECORE and MMAP are enabled. On Win32, it uses emulations |
based on VirtualAlloc. It also uses common C library functions |
like memset. |
Compliance: I believe it is compliant with the Single Unix Specification |
(See http://www.unix.org). Also SVID/XPG, ANSI C, and probably |
others as well. |
* Overview of algorithms |
This is not the fastest, most space-conserving, most portable, or |
most tunable malloc ever written. However it is among the fastest |
while also being among the most space-conserving, portable and |
tunable. Consistent balance across these factors results in a good |
general-purpose allocator for malloc-intensive programs. |
In most ways, this malloc is a best-fit allocator. Generally, it |
chooses the best-fitting existing chunk for a request, with ties |
broken in approximately least-recently-used order. (This strategy |
normally maintains low fragmentation.) However, for requests less |
than 256bytes, it deviates from best-fit when there is not an |
exactly fitting available chunk by preferring to use space adjacent |
to that used for the previous small request, as well as by breaking |
ties in approximately most-recently-used order. (These enhance |
locality of series of small allocations.) And for very large requests |
(>= 256Kb by default), it relies on system memory mapping |
facilities, if supported. (This helps avoid carrying around and |
possibly fragmenting memory used only for large chunks.) |
All operations (except malloc_stats and mallinfo) have execution |
times that are bounded by a constant factor of the number of bits in |
a size_t, not counting any clearing in calloc or copying in realloc, |
or actions surrounding MORECORE and MMAP that have times |
proportional to the number of non-contiguous regions returned by |
system allocation routines, which is often just 1. |
The implementation is not very modular and seriously overuses |
macros. Perhaps someday all C compilers will do as good a job |
inlining modular code as can now be done by brute-force expansion, |
but now, enough of them seem not to. |
Some compilers issue a lot of warnings about code that is |
dead/unreachable only on some platforms, and also about intentional |
uses of negation on unsigned types. All known cases of each can be |
ignored. |
For a longer but out of date high-level description, see |
http://gee.cs.oswego.edu/dl/html/malloc.html |
* MSPACES |
If MSPACES is defined, then in addition to malloc, free, etc., |
this file also defines mspace_malloc, mspace_free, etc. These |
are versions of malloc routines that take an "mspace" argument |
obtained using create_mspace, to control all internal bookkeeping. |
If ONLY_MSPACES is defined, only these versions are compiled. |
So if you would like to use this allocator for only some allocations, |
and your system malloc for others, you can compile with |
ONLY_MSPACES and then do something like... |
static mspace mymspace = create_mspace(0,0); // for example |
#define mymalloc(bytes) mspace_malloc(mymspace, bytes) |
(Note: If you only need one instance of an mspace, you can instead |
use "USE_DL_PREFIX" to relabel the global malloc.) |
You can similarly create thread-local allocators by storing |
mspaces as thread-locals. For example: |
static __thread mspace tlms = 0; |
void* tlmalloc(size_t bytes) { |
if (tlms == 0) tlms = create_mspace(0, 0); |
return mspace_malloc(tlms, bytes); |
} |
void tlfree(void* mem) { mspace_free(tlms, mem); } |
Unless FOOTERS is defined, each mspace is completely independent. |
You cannot allocate from one and free to another (although |
conformance is only weakly checked, so usage errors are not always |
caught). If FOOTERS is defined, then each chunk carries around a tag |
indicating its originating mspace, and frees are directed to their |
originating spaces. |
------------------------- Compile-time options --------------------------- |
Be careful in setting #define values for numerical constants of type |
size_t. On some systems, literal values are not automatically extended |
to size_t precision unless they are explicitly casted. |
WIN32 default: defined if _WIN32 defined |
Defining WIN32 sets up defaults for MS environment and compilers. |
Otherwise defaults are for unix. |
MALLOC_ALIGNMENT default: (size_t)8 |
Controls the minimum alignment for malloc'ed chunks. It must be a |
power of two and at least 8, even on machines for which smaller |
alignments would suffice. It may be defined as larger than this |
though. Note however that code and data structures are optimized for |
the case of 8-byte alignment. |
MSPACES default: 0 (false) |
If true, compile in support for independent allocation spaces. |
This is only supported if HAVE_MMAP is true. |
ONLY_MSPACES default: 0 (false) |
If true, only compile in mspace versions, not regular versions. |
USE_LOCKS default: 0 (false) |
Causes each call to each public routine to be surrounded with |
pthread or WIN32 mutex lock/unlock. (If set true, this can be |
overridden on a per-mspace basis for mspace versions.) |
FOOTERS default: 0 |
If true, provide extra checking and dispatching by placing |
information in the footers of allocated chunks. This adds |
space and time overhead. |
INSECURE default: 0 |
If true, omit checks for usage errors and heap space overwrites. |
USE_DL_PREFIX default: NOT defined |
Causes compiler to prefix all public routines with the string 'dl'. |
This can be useful when you only want to use this malloc in one part |
of a program, using your regular system malloc elsewhere. |
ABORT default: defined as abort() |
Defines how to abort on failed checks. On most systems, a failed |
check cannot die with an "assert" or even print an informative |
message, because the underlying print routines in turn call malloc, |
which will fail again. Generally, the best policy is to simply call |
abort(). It's not very useful to do more than this because many |
errors due to overwriting will show up as address faults (null, odd |
addresses etc) rather than malloc-triggered checks, so will also |
abort. Also, most compilers know that abort() does not return, so |
can better optimize code conditionally calling it. |
PROCEED_ON_ERROR default: defined as 0 (false) |
Controls whether detected bad addresses cause them to bypassed |
rather than aborting. If set, detected bad arguments to free and |
realloc are ignored. And all bookkeeping information is zeroed out |
upon a detected overwrite of freed heap space, thus losing the |
ability to ever return it from malloc again, but enabling the |
application to proceed. If PROCEED_ON_ERROR is defined, the |
static variable malloc_corruption_error_count is compiled in |
and can be examined to see if errors have occurred. This option |
generates slower code than the default abort policy. |
DEBUG default: NOT defined |
The DEBUG setting is mainly intended for people trying to modify |
this code or diagnose problems when porting to new platforms. |
However, it may also be able to better isolate user errors than just |
using runtime checks. The assertions in the check routines spell |
out in more detail the assumptions and invariants underlying the |
algorithms. The checking is fairly extensive, and will slow down |
execution noticeably. Calling malloc_stats or mallinfo with DEBUG |
set will attempt to check every non-mmapped allocated and free chunk |
in the course of computing the summaries. |
ABORT_ON_ASSERT_FAILURE default: defined as 1 (true) |
Debugging assertion failures can be nearly impossible if your |
version of the assert macro causes malloc to be called, which will |
lead to a cascade of further failures, blowing the runtime stack. |
ABORT_ON_ASSERT_FAILURE cause assertions failures to call abort(), |
which will usually make debugging easier. |
MALLOC_FAILURE_ACTION default: sets errno to ENOMEM, or no-op on win32 |
The action to take before "return 0" when malloc fails to be able to |
return memory because there is none available. |
HAVE_MORECORE default: 1 (true) unless win32 or ONLY_MSPACES |
True if this system supports sbrk or an emulation of it. |
MORECORE default: sbrk |
The name of the sbrk-style system routine to call to obtain more |
memory. See below for guidance on writing custom MORECORE |
functions. The type of the argument to sbrk/MORECORE varies across |
systems. It cannot be size_t, because it supports negative |
arguments, so it is normally the signed type of the same width as |
size_t (sometimes declared as "intptr_t"). It doesn't much matter |
though. Internally, we only call it with arguments less than half |
the max value of a size_t, which should work across all reasonable |
possibilities, although sometimes generating compiler warnings. See |
near the end of this file for guidelines for creating a custom |
version of MORECORE. |
MORECORE_CONTIGUOUS default: 1 (true) |
If true, take advantage of fact that consecutive calls to MORECORE |
with positive arguments always return contiguous increasing |
addresses. This is true of unix sbrk. It does not hurt too much to |
set it true anyway, since malloc copes with non-contiguities. |
Setting it false when definitely non-contiguous saves time |
and possibly wasted space it would take to discover this though. |
MORECORE_CANNOT_TRIM default: NOT defined |
True if MORECORE cannot release space back to the system when given |
negative arguments. This is generally necessary only if you are |
using a hand-crafted MORECORE function that cannot handle negative |
arguments. |
HAVE_MMAP default: 1 (true) |
True if this system supports mmap or an emulation of it. If so, and |
HAVE_MORECORE is not true, MMAP is used for all system |
allocation. If set and HAVE_MORECORE is true as well, MMAP is |
primarily used to directly allocate very large blocks. It is also |
used as a backup strategy in cases where MORECORE fails to provide |
space from system. Note: A single call to MUNMAP is assumed to be |
able to unmap memory that may have be allocated using multiple calls |
to MMAP, so long as they are adjacent. |
HAVE_MREMAP default: 1 on linux, else 0 |
If true realloc() uses mremap() to re-allocate large blocks and |
extend or shrink allocation spaces. |
MMAP_CLEARS default: 1 on unix |
True if mmap clears memory so calloc doesn't need to. This is true |
for standard unix mmap using /dev/zero. |
USE_BUILTIN_FFS default: 0 (i.e., not used) |
Causes malloc to use the builtin ffs() function to compute indices. |
Some compilers may recognize and intrinsify ffs to be faster than the |
supplied C version. Also, the case of x86 using gcc is special-cased |
to an asm instruction, so is already as fast as it can be, and so |
this setting has no effect. (On most x86s, the asm version is only |
slightly faster than the C version.) |
malloc_getpagesize default: derive from system includes, or 4096. |
The system page size. To the extent possible, this malloc manages |
memory from the system in page-size units. This may be (and |
usually is) a function rather than a constant. This is ignored |
if WIN32, where page size is determined using getSystemInfo during |
initialization. |
USE_DEV_RANDOM default: 0 (i.e., not used) |
Causes malloc to use /dev/random to initialize secure magic seed for |
stamping footers. Otherwise, the current time is used. |
NO_MALLINFO default: 0 |
If defined, don't compile "mallinfo". This can be a simple way |
of dealing with mismatches between system declarations and |
those in this file. |
MALLINFO_FIELD_TYPE default: size_t |
The type of the fields in the mallinfo struct. This was originally |
defined as "int" in SVID etc, but is more usefully defined as |
size_t. The value is used only if HAVE_USR_INCLUDE_MALLOC_H is not set |
REALLOC_ZERO_BYTES_FREES default: not defined |
This should be set if a call to realloc with zero bytes should |
be the same as a call to free. Some people think it should. Otherwise, |
since this malloc returns a unique pointer for malloc(0), so does |
realloc(p, 0). |
LACKS_UNISTD_H, LACKS_FCNTL_H, LACKS_SYS_PARAM_H, LACKS_SYS_MMAN_H |
LACKS_STRINGS_H, LACKS_STRING_H, LACKS_SYS_TYPES_H, LACKS_ERRNO_H |
LACKS_STDLIB_H default: NOT defined unless on WIN32 |
Define these if your system does not have these header files. |
You might need to manually insert some of the declarations they provide. |
DEFAULT_GRANULARITY default: page size if MORECORE_CONTIGUOUS, |
system_info.dwAllocationGranularity in WIN32, |
otherwise 64K. |
Also settable using mallopt(M_GRANULARITY, x) |
The unit for allocating and deallocating memory from the system. On |
most systems with contiguous MORECORE, there is no reason to |
make this more than a page. However, systems with MMAP tend to |
either require or encourage larger granularities. You can increase |
this value to prevent system allocation functions to be called so |
often, especially if they are slow. The value must be at least one |
page and must be a power of two. Setting to 0 causes initialization |
to either page size or win32 region size. (Note: In previous |
versions of malloc, the equivalent of this option was called |
"TOP_PAD") |
DEFAULT_TRIM_THRESHOLD default: 2MB |
Also settable using mallopt(M_TRIM_THRESHOLD, x) |
The maximum amount of unused top-most memory to keep before |
releasing via malloc_trim in free(). Automatic trimming is mainly |
useful in long-lived programs using contiguous MORECORE. Because |
trimming via sbrk can be slow on some systems, and can sometimes be |
wasteful (in cases where programs immediately afterward allocate |
more large chunks) the value should be high enough so that your |
overall system performance would improve by releasing this much |
memory. As a rough guide, you might set to a value close to the |
average size of a process (program) running on your system. |
Releasing this much memory would allow such a process to run in |
memory. Generally, it is worth tuning trim thresholds when a |
program undergoes phases where several large chunks are allocated |
and released in ways that can reuse each other's storage, perhaps |
mixed with phases where there are no such chunks at all. The trim |
value must be greater than page size to have any useful effect. To |
disable trimming completely, you can set to MAX_SIZE_T. Note that the trick |
some people use of mallocing a huge space and then freeing it at |
program startup, in an attempt to reserve system memory, doesn't |
have the intended effect under automatic trimming, since that memory |
will immediately be returned to the system. |
DEFAULT_MMAP_THRESHOLD default: 256K |
Also settable using mallopt(M_MMAP_THRESHOLD, x) |
The request size threshold for using MMAP to directly service a |
request. Requests of at least this size that cannot be allocated |
using already-existing space will be serviced via mmap. (If enough |
normal freed space already exists it is used instead.) Using mmap |
segregates relatively large chunks of memory so that they can be |
individually obtained and released from the host system. A request |
serviced through mmap is never reused by any other request (at least |
not directly; the system may just so happen to remap successive |
requests to the same locations). Segregating space in this way has |
the benefits that: Mmapped space can always be individually released |
back to the system, which helps keep the system level memory demands |
of a long-lived program low. Also, mapped memory doesn't become |
`locked' between other chunks, as can happen with normally allocated |
chunks, which means that even trimming via malloc_trim would not |
release them. However, it has the disadvantage that the space |
cannot be reclaimed, consolidated, and then used to service later |
requests, as happens with normal chunks. The advantages of mmap |
nearly always outweigh disadvantages for "large" chunks, but the |
value of "large" may vary across systems. The default is an |
empirically derived value that works well in most systems. You can |
disable mmap by setting to MAX_SIZE_T. |
*/ |
/** @addtogroup libcmalloc malloc |
* @brief Malloc originally written by Doug Lea and ported to HelenOS. |
* @ingroup libc |
* @{ |
*/ |
/** @file |
*/ |
#include <sys/types.h> /* For size_t */ |
/** Non-default helenos customizations */ |
#define LACKS_FCNTL_H |
#define LACKS_SYS_MMAN_H |
#define LACKS_SYS_PARAM_H |
#undef HAVE_MMAP |
#define HAVE_MMAP 0 |
#define LACKS_ERRNO_H |
/* Set errno? */ |
#undef MALLOC_FAILURE_ACTION |
#define MALLOC_FAILURE_ACTION |
/* The maximum possible size_t value has all bits set */ |
#define MAX_SIZE_T (~(size_t)0) |
#define ONLY_MSPACES 0 |
#define MSPACES 0 |
#ifdef MALLOC_ALIGNMENT_16 |
#define MALLOC_ALIGNMENT ((size_t)16U) |
#else |
#define MALLOC_ALIGNMENT ((size_t)8U) |
#endif |
#define FOOTERS 0 |
#define ABORT \ |
{ \ |
DEBUG("%s abort in %s on line %d\n", __FILE__, __func__, __LINE__); \ |
abort(); \ |
} |
#define ABORT_ON_ASSERT_FAILURE 1 |
#define PROCEED_ON_ERROR 0 |
#define USE_LOCKS 1 |
#define INSECURE 0 |
#define HAVE_MMAP 0 |
#define MMAP_CLEARS 1 |
#define HAVE_MORECORE 1 |
#define MORECORE_CONTIGUOUS 1 |
#define MORECORE sbrk |
#define DEFAULT_GRANULARITY (0) /* 0 means to compute in init_mparams */ |
#ifndef DEFAULT_TRIM_THRESHOLD |
#ifndef MORECORE_CANNOT_TRIM |
#define DEFAULT_TRIM_THRESHOLD ((size_t)2U * (size_t)1024U * (size_t)1024U) |
#else /* MORECORE_CANNOT_TRIM */ |
#define DEFAULT_TRIM_THRESHOLD MAX_SIZE_T |
#endif /* MORECORE_CANNOT_TRIM */ |
#endif /* DEFAULT_TRIM_THRESHOLD */ |
#ifndef DEFAULT_MMAP_THRESHOLD |
#if HAVE_MMAP |
#define DEFAULT_MMAP_THRESHOLD ((size_t)256U * (size_t)1024U) |
#else /* HAVE_MMAP */ |
#define DEFAULT_MMAP_THRESHOLD MAX_SIZE_T |
#endif /* HAVE_MMAP */ |
#endif /* DEFAULT_MMAP_THRESHOLD */ |
#ifndef USE_BUILTIN_FFS |
#define USE_BUILTIN_FFS 0 |
#endif /* USE_BUILTIN_FFS */ |
#ifndef USE_DEV_RANDOM |
#define USE_DEV_RANDOM 0 |
#endif /* USE_DEV_RANDOM */ |
#ifndef NO_MALLINFO |
#define NO_MALLINFO 0 |
#endif /* NO_MALLINFO */ |
#ifndef MALLINFO_FIELD_TYPE |
#define MALLINFO_FIELD_TYPE size_t |
#endif /* MALLINFO_FIELD_TYPE */ |
/* |
mallopt tuning options. SVID/XPG defines four standard parameter |
numbers for mallopt, normally defined in malloc.h. None of these |
are used in this malloc, so setting them has no effect. But this |
malloc does support the following options. |
*/ |
#define M_TRIM_THRESHOLD (-1) |
#define M_GRANULARITY (-2) |
#define M_MMAP_THRESHOLD (-3) |
/* |
======================================================================== |
To make a fully customizable malloc.h header file, cut everything |
above this line, put into file malloc.h, edit to suit, and #include it |
on the next line, as well as in programs that use this malloc. |
======================================================================== |
*/ |
#include "malloc.h" |
/*------------------------------ internal #includes ---------------------- */ |
#include <stdio.h> /* for printing in malloc_stats */ |
#include <string.h> |
#ifndef LACKS_ERRNO_H |
#include <errno.h> /* for MALLOC_FAILURE_ACTION */ |
#endif /* LACKS_ERRNO_H */ |
#if FOOTERS |
#include <time.h> /* for magic initialization */ |
#endif /* FOOTERS */ |
#ifndef LACKS_STDLIB_H |
#include <stdlib.h> /* for abort() */ |
#endif /* LACKS_STDLIB_H */ |
#ifdef DEBUG |
#if ABORT_ON_ASSERT_FAILURE |
#define assert(x) {if(!(x)) {DEBUG(#x);ABORT;}} |
#else /* ABORT_ON_ASSERT_FAILURE */ |
#include <assert.h> |
#endif /* ABORT_ON_ASSERT_FAILURE */ |
#else /* DEBUG */ |
#define assert(x) |
#endif /* DEBUG */ |
#if USE_BUILTIN_FFS |
#ifndef LACKS_STRINGS_H |
#include <strings.h> /* for ffs */ |
#endif /* LACKS_STRINGS_H */ |
#endif /* USE_BUILTIN_FFS */ |
#if HAVE_MMAP |
#ifndef LACKS_SYS_MMAN_H |
#include <sys/mman.h> /* for mmap */ |
#endif /* LACKS_SYS_MMAN_H */ |
#ifndef LACKS_FCNTL_H |
#include <fcntl.h> |
#endif /* LACKS_FCNTL_H */ |
#endif /* HAVE_MMAP */ |
#if HAVE_MORECORE |
#ifndef LACKS_UNISTD_H |
#include <unistd.h> /* for sbrk */ |
#else /* LACKS_UNISTD_H */ |
#if !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__NetBSD__) |
extern void* sbrk(ptrdiff_t); |
#endif /* FreeBSD etc */ |
#endif /* LACKS_UNISTD_H */ |
#endif /* HAVE_MMAP */ |
#ifndef WIN32 |
#ifndef malloc_getpagesize |
# ifdef _SC_PAGESIZE /* some SVR4 systems omit an underscore */ |
# ifndef _SC_PAGE_SIZE |
# define _SC_PAGE_SIZE _SC_PAGESIZE |
# endif |
# endif |
# ifdef _SC_PAGE_SIZE |
# define malloc_getpagesize sysconf(_SC_PAGE_SIZE) |
# else |
# if defined(BSD) || defined(DGUX) || defined(HAVE_GETPAGESIZE) |
extern size_t getpagesize(); |
# define malloc_getpagesize getpagesize() |
# else |
# ifdef WIN32 /* use supplied emulation of getpagesize */ |
# define malloc_getpagesize getpagesize() |
# else |
# ifndef LACKS_SYS_PARAM_H |
# include <sys/param.h> |
# endif |
# ifdef EXEC_PAGESIZE |
# define malloc_getpagesize EXEC_PAGESIZE |
# else |
# ifdef NBPG |
# ifndef CLSIZE |
# define malloc_getpagesize NBPG |
# else |
# define malloc_getpagesize (NBPG * CLSIZE) |
# endif |
# else |
# ifdef NBPC |
# define malloc_getpagesize NBPC |
# else |
# ifdef PAGESIZE |
# define malloc_getpagesize PAGESIZE |
# else /* just guess */ |
# define malloc_getpagesize ((size_t)4096U) |
# endif |
# endif |
# endif |
# endif |
# endif |
# endif |
# endif |
#endif |
#endif |
/* ------------------- size_t and alignment properties -------------------- */ |
/* The byte and bit size of a size_t */ |
#define SIZE_T_SIZE (sizeof(size_t)) |
#define SIZE_T_BITSIZE (sizeof(size_t) << 3) |
/* Some constants coerced to size_t */ |
/* Annoying but necessary to avoid errors on some plaftorms */ |
#define SIZE_T_ZERO ((size_t)0) |
#define SIZE_T_ONE ((size_t)1) |
#define SIZE_T_TWO ((size_t)2) |
#define TWO_SIZE_T_SIZES (SIZE_T_SIZE<<1) |
#define FOUR_SIZE_T_SIZES (SIZE_T_SIZE<<2) |
#define SIX_SIZE_T_SIZES (FOUR_SIZE_T_SIZES+TWO_SIZE_T_SIZES) |
#define HALF_MAX_SIZE_T (MAX_SIZE_T / 2U) |
/* The bit mask value corresponding to MALLOC_ALIGNMENT */ |
#define CHUNK_ALIGN_MASK (MALLOC_ALIGNMENT - SIZE_T_ONE) |
/* True if address a has acceptable alignment */ |
#define is_aligned(A) (((size_t)((A)) & (CHUNK_ALIGN_MASK)) == 0) |
/* the number of bytes to offset an address to align it */ |
#define align_offset(A)\ |
((((size_t)(A) & CHUNK_ALIGN_MASK) == 0)? 0 :\ |
((MALLOC_ALIGNMENT - ((size_t)(A) & CHUNK_ALIGN_MASK)) & CHUNK_ALIGN_MASK)) |
/* -------------------------- MMAP preliminaries ------------------------- */ |
/* |
If HAVE_MORECORE or HAVE_MMAP are false, we just define calls and |
checks to fail so compiler optimizer can delete code rather than |
using so many "#if"s. |
*/ |
/* MORECORE and MMAP must return MFAIL on failure */ |
#define MFAIL ((void*)(MAX_SIZE_T)) |
#define CMFAIL ((char*)(MFAIL)) /* defined for convenience */ |
#if !HAVE_MMAP |
#define IS_MMAPPED_BIT (SIZE_T_ZERO) |
#define USE_MMAP_BIT (SIZE_T_ZERO) |
#define CALL_MMAP(s) MFAIL |
#define CALL_MUNMAP(a, s) (-1) |
#define DIRECT_MMAP(s) MFAIL |
#else /* HAVE_MMAP */ |
#define IS_MMAPPED_BIT (SIZE_T_ONE) |
#define USE_MMAP_BIT (SIZE_T_ONE) |
#ifndef WIN32 |
#define CALL_MUNMAP(a, s) munmap((a), (s)) |
#define MMAP_PROT (PROT_READ|PROT_WRITE) |
#if !defined(MAP_ANONYMOUS) && defined(MAP_ANON) |
#define MAP_ANONYMOUS MAP_ANON |
#endif /* MAP_ANON */ |
#ifdef MAP_ANONYMOUS |
#define MMAP_FLAGS (MAP_PRIVATE|MAP_ANONYMOUS) |
#define CALL_MMAP(s) mmap(0, (s), MMAP_PROT, MMAP_FLAGS, -1, 0) |
#else /* MAP_ANONYMOUS */ |
/* |
Nearly all versions of mmap support MAP_ANONYMOUS, so the following |
is unlikely to be needed, but is supplied just in case. |
*/ |
#define MMAP_FLAGS (MAP_PRIVATE) |
static int dev_zero_fd = -1; /* Cached file descriptor for /dev/zero. */ |
#define CALL_MMAP(s) ((dev_zero_fd < 0) ? \ |
(dev_zero_fd = open("/dev/zero", O_RDWR), \ |
mmap(0, (s), MMAP_PROT, MMAP_FLAGS, dev_zero_fd, 0)) : \ |
mmap(0, (s), MMAP_PROT, MMAP_FLAGS, dev_zero_fd, 0)) |
#endif /* MAP_ANONYMOUS */ |
#define DIRECT_MMAP(s) CALL_MMAP(s) |
#else /* WIN32 */ |
/* Win32 MMAP via VirtualAlloc */ |
static void* win32mmap(size_t size) { |
void* ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE); |
return (ptr != 0)? ptr: MFAIL; |
} |
/* For direct MMAP, use MEM_TOP_DOWN to minimize interference */ |
static void* win32direct_mmap(size_t size) { |
void* ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT|MEM_TOP_DOWN, |
PAGE_READWRITE); |
return (ptr != 0)? ptr: MFAIL; |
} |
/* This function supports releasing coalesed segments */ |
static int win32munmap(void* ptr, size_t size) { |
MEMORY_BASIC_INFORMATION minfo; |
char* cptr = ptr; |
while (size) { |
if (VirtualQuery(cptr, &minfo, sizeof(minfo)) == 0) |
return -1; |
if (minfo.BaseAddress != cptr || minfo.AllocationBase != cptr || |
minfo.State != MEM_COMMIT || minfo.RegionSize > size) |
return -1; |
if (VirtualFree(cptr, 0, MEM_RELEASE) == 0) |
return -1; |
cptr += minfo.RegionSize; |
size -= minfo.RegionSize; |
} |
return 0; |
} |
#define CALL_MMAP(s) win32mmap(s) |
#define CALL_MUNMAP(a, s) win32munmap((a), (s)) |
#define DIRECT_MMAP(s) win32direct_mmap(s) |
#endif /* WIN32 */ |
#endif /* HAVE_MMAP */ |
#if HAVE_MMAP && HAVE_MREMAP |
#define CALL_MREMAP(addr, osz, nsz, mv) mremap((addr), (osz), (nsz), (mv)) |
#else /* HAVE_MMAP && HAVE_MREMAP */ |
#define CALL_MREMAP(addr, osz, nsz, mv) MFAIL |
#endif /* HAVE_MMAP && HAVE_MREMAP */ |
#if HAVE_MORECORE |
#define CALL_MORECORE(S) MORECORE(S) |
#else /* HAVE_MORECORE */ |
#define CALL_MORECORE(S) MFAIL |
#endif /* HAVE_MORECORE */ |
/* mstate bit set if continguous morecore disabled or failed */ |
#define USE_NONCONTIGUOUS_BIT (4U) |
/* segment bit set in create_mspace_with_base */ |
#define EXTERN_BIT (8U) |
/* --------------------------- Lock preliminaries ------------------------ */ |
#if USE_LOCKS |
/* |
When locks are defined, there are up to two global locks: |
* If HAVE_MORECORE, morecore_mutex protects sequences of calls to |
MORECORE. In many cases sys_alloc requires two calls, that should |
not be interleaved with calls by other threads. This does not |
protect against direct calls to MORECORE by other threads not |
using this lock, so there is still code to cope the best we can on |
interference. |
* magic_init_mutex ensures that mparams.magic and other |
unique mparams values are initialized only once. |
*/ |
/* By default use posix locks */ |
#include <futex.h> |
#define MLOCK_T atomic_t |
#define INITIAL_LOCK(l) futex_initialize(l, 1) |
/* futex_down cannot fail, but can return different |
* retvals for OK |
*/ |
#define ACQUIRE_LOCK(l) ({futex_down(l);0;}) |
#define RELEASE_LOCK(l) futex_up(l) |
#if HAVE_MORECORE |
static MLOCK_T morecore_mutex = FUTEX_INITIALIZER; |
#endif /* HAVE_MORECORE */ |
static MLOCK_T magic_init_mutex = FUTEX_INITIALIZER; |
#define USE_LOCK_BIT (2U) |
#else /* USE_LOCKS */ |
#define USE_LOCK_BIT (0U) |
#define INITIAL_LOCK(l) |
#endif /* USE_LOCKS */ |
#if USE_LOCKS && HAVE_MORECORE |
#define ACQUIRE_MORECORE_LOCK() ACQUIRE_LOCK(&morecore_mutex); |
#define RELEASE_MORECORE_LOCK() RELEASE_LOCK(&morecore_mutex); |
#else /* USE_LOCKS && HAVE_MORECORE */ |
#define ACQUIRE_MORECORE_LOCK() |
#define RELEASE_MORECORE_LOCK() |
#endif /* USE_LOCKS && HAVE_MORECORE */ |
#if USE_LOCKS |
#define ACQUIRE_MAGIC_INIT_LOCK() ACQUIRE_LOCK(&magic_init_mutex); |
#define RELEASE_MAGIC_INIT_LOCK() RELEASE_LOCK(&magic_init_mutex); |
#else /* USE_LOCKS */ |
#define ACQUIRE_MAGIC_INIT_LOCK() |
#define RELEASE_MAGIC_INIT_LOCK() |
#endif /* USE_LOCKS */ |
/* ----------------------- Chunk representations ------------------------ */ |
/* |
(The following includes lightly edited explanations by Colin Plumb.) |
The malloc_chunk declaration below is misleading (but accurate and |
necessary). It declares a "view" into memory allowing access to |
necessary fields at known offsets from a given base. |
Chunks of memory are maintained using a `boundary tag' method as |
originally described by Knuth. (See the paper by Paul Wilson |
ftp://ftp.cs.utexas.edu/pub/garbage/allocsrv.ps for a survey of such |
techniques.) Sizes of free chunks are stored both in the front of |
each chunk and at the end. This makes consolidating fragmented |
chunks into bigger chunks fast. The head fields also hold bits |
representing whether chunks are free or in use. |
Here are some pictures to make it clearer. They are "exploded" to |
show that the state of a chunk can be thought of as extending from |
the high 31 bits of the head field of its header through the |
prev_foot and PINUSE_BIT bit of the following chunk header. |
A chunk that's in use looks like: |
chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| Size of previous chunk (if P = 1) | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |P| |
| Size of this chunk 1| +-+ |
mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| | |
+- -+ |
| | |
+- -+ |
| : |
+- size - sizeof(size_t) available payload bytes -+ |
: | |
chunk-> +- -+ |
| | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |1| |
| Size of next chunk (may or may not be in use) | +-+ |
mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
And if it's free, it looks like this: |
chunk-> +- -+ |
| User payload (must be in use, or we would have merged!) | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |P| |
| Size of this chunk 0| +-+ |
mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| Next pointer | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| Prev pointer | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| : |
+- size - sizeof(struct chunk) unused bytes -+ |
: | |
chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| Size of this chunk | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |0| |
| Size of next chunk (must be in use, or we would have merged)| +-+ |
mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| : |
+- User payload -+ |
: | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
|0| |
+-+ |
Note that since we always merge adjacent free chunks, the chunks |
adjacent to a free chunk must be in use. |
Given a pointer to a chunk (which can be derived trivially from the |
payload pointer) we can, in O(1) time, find out whether the adjacent |
chunks are free, and if so, unlink them from the lists that they |
are on and merge them with the current chunk. |
Chunks always begin on even word boundaries, so the mem portion |
(which is returned to the user) is also on an even word boundary, and |
thus at least double-word aligned. |
The P (PINUSE_BIT) bit, stored in the unused low-order bit of the |
chunk size (which is always a multiple of two words), is an in-use |
bit for the *previous* chunk. If that bit is *clear*, then the |
word before the current chunk size contains the previous chunk |
size, and can be used to find the front of the previous chunk. |
The very first chunk allocated always has this bit set, preventing |
access to non-existent (or non-owned) memory. If pinuse is set for |
any given chunk, then you CANNOT determine the size of the |
previous chunk, and might even get a memory addressing fault when |
trying to do so. |
The C (CINUSE_BIT) bit, stored in the unused second-lowest bit of |
the chunk size redundantly records whether the current chunk is |
inuse. This redundancy enables usage checks within free and realloc, |
and reduces indirection when freeing and consolidating chunks. |
Each freshly allocated chunk must have both cinuse and pinuse set. |
That is, each allocated chunk borders either a previously allocated |
and still in-use chunk, or the base of its memory arena. This is |
ensured by making all allocations from the the `lowest' part of any |
found chunk. Further, no free chunk physically borders another one, |
so each free chunk is known to be preceded and followed by either |
inuse chunks or the ends of memory. |
Note that the `foot' of the current chunk is actually represented |
as the prev_foot of the NEXT chunk. This makes it easier to |
deal with alignments etc but can be very confusing when trying |
to extend or adapt this code. |
The exceptions to all this are |
1. The special chunk `top' is the top-most available chunk (i.e., |
the one bordering the end of available memory). It is treated |
specially. Top is never included in any bin, is used only if |
no other chunk is available, and is released back to the |
system if it is very large (see M_TRIM_THRESHOLD). In effect, |
the top chunk is treated as larger (and thus less well |
fitting) than any other available chunk. The top chunk |
doesn't update its trailing size field since there is no next |
contiguous chunk that would have to index off it. However, |
space is still allocated for it (TOP_FOOT_SIZE) to enable |
separation or merging when space is extended. |
3. Chunks allocated via mmap, which have the lowest-order bit |
(IS_MMAPPED_BIT) set in their prev_foot fields, and do not set |
PINUSE_BIT in their head fields. Because they are allocated |
one-by-one, each must carry its own prev_foot field, which is |
also used to hold the offset this chunk has within its mmapped |
region, which is needed to preserve alignment. Each mmapped |
chunk is trailed by the first two fields of a fake next-chunk |
for sake of usage checks. |
*/ |
struct malloc_chunk { |
size_t prev_foot; /* Size of previous chunk (if free). */ |
size_t head; /* Size and inuse bits. */ |
struct malloc_chunk* fd; /* double links -- used only if free. */ |
struct malloc_chunk* bk; |
}; |
typedef struct malloc_chunk mchunk; |
typedef struct malloc_chunk* mchunkptr; |
typedef struct malloc_chunk* sbinptr; /* The type of bins of chunks */ |
typedef unsigned int bindex_t; /* Described below */ |
typedef unsigned int binmap_t; /* Described below */ |
typedef unsigned int flag_t; /* The type of various bit flag sets */ |
/* ------------------- Chunks sizes and alignments ----------------------- */ |
#define MCHUNK_SIZE (sizeof(mchunk)) |
#if FOOTERS |
#define CHUNK_OVERHEAD (TWO_SIZE_T_SIZES) |
#else /* FOOTERS */ |
#define CHUNK_OVERHEAD (SIZE_T_SIZE) |
#endif /* FOOTERS */ |
/* MMapped chunks need a second word of overhead ... */ |
#define MMAP_CHUNK_OVERHEAD (TWO_SIZE_T_SIZES) |
/* ... and additional padding for fake next-chunk at foot */ |
#define MMAP_FOOT_PAD (FOUR_SIZE_T_SIZES) |
/* The smallest size we can malloc is an aligned minimal chunk */ |
#define MIN_CHUNK_SIZE\ |
((MCHUNK_SIZE + CHUNK_ALIGN_MASK) & ~CHUNK_ALIGN_MASK) |
/* conversion from malloc headers to user pointers, and back */ |
#define chunk2mem(p) ((void*)((char*)(p) + TWO_SIZE_T_SIZES)) |
#define mem2chunk(mem) ((mchunkptr)((char*)(mem) - TWO_SIZE_T_SIZES)) |
/* chunk associated with aligned address A */ |
#define align_as_chunk(A) (mchunkptr)((A) + align_offset(chunk2mem(A))) |
/* Bounds on request (not chunk) sizes. */ |
#define MAX_REQUEST ((-MIN_CHUNK_SIZE) << 2) |
#define MIN_REQUEST (MIN_CHUNK_SIZE - CHUNK_OVERHEAD - SIZE_T_ONE) |
/* pad request bytes into a usable size */ |
#define pad_request(req) \ |
(((req) + CHUNK_OVERHEAD + CHUNK_ALIGN_MASK) & ~CHUNK_ALIGN_MASK) |
/* pad request, checking for minimum (but not maximum) */ |
#define request2size(req) \ |
(((req) < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(req)) |
/* ------------------ Operations on head and foot fields ----------------- */ |
/* |
The head field of a chunk is or'ed with PINUSE_BIT when previous |
adjacent chunk in use, and or'ed with CINUSE_BIT if this chunk is in |
use. If the chunk was obtained with mmap, the prev_foot field has |
IS_MMAPPED_BIT set, otherwise holding the offset of the base of the |
mmapped region to the base of the chunk. |
*/ |
#define PINUSE_BIT (SIZE_T_ONE) |
#define CINUSE_BIT (SIZE_T_TWO) |
#define INUSE_BITS (PINUSE_BIT|CINUSE_BIT) |
/* Head value for fenceposts */ |
#define FENCEPOST_HEAD (INUSE_BITS|SIZE_T_SIZE) |
/* extraction of fields from head words */ |
#define cinuse(p) ((p)->head & CINUSE_BIT) |
#define pinuse(p) ((p)->head & PINUSE_BIT) |
#define chunksize(p) ((p)->head & ~(INUSE_BITS)) |
#define clear_pinuse(p) ((p)->head &= ~PINUSE_BIT) |
#define clear_cinuse(p) ((p)->head &= ~CINUSE_BIT) |
/* Treat space at ptr +/- offset as a chunk */ |
#define chunk_plus_offset(p, s) ((mchunkptr)(((char*)(p)) + (s))) |
#define chunk_minus_offset(p, s) ((mchunkptr)(((char*)(p)) - (s))) |
/* Ptr to next or previous physical malloc_chunk. */ |
#define next_chunk(p) ((mchunkptr)( ((char*)(p)) + ((p)->head & ~INUSE_BITS))) |
#define prev_chunk(p) ((mchunkptr)( ((char*)(p)) - ((p)->prev_foot) )) |
/* extract next chunk's pinuse bit */ |
#define next_pinuse(p) ((next_chunk(p)->head) & PINUSE_BIT) |
/* Get/set size at footer */ |
#define get_foot(p, s) (((mchunkptr)((char*)(p) + (s)))->prev_foot) |
#define set_foot(p, s) (((mchunkptr)((char*)(p) + (s)))->prev_foot = (s)) |
/* Set size, pinuse bit, and foot */ |
#define set_size_and_pinuse_of_free_chunk(p, s)\ |
((p)->head = (s|PINUSE_BIT), set_foot(p, s)) |
/* Set size, pinuse bit, foot, and clear next pinuse */ |
#define set_free_with_pinuse(p, s, n)\ |
(clear_pinuse(n), set_size_and_pinuse_of_free_chunk(p, s)) |
#define is_mmapped(p)\ |
(!((p)->head & PINUSE_BIT) && ((p)->prev_foot & IS_MMAPPED_BIT)) |
/* Get the internal overhead associated with chunk p */ |
#define overhead_for(p)\ |
(is_mmapped(p)? MMAP_CHUNK_OVERHEAD : CHUNK_OVERHEAD) |
/* Return true if malloced space is not necessarily cleared */ |
#if MMAP_CLEARS |
#define calloc_must_clear(p) (!is_mmapped(p)) |
#else /* MMAP_CLEARS */ |
#define calloc_must_clear(p) (1) |
#endif /* MMAP_CLEARS */ |
/* ---------------------- Overlaid data structures ----------------------- */ |
/* |
When chunks are not in use, they are treated as nodes of either |
lists or trees. |
"Small" chunks are stored in circular doubly-linked lists, and look |
like this: |
chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| Size of previous chunk | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
`head:' | Size of chunk, in bytes |P| |
mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| Forward pointer to next chunk in list | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| Back pointer to previous chunk in list | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| Unused space (may be 0 bytes long) . |
. . |
. | |
nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
`foot:' | Size of chunk, in bytes | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
Larger chunks are kept in a form of bitwise digital trees (aka |
tries) keyed on chunksizes. Because malloc_tree_chunks are only for |
free chunks greater than 256 bytes, their size doesn't impose any |
constraints on user chunk sizes. Each node looks like: |
chunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| Size of previous chunk | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
`head:' | Size of chunk, in bytes |P| |
mem-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| Forward pointer to next chunk of same size | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| Back pointer to previous chunk of same size | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| Pointer to left child (child[0]) | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| Pointer to right child (child[1]) | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| Pointer to parent | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| bin index of this chunk | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| Unused space . |
. | |
nextchunk-> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
`foot:' | Size of chunk, in bytes | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
Each tree holding treenodes is a tree of unique chunk sizes. Chunks |
of the same size are arranged in a circularly-linked list, with only |
the oldest chunk (the next to be used, in our FIFO ordering) |
actually in the tree. (Tree members are distinguished by a non-null |
parent pointer.) If a chunk with the same size an an existing node |
is inserted, it is linked off the existing node using pointers that |
work in the same way as fd/bk pointers of small chunks. |
Each tree contains a power of 2 sized range of chunk sizes (the |
smallest is 0x100 <= x < 0x180), which is is divided in half at each |
tree level, with the chunks in the smaller half of the range (0x100 |
<= x < 0x140 for the top nose) in the left subtree and the larger |
half (0x140 <= x < 0x180) in the right subtree. This is, of course, |
done by inspecting individual bits. |
Using these rules, each node's left subtree contains all smaller |
sizes than its right subtree. However, the node at the root of each |
subtree has no particular ordering relationship to either. (The |
dividing line between the subtree sizes is based on trie relation.) |
If we remove the last chunk of a given size from the interior of the |
tree, we need to replace it with a leaf node. The tree ordering |
rules permit a node to be replaced by any leaf below it. |
The smallest chunk in a tree (a common operation in a best-fit |
allocator) can be found by walking a path to the leftmost leaf in |
the tree. Unlike a usual binary tree, where we follow left child |
pointers until we reach a null, here we follow the right child |
pointer any time the left one is null, until we reach a leaf with |
both child pointers null. The smallest chunk in the tree will be |
somewhere along that path. |
The worst case number of steps to add, find, or remove a node is |
bounded by the number of bits differentiating chunks within |
bins. Under current bin calculations, this ranges from 6 up to 21 |
(for 32 bit sizes) or up to 53 (for 64 bit sizes). The typical case |
is of course much better. |
*/ |
struct malloc_tree_chunk { |
/* The first four fields must be compatible with malloc_chunk */ |
size_t prev_foot; |
size_t head; |
struct malloc_tree_chunk* fd; |
struct malloc_tree_chunk* bk; |
struct malloc_tree_chunk* child[2]; |
struct malloc_tree_chunk* parent; |
bindex_t index; |
}; |
typedef struct malloc_tree_chunk tchunk; |
typedef struct malloc_tree_chunk* tchunkptr; |
typedef struct malloc_tree_chunk* tbinptr; /* The type of bins of trees */ |
/* A little helper macro for trees */ |
#define leftmost_child(t) ((t)->child[0] != 0? (t)->child[0] : (t)->child[1]) |
/* ----------------------------- Segments -------------------------------- */ |
/* |
Each malloc space may include non-contiguous segments, held in a |
list headed by an embedded malloc_segment record representing the |
top-most space. Segments also include flags holding properties of |
the space. Large chunks that are directly allocated by mmap are not |
included in this list. They are instead independently created and |
destroyed without otherwise keeping track of them. |
Segment management mainly comes into play for spaces allocated by |
MMAP. Any call to MMAP might or might not return memory that is |
adjacent to an existing segment. MORECORE normally contiguously |
extends the current space, so this space is almost always adjacent, |
which is simpler and faster to deal with. (This is why MORECORE is |
used preferentially to MMAP when both are available -- see |
sys_alloc.) When allocating using MMAP, we don't use any of the |
hinting mechanisms (inconsistently) supported in various |
implementations of unix mmap, or distinguish reserving from |
committing memory. Instead, we just ask for space, and exploit |
contiguity when we get it. It is probably possible to do |
better than this on some systems, but no general scheme seems |
to be significantly better. |
Management entails a simpler variant of the consolidation scheme |
used for chunks to reduce fragmentation -- new adjacent memory is |
normally prepended or appended to an existing segment. However, |
there are limitations compared to chunk consolidation that mostly |
reflect the fact that segment processing is relatively infrequent |
(occurring only when getting memory from system) and that we |
don't expect to have huge numbers of segments: |
* Segments are not indexed, so traversal requires linear scans. (It |
would be possible to index these, but is not worth the extra |
overhead and complexity for most programs on most platforms.) |
* New segments are only appended to old ones when holding top-most |
memory; if they cannot be prepended to others, they are held in |
different segments. |
Except for the top-most segment of an mstate, each segment record |
is kept at the tail of its segment. Segments are added by pushing |
segment records onto the list headed by &mstate.seg for the |
containing mstate. |
Segment flags control allocation/merge/deallocation policies: |
* If EXTERN_BIT set, then we did not allocate this segment, |
and so should not try to deallocate or merge with others. |
(This currently holds only for the initial segment passed |
into create_mspace_with_base.) |
* If IS_MMAPPED_BIT set, the segment may be merged with |
other surrounding mmapped segments and trimmed/de-allocated |
using munmap. |
* If neither bit is set, then the segment was obtained using |
MORECORE so can be merged with surrounding MORECORE'd segments |
and deallocated/trimmed using MORECORE with negative arguments. |
*/ |
struct malloc_segment { |
char* base; /* base address */ |
size_t size; /* allocated size */ |
struct malloc_segment* next; /* ptr to next segment */ |
flag_t sflags; /* mmap and extern flag */ |
}; |
#define is_mmapped_segment(S) ((S)->sflags & IS_MMAPPED_BIT) |
#define is_extern_segment(S) ((S)->sflags & EXTERN_BIT) |
typedef struct malloc_segment msegment; |
typedef struct malloc_segment* msegmentptr; |
/* ---------------------------- malloc_state ----------------------------- */ |
/* |
A malloc_state holds all of the bookkeeping for a space. |
The main fields are: |
Top |
The topmost chunk of the currently active segment. Its size is |
cached in topsize. The actual size of topmost space is |
topsize+TOP_FOOT_SIZE, which includes space reserved for adding |
fenceposts and segment records if necessary when getting more |
space from the system. The size at which to autotrim top is |
cached from mparams in trim_check, except that it is disabled if |
an autotrim fails. |
Designated victim (dv) |
This is the preferred chunk for servicing small requests that |
don't have exact fits. It is normally the chunk split off most |
recently to service another small request. Its size is cached in |
dvsize. The link fields of this chunk are not maintained since it |
is not kept in a bin. |
SmallBins |
An array of bin headers for free chunks. These bins hold chunks |
with sizes less than MIN_LARGE_SIZE bytes. Each bin contains |
chunks of all the same size, spaced 8 bytes apart. To simplify |
use in double-linked lists, each bin header acts as a malloc_chunk |
pointing to the real first node, if it exists (else pointing to |
itself). This avoids special-casing for headers. But to avoid |
waste, we allocate only the fd/bk pointers of bins, and then use |
repositioning tricks to treat these as the fields of a chunk. |
TreeBins |
Treebins are pointers to the roots of trees holding a range of |
sizes. There are 2 equally spaced treebins for each power of two |
from TREE_SHIFT to TREE_SHIFT+16. The last bin holds anything |
larger. |
Bin maps |
There is one bit map for small bins ("smallmap") and one for |
treebins ("treemap). Each bin sets its bit when non-empty, and |
clears the bit when empty. Bit operations are then used to avoid |
bin-by-bin searching -- nearly all "search" is done without ever |
looking at bins that won't be selected. The bit maps |
conservatively use 32 bits per map word, even if on 64bit system. |
For a good description of some of the bit-based techniques used |
here, see Henry S. Warren Jr's book "Hacker's Delight" (and |
supplement at http://hackersdelight.org/). Many of these are |
intended to reduce the branchiness of paths through malloc etc, as |
well as to reduce the number of memory locations read or written. |
Segments |
A list of segments headed by an embedded malloc_segment record |
representing the initial space. |
Address check support |
The least_addr field is the least address ever obtained from |
MORECORE or MMAP. Attempted frees and reallocs of any address less |
than this are trapped (unless INSECURE is defined). |
Magic tag |
A cross-check field that should always hold same value as mparams.magic. |
Flags |
Bits recording whether to use MMAP, locks, or contiguous MORECORE |
Statistics |
Each space keeps track of current and maximum system memory |
obtained via MORECORE or MMAP. |
Locking |
If USE_LOCKS is defined, the "mutex" lock is acquired and released |
around every public call using this mspace. |
*/ |
/* Bin types, widths and sizes */ |
#define NSMALLBINS (32U) |
#define NTREEBINS (32U) |
#define SMALLBIN_SHIFT (3U) |
#define SMALLBIN_WIDTH (SIZE_T_ONE << SMALLBIN_SHIFT) |
#define TREEBIN_SHIFT (8U) |
#define MIN_LARGE_SIZE (SIZE_T_ONE << TREEBIN_SHIFT) |
#define MAX_SMALL_SIZE (MIN_LARGE_SIZE - SIZE_T_ONE) |
#define MAX_SMALL_REQUEST (MAX_SMALL_SIZE - CHUNK_ALIGN_MASK - CHUNK_OVERHEAD) |
struct malloc_state { |
binmap_t smallmap; |
binmap_t treemap; |
size_t dvsize; |
size_t topsize; |
char* least_addr; |
mchunkptr dv; |
mchunkptr top; |
size_t trim_check; |
size_t magic; |
mchunkptr smallbins[(NSMALLBINS+1)*2]; |
tbinptr treebins[NTREEBINS]; |
size_t footprint; |
size_t max_footprint; |
flag_t mflags; |
#if USE_LOCKS |
MLOCK_T mutex; /* locate lock among fields that rarely change */ |
#endif /* USE_LOCKS */ |
msegment seg; |
}; |
typedef struct malloc_state* mstate; |
/* ------------- Global malloc_state and malloc_params ------------------- */ |
/* |
malloc_params holds global properties, including those that can be |
dynamically set using mallopt. There is a single instance, mparams, |
initialized in init_mparams. |
*/ |
struct malloc_params { |
size_t magic; |
size_t page_size; |
size_t granularity; |
size_t mmap_threshold; |
size_t trim_threshold; |
flag_t default_mflags; |
}; |
static struct malloc_params mparams; |
/* The global malloc_state used for all non-"mspace" calls */ |
static struct malloc_state _gm_; |
#define gm (&_gm_) |
#define is_global(M) ((M) == &_gm_) |
#define is_initialized(M) ((M)->top != 0) |
/* -------------------------- system alloc setup ------------------------- */ |
/* Operations on mflags */ |
#define use_lock(M) ((M)->mflags & USE_LOCK_BIT) |
#define enable_lock(M) ((M)->mflags |= USE_LOCK_BIT) |
#define disable_lock(M) ((M)->mflags &= ~USE_LOCK_BIT) |
#define use_mmap(M) ((M)->mflags & USE_MMAP_BIT) |
#define enable_mmap(M) ((M)->mflags |= USE_MMAP_BIT) |
#define disable_mmap(M) ((M)->mflags &= ~USE_MMAP_BIT) |
#define use_noncontiguous(M) ((M)->mflags & USE_NONCONTIGUOUS_BIT) |
#define disable_contiguous(M) ((M)->mflags |= USE_NONCONTIGUOUS_BIT) |
#define set_lock(M,L)\ |
((M)->mflags = (L)?\ |
((M)->mflags | USE_LOCK_BIT) :\ |
((M)->mflags & ~USE_LOCK_BIT)) |
/* page-align a size */ |
#define page_align(S)\ |
(((S) + (mparams.page_size)) & ~(mparams.page_size - SIZE_T_ONE)) |
/* granularity-align a size */ |
#define granularity_align(S)\ |
(((S) + (mparams.granularity)) & ~(mparams.granularity - SIZE_T_ONE)) |
#define is_page_aligned(S)\ |
(((size_t)(S) & (mparams.page_size - SIZE_T_ONE)) == 0) |
#define is_granularity_aligned(S)\ |
(((size_t)(S) & (mparams.granularity - SIZE_T_ONE)) == 0) |
/* True if segment S holds address A */ |
#define segment_holds(S, A)\ |
((char*)(A) >= S->base && (char*)(A) < S->base + S->size) |
/* Return segment holding given address */ |
static msegmentptr segment_holding(mstate m, char* addr) { |
msegmentptr sp = &m->seg; |
for (;;) { |
if (addr >= sp->base && addr < sp->base + sp->size) |
return sp; |
if ((sp = sp->next) == 0) |
return 0; |
} |
} |
/* Return true if segment contains a segment link */ |
static int has_segment_link(mstate m, msegmentptr ss) { |
msegmentptr sp = &m->seg; |
for (;;) { |
if ((char*)sp >= ss->base && (char*)sp < ss->base + ss->size) |
return 1; |
if ((sp = sp->next) == 0) |
return 0; |
} |
} |
#ifndef MORECORE_CANNOT_TRIM |
#define should_trim(M,s) ((s) > (M)->trim_check) |
#else /* MORECORE_CANNOT_TRIM */ |
#define should_trim(M,s) (0) |
#endif /* MORECORE_CANNOT_TRIM */ |
/* |
TOP_FOOT_SIZE is padding at the end of a segment, including space |
that may be needed to place segment records and fenceposts when new |
noncontiguous segments are added. |
*/ |
#define TOP_FOOT_SIZE\ |
(align_offset(chunk2mem(0))+pad_request(sizeof(struct malloc_segment))+MIN_CHUNK_SIZE) |
/* ------------------------------- Hooks -------------------------------- */ |
/* |
PREACTION should be defined to return 0 on success, and nonzero on |
failure. If you are not using locking, you can redefine these to do |
anything you like. |
*/ |
#if USE_LOCKS |
/* Ensure locks are initialized */ |
#define GLOBALLY_INITIALIZE() (mparams.page_size == 0 && init_mparams()) |
#define PREACTION(M) ((GLOBALLY_INITIALIZE() || use_lock(M))? ACQUIRE_LOCK(&(M)->mutex) : 0) |
#define POSTACTION(M) { if (use_lock(M)) RELEASE_LOCK(&(M)->mutex); } |
#else /* USE_LOCKS */ |
#ifndef PREACTION |
#define PREACTION(M) (0) |
#endif /* PREACTION */ |
#ifndef POSTACTION |
#define POSTACTION(M) |
#endif /* POSTACTION */ |
#endif /* USE_LOCKS */ |
/* |
CORRUPTION_ERROR_ACTION is triggered upon detected bad addresses. |
USAGE_ERROR_ACTION is triggered on detected bad frees and |
reallocs. The argument p is an address that might have triggered the |
fault. It is ignored by the two predefined actions, but might be |
useful in custom actions that try to help diagnose errors. |
*/ |
#if PROCEED_ON_ERROR |
/* A count of the number of corruption errors causing resets */ |
int malloc_corruption_error_count; |
/* default corruption action */ |
static void reset_on_error(mstate m); |
#define CORRUPTION_ERROR_ACTION(m) reset_on_error(m) |
#define USAGE_ERROR_ACTION(m, p) |
#else /* PROCEED_ON_ERROR */ |
#ifndef CORRUPTION_ERROR_ACTION |
#define CORRUPTION_ERROR_ACTION(m) ABORT |
#endif /* CORRUPTION_ERROR_ACTION */ |
#ifndef USAGE_ERROR_ACTION |
#define USAGE_ERROR_ACTION(m,p) ABORT |
#endif /* USAGE_ERROR_ACTION */ |
#endif /* PROCEED_ON_ERROR */ |
/* -------------------------- Debugging setup ---------------------------- */ |
#if ! DEBUG |
#define check_free_chunk(M,P) |
#define check_inuse_chunk(M,P) |
#define check_malloced_chunk(M,P,N) |
#define check_mmapped_chunk(M,P) |
#define check_malloc_state(M) |
#define check_top_chunk(M,P) |
#else /* DEBUG */ |
#define check_free_chunk(M,P) do_check_free_chunk(M,P) |
#define check_inuse_chunk(M,P) do_check_inuse_chunk(M,P) |
#define check_top_chunk(M,P) do_check_top_chunk(M,P) |
#define check_malloced_chunk(M,P,N) do_check_malloced_chunk(M,P,N) |
#define check_mmapped_chunk(M,P) do_check_mmapped_chunk(M,P) |
#define check_malloc_state(M) do_check_malloc_state(M) |
static void do_check_any_chunk(mstate m, mchunkptr p); |
static void do_check_top_chunk(mstate m, mchunkptr p); |
static void do_check_mmapped_chunk(mstate m, mchunkptr p); |
static void do_check_inuse_chunk(mstate m, mchunkptr p); |
static void do_check_free_chunk(mstate m, mchunkptr p); |
static void do_check_malloced_chunk(mstate m, void* mem, size_t s); |
static void do_check_tree(mstate m, tchunkptr t); |
static void do_check_treebin(mstate m, bindex_t i); |
static void do_check_smallbin(mstate m, bindex_t i); |
static void do_check_malloc_state(mstate m); |
static int bin_find(mstate m, mchunkptr x); |
static size_t traverse_and_check(mstate m); |
#endif /* DEBUG */ |
/* ---------------------------- Indexing Bins ---------------------------- */ |
#define is_small(s) (((s) >> SMALLBIN_SHIFT) < NSMALLBINS) |
#define small_index(s) ((s) >> SMALLBIN_SHIFT) |
#define small_index2size(i) ((i) << SMALLBIN_SHIFT) |
#define MIN_SMALL_INDEX (small_index(MIN_CHUNK_SIZE)) |
/* addressing by index. See above about smallbin repositioning */ |
#define smallbin_at(M, i) ((sbinptr)((char*)&((M)->smallbins[(i)<<1]))) |
#define treebin_at(M,i) (&((M)->treebins[i])) |
/* assign tree index for size S to variable I */ |
#if defined(__GNUC__) && defined(i386) |
#define compute_tree_index(S, I)\ |
{\ |
size_t X = S >> TREEBIN_SHIFT;\ |
if (X == 0)\ |
I = 0;\ |
else if (X > 0xFFFF)\ |
I = NTREEBINS-1;\ |
else {\ |
unsigned int K;\ |
asm("bsrl %1,%0\n\t" : "=r" (K) : "rm" (X));\ |
I = (bindex_t)((K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1)));\ |
}\ |
} |
#else /* GNUC */ |
#define compute_tree_index(S, I)\ |
{\ |
size_t X = S >> TREEBIN_SHIFT;\ |
if (X == 0)\ |
I = 0;\ |
else if (X > 0xFFFF)\ |
I = NTREEBINS-1;\ |
else {\ |
unsigned int Y = (unsigned int)X;\ |
unsigned int N = ((Y - 0x100) >> 16) & 8;\ |
unsigned int K = (((Y <<= N) - 0x1000) >> 16) & 4;\ |
N += K;\ |
N += K = (((Y <<= K) - 0x4000) >> 16) & 2;\ |
K = 14 - N + ((Y <<= K) >> 15);\ |
I = (K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1));\ |
}\ |
} |
#endif /* GNUC */ |
/* Bit representing maximum resolved size in a treebin at i */ |
#define bit_for_tree_index(i) \ |
(i == NTREEBINS-1)? (SIZE_T_BITSIZE-1) : (((i) >> 1) + TREEBIN_SHIFT - 2) |
/* Shift placing maximum resolved bit in a treebin at i as sign bit */ |
#define leftshift_for_tree_index(i) \ |
((i == NTREEBINS-1)? 0 : \ |
((SIZE_T_BITSIZE-SIZE_T_ONE) - (((i) >> 1) + TREEBIN_SHIFT - 2))) |
/* The size of the smallest chunk held in bin with index i */ |
#define minsize_for_tree_index(i) \ |
((SIZE_T_ONE << (((i) >> 1) + TREEBIN_SHIFT)) | \ |
(((size_t)((i) & SIZE_T_ONE)) << (((i) >> 1) + TREEBIN_SHIFT - 1))) |
/* ------------------------ Operations on bin maps ----------------------- */ |
/* bit corresponding to given index */ |
#define idx2bit(i) ((binmap_t)(1) << (i)) |
/* Mark/Clear bits with given index */ |
#define mark_smallmap(M,i) ((M)->smallmap |= idx2bit(i)) |
#define clear_smallmap(M,i) ((M)->smallmap &= ~idx2bit(i)) |
#define smallmap_is_marked(M,i) ((M)->smallmap & idx2bit(i)) |
#define mark_treemap(M,i) ((M)->treemap |= idx2bit(i)) |
#define clear_treemap(M,i) ((M)->treemap &= ~idx2bit(i)) |
#define treemap_is_marked(M,i) ((M)->treemap & idx2bit(i)) |
/* index corresponding to given bit */ |
#if defined(__GNUC__) && defined(i386) |
#define compute_bit2idx(X, I)\ |
{\ |
unsigned int J;\ |
asm("bsfl %1,%0\n\t" : "=r" (J) : "rm" (X));\ |
I = (bindex_t)J;\ |
} |
#else /* GNUC */ |
#if USE_BUILTIN_FFS |
#define compute_bit2idx(X, I) I = ffs(X)-1 |
#else /* USE_BUILTIN_FFS */ |
#define compute_bit2idx(X, I)\ |
{\ |
unsigned int Y = X - 1;\ |
unsigned int K = Y >> (16-4) & 16;\ |
unsigned int N = K; Y >>= K;\ |
N += K = Y >> (8-3) & 8; Y >>= K;\ |
N += K = Y >> (4-2) & 4; Y >>= K;\ |
N += K = Y >> (2-1) & 2; Y >>= K;\ |
N += K = Y >> (1-0) & 1; Y >>= K;\ |
I = (bindex_t)(N + Y);\ |
} |
#endif /* USE_BUILTIN_FFS */ |
#endif /* GNUC */ |
/* isolate the least set bit of a bitmap */ |
#define least_bit(x) ((x) & -(x)) |
/* mask with all bits to left of least bit of x on */ |
#define left_bits(x) ((x<<1) | -(x<<1)) |
/* mask with all bits to left of or equal to least bit of x on */ |
#define same_or_left_bits(x) ((x) | -(x)) |
/* ----------------------- Runtime Check Support ------------------------- */ |
/* |
For security, the main invariant is that malloc/free/etc never |
writes to a static address other than malloc_state, unless static |
malloc_state itself has been corrupted, which cannot occur via |
malloc (because of these checks). In essence this means that we |
believe all pointers, sizes, maps etc held in malloc_state, but |
check all of those linked or offsetted from other embedded data |
structures. These checks are interspersed with main code in a way |
that tends to minimize their run-time cost. |
When FOOTERS is defined, in addition to range checking, we also |
verify footer fields of inuse chunks, which can be used guarantee |
that the mstate controlling malloc/free is intact. This is a |
streamlined version of the approach described by William Robertson |
et al in "Run-time Detection of Heap-based Overflows" LISA'03 |
http://www.usenix.org/events/lisa03/tech/robertson.html The footer |
of an inuse chunk holds the xor of its mstate and a random seed, |
that is checked upon calls to free() and realloc(). This is |
(probablistically) unguessable from outside the program, but can be |
computed by any code successfully malloc'ing any chunk, so does not |
itself provide protection against code that has already broken |
security through some other means. Unlike Robertson et al, we |
always dynamically check addresses of all offset chunks (previous, |
next, etc). This turns out to be cheaper than relying on hashes. |
*/ |
#if !INSECURE |
/* Check if address a is at least as high as any from MORECORE or MMAP */ |
#define ok_address(M, a) ((char*)(a) >= (M)->least_addr) |
/* Check if address of next chunk n is higher than base chunk p */ |
#define ok_next(p, n) ((char*)(p) < (char*)(n)) |
/* Check if p has its cinuse bit on */ |
#define ok_cinuse(p) cinuse(p) |
/* Check if p has its pinuse bit on */ |
#define ok_pinuse(p) pinuse(p) |
#else /* !INSECURE */ |
#define ok_address(M, a) (1) |
#define ok_next(b, n) (1) |
#define ok_cinuse(p) (1) |
#define ok_pinuse(p) (1) |
#endif /* !INSECURE */ |
#if (FOOTERS && !INSECURE) |
/* Check if (alleged) mstate m has expected magic field */ |
#define ok_magic(M) ((M)->magic == mparams.magic) |
#else /* (FOOTERS && !INSECURE) */ |
#define ok_magic(M) (1) |
#endif /* (FOOTERS && !INSECURE) */ |
/* In gcc, use __builtin_expect to minimize impact of checks */ |
#if !INSECURE |
#if defined(__GNUC__) && __GNUC__ >= 3 |
#define RTCHECK(e) __builtin_expect(e, 1) |
#else /* GNUC */ |
#define RTCHECK(e) (e) |
#endif /* GNUC */ |
#else /* !INSECURE */ |
#define RTCHECK(e) (1) |
#endif /* !INSECURE */ |
/* macros to set up inuse chunks with or without footers */ |
#if !FOOTERS |
#define mark_inuse_foot(M,p,s) |
/* Set cinuse bit and pinuse bit of next chunk */ |
#define set_inuse(M,p,s)\ |
((p)->head = (((p)->head & PINUSE_BIT)|s|CINUSE_BIT),\ |
((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT) |
/* Set cinuse and pinuse of this chunk and pinuse of next chunk */ |
#define set_inuse_and_pinuse(M,p,s)\ |
((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\ |
((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT) |
/* Set size, cinuse and pinuse bit of this chunk */ |
#define set_size_and_pinuse_of_inuse_chunk(M, p, s)\ |
((p)->head = (s|PINUSE_BIT|CINUSE_BIT)) |
#else /* FOOTERS */ |
/* Set foot of inuse chunk to be xor of mstate and seed */ |
#define mark_inuse_foot(M,p,s)\ |
(((mchunkptr)((char*)(p) + (s)))->prev_foot = ((size_t)(M) ^ mparams.magic)) |
#define get_mstate_for(p)\ |
((mstate)(((mchunkptr)((char*)(p) +\ |
(chunksize(p))))->prev_foot ^ mparams.magic)) |
#define set_inuse(M,p,s)\ |
((p)->head = (((p)->head & PINUSE_BIT)|s|CINUSE_BIT),\ |
(((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT), \ |
mark_inuse_foot(M,p,s)) |
#define set_inuse_and_pinuse(M,p,s)\ |
((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\ |
(((mchunkptr)(((char*)(p)) + (s)))->head |= PINUSE_BIT),\ |
mark_inuse_foot(M,p,s)) |
#define set_size_and_pinuse_of_inuse_chunk(M, p, s)\ |
((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\ |
mark_inuse_foot(M, p, s)) |
#endif /* !FOOTERS */ |
/* ---------------------------- setting mparams -------------------------- */ |
/* Initialize mparams */ |
static int init_mparams(void) { |
if (mparams.page_size == 0) { |
size_t s; |
mparams.mmap_threshold = DEFAULT_MMAP_THRESHOLD; |
mparams.trim_threshold = DEFAULT_TRIM_THRESHOLD; |
#if MORECORE_CONTIGUOUS |
mparams.default_mflags = USE_LOCK_BIT|USE_MMAP_BIT; |
#else /* MORECORE_CONTIGUOUS */ |
mparams.default_mflags = USE_LOCK_BIT|USE_MMAP_BIT|USE_NONCONTIGUOUS_BIT; |
#endif /* MORECORE_CONTIGUOUS */ |
#if (FOOTERS && !INSECURE) |
{ |
#if USE_DEV_RANDOM |
int fd; |
unsigned char buf[sizeof(size_t)]; |
/* Try to use /dev/urandom, else fall back on using time */ |
if ((fd = open("/dev/urandom", O_RDONLY)) >= 0 && |
read(fd, buf, sizeof(buf)) == sizeof(buf)) { |
s = *((size_t *) buf); |
close(fd); |
} |
else |
#endif /* USE_DEV_RANDOM */ |
s = (size_t)(time(0) ^ (size_t)0x55555555U); |
s |= (size_t)8U; /* ensure nonzero */ |
s &= ~(size_t)7U; /* improve chances of fault for bad values */ |
} |
#else /* (FOOTERS && !INSECURE) */ |
s = (size_t)0x58585858U; |
#endif /* (FOOTERS && !INSECURE) */ |
ACQUIRE_MAGIC_INIT_LOCK(); |
if (mparams.magic == 0) { |
mparams.magic = s; |
/* Set up lock for main malloc area */ |
INITIAL_LOCK(&gm->mutex); |
gm->mflags = mparams.default_mflags; |
} |
RELEASE_MAGIC_INIT_LOCK(); |
#ifndef WIN32 |
mparams.page_size = malloc_getpagesize; |
mparams.granularity = ((DEFAULT_GRANULARITY != 0)? |
DEFAULT_GRANULARITY : mparams.page_size); |
#else /* WIN32 */ |
{ |
SYSTEM_INFO system_info; |
GetSystemInfo(&system_info); |
mparams.page_size = system_info.dwPageSize; |
mparams.granularity = system_info.dwAllocationGranularity; |
} |
#endif /* WIN32 */ |
/* Sanity-check configuration: |
size_t must be unsigned and as wide as pointer type. |
ints must be at least 4 bytes. |
alignment must be at least 8. |
Alignment, min chunk size, and page size must all be powers of 2. |
*/ |
if ((sizeof(size_t) != sizeof(char*)) || |
(MAX_SIZE_T < MIN_CHUNK_SIZE) || |
(sizeof(int) < 4) || |
(MALLOC_ALIGNMENT < (size_t)8U) || |
((MALLOC_ALIGNMENT & (MALLOC_ALIGNMENT-SIZE_T_ONE)) != 0) || |
((MCHUNK_SIZE & (MCHUNK_SIZE-SIZE_T_ONE)) != 0) || |
((mparams.granularity & (mparams.granularity-SIZE_T_ONE)) != 0) || |
((mparams.page_size & (mparams.page_size-SIZE_T_ONE)) != 0)) |
ABORT; |
} |
return 0; |
} |
/* support for mallopt */ |
static int change_mparam(int param_number, int value) { |
size_t val = (size_t)value; |
init_mparams(); |
switch(param_number) { |
case M_TRIM_THRESHOLD: |
mparams.trim_threshold = val; |
return 1; |
case M_GRANULARITY: |
if (val >= mparams.page_size && ((val & (val-1)) == 0)) { |
mparams.granularity = val; |
return 1; |
} |
else |
return 0; |
case M_MMAP_THRESHOLD: |
mparams.mmap_threshold = val; |
return 1; |
default: |
return 0; |
} |
} |
#if DEBUG |
/* ------------------------- Debugging Support --------------------------- */ |
/* Check properties of any chunk, whether free, inuse, mmapped etc */ |
static void do_check_any_chunk(mstate m, mchunkptr p) { |
assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD)); |
assert(ok_address(m, p)); |
} |
/* Check properties of top chunk */ |
static void do_check_top_chunk(mstate m, mchunkptr p) { |
msegmentptr sp = segment_holding(m, (char*)p); |
size_t sz = chunksize(p); |
assert(sp != 0); |
assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD)); |
assert(ok_address(m, p)); |
assert(sz == m->topsize); |
assert(sz > 0); |
assert(sz == ((sp->base + sp->size) - (char*)p) - TOP_FOOT_SIZE); |
assert(pinuse(p)); |
assert(!next_pinuse(p)); |
} |
/* Check properties of (inuse) mmapped chunks */ |
static void do_check_mmapped_chunk(mstate m, mchunkptr p) { |
size_t sz = chunksize(p); |
size_t len = (sz + (p->prev_foot & ~IS_MMAPPED_BIT) + MMAP_FOOT_PAD); |
assert(is_mmapped(p)); |
assert(use_mmap(m)); |
assert((is_aligned(chunk2mem(p))) || (p->head == FENCEPOST_HEAD)); |
assert(ok_address(m, p)); |
assert(!is_small(sz)); |
assert((len & (mparams.page_size-SIZE_T_ONE)) == 0); |
assert(chunk_plus_offset(p, sz)->head == FENCEPOST_HEAD); |
assert(chunk_plus_offset(p, sz+SIZE_T_SIZE)->head == 0); |
} |
/* Check properties of inuse chunks */ |
static void do_check_inuse_chunk(mstate m, mchunkptr p) { |
do_check_any_chunk(m, p); |
assert(cinuse(p)); |
assert(next_pinuse(p)); |
/* If not pinuse and not mmapped, previous chunk has OK offset */ |
assert(is_mmapped(p) || pinuse(p) || next_chunk(prev_chunk(p)) == p); |
if (is_mmapped(p)) |
do_check_mmapped_chunk(m, p); |
} |
/* Check properties of free chunks */ |
static void do_check_free_chunk(mstate m, mchunkptr p) { |
size_t sz = p->head & ~(PINUSE_BIT|CINUSE_BIT); |
mchunkptr next = chunk_plus_offset(p, sz); |
do_check_any_chunk(m, p); |
assert(!cinuse(p)); |
assert(!next_pinuse(p)); |
assert (!is_mmapped(p)); |
if (p != m->dv && p != m->top) { |
if (sz >= MIN_CHUNK_SIZE) { |
assert((sz & CHUNK_ALIGN_MASK) == 0); |
assert(is_aligned(chunk2mem(p))); |
assert(next->prev_foot == sz); |
assert(pinuse(p)); |
assert (next == m->top || cinuse(next)); |
assert(p->fd->bk == p); |
assert(p->bk->fd == p); |
} |
else /* markers are always of size SIZE_T_SIZE */ |
assert(sz == SIZE_T_SIZE); |
} |
} |
/* Check properties of malloced chunks at the point they are malloced */ |
static void do_check_malloced_chunk(mstate m, void* mem, size_t s) { |
if (mem != 0) { |
mchunkptr p = mem2chunk(mem); |
size_t sz = p->head & ~(PINUSE_BIT|CINUSE_BIT); |
do_check_inuse_chunk(m, p); |
assert((sz & CHUNK_ALIGN_MASK) == 0); |
assert(sz >= MIN_CHUNK_SIZE); |
assert(sz >= s); |
/* unless mmapped, size is less than MIN_CHUNK_SIZE more than request */ |
assert(is_mmapped(p) || sz < (s + MIN_CHUNK_SIZE)); |
} |
} |
/* Check a tree and its subtrees. */ |
static void do_check_tree(mstate m, tchunkptr t) { |
tchunkptr head = 0; |
tchunkptr u = t; |
bindex_t tindex = t->index; |
size_t tsize = chunksize(t); |
bindex_t idx; |
compute_tree_index(tsize, idx); |
assert(tindex == idx); |
assert(tsize >= MIN_LARGE_SIZE); |
assert(tsize >= minsize_for_tree_index(idx)); |
assert((idx == NTREEBINS-1) || (tsize < minsize_for_tree_index((idx+1)))); |
do { /* traverse through chain of same-sized nodes */ |
do_check_any_chunk(m, ((mchunkptr)u)); |
assert(u->index == tindex); |
assert(chunksize(u) == tsize); |
assert(!cinuse(u)); |
assert(!next_pinuse(u)); |
assert(u->fd->bk == u); |
assert(u->bk->fd == u); |
if (u->parent == 0) { |
assert(u->child[0] == 0); |
assert(u->child[1] == 0); |
} |
else { |
assert(head == 0); /* only one node on chain has parent */ |
head = u; |
assert(u->parent != u); |
assert (u->parent->child[0] == u || |
u->parent->child[1] == u || |
*((tbinptr*)(u->parent)) == u); |
if (u->child[0] != 0) { |
assert(u->child[0]->parent == u); |
assert(u->child[0] != u); |
do_check_tree(m, u->child[0]); |
} |
if (u->child[1] != 0) { |
assert(u->child[1]->parent == u); |
assert(u->child[1] != u); |
do_check_tree(m, u->child[1]); |
} |
if (u->child[0] != 0 && u->child[1] != 0) { |
assert(chunksize(u->child[0]) < chunksize(u->child[1])); |
} |
} |
u = u->fd; |
} while (u != t); |
assert(head != 0); |
} |
/* Check all the chunks in a treebin. */ |
static void do_check_treebin(mstate m, bindex_t i) { |
tbinptr* tb = treebin_at(m, i); |
tchunkptr t = *tb; |
int empty = (m->treemap & (1U << i)) == 0; |
if (t == 0) |
assert(empty); |
if (!empty) |
do_check_tree(m, t); |
} |
/* Check all the chunks in a smallbin. */ |
static void do_check_smallbin(mstate m, bindex_t i) { |
sbinptr b = smallbin_at(m, i); |
mchunkptr p = b->bk; |
unsigned int empty = (m->smallmap & (1U << i)) == 0; |
if (p == b) |
assert(empty); |
if (!empty) { |
for (; p != b; p = p->bk) { |
size_t size = chunksize(p); |
mchunkptr q; |
/* each chunk claims to be free */ |
do_check_free_chunk(m, p); |
/* chunk belongs in bin */ |
assert(small_index(size) == i); |
assert(p->bk == b || chunksize(p->bk) == chunksize(p)); |
/* chunk is followed by an inuse chunk */ |
q = next_chunk(p); |
if (q->head != FENCEPOST_HEAD) |
do_check_inuse_chunk(m, q); |
} |
} |
} |
/* Find x in a bin. Used in other check functions. */ |
static int bin_find(mstate m, mchunkptr x) { |
size_t size = chunksize(x); |
if (is_small(size)) { |
bindex_t sidx = small_index(size); |
sbinptr b = smallbin_at(m, sidx); |
if (smallmap_is_marked(m, sidx)) { |
mchunkptr p = b; |
do { |
if (p == x) |
return 1; |
} while ((p = p->fd) != b); |
} |
} |
else { |
bindex_t tidx; |
compute_tree_index(size, tidx); |
if (treemap_is_marked(m, tidx)) { |
tchunkptr t = *treebin_at(m, tidx); |
size_t sizebits = size << leftshift_for_tree_index(tidx); |
while (t != 0 && chunksize(t) != size) { |
t = t->child[(sizebits >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1]; |
sizebits <<= 1; |
} |
if (t != 0) { |
tchunkptr u = t; |
do { |
if (u == (tchunkptr)x) |
return 1; |
} while ((u = u->fd) != t); |
} |
} |
} |
return 0; |
} |
/* Traverse each chunk and check it; return total */ |
static size_t traverse_and_check(mstate m) { |
size_t sum = 0; |
if (is_initialized(m)) { |
msegmentptr s = &m->seg; |
sum += m->topsize + TOP_FOOT_SIZE; |
while (s != 0) { |
mchunkptr q = align_as_chunk(s->base); |
mchunkptr lastq = 0; |
assert(pinuse(q)); |
while (segment_holds(s, q) && |
q != m->top && q->head != FENCEPOST_HEAD) { |
sum += chunksize(q); |
if (cinuse(q)) { |
assert(!bin_find(m, q)); |
do_check_inuse_chunk(m, q); |
} |
else { |
assert(q == m->dv || bin_find(m, q)); |
assert(lastq == 0 || cinuse(lastq)); /* Not 2 consecutive free */ |
do_check_free_chunk(m, q); |
} |
lastq = q; |
q = next_chunk(q); |
} |
s = s->next; |
} |
} |
return sum; |
} |
/* Check all properties of malloc_state. */ |
static void do_check_malloc_state(mstate m) { |
bindex_t i; |
size_t total; |
/* check bins */ |
for (i = 0; i < NSMALLBINS; ++i) |
do_check_smallbin(m, i); |
for (i = 0; i < NTREEBINS; ++i) |
do_check_treebin(m, i); |
if (m->dvsize != 0) { /* check dv chunk */ |
do_check_any_chunk(m, m->dv); |
assert(m->dvsize == chunksize(m->dv)); |
assert(m->dvsize >= MIN_CHUNK_SIZE); |
assert(bin_find(m, m->dv) == 0); |
} |
if (m->top != 0) { /* check top chunk */ |
do_check_top_chunk(m, m->top); |
assert(m->topsize == chunksize(m->top)); |
assert(m->topsize > 0); |
assert(bin_find(m, m->top) == 0); |
} |
total = traverse_and_check(m); |
assert(total <= m->footprint); |
assert(m->footprint <= m->max_footprint); |
} |
#endif /* DEBUG */ |
/* ----------------------------- statistics ------------------------------ */ |
#if !NO_MALLINFO |
static struct mallinfo internal_mallinfo(mstate m) { |
struct mallinfo nm = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; |
if (!PREACTION(m)) { |
check_malloc_state(m); |
if (is_initialized(m)) { |
size_t nfree = SIZE_T_ONE; /* top always free */ |
size_t mfree = m->topsize + TOP_FOOT_SIZE; |
size_t sum = mfree; |
msegmentptr s = &m->seg; |
while (s != 0) { |
mchunkptr q = align_as_chunk(s->base); |
while (segment_holds(s, q) && |
q != m->top && q->head != FENCEPOST_HEAD) { |
size_t sz = chunksize(q); |
sum += sz; |
if (!cinuse(q)) { |
mfree += sz; |
++nfree; |
} |
q = next_chunk(q); |
} |
s = s->next; |
} |
nm.arena = sum; |
nm.ordblks = nfree; |
nm.hblkhd = m->footprint - sum; |
nm.usmblks = m->max_footprint; |
nm.uordblks = m->footprint - mfree; |
nm.fordblks = mfree; |
nm.keepcost = m->topsize; |
} |
POSTACTION(m); |
} |
return nm; |
} |
#endif /* !NO_MALLINFO */ |
static void internal_malloc_stats(mstate m) { |
if (!PREACTION(m)) { |
size_t maxfp = 0; |
size_t fp = 0; |
size_t used = 0; |
check_malloc_state(m); |
if (is_initialized(m)) { |
msegmentptr s = &m->seg; |
maxfp = m->max_footprint; |
fp = m->footprint; |
used = fp - (m->topsize + TOP_FOOT_SIZE); |
while (s != 0) { |
mchunkptr q = align_as_chunk(s->base); |
while (segment_holds(s, q) && |
q != m->top && q->head != FENCEPOST_HEAD) { |
if (!cinuse(q)) |
used -= chunksize(q); |
q = next_chunk(q); |
} |
s = s->next; |
} |
} |
fprintf(stderr, "max system bytes = %10lu\n", (unsigned long)(maxfp)); |
fprintf(stderr, "system bytes = %10lu\n", (unsigned long)(fp)); |
fprintf(stderr, "in use bytes = %10lu\n", (unsigned long)(used)); |
POSTACTION(m); |
} |
} |
/* ----------------------- Operations on smallbins ----------------------- */ |
/* |
Various forms of linking and unlinking are defined as macros. Even |
the ones for trees, which are very long but have very short typical |
paths. This is ugly but reduces reliance on inlining support of |
compilers. |
*/ |
/* Link a free chunk into a smallbin */ |
#define insert_small_chunk(M, P, S) {\ |
bindex_t I = small_index(S);\ |
mchunkptr B = smallbin_at(M, I);\ |
mchunkptr F = B;\ |
assert(S >= MIN_CHUNK_SIZE);\ |
if (!smallmap_is_marked(M, I))\ |
mark_smallmap(M, I);\ |
else if (RTCHECK(ok_address(M, B->fd)))\ |
F = B->fd;\ |
else {\ |
CORRUPTION_ERROR_ACTION(M);\ |
}\ |
B->fd = P;\ |
F->bk = P;\ |
P->fd = F;\ |
P->bk = B;\ |
} |
/* Unlink a chunk from a smallbin */ |
#define unlink_small_chunk(M, P, S) {\ |
mchunkptr F = P->fd;\ |
mchunkptr B = P->bk;\ |
bindex_t I = small_index(S);\ |
assert(P != B);\ |
assert(P != F);\ |
assert(chunksize(P) == small_index2size(I));\ |
if (F == B)\ |
clear_smallmap(M, I);\ |
else if (RTCHECK((F == smallbin_at(M,I) || ok_address(M, F)) &&\ |
(B == smallbin_at(M,I) || ok_address(M, B)))) {\ |
F->bk = B;\ |
B->fd = F;\ |
}\ |
else {\ |
CORRUPTION_ERROR_ACTION(M);\ |
}\ |
} |
/* Unlink the first chunk from a smallbin */ |
#define unlink_first_small_chunk(M, B, P, I) {\ |
mchunkptr F = P->fd;\ |
assert(P != B);\ |
assert(P != F);\ |
assert(chunksize(P) == small_index2size(I));\ |
if (B == F)\ |
clear_smallmap(M, I);\ |
else if (RTCHECK(ok_address(M, F))) {\ |
B->fd = F;\ |
F->bk = B;\ |
}\ |
else {\ |
CORRUPTION_ERROR_ACTION(M);\ |
}\ |
} |
/* Replace dv node, binning the old one */ |
/* Used only when dvsize known to be small */ |
#define replace_dv(M, P, S) {\ |
size_t DVS = M->dvsize;\ |
if (DVS != 0) {\ |
mchunkptr DV = M->dv;\ |
assert(is_small(DVS));\ |
insert_small_chunk(M, DV, DVS);\ |
}\ |
M->dvsize = S;\ |
M->dv = P;\ |
} |
/* ------------------------- Operations on trees ------------------------- */ |
/* Insert chunk into tree */ |
#define insert_large_chunk(M, X, S) {\ |
tbinptr* H;\ |
bindex_t I;\ |
compute_tree_index(S, I);\ |
H = treebin_at(M, I);\ |
X->index = I;\ |
X->child[0] = X->child[1] = 0;\ |
if (!treemap_is_marked(M, I)) {\ |
mark_treemap(M, I);\ |
*H = X;\ |
X->parent = (tchunkptr)H;\ |
X->fd = X->bk = X;\ |
}\ |
else {\ |
tchunkptr T = *H;\ |
size_t K = S << leftshift_for_tree_index(I);\ |
for (;;) {\ |
if (chunksize(T) != S) {\ |
tchunkptr* C = &(T->child[(K >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1]);\ |
K <<= 1;\ |
if (*C != 0)\ |
T = *C;\ |
else if (RTCHECK(ok_address(M, C))) {\ |
*C = X;\ |
X->parent = T;\ |
X->fd = X->bk = X;\ |
break;\ |
}\ |
else {\ |
CORRUPTION_ERROR_ACTION(M);\ |
break;\ |
}\ |
}\ |
else {\ |
tchunkptr F = T->fd;\ |
if (RTCHECK(ok_address(M, T) && ok_address(M, F))) {\ |
T->fd = F->bk = X;\ |
X->fd = F;\ |
X->bk = T;\ |
X->parent = 0;\ |
break;\ |
}\ |
else {\ |
CORRUPTION_ERROR_ACTION(M);\ |
break;\ |
}\ |
}\ |
}\ |
}\ |
} |
/* |
Unlink steps: |
1. If x is a chained node, unlink it from its same-sized fd/bk links |
and choose its bk node as its replacement. |
2. If x was the last node of its size, but not a leaf node, it must |
be replaced with a leaf node (not merely one with an open left or |
right), to make sure that lefts and rights of descendents |
correspond properly to bit masks. We use the rightmost descendent |
of x. We could use any other leaf, but this is easy to locate and |
tends to counteract removal of leftmosts elsewhere, and so keeps |
paths shorter than minimally guaranteed. This doesn't loop much |
because on average a node in a tree is near the bottom. |
3. If x is the base of a chain (i.e., has parent links) relink |
x's parent and children to x's replacement (or null if none). |
*/ |
#define unlink_large_chunk(M, X) {\ |
tchunkptr XP = X->parent;\ |
tchunkptr R;\ |
if (X->bk != X) {\ |
tchunkptr F = X->fd;\ |
R = X->bk;\ |
if (RTCHECK(ok_address(M, F))) {\ |
F->bk = R;\ |
R->fd = F;\ |
}\ |
else {\ |
CORRUPTION_ERROR_ACTION(M);\ |
}\ |
}\ |
else {\ |
tchunkptr* RP;\ |
if (((R = *(RP = &(X->child[1]))) != 0) ||\ |
((R = *(RP = &(X->child[0]))) != 0)) {\ |
tchunkptr* CP;\ |
while ((*(CP = &(R->child[1])) != 0) ||\ |
(*(CP = &(R->child[0])) != 0)) {\ |
R = *(RP = CP);\ |
}\ |
if (RTCHECK(ok_address(M, RP)))\ |
*RP = 0;\ |
else {\ |
CORRUPTION_ERROR_ACTION(M);\ |
}\ |
}\ |
}\ |
if (XP != 0) {\ |
tbinptr* H = treebin_at(M, X->index);\ |
if (X == *H) {\ |
if ((*H = R) == 0) \ |
clear_treemap(M, X->index);\ |
}\ |
else if (RTCHECK(ok_address(M, XP))) {\ |
if (XP->child[0] == X) \ |
XP->child[0] = R;\ |
else \ |
XP->child[1] = R;\ |
}\ |
else\ |
CORRUPTION_ERROR_ACTION(M);\ |
if (R != 0) {\ |
if (RTCHECK(ok_address(M, R))) {\ |
tchunkptr C0, C1;\ |
R->parent = XP;\ |
if ((C0 = X->child[0]) != 0) {\ |
if (RTCHECK(ok_address(M, C0))) {\ |
R->child[0] = C0;\ |
C0->parent = R;\ |
}\ |
else\ |
CORRUPTION_ERROR_ACTION(M);\ |
}\ |
if ((C1 = X->child[1]) != 0) {\ |
if (RTCHECK(ok_address(M, C1))) {\ |
R->child[1] = C1;\ |
C1->parent = R;\ |
}\ |
else\ |
CORRUPTION_ERROR_ACTION(M);\ |
}\ |
}\ |
else\ |
CORRUPTION_ERROR_ACTION(M);\ |
}\ |
}\ |
} |
/* Relays to large vs small bin operations */ |
#define insert_chunk(M, P, S)\ |
if (is_small(S)) insert_small_chunk(M, P, S)\ |
else { tchunkptr TP = (tchunkptr)(P); insert_large_chunk(M, TP, S); } |
#define unlink_chunk(M, P, S)\ |
if (is_small(S)) unlink_small_chunk(M, P, S)\ |
else { tchunkptr TP = (tchunkptr)(P); unlink_large_chunk(M, TP); } |
/* Relays to internal calls to malloc/free from realloc, memalign etc */ |
#if ONLY_MSPACES |
#define internal_malloc(m, b) mspace_malloc(m, b) |
#define internal_free(m, mem) mspace_free(m,mem); |
#else /* ONLY_MSPACES */ |
#if MSPACES |
#define internal_malloc(m, b)\ |
(m == gm)? dlmalloc(b) : mspace_malloc(m, b) |
#define internal_free(m, mem)\ |
if (m == gm) dlfree(mem); else mspace_free(m,mem); |
#else /* MSPACES */ |
#define internal_malloc(m, b) dlmalloc(b) |
#define internal_free(m, mem) dlfree(mem) |
#endif /* MSPACES */ |
#endif /* ONLY_MSPACES */ |
/* ----------------------- Direct-mmapping chunks ----------------------- */ |
/* |
Directly mmapped chunks are set up with an offset to the start of |
the mmapped region stored in the prev_foot field of the chunk. This |
allows reconstruction of the required argument to MUNMAP when freed, |
and also allows adjustment of the returned chunk to meet alignment |
requirements (especially in memalign). There is also enough space |
allocated to hold a fake next chunk of size SIZE_T_SIZE to maintain |
the PINUSE bit so frees can be checked. |
*/ |
/* Malloc using mmap */ |
static void* mmap_alloc(mstate m, size_t nb) { |
size_t mmsize = granularity_align(nb + SIX_SIZE_T_SIZES + CHUNK_ALIGN_MASK); |
if (mmsize > nb) { /* Check for wrap around 0 */ |
char* mm = (char*)(DIRECT_MMAP(mmsize)); |
if (mm != CMFAIL) { |
size_t offset = align_offset(chunk2mem(mm)); |
size_t psize = mmsize - offset - MMAP_FOOT_PAD; |
mchunkptr p = (mchunkptr)(mm + offset); |
p->prev_foot = offset | IS_MMAPPED_BIT; |
(p)->head = (psize|CINUSE_BIT); |
mark_inuse_foot(m, p, psize); |
chunk_plus_offset(p, psize)->head = FENCEPOST_HEAD; |
chunk_plus_offset(p, psize+SIZE_T_SIZE)->head = 0; |
if (mm < m->least_addr) |
m->least_addr = mm; |
if ((m->footprint += mmsize) > m->max_footprint) |
m->max_footprint = m->footprint; |
assert(is_aligned(chunk2mem(p))); |
check_mmapped_chunk(m, p); |
return chunk2mem(p); |
} |
} |
return 0; |
} |
/* Realloc using mmap */ |
static mchunkptr mmap_resize(mstate m, mchunkptr oldp, size_t nb) { |
size_t oldsize = chunksize(oldp); |
if (is_small(nb)) /* Can't shrink mmap regions below small size */ |
return 0; |
/* Keep old chunk if big enough but not too big */ |
if (oldsize >= nb + SIZE_T_SIZE && |
(oldsize - nb) <= (mparams.granularity << 1)) |
return oldp; |
else { |
size_t offset = oldp->prev_foot & ~IS_MMAPPED_BIT; |
size_t oldmmsize = oldsize + offset + MMAP_FOOT_PAD; |
size_t newmmsize = granularity_align(nb + SIX_SIZE_T_SIZES + |
CHUNK_ALIGN_MASK); |
char* cp = (char*)CALL_MREMAP((char*)oldp - offset, |
oldmmsize, newmmsize, 1); |
if (cp != CMFAIL) { |
mchunkptr newp = (mchunkptr)(cp + offset); |
size_t psize = newmmsize - offset - MMAP_FOOT_PAD; |
newp->head = (psize|CINUSE_BIT); |
mark_inuse_foot(m, newp, psize); |
chunk_plus_offset(newp, psize)->head = FENCEPOST_HEAD; |
chunk_plus_offset(newp, psize+SIZE_T_SIZE)->head = 0; |
if (cp < m->least_addr) |
m->least_addr = cp; |
if ((m->footprint += newmmsize - oldmmsize) > m->max_footprint) |
m->max_footprint = m->footprint; |
check_mmapped_chunk(m, newp); |
return newp; |
} |
} |
return 0; |
} |
/* -------------------------- mspace management -------------------------- */ |
/* Initialize top chunk and its size */ |
static void init_top(mstate m, mchunkptr p, size_t psize) { |
/* Ensure alignment */ |
size_t offset = align_offset(chunk2mem(p)); |
p = (mchunkptr)((char*)p + offset); |
psize -= offset; |
m->top = p; |
m->topsize = psize; |
p->head = psize | PINUSE_BIT; |
/* set size of fake trailing chunk holding overhead space only once */ |
chunk_plus_offset(p, psize)->head = TOP_FOOT_SIZE; |
m->trim_check = mparams.trim_threshold; /* reset on each update */ |
} |
/* Initialize bins for a new mstate that is otherwise zeroed out */ |
static void init_bins(mstate m) { |
/* Establish circular links for smallbins */ |
bindex_t i; |
for (i = 0; i < NSMALLBINS; ++i) { |
sbinptr bin = smallbin_at(m,i); |
bin->fd = bin->bk = bin; |
} |
} |
#if PROCEED_ON_ERROR |
/* default corruption action */ |
static void reset_on_error(mstate m) { |
int i; |
++malloc_corruption_error_count; |
/* Reinitialize fields to forget about all memory */ |
m->smallbins = m->treebins = 0; |
m->dvsize = m->topsize = 0; |
m->seg.base = 0; |
m->seg.size = 0; |
m->seg.next = 0; |
m->top = m->dv = 0; |
for (i = 0; i < NTREEBINS; ++i) |
*treebin_at(m, i) = 0; |
init_bins(m); |
} |
#endif /* PROCEED_ON_ERROR */ |
/* Allocate chunk and prepend remainder with chunk in successor base. */ |
static void* prepend_alloc(mstate m, char* newbase, char* oldbase, |
size_t nb) { |
mchunkptr p = align_as_chunk(newbase); |
mchunkptr oldfirst = align_as_chunk(oldbase); |
size_t psize = (char*)oldfirst - (char*)p; |
mchunkptr q = chunk_plus_offset(p, nb); |
size_t qsize = psize - nb; |
set_size_and_pinuse_of_inuse_chunk(m, p, nb); |
assert((char*)oldfirst > (char*)q); |
assert(pinuse(oldfirst)); |
assert(qsize >= MIN_CHUNK_SIZE); |
/* consolidate remainder with first chunk of old base */ |
if (oldfirst == m->top) { |
size_t tsize = m->topsize += qsize; |
m->top = q; |
q->head = tsize | PINUSE_BIT; |
check_top_chunk(m, q); |
} |
else if (oldfirst == m->dv) { |
size_t dsize = m->dvsize += qsize; |
m->dv = q; |
set_size_and_pinuse_of_free_chunk(q, dsize); |
} |
else { |
if (!cinuse(oldfirst)) { |
size_t nsize = chunksize(oldfirst); |
unlink_chunk(m, oldfirst, nsize); |
oldfirst = chunk_plus_offset(oldfirst, nsize); |
qsize += nsize; |
} |
set_free_with_pinuse(q, qsize, oldfirst); |
insert_chunk(m, q, qsize); |
check_free_chunk(m, q); |
} |
check_malloced_chunk(m, chunk2mem(p), nb); |
return chunk2mem(p); |
} |
/* Add a segment to hold a new noncontiguous region */ |
static void add_segment(mstate m, char* tbase, size_t tsize, flag_t mmapped) { |
/* Determine locations and sizes of segment, fenceposts, old top */ |
char* old_top = (char*)m->top; |
msegmentptr oldsp = segment_holding(m, old_top); |
char* old_end = oldsp->base + oldsp->size; |
size_t ssize = pad_request(sizeof(struct malloc_segment)); |
char* rawsp = old_end - (ssize + FOUR_SIZE_T_SIZES + CHUNK_ALIGN_MASK); |
size_t offset = align_offset(chunk2mem(rawsp)); |
char* asp = rawsp + offset; |
char* csp = (asp < (old_top + MIN_CHUNK_SIZE))? old_top : asp; |
mchunkptr sp = (mchunkptr)csp; |
msegmentptr ss = (msegmentptr)(chunk2mem(sp)); |
mchunkptr tnext = chunk_plus_offset(sp, ssize); |
mchunkptr p = tnext; |
int nfences = 0; |
/* reset top to new space */ |
init_top(m, (mchunkptr)tbase, tsize - TOP_FOOT_SIZE); |
/* Set up segment record */ |
assert(is_aligned(ss)); |
set_size_and_pinuse_of_inuse_chunk(m, sp, ssize); |
*ss = m->seg; /* Push current record */ |
m->seg.base = tbase; |
m->seg.size = tsize; |
m->seg.sflags = mmapped; |
m->seg.next = ss; |
/* Insert trailing fenceposts */ |
for (;;) { |
mchunkptr nextp = chunk_plus_offset(p, SIZE_T_SIZE); |
p->head = FENCEPOST_HEAD; |
++nfences; |
if ((char*)(&(nextp->head)) < old_end) |
p = nextp; |
else |
break; |
} |
assert(nfences >= 2); |
/* Insert the rest of old top into a bin as an ordinary free chunk */ |
if (csp != old_top) { |
mchunkptr q = (mchunkptr)old_top; |
size_t psize = csp - old_top; |
mchunkptr tn = chunk_plus_offset(q, psize); |
set_free_with_pinuse(q, psize, tn); |
insert_chunk(m, q, psize); |
} |
check_top_chunk(m, m->top); |
} |
/* -------------------------- System allocation -------------------------- */ |
/* Get memory from system using MORECORE or MMAP */ |
static void* sys_alloc(mstate m, size_t nb) { |
char* tbase = CMFAIL; |
size_t tsize = 0; |
flag_t mmap_flag = 0; |
init_mparams(); |
/* Directly map large chunks */ |
if (use_mmap(m) && nb >= mparams.mmap_threshold) { |
void* mem = mmap_alloc(m, nb); |
if (mem != 0) |
return mem; |
} |
/* |
Try getting memory in any of three ways (in most-preferred to |
least-preferred order): |
1. A call to MORECORE that can normally contiguously extend memory. |
(disabled if not MORECORE_CONTIGUOUS or not HAVE_MORECORE or |
or main space is mmapped or a previous contiguous call failed) |
2. A call to MMAP new space (disabled if not HAVE_MMAP). |
Note that under the default settings, if MORECORE is unable to |
fulfill a request, and HAVE_MMAP is true, then mmap is |
used as a noncontiguous system allocator. This is a useful backup |
strategy for systems with holes in address spaces -- in this case |
sbrk cannot contiguously expand the heap, but mmap may be able to |
find space. |
3. A call to MORECORE that cannot usually contiguously extend memory. |
(disabled if not HAVE_MORECORE) |
*/ |
if (MORECORE_CONTIGUOUS && !use_noncontiguous(m)) { |
char* br = CMFAIL; |
msegmentptr ss = (m->top == 0)? 0 : segment_holding(m, (char*)m->top); |
size_t asize = 0; |
ACQUIRE_MORECORE_LOCK(); |
if (ss == 0) { /* First time through or recovery */ |
char* base = (char*)CALL_MORECORE(0); |
if (base != CMFAIL) { |
asize = granularity_align(nb + TOP_FOOT_SIZE + SIZE_T_ONE); |
/* Adjust to end on a page boundary */ |
if (!is_page_aligned(base)) |
asize += (page_align((size_t)base) - (size_t)base); |
/* Can't call MORECORE if size is negative when treated as signed */ |
if (asize < HALF_MAX_SIZE_T && |
(br = (char*)(CALL_MORECORE(asize))) == base) { |
tbase = base; |
tsize = asize; |
} |
} |
} |
else { |
/* Subtract out existing available top space from MORECORE request. */ |
asize = granularity_align(nb - m->topsize + TOP_FOOT_SIZE + SIZE_T_ONE); |
/* Use mem here only if it did continuously extend old space */ |
if (asize < HALF_MAX_SIZE_T && |
(br = (char*)(CALL_MORECORE(asize))) == ss->base+ss->size) { |
tbase = br; |
tsize = asize; |
} |
} |
if (tbase == CMFAIL) { /* Cope with partial failure */ |
if (br != CMFAIL) { /* Try to use/extend the space we did get */ |
if (asize < HALF_MAX_SIZE_T && |
asize < nb + TOP_FOOT_SIZE + SIZE_T_ONE) { |
size_t esize = granularity_align(nb + TOP_FOOT_SIZE + SIZE_T_ONE - asize); |
if (esize < HALF_MAX_SIZE_T) { |
char* end = (char*)CALL_MORECORE(esize); |
if (end != CMFAIL) |
asize += esize; |
else { /* Can't use; try to release */ |
CALL_MORECORE(-asize); |
br = CMFAIL; |
} |
} |
} |
} |
if (br != CMFAIL) { /* Use the space we did get */ |
tbase = br; |
tsize = asize; |
} |
else |
disable_contiguous(m); /* Don't try contiguous path in the future */ |
} |
RELEASE_MORECORE_LOCK(); |
} |
if (HAVE_MMAP && tbase == CMFAIL) { /* Try MMAP */ |
size_t req = nb + TOP_FOOT_SIZE + SIZE_T_ONE; |
size_t rsize = granularity_align(req); |
if (rsize > nb) { /* Fail if wraps around zero */ |
char* mp = (char*)(CALL_MMAP(rsize)); |
if (mp != CMFAIL) { |
tbase = mp; |
tsize = rsize; |
mmap_flag = IS_MMAPPED_BIT; |
} |
} |
} |
if (HAVE_MORECORE && tbase == CMFAIL) { /* Try noncontiguous MORECORE */ |
size_t asize = granularity_align(nb + TOP_FOOT_SIZE + SIZE_T_ONE); |
if (asize < HALF_MAX_SIZE_T) { |
char* br = CMFAIL; |
char* end = CMFAIL; |
ACQUIRE_MORECORE_LOCK(); |
br = (char*)(CALL_MORECORE(asize)); |
end = (char*)(CALL_MORECORE(0)); |
RELEASE_MORECORE_LOCK(); |
if (br != CMFAIL && end != CMFAIL && br < end) { |
size_t ssize = end - br; |
if (ssize > nb + TOP_FOOT_SIZE) { |
tbase = br; |
tsize = ssize; |
} |
} |
} |
} |
if (tbase != CMFAIL) { |
if ((m->footprint += tsize) > m->max_footprint) |
m->max_footprint = m->footprint; |
if (!is_initialized(m)) { /* first-time initialization */ |
m->seg.base = m->least_addr = tbase; |
m->seg.size = tsize; |
m->seg.sflags = mmap_flag; |
m->magic = mparams.magic; |
init_bins(m); |
if (is_global(m)) |
init_top(m, (mchunkptr)tbase, tsize - TOP_FOOT_SIZE); |
else { |
/* Offset top by embedded malloc_state */ |
mchunkptr mn = next_chunk(mem2chunk(m)); |
init_top(m, mn, (size_t)((tbase + tsize) - (char*)mn) -TOP_FOOT_SIZE); |
} |
} |
else { |
/* Try to merge with an existing segment */ |
msegmentptr sp = &m->seg; |
while (sp != 0 && tbase != sp->base + sp->size) |
sp = sp->next; |
if (sp != 0 && |
!is_extern_segment(sp) && |
(sp->sflags & IS_MMAPPED_BIT) == mmap_flag && |
segment_holds(sp, m->top)) { /* append */ |
sp->size += tsize; |
init_top(m, m->top, m->topsize + tsize); |
} |
else { |
if (tbase < m->least_addr) |
m->least_addr = tbase; |
sp = &m->seg; |
while (sp != 0 && sp->base != tbase + tsize) |
sp = sp->next; |
if (sp != 0 && |
!is_extern_segment(sp) && |
(sp->sflags & IS_MMAPPED_BIT) == mmap_flag) { |
char* oldbase = sp->base; |
sp->base = tbase; |
sp->size += tsize; |
return prepend_alloc(m, tbase, oldbase, nb); |
} |
else |
add_segment(m, tbase, tsize, mmap_flag); |
} |
} |
if (nb < m->topsize) { /* Allocate from new or extended top space */ |
size_t rsize = m->topsize -= nb; |
mchunkptr p = m->top; |
mchunkptr r = m->top = chunk_plus_offset(p, nb); |
r->head = rsize | PINUSE_BIT; |
set_size_and_pinuse_of_inuse_chunk(m, p, nb); |
check_top_chunk(m, m->top); |
check_malloced_chunk(m, chunk2mem(p), nb); |
return chunk2mem(p); |
} |
} |
MALLOC_FAILURE_ACTION; |
return 0; |
} |
/* ----------------------- system deallocation -------------------------- */ |
/* Unmap and unlink any mmapped segments that don't contain used chunks */ |
static size_t release_unused_segments(mstate m) { |
size_t released = 0; |
msegmentptr pred = &m->seg; |
msegmentptr sp = pred->next; |
while (sp != 0) { |
char* base = sp->base; |
size_t size = sp->size; |
msegmentptr next = sp->next; |
if (is_mmapped_segment(sp) && !is_extern_segment(sp)) { |
mchunkptr p = align_as_chunk(base); |
size_t psize = chunksize(p); |
/* Can unmap if first chunk holds entire segment and not pinned */ |
if (!cinuse(p) && (char*)p + psize >= base + size - TOP_FOOT_SIZE) { |
tchunkptr tp = (tchunkptr)p; |
assert(segment_holds(sp, (char*)sp)); |
if (p == m->dv) { |
m->dv = 0; |
m->dvsize = 0; |
} |
else { |
unlink_large_chunk(m, tp); |
} |
if (CALL_MUNMAP(base, size) == 0) { |
released += size; |
m->footprint -= size; |
/* unlink obsoleted record */ |
sp = pred; |
sp->next = next; |
} |
else { /* back out if cannot unmap */ |
insert_large_chunk(m, tp, psize); |
} |
} |
} |
pred = sp; |
sp = next; |
} |
return released; |
} |
static int sys_trim(mstate m, size_t pad) { |
size_t released = 0; |
if (pad < MAX_REQUEST && is_initialized(m)) { |
pad += TOP_FOOT_SIZE; /* ensure enough room for segment overhead */ |
if (m->topsize > pad) { |
/* Shrink top space in granularity-size units, keeping at least one */ |
size_t unit = mparams.granularity; |
size_t extra = ((m->topsize - pad + (unit - SIZE_T_ONE)) / unit - |
SIZE_T_ONE) * unit; |
msegmentptr sp = segment_holding(m, (char*)m->top); |
if (!is_extern_segment(sp)) { |
if (is_mmapped_segment(sp)) { |
if (HAVE_MMAP && |
sp->size >= extra && |
!has_segment_link(m, sp)) { /* can't shrink if pinned */ |
/* Prefer mremap, fall back to munmap */ |
if ((CALL_MREMAP(sp->base, sp->size, sp->size - extra, 0) != MFAIL) || |
(CALL_MUNMAP(sp->base + sp->size - extra, extra) == 0)) { |
released = extra; |
} |
} |
} |
else if (HAVE_MORECORE) { |
if (extra >= HALF_MAX_SIZE_T) /* Avoid wrapping negative */ |
extra = (HALF_MAX_SIZE_T) + SIZE_T_ONE - unit; |
ACQUIRE_MORECORE_LOCK(); |
{ |
/* Make sure end of memory is where we last set it. */ |
char* old_br = (char*)(CALL_MORECORE(0)); |
if (old_br == sp->base + sp->size) { |
char* rel_br = (char*)(CALL_MORECORE(-extra)); |
char* new_br = (char*)(CALL_MORECORE(0)); |
if (rel_br != CMFAIL && new_br < old_br) |
released = old_br - new_br; |
} |
} |
RELEASE_MORECORE_LOCK(); |
} |
} |
if (released != 0) { |
sp->size -= released; |
m->footprint -= released; |
init_top(m, m->top, m->topsize - released); |
check_top_chunk(m, m->top); |
} |
} |
/* Unmap any unused mmapped segments */ |
if (HAVE_MMAP) |
released += release_unused_segments(m); |
/* On failure, disable autotrim to avoid repeated failed future calls */ |
if (released == 0) |
m->trim_check = MAX_SIZE_T; |
} |
return (released != 0)? 1 : 0; |
} |
/* ---------------------------- malloc support --------------------------- */ |
/* allocate a large request from the best fitting chunk in a treebin */ |
static void* tmalloc_large(mstate m, size_t nb) { |
tchunkptr v = 0; |
size_t rsize = -nb; /* Unsigned negation */ |
tchunkptr t; |
bindex_t idx; |
compute_tree_index(nb, idx); |
if ((t = *treebin_at(m, idx)) != 0) { |
/* Traverse tree for this bin looking for node with size == nb */ |
size_t sizebits = nb << leftshift_for_tree_index(idx); |
tchunkptr rst = 0; /* The deepest untaken right subtree */ |
for (;;) { |
tchunkptr rt; |
size_t trem = chunksize(t) - nb; |
if (trem < rsize) { |
v = t; |
if ((rsize = trem) == 0) |
break; |
} |
rt = t->child[1]; |
t = t->child[(sizebits >> (SIZE_T_BITSIZE-SIZE_T_ONE)) & 1]; |
if (rt != 0 && rt != t) |
rst = rt; |
if (t == 0) { |
t = rst; /* set t to least subtree holding sizes > nb */ |
break; |
} |
sizebits <<= 1; |
} |
} |
if (t == 0 && v == 0) { /* set t to root of next non-empty treebin */ |
binmap_t leftbits = left_bits(idx2bit(idx)) & m->treemap; |
if (leftbits != 0) { |
bindex_t i; |
binmap_t leastbit = least_bit(leftbits); |
compute_bit2idx(leastbit, i); |
t = *treebin_at(m, i); |
} |
} |
while (t != 0) { /* find smallest of tree or subtree */ |
size_t trem = chunksize(t) - nb; |
if (trem < rsize) { |
rsize = trem; |
v = t; |
} |
t = leftmost_child(t); |
} |
/* If dv is a better fit, return 0 so malloc will use it */ |
if (v != 0 && rsize < (size_t)(m->dvsize - nb)) { |
if (RTCHECK(ok_address(m, v))) { /* split */ |
mchunkptr r = chunk_plus_offset(v, nb); |
assert(chunksize(v) == rsize + nb); |
if (RTCHECK(ok_next(v, r))) { |
unlink_large_chunk(m, v); |
if (rsize < MIN_CHUNK_SIZE) |
set_inuse_and_pinuse(m, v, (rsize + nb)); |
else { |
set_size_and_pinuse_of_inuse_chunk(m, v, nb); |
set_size_and_pinuse_of_free_chunk(r, rsize); |
insert_chunk(m, r, rsize); |
} |
return chunk2mem(v); |
} |
} |
CORRUPTION_ERROR_ACTION(m); |
} |
return 0; |
} |
/* allocate a small request from the best fitting chunk in a treebin */ |
static void* tmalloc_small(mstate m, size_t nb) { |
tchunkptr t, v; |
size_t rsize; |
bindex_t i; |
binmap_t leastbit = least_bit(m->treemap); |
compute_bit2idx(leastbit, i); |
v = t = *treebin_at(m, i); |
rsize = chunksize(t) - nb; |
while ((t = leftmost_child(t)) != 0) { |
size_t trem = chunksize(t) - nb; |
if (trem < rsize) { |
rsize = trem; |
v = t; |
} |
} |
if (RTCHECK(ok_address(m, v))) { |
mchunkptr r = chunk_plus_offset(v, nb); |
assert(chunksize(v) == rsize + nb); |
if (RTCHECK(ok_next(v, r))) { |
unlink_large_chunk(m, v); |
if (rsize < MIN_CHUNK_SIZE) |
set_inuse_and_pinuse(m, v, (rsize + nb)); |
else { |
set_size_and_pinuse_of_inuse_chunk(m, v, nb); |
set_size_and_pinuse_of_free_chunk(r, rsize); |
replace_dv(m, r, rsize); |
} |
return chunk2mem(v); |
} |
} |
CORRUPTION_ERROR_ACTION(m); |
return 0; |
} |
/* --------------------------- realloc support --------------------------- */ |
static void* internal_realloc(mstate m, void* oldmem, size_t bytes) { |
if (bytes >= MAX_REQUEST) { |
MALLOC_FAILURE_ACTION; |
return 0; |
} |
if (!PREACTION(m)) { |
mchunkptr oldp = mem2chunk(oldmem); |
size_t oldsize = chunksize(oldp); |
mchunkptr next = chunk_plus_offset(oldp, oldsize); |
mchunkptr newp = 0; |
void* extra = 0; |
/* Try to either shrink or extend into top. Else malloc-copy-free */ |
if (RTCHECK(ok_address(m, oldp) && ok_cinuse(oldp) && |
ok_next(oldp, next) && ok_pinuse(next))) { |
size_t nb = request2size(bytes); |
if (is_mmapped(oldp)) |
newp = mmap_resize(m, oldp, nb); |
else if (oldsize >= nb) { /* already big enough */ |
size_t rsize = oldsize - nb; |
newp = oldp; |
if (rsize >= MIN_CHUNK_SIZE) { |
mchunkptr remainder = chunk_plus_offset(newp, nb); |
set_inuse(m, newp, nb); |
set_inuse(m, remainder, rsize); |
extra = chunk2mem(remainder); |
} |
} |
else if (next == m->top && oldsize + m->topsize > nb) { |
/* Expand into top */ |
size_t newsize = oldsize + m->topsize; |
size_t newtopsize = newsize - nb; |
mchunkptr newtop = chunk_plus_offset(oldp, nb); |
set_inuse(m, oldp, nb); |
newtop->head = newtopsize |PINUSE_BIT; |
m->top = newtop; |
m->topsize = newtopsize; |
newp = oldp; |
} |
} |
else { |
USAGE_ERROR_ACTION(m, oldmem); |
POSTACTION(m); |
return 0; |
} |
POSTACTION(m); |
if (newp != 0) { |
if (extra != 0) { |
internal_free(m, extra); |
} |
check_inuse_chunk(m, newp); |
return chunk2mem(newp); |
} |
else { |
void* newmem = internal_malloc(m, bytes); |
if (newmem != 0) { |
size_t oc = oldsize - overhead_for(oldp); |
memcpy(newmem, oldmem, (oc < bytes)? oc : bytes); |
internal_free(m, oldmem); |
} |
return newmem; |
} |
} |
return 0; |
} |
/* --------------------------- memalign support -------------------------- */ |
static void* internal_memalign(mstate m, size_t alignment, size_t bytes) { |
if (alignment <= MALLOC_ALIGNMENT) /* Can just use malloc */ |
return internal_malloc(m, bytes); |
if (alignment < MIN_CHUNK_SIZE) /* must be at least a minimum chunk size */ |
alignment = MIN_CHUNK_SIZE; |
if ((alignment & (alignment-SIZE_T_ONE)) != 0) {/* Ensure a power of 2 */ |
size_t a = MALLOC_ALIGNMENT << 1; |
while (a < alignment) a <<= 1; |
alignment = a; |
} |
if (bytes >= MAX_REQUEST - alignment) { |
if (m != 0) { /* Test isn't needed but avoids compiler warning */ |
MALLOC_FAILURE_ACTION; |
} |
} |
else { |
size_t nb = request2size(bytes); |
size_t req = nb + alignment + MIN_CHUNK_SIZE - CHUNK_OVERHEAD; |
char* mem = (char*)internal_malloc(m, req); |
if (mem != 0) { |
void* leader = 0; |
void* trailer = 0; |
mchunkptr p = mem2chunk(mem); |
if (PREACTION(m)) return 0; |
if ((((size_t)(mem)) % alignment) != 0) { /* misaligned */ |
/* |
Find an aligned spot inside chunk. Since we need to give |
back leading space in a chunk of at least MIN_CHUNK_SIZE, if |
the first calculation places us at a spot with less than |
MIN_CHUNK_SIZE leader, we can move to the next aligned spot. |
We've allocated enough total room so that this is always |
possible. |
*/ |
char* br = (char*)mem2chunk((size_t)(((size_t)(mem + |
alignment - |
SIZE_T_ONE)) & |
-alignment)); |
char* pos = ((size_t)(br - (char*)(p)) >= MIN_CHUNK_SIZE)? |
br : br+alignment; |
mchunkptr newp = (mchunkptr)pos; |
size_t leadsize = pos - (char*)(p); |
size_t newsize = chunksize(p) - leadsize; |
if (is_mmapped(p)) { /* For mmapped chunks, just adjust offset */ |
newp->prev_foot = p->prev_foot + leadsize; |
newp->head = (newsize|CINUSE_BIT); |
} |
else { /* Otherwise, give back leader, use the rest */ |
set_inuse(m, newp, newsize); |
set_inuse(m, p, leadsize); |
leader = chunk2mem(p); |
} |
p = newp; |
} |
/* Give back spare room at the end */ |
if (!is_mmapped(p)) { |
size_t size = chunksize(p); |
if (size > nb + MIN_CHUNK_SIZE) { |
size_t remainder_size = size - nb; |
mchunkptr remainder = chunk_plus_offset(p, nb); |
set_inuse(m, p, nb); |
set_inuse(m, remainder, remainder_size); |
trailer = chunk2mem(remainder); |
} |
} |
assert (chunksize(p) >= nb); |
assert((((size_t)(chunk2mem(p))) % alignment) == 0); |
check_inuse_chunk(m, p); |
POSTACTION(m); |
if (leader != 0) { |
internal_free(m, leader); |
} |
if (trailer != 0) { |
internal_free(m, trailer); |
} |
return chunk2mem(p); |
} |
} |
return 0; |
} |
/* ------------------------ comalloc/coalloc support --------------------- */ |
static void** ialloc(mstate m, |
size_t n_elements, |
size_t* sizes, |
int opts, |
void* chunks[]) { |
/* |
This provides common support for independent_X routines, handling |
all of the combinations that can result. |
The opts arg has: |
bit 0 set if all elements are same size (using sizes[0]) |
bit 1 set if elements should be zeroed |
*/ |
size_t element_size; /* chunksize of each element, if all same */ |
size_t contents_size; /* total size of elements */ |
size_t array_size; /* request size of pointer array */ |
void* mem; /* malloced aggregate space */ |
mchunkptr p; /* corresponding chunk */ |
size_t remainder_size; /* remaining bytes while splitting */ |
void** marray; /* either "chunks" or malloced ptr array */ |
mchunkptr array_chunk; /* chunk for malloced ptr array */ |
flag_t was_enabled; /* to disable mmap */ |
size_t size; |
size_t i; |
/* compute array length, if needed */ |
if (chunks != 0) { |
if (n_elements == 0) |
return chunks; /* nothing to do */ |
marray = chunks; |
array_size = 0; |
} |
else { |
/* if empty req, must still return chunk representing empty array */ |
if (n_elements == 0) |
return (void**)internal_malloc(m, 0); |
marray = 0; |
array_size = request2size(n_elements * (sizeof(void*))); |
} |
/* compute total element size */ |
if (opts & 0x1) { /* all-same-size */ |
element_size = request2size(*sizes); |
contents_size = n_elements * element_size; |
} |
else { /* add up all the sizes */ |
element_size = 0; |
contents_size = 0; |
for (i = 0; i != n_elements; ++i) |
contents_size += request2size(sizes[i]); |
} |
size = contents_size + array_size; |
/* |
Allocate the aggregate chunk. First disable direct-mmapping so |
malloc won't use it, since we would not be able to later |
free/realloc space internal to a segregated mmap region. |
*/ |
was_enabled = use_mmap(m); |
disable_mmap(m); |
mem = internal_malloc(m, size - CHUNK_OVERHEAD); |
if (was_enabled) |
enable_mmap(m); |
if (mem == 0) |
return 0; |
if (PREACTION(m)) return 0; |
p = mem2chunk(mem); |
remainder_size = chunksize(p); |
assert(!is_mmapped(p)); |
if (opts & 0x2) { /* optionally clear the elements */ |
memset((size_t*)mem, 0, remainder_size - SIZE_T_SIZE - array_size); |
} |
/* If not provided, allocate the pointer array as final part of chunk */ |
if (marray == 0) { |
size_t array_chunk_size; |
array_chunk = chunk_plus_offset(p, contents_size); |
array_chunk_size = remainder_size - contents_size; |
marray = (void**) (chunk2mem(array_chunk)); |
set_size_and_pinuse_of_inuse_chunk(m, array_chunk, array_chunk_size); |
remainder_size = contents_size; |
} |
/* split out elements */ |
for (i = 0; ; ++i) { |
marray[i] = chunk2mem(p); |
if (i != n_elements-1) { |
if (element_size != 0) |
size = element_size; |
else |
size = request2size(sizes[i]); |
remainder_size -= size; |
set_size_and_pinuse_of_inuse_chunk(m, p, size); |
p = chunk_plus_offset(p, size); |
} |
else { /* the final element absorbs any overallocation slop */ |
set_size_and_pinuse_of_inuse_chunk(m, p, remainder_size); |
break; |
} |
} |
#if DEBUG |
if (marray != chunks) { |
/* final element must have exactly exhausted chunk */ |
if (element_size != 0) { |
assert(remainder_size == element_size); |
} |
else { |
assert(remainder_size == request2size(sizes[i])); |
} |
check_inuse_chunk(m, mem2chunk(marray)); |
} |
for (i = 0; i != n_elements; ++i) |
check_inuse_chunk(m, mem2chunk(marray[i])); |
#endif /* DEBUG */ |
POSTACTION(m); |
return marray; |
} |
/* -------------------------- public routines ---------------------------- */ |
#if !ONLY_MSPACES |
void* dlmalloc(size_t bytes) { |
/* |
Basic algorithm: |
If a small request (< 256 bytes minus per-chunk overhead): |
1. If one exists, use a remainderless chunk in associated smallbin. |
(Remainderless means that there are too few excess bytes to |
represent as a chunk.) |
2. If it is big enough, use the dv chunk, which is normally the |
chunk adjacent to the one used for the most recent small request. |
3. If one exists, split the smallest available chunk in a bin, |
saving remainder in dv. |
4. If it is big enough, use the top chunk. |
5. If available, get memory from system and use it |
Otherwise, for a large request: |
1. Find the smallest available binned chunk that fits, and use it |
if it is better fitting than dv chunk, splitting if necessary. |
2. If better fitting than any binned chunk, use the dv chunk. |
3. If it is big enough, use the top chunk. |
4. If request size >= mmap threshold, try to directly mmap this chunk. |
5. If available, get memory from system and use it |
The ugly goto's here ensure that postaction occurs along all paths. |
*/ |
if (!PREACTION(gm)) { |
void* mem; |
size_t nb; |
if (bytes <= MAX_SMALL_REQUEST) { |
bindex_t idx; |
binmap_t smallbits; |
nb = (bytes < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(bytes); |
idx = small_index(nb); |
smallbits = gm->smallmap >> idx; |
if ((smallbits & 0x3U) != 0) { /* Remainderless fit to a smallbin. */ |
mchunkptr b, p; |
idx += ~smallbits & 1; /* Uses next bin if idx empty */ |
b = smallbin_at(gm, idx); |
p = b->fd; |
assert(chunksize(p) == small_index2size(idx)); |
unlink_first_small_chunk(gm, b, p, idx); |
set_inuse_and_pinuse(gm, p, small_index2size(idx)); |
mem = chunk2mem(p); |
check_malloced_chunk(gm, mem, nb); |
goto postaction; |
} |
else if (nb > gm->dvsize) { |
if (smallbits != 0) { /* Use chunk in next nonempty smallbin */ |
mchunkptr b, p, r; |
size_t rsize; |
bindex_t i; |
binmap_t leftbits = (smallbits << idx) & left_bits(idx2bit(idx)); |
binmap_t leastbit = least_bit(leftbits); |
compute_bit2idx(leastbit, i); |
b = smallbin_at(gm, i); |
p = b->fd; |
assert(chunksize(p) == small_index2size(i)); |
unlink_first_small_chunk(gm, b, p, i); |
rsize = small_index2size(i) - nb; |
/* Fit here cannot be remainderless if 4byte sizes */ |
if (SIZE_T_SIZE != 4 && rsize < MIN_CHUNK_SIZE) |
set_inuse_and_pinuse(gm, p, small_index2size(i)); |
else { |
set_size_and_pinuse_of_inuse_chunk(gm, p, nb); |
r = chunk_plus_offset(p, nb); |
set_size_and_pinuse_of_free_chunk(r, rsize); |
replace_dv(gm, r, rsize); |
} |
mem = chunk2mem(p); |
check_malloced_chunk(gm, mem, nb); |
goto postaction; |
} |
else if (gm->treemap != 0 && (mem = tmalloc_small(gm, nb)) != 0) { |
check_malloced_chunk(gm, mem, nb); |
goto postaction; |
} |
} |
} |
else if (bytes >= MAX_REQUEST) |
nb = MAX_SIZE_T; /* Too big to allocate. Force failure (in sys alloc) */ |
else { |
nb = pad_request(bytes); |
if (gm->treemap != 0 && (mem = tmalloc_large(gm, nb)) != 0) { |
check_malloced_chunk(gm, mem, nb); |
goto postaction; |
} |
} |
if (nb <= gm->dvsize) { |
size_t rsize = gm->dvsize - nb; |
mchunkptr p = gm->dv; |
if (rsize >= MIN_CHUNK_SIZE) { /* split dv */ |
mchunkptr r = gm->dv = chunk_plus_offset(p, nb); |
gm->dvsize = rsize; |
set_size_and_pinuse_of_free_chunk(r, rsize); |
set_size_and_pinuse_of_inuse_chunk(gm, p, nb); |
} |
else { /* exhaust dv */ |
size_t dvs = gm->dvsize; |
gm->dvsize = 0; |
gm->dv = 0; |
set_inuse_and_pinuse(gm, p, dvs); |
} |
mem = chunk2mem(p); |
check_malloced_chunk(gm, mem, nb); |
goto postaction; |
} |
else if (nb < gm->topsize) { /* Split top */ |
size_t rsize = gm->topsize -= nb; |
mchunkptr p = gm->top; |
mchunkptr r = gm->top = chunk_plus_offset(p, nb); |
r->head = rsize | PINUSE_BIT; |
set_size_and_pinuse_of_inuse_chunk(gm, p, nb); |
mem = chunk2mem(p); |
check_top_chunk(gm, gm->top); |
check_malloced_chunk(gm, mem, nb); |
goto postaction; |
} |
mem = sys_alloc(gm, nb); |
postaction: |
POSTACTION(gm); |
return mem; |
} |
return 0; |
} |
void dlfree(void* mem) { |
/* |
Consolidate freed chunks with preceeding or succeeding bordering |
free chunks, if they exist, and then place in a bin. Intermixed |
with special cases for top, dv, mmapped chunks, and usage errors. |
*/ |
if (mem != 0) { |
mchunkptr p = mem2chunk(mem); |
#if FOOTERS |
mstate fm = get_mstate_for(p); |
if (!ok_magic(fm)) { |
USAGE_ERROR_ACTION(fm, p); |
return; |
} |
#else /* FOOTERS */ |
#define fm gm |
#endif /* FOOTERS */ |
if (!PREACTION(fm)) { |
check_inuse_chunk(fm, p); |
if (RTCHECK(ok_address(fm, p) && ok_cinuse(p))) { |
size_t psize = chunksize(p); |
mchunkptr next = chunk_plus_offset(p, psize); |
if (!pinuse(p)) { |
size_t prevsize = p->prev_foot; |
if ((prevsize & IS_MMAPPED_BIT) != 0) { |
prevsize &= ~IS_MMAPPED_BIT; |
psize += prevsize + MMAP_FOOT_PAD; |
if (CALL_MUNMAP((char*)p - prevsize, psize) == 0) |
fm->footprint -= psize; |
goto postaction; |
} |
else { |
mchunkptr prev = chunk_minus_offset(p, prevsize); |
psize += prevsize; |
p = prev; |
if (RTCHECK(ok_address(fm, prev))) { /* consolidate backward */ |
if (p != fm->dv) { |
unlink_chunk(fm, p, prevsize); |
} |
else if ((next->head & INUSE_BITS) == INUSE_BITS) { |
fm->dvsize = psize; |
set_free_with_pinuse(p, psize, next); |
goto postaction; |
} |
} |
else |
goto erroraction; |
} |
} |
if (RTCHECK(ok_next(p, next) && ok_pinuse(next))) { |
if (!cinuse(next)) { /* consolidate forward */ |
if (next == fm->top) { |
size_t tsize = fm->topsize += psize; |
fm->top = p; |
p->head = tsize | PINUSE_BIT; |
if (p == fm->dv) { |
fm->dv = 0; |
fm->dvsize = 0; |
} |
if (should_trim(fm, tsize)) |
sys_trim(fm, 0); |
goto postaction; |
} |
else if (next == fm->dv) { |
size_t dsize = fm->dvsize += psize; |
fm->dv = p; |
set_size_and_pinuse_of_free_chunk(p, dsize); |
goto postaction; |
} |
else { |
size_t nsize = chunksize(next); |
psize += nsize; |
unlink_chunk(fm, next, nsize); |
set_size_and_pinuse_of_free_chunk(p, psize); |
if (p == fm->dv) { |
fm->dvsize = psize; |
goto postaction; |
} |
} |
} |
else |
set_free_with_pinuse(p, psize, next); |
insert_chunk(fm, p, psize); |
check_free_chunk(fm, p); |
goto postaction; |
} |
} |
erroraction: |
USAGE_ERROR_ACTION(fm, p); |
postaction: |
POSTACTION(fm); |
} |
} |
#if !FOOTERS |
#undef fm |
#endif /* FOOTERS */ |
} |
void* dlcalloc(size_t n_elements, size_t elem_size) { |
void* mem; |
size_t req = 0; |
if (n_elements != 0) { |
req = n_elements * elem_size; |
if (((n_elements | elem_size) & ~(size_t)0xffff) && |
(req / n_elements != elem_size)) |
req = MAX_SIZE_T; /* force downstream failure on overflow */ |
} |
mem = dlmalloc(req); |
if (mem != 0 && calloc_must_clear(mem2chunk(mem))) |
memset(mem, 0, req); |
return mem; |
} |
void* dlrealloc(void* oldmem, size_t bytes) { |
if (oldmem == 0) |
return dlmalloc(bytes); |
#ifdef REALLOC_ZERO_BYTES_FREES |
if (bytes == 0) { |
dlfree(oldmem); |
return 0; |
} |
#endif /* REALLOC_ZERO_BYTES_FREES */ |
else { |
#if ! FOOTERS |
mstate m = gm; |
#else /* FOOTERS */ |
mstate m = get_mstate_for(mem2chunk(oldmem)); |
if (!ok_magic(m)) { |
USAGE_ERROR_ACTION(m, oldmem); |
return 0; |
} |
#endif /* FOOTERS */ |
return internal_realloc(m, oldmem, bytes); |
} |
} |
void* dlmemalign(size_t alignment, size_t bytes) { |
return internal_memalign(gm, alignment, bytes); |
} |
void** dlindependent_calloc(size_t n_elements, size_t elem_size, |
void* chunks[]) { |
size_t sz = elem_size; /* serves as 1-element array */ |
return ialloc(gm, n_elements, &sz, 3, chunks); |
} |
void** dlindependent_comalloc(size_t n_elements, size_t sizes[], |
void* chunks[]) { |
return ialloc(gm, n_elements, sizes, 0, chunks); |
} |
void* dlvalloc(size_t bytes) { |
size_t pagesz; |
init_mparams(); |
pagesz = mparams.page_size; |
return dlmemalign(pagesz, bytes); |
} |
void* dlpvalloc(size_t bytes) { |
size_t pagesz; |
init_mparams(); |
pagesz = mparams.page_size; |
return dlmemalign(pagesz, (bytes + pagesz - SIZE_T_ONE) & ~(pagesz - SIZE_T_ONE)); |
} |
int dlmalloc_trim(size_t pad) { |
int result = 0; |
if (!PREACTION(gm)) { |
result = sys_trim(gm, pad); |
POSTACTION(gm); |
} |
return result; |
} |
size_t dlmalloc_footprint(void) { |
return gm->footprint; |
} |
size_t dlmalloc_max_footprint(void) { |
return gm->max_footprint; |
} |
#if !NO_MALLINFO |
struct mallinfo dlmallinfo(void) { |
return internal_mallinfo(gm); |
} |
#endif /* NO_MALLINFO */ |
void dlmalloc_stats() { |
internal_malloc_stats(gm); |
} |
size_t dlmalloc_usable_size(void* mem) { |
if (mem != 0) { |
mchunkptr p = mem2chunk(mem); |
if (cinuse(p)) |
return chunksize(p) - overhead_for(p); |
} |
return 0; |
} |
int dlmallopt(int param_number, int value) { |
return change_mparam(param_number, value); |
} |
#endif /* !ONLY_MSPACES */ |
/* ----------------------------- user mspaces ---------------------------- */ |
#if MSPACES |
static mstate init_user_mstate(char* tbase, size_t tsize) { |
size_t msize = pad_request(sizeof(struct malloc_state)); |
mchunkptr mn; |
mchunkptr msp = align_as_chunk(tbase); |
mstate m = (mstate)(chunk2mem(msp)); |
memset(m, 0, msize); |
INITIAL_LOCK(&m->mutex); |
msp->head = (msize|PINUSE_BIT|CINUSE_BIT); |
m->seg.base = m->least_addr = tbase; |
m->seg.size = m->footprint = m->max_footprint = tsize; |
m->magic = mparams.magic; |
m->mflags = mparams.default_mflags; |
disable_contiguous(m); |
init_bins(m); |
mn = next_chunk(mem2chunk(m)); |
init_top(m, mn, (size_t)((tbase + tsize) - (char*)mn) - TOP_FOOT_SIZE); |
check_top_chunk(m, m->top); |
return m; |
} |
mspace create_mspace(size_t capacity, int locked) { |
mstate m = 0; |
size_t msize = pad_request(sizeof(struct malloc_state)); |
init_mparams(); /* Ensure pagesize etc initialized */ |
if (capacity < (size_t) -(msize + TOP_FOOT_SIZE + mparams.page_size)) { |
size_t rs = ((capacity == 0)? mparams.granularity : |
(capacity + TOP_FOOT_SIZE + msize)); |
size_t tsize = granularity_align(rs); |
char* tbase = (char*)(CALL_MMAP(tsize)); |
if (tbase != CMFAIL) { |
m = init_user_mstate(tbase, tsize); |
m->seg.sflags = IS_MMAPPED_BIT; |
set_lock(m, locked); |
} |
} |
return (mspace)m; |
} |
mspace create_mspace_with_base(void* base, size_t capacity, int locked) { |
mstate m = 0; |
size_t msize = pad_request(sizeof(struct malloc_state)); |
init_mparams(); /* Ensure pagesize etc initialized */ |
if (capacity > msize + TOP_FOOT_SIZE && |
capacity < (size_t) -(msize + TOP_FOOT_SIZE + mparams.page_size)) { |
m = init_user_mstate((char*)base, capacity); |
m->seg.sflags = EXTERN_BIT; |
set_lock(m, locked); |
} |
return (mspace)m; |
} |
size_t destroy_mspace(mspace msp) { |
size_t freed = 0; |
mstate ms = (mstate)msp; |
if (ok_magic(ms)) { |
msegmentptr sp = &ms->seg; |
while (sp != 0) { |
char* base = sp->base; |
size_t size = sp->size; |
flag_t flag = sp->sflags; |
sp = sp->next; |
if ((flag & IS_MMAPPED_BIT) && !(flag & EXTERN_BIT) && |
CALL_MUNMAP(base, size) == 0) |
freed += size; |
} |
} |
else { |
USAGE_ERROR_ACTION(ms,ms); |
} |
return freed; |
} |
/* |
mspace versions of routines are near-clones of the global |
versions. This is not so nice but better than the alternatives. |
*/ |
void* mspace_malloc(mspace msp, size_t bytes) { |
mstate ms = (mstate)msp; |
if (!ok_magic(ms)) { |
USAGE_ERROR_ACTION(ms,ms); |
return 0; |
} |
if (!PREACTION(ms)) { |
void* mem; |
size_t nb; |
if (bytes <= MAX_SMALL_REQUEST) { |
bindex_t idx; |
binmap_t smallbits; |
nb = (bytes < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(bytes); |
idx = small_index(nb); |
smallbits = ms->smallmap >> idx; |
if ((smallbits & 0x3U) != 0) { /* Remainderless fit to a smallbin. */ |
mchunkptr b, p; |
idx += ~smallbits & 1; /* Uses next bin if idx empty */ |
b = smallbin_at(ms, idx); |
p = b->fd; |
assert(chunksize(p) == small_index2size(idx)); |
unlink_first_small_chunk(ms, b, p, idx); |
set_inuse_and_pinuse(ms, p, small_index2size(idx)); |
mem = chunk2mem(p); |
check_malloced_chunk(ms, mem, nb); |
goto postaction; |
} |
else if (nb > ms->dvsize) { |
if (smallbits != 0) { /* Use chunk in next nonempty smallbin */ |
mchunkptr b, p, r; |
size_t rsize; |
bindex_t i; |
binmap_t leftbits = (smallbits << idx) & left_bits(idx2bit(idx)); |
binmap_t leastbit = least_bit(leftbits); |
compute_bit2idx(leastbit, i); |
b = smallbin_at(ms, i); |
p = b->fd; |
assert(chunksize(p) == small_index2size(i)); |
unlink_first_small_chunk(ms, b, p, i); |
rsize = small_index2size(i) - nb; |
/* Fit here cannot be remainderless if 4byte sizes */ |
if (SIZE_T_SIZE != 4 && rsize < MIN_CHUNK_SIZE) |
set_inuse_and_pinuse(ms, p, small_index2size(i)); |
else { |
set_size_and_pinuse_of_inuse_chunk(ms, p, nb); |
r = chunk_plus_offset(p, nb); |
set_size_and_pinuse_of_free_chunk(r, rsize); |
replace_dv(ms, r, rsize); |
} |
mem = chunk2mem(p); |
check_malloced_chunk(ms, mem, nb); |
goto postaction; |
} |
else if (ms->treemap != 0 && (mem = tmalloc_small(ms, nb)) != 0) { |
check_malloced_chunk(ms, mem, nb); |
goto postaction; |
} |
} |
} |
else if (bytes >= MAX_REQUEST) |
nb = MAX_SIZE_T; /* Too big to allocate. Force failure (in sys alloc) */ |
else { |
nb = pad_request(bytes); |
if (ms->treemap != 0 && (mem = tmalloc_large(ms, nb)) != 0) { |
check_malloced_chunk(ms, mem, nb); |
goto postaction; |
} |
} |
if (nb <= ms->dvsize) { |
size_t rsize = ms->dvsize - nb; |
mchunkptr p = ms->dv; |
if (rsize >= MIN_CHUNK_SIZE) { /* split dv */ |
mchunkptr r = ms->dv = chunk_plus_offset(p, nb); |
ms->dvsize = rsize; |
set_size_and_pinuse_of_free_chunk(r, rsize); |
set_size_and_pinuse_of_inuse_chunk(ms, p, nb); |
} |
else { /* exhaust dv */ |
size_t dvs = ms->dvsize; |
ms->dvsize = 0; |
ms->dv = 0; |
set_inuse_and_pinuse(ms, p, dvs); |
} |
mem = chunk2mem(p); |
check_malloced_chunk(ms, mem, nb); |
goto postaction; |
} |
else if (nb < ms->topsize) { /* Split top */ |
size_t rsize = ms->topsize -= nb; |
mchunkptr p = ms->top; |
mchunkptr r = ms->top = chunk_plus_offset(p, nb); |
r->head = rsize | PINUSE_BIT; |
set_size_and_pinuse_of_inuse_chunk(ms, p, nb); |
mem = chunk2mem(p); |
check_top_chunk(ms, ms->top); |
check_malloced_chunk(ms, mem, nb); |
goto postaction; |
} |
mem = sys_alloc(ms, nb); |
postaction: |
POSTACTION(ms); |
return mem; |
} |
return 0; |
} |
void mspace_free(mspace msp, void* mem) { |
if (mem != 0) { |
mchunkptr p = mem2chunk(mem); |
#if FOOTERS |
mstate fm = get_mstate_for(p); |
#else /* FOOTERS */ |
mstate fm = (mstate)msp; |
#endif /* FOOTERS */ |
if (!ok_magic(fm)) { |
USAGE_ERROR_ACTION(fm, p); |
return; |
} |
if (!PREACTION(fm)) { |
check_inuse_chunk(fm, p); |
if (RTCHECK(ok_address(fm, p) && ok_cinuse(p))) { |
size_t psize = chunksize(p); |
mchunkptr next = chunk_plus_offset(p, psize); |
if (!pinuse(p)) { |
size_t prevsize = p->prev_foot; |
if ((prevsize & IS_MMAPPED_BIT) != 0) { |
prevsize &= ~IS_MMAPPED_BIT; |
psize += prevsize + MMAP_FOOT_PAD; |
if (CALL_MUNMAP((char*)p - prevsize, psize) == 0) |
fm->footprint -= psize; |
goto postaction; |
} |
else { |
mchunkptr prev = chunk_minus_offset(p, prevsize); |
psize += prevsize; |
p = prev; |
if (RTCHECK(ok_address(fm, prev))) { /* consolidate backward */ |
if (p != fm->dv) { |
unlink_chunk(fm, p, prevsize); |
} |
else if ((next->head & INUSE_BITS) == INUSE_BITS) { |
fm->dvsize = psize; |
set_free_with_pinuse(p, psize, next); |
goto postaction; |
} |
} |
else |
goto erroraction; |
} |
} |
if (RTCHECK(ok_next(p, next) && ok_pinuse(next))) { |
if (!cinuse(next)) { /* consolidate forward */ |
if (next == fm->top) { |
size_t tsize = fm->topsize += psize; |
fm->top = p; |
p->head = tsize | PINUSE_BIT; |
if (p == fm->dv) { |
fm->dv = 0; |
fm->dvsize = 0; |
} |
if (should_trim(fm, tsize)) |
sys_trim(fm, 0); |
goto postaction; |
} |
else if (next == fm->dv) { |
size_t dsize = fm->dvsize += psize; |
fm->dv = p; |
set_size_and_pinuse_of_free_chunk(p, dsize); |
goto postaction; |
} |
else { |
size_t nsize = chunksize(next); |
psize += nsize; |
unlink_chunk(fm, next, nsize); |
set_size_and_pinuse_of_free_chunk(p, psize); |
if (p == fm->dv) { |
fm->dvsize = psize; |
goto postaction; |
} |
} |
} |
else |
set_free_with_pinuse(p, psize, next); |
insert_chunk(fm, p, psize); |
check_free_chunk(fm, p); |
goto postaction; |
} |
} |
erroraction: |
USAGE_ERROR_ACTION(fm, p); |
postaction: |
POSTACTION(fm); |
} |
} |
} |
void* mspace_calloc(mspace msp, size_t n_elements, size_t elem_size) { |
void* mem; |
size_t req = 0; |
mstate ms = (mstate)msp; |
if (!ok_magic(ms)) { |
USAGE_ERROR_ACTION(ms,ms); |
return 0; |
} |
if (n_elements != 0) { |
req = n_elements * elem_size; |
if (((n_elements | elem_size) & ~(size_t)0xffff) && |
(req / n_elements != elem_size)) |
req = MAX_SIZE_T; /* force downstream failure on overflow */ |
} |
mem = internal_malloc(ms, req); |
if (mem != 0 && calloc_must_clear(mem2chunk(mem))) |
memset(mem, 0, req); |
return mem; |
} |
void* mspace_realloc(mspace msp, void* oldmem, size_t bytes) { |
if (oldmem == 0) |
return mspace_malloc(msp, bytes); |
#ifdef REALLOC_ZERO_BYTES_FREES |
if (bytes == 0) { |
mspace_free(msp, oldmem); |
return 0; |
} |
#endif /* REALLOC_ZERO_BYTES_FREES */ |
else { |
#if FOOTERS |
mchunkptr p = mem2chunk(oldmem); |
mstate ms = get_mstate_for(p); |
#else /* FOOTERS */ |
mstate ms = (mstate)msp; |
#endif /* FOOTERS */ |
if (!ok_magic(ms)) { |
USAGE_ERROR_ACTION(ms,ms); |
return 0; |
} |
return internal_realloc(ms, oldmem, bytes); |
} |
} |
void* mspace_memalign(mspace msp, size_t alignment, size_t bytes) { |
mstate ms = (mstate)msp; |
if (!ok_magic(ms)) { |
USAGE_ERROR_ACTION(ms,ms); |
return 0; |
} |
return internal_memalign(ms, alignment, bytes); |
} |
void** mspace_independent_calloc(mspace msp, size_t n_elements, |
size_t elem_size, void* chunks[]) { |
size_t sz = elem_size; /* serves as 1-element array */ |
mstate ms = (mstate)msp; |
if (!ok_magic(ms)) { |
USAGE_ERROR_ACTION(ms,ms); |
return 0; |
} |
return ialloc(ms, n_elements, &sz, 3, chunks); |
} |
void** mspace_independent_comalloc(mspace msp, size_t n_elements, |
size_t sizes[], void* chunks[]) { |
mstate ms = (mstate)msp; |
if (!ok_magic(ms)) { |
USAGE_ERROR_ACTION(ms,ms); |
return 0; |
} |
return ialloc(ms, n_elements, sizes, 0, chunks); |
} |
int mspace_trim(mspace msp, size_t pad) { |
int result = 0; |
mstate ms = (mstate)msp; |
if (ok_magic(ms)) { |
if (!PREACTION(ms)) { |
result = sys_trim(ms, pad); |
POSTACTION(ms); |
} |
} |
else { |
USAGE_ERROR_ACTION(ms,ms); |
} |
return result; |
} |
void mspace_malloc_stats(mspace msp) { |
mstate ms = (mstate)msp; |
if (ok_magic(ms)) { |
internal_malloc_stats(ms); |
} |
else { |
USAGE_ERROR_ACTION(ms,ms); |
} |
} |
size_t mspace_footprint(mspace msp) { |
size_t result; |
mstate ms = (mstate)msp; |
if (ok_magic(ms)) { |
result = ms->footprint; |
} |
USAGE_ERROR_ACTION(ms,ms); |
return result; |
} |
size_t mspace_max_footprint(mspace msp) { |
size_t result; |
mstate ms = (mstate)msp; |
if (ok_magic(ms)) { |
result = ms->max_footprint; |
} |
USAGE_ERROR_ACTION(ms,ms); |
return result; |
} |
#if !NO_MALLINFO |
struct mallinfo mspace_mallinfo(mspace msp) { |
mstate ms = (mstate)msp; |
if (!ok_magic(ms)) { |
USAGE_ERROR_ACTION(ms,ms); |
} |
return internal_mallinfo(ms); |
} |
#endif /* NO_MALLINFO */ |
int mspace_mallopt(int param_number, int value) { |
return change_mparam(param_number, value); |
} |
#endif /* MSPACES */ |
/* -------------------- Alternative MORECORE functions ------------------- */ |
/* |
Guidelines for creating a custom version of MORECORE: |
* For best performance, MORECORE should allocate in multiples of pagesize. |
* MORECORE may allocate more memory than requested. (Or even less, |
but this will usually result in a malloc failure.) |
* MORECORE must not allocate memory when given argument zero, but |
instead return one past the end address of memory from previous |
nonzero call. |
* For best performance, consecutive calls to MORECORE with positive |
arguments should return increasing addresses, indicating that |
space has been contiguously extended. |
* Even though consecutive calls to MORECORE need not return contiguous |
addresses, it must be OK for malloc'ed chunks to span multiple |
regions in those cases where they do happen to be contiguous. |
* MORECORE need not handle negative arguments -- it may instead |
just return MFAIL when given negative arguments. |
Negative arguments are always multiples of pagesize. MORECORE |
must not misinterpret negative args as large positive unsigned |
args. You can suppress all such calls from even occurring by defining |
MORECORE_CANNOT_TRIM, |
As an example alternative MORECORE, here is a custom allocator |
kindly contributed for pre-OSX macOS. It uses virtually but not |
necessarily physically contiguous non-paged memory (locked in, |
present and won't get swapped out). You can use it by uncommenting |
this section, adding some #includes, and setting up the appropriate |
defines above: |
#define MORECORE osMoreCore |
There is also a shutdown routine that should somehow be called for |
cleanup upon program exit. |
#define MAX_POOL_ENTRIES 100 |
#define MINIMUM_MORECORE_SIZE (64 * 1024U) |
static int next_os_pool; |
void *our_os_pools[MAX_POOL_ENTRIES]; |
void *osMoreCore(int size) |
{ |
void *ptr = 0; |
static void *sbrk_top = 0; |
if (size > 0) |
{ |
if (size < MINIMUM_MORECORE_SIZE) |
size = MINIMUM_MORECORE_SIZE; |
if (CurrentExecutionLevel() == kTaskLevel) |
ptr = PoolAllocateResident(size + RM_PAGE_SIZE, 0); |
if (ptr == 0) |
{ |
return (void *) MFAIL; |
} |
// save ptrs so they can be freed during cleanup |
our_os_pools[next_os_pool] = ptr; |
next_os_pool++; |
ptr = (void *) ((((size_t) ptr) + RM_PAGE_MASK) & ~RM_PAGE_MASK); |
sbrk_top = (char *) ptr + size; |
return ptr; |
} |
else if (size < 0) |
{ |
// we don't currently support shrink behavior |
return (void *) MFAIL; |
} |
else |
{ |
return sbrk_top; |
} |
} |
// cleanup any allocated memory pools |
// called as last thing before shutting down driver |
void osCleanupMem(void) |
{ |
void **ptr; |
for (ptr = our_os_pools; ptr < &our_os_pools[MAX_POOL_ENTRIES]; ptr++) |
if (*ptr) |
{ |
PoolDeallocate(*ptr); |
*ptr = 0; |
} |
} |
*/ |
/* ----------------------------------------------------------------------- |
History: |
V2.8.3 Thu Sep 22 11:16:32 2005 Doug Lea (dl at gee) |
* Add max_footprint functions |
* Ensure all appropriate literals are size_t |
* Fix conditional compilation problem for some #define settings |
* Avoid concatenating segments with the one provided |
in create_mspace_with_base |
* Rename some variables to avoid compiler shadowing warnings |
* Use explicit lock initialization. |
* Better handling of sbrk interference. |
* Simplify and fix segment insertion, trimming and mspace_destroy |
* Reinstate REALLOC_ZERO_BYTES_FREES option from 2.7.x |
* Thanks especially to Dennis Flanagan for help on these. |
V2.8.2 Sun Jun 12 16:01:10 2005 Doug Lea (dl at gee) |
* Fix memalign brace error. |
V2.8.1 Wed Jun 8 16:11:46 2005 Doug Lea (dl at gee) |
* Fix improper #endif nesting in C++ |
* Add explicit casts needed for C++ |
V2.8.0 Mon May 30 14:09:02 2005 Doug Lea (dl at gee) |
* Use trees for large bins |
* Support mspaces |
* Use segments to unify sbrk-based and mmap-based system allocation, |
removing need for emulation on most platforms without sbrk. |
* Default safety checks |
* Optional footer checks. Thanks to William Robertson for the idea. |
* Internal code refactoring |
* Incorporate suggestions and platform-specific changes. |
Thanks to Dennis Flanagan, Colin Plumb, Niall Douglas, |
Aaron Bachmann, Emery Berger, and others. |
* Speed up non-fastbin processing enough to remove fastbins. |
* Remove useless cfree() to avoid conflicts with other apps. |
* Remove internal memcpy, memset. Compilers handle builtins better. |
* Remove some options that no one ever used and rename others. |
V2.7.2 Sat Aug 17 09:07:30 2002 Doug Lea (dl at gee) |
* Fix malloc_state bitmap array misdeclaration |
V2.7.1 Thu Jul 25 10:58:03 2002 Doug Lea (dl at gee) |
* Allow tuning of FIRST_SORTED_BIN_SIZE |
* Use PTR_UINT as type for all ptr->int casts. Thanks to John Belmonte. |
* Better detection and support for non-contiguousness of MORECORE. |
Thanks to Andreas Mueller, Conal Walsh, and Wolfram Gloger |
* Bypass most of malloc if no frees. Thanks To Emery Berger. |
* Fix freeing of old top non-contiguous chunk im sysmalloc. |
* Raised default trim and map thresholds to 256K. |
* Fix mmap-related #defines. Thanks to Lubos Lunak. |
* Fix copy macros; added LACKS_FCNTL_H. Thanks to Neal Walfield. |
* Branch-free bin calculation |
* Default trim and mmap thresholds now 256K. |
V2.7.0 Sun Mar 11 14:14:06 2001 Doug Lea (dl at gee) |
* Introduce independent_comalloc and independent_calloc. |
Thanks to Michael Pachos for motivation and help. |
* Make optional .h file available |
* Allow > 2GB requests on 32bit systems. |
* new WIN32 sbrk, mmap, munmap, lock code from <Walter@GeNeSys-e.de>. |
Thanks also to Andreas Mueller <a.mueller at paradatec.de>, |
and Anonymous. |
* Allow override of MALLOC_ALIGNMENT (Thanks to Ruud Waij for |
helping test this.) |
* memalign: check alignment arg |
* realloc: don't try to shift chunks backwards, since this |
leads to more fragmentation in some programs and doesn't |
seem to help in any others. |
* Collect all cases in malloc requiring system memory into sysmalloc |
* Use mmap as backup to sbrk |
* Place all internal state in malloc_state |
* Introduce fastbins (although similar to 2.5.1) |
* Many minor tunings and cosmetic improvements |
* Introduce USE_PUBLIC_MALLOC_WRAPPERS, USE_MALLOC_LOCK |
* Introduce MALLOC_FAILURE_ACTION, MORECORE_CONTIGUOUS |
Thanks to Tony E. Bennett <tbennett@nvidia.com> and others. |
* Include errno.h to support default failure action. |
V2.6.6 Sun Dec 5 07:42:19 1999 Doug Lea (dl at gee) |
* return null for negative arguments |
* Added Several WIN32 cleanups from Martin C. Fong <mcfong at yahoo.com> |
* Add 'LACKS_SYS_PARAM_H' for those systems without 'sys/param.h' |
(e.g. WIN32 platforms) |
* Cleanup header file inclusion for WIN32 platforms |
* Cleanup code to avoid Microsoft Visual C++ compiler complaints |
* Add 'USE_DL_PREFIX' to quickly allow co-existence with existing |
memory allocation routines |
* Set 'malloc_getpagesize' for WIN32 platforms (needs more work) |
* Use 'assert' rather than 'ASSERT' in WIN32 code to conform to |
usage of 'assert' in non-WIN32 code |
* Improve WIN32 'sbrk()' emulation's 'findRegion()' routine to |
avoid infinite loop |
* Always call 'fREe()' rather than 'free()' |
V2.6.5 Wed Jun 17 15:57:31 1998 Doug Lea (dl at gee) |
* Fixed ordering problem with boundary-stamping |
V2.6.3 Sun May 19 08:17:58 1996 Doug Lea (dl at gee) |
* Added pvalloc, as recommended by H.J. Liu |
* Added 64bit pointer support mainly from Wolfram Gloger |
* Added anonymously donated WIN32 sbrk emulation |
* Malloc, calloc, getpagesize: add optimizations from Raymond Nijssen |
* malloc_extend_top: fix mask error that caused wastage after |
foreign sbrks |
* Add linux mremap support code from HJ Liu |
V2.6.2 Tue Dec 5 06:52:55 1995 Doug Lea (dl at gee) |
* Integrated most documentation with the code. |
* Add support for mmap, with help from |
Wolfram Gloger (Gloger@lrz.uni-muenchen.de). |
* Use last_remainder in more cases. |
* Pack bins using idea from colin@nyx10.cs.du.edu |
* Use ordered bins instead of best-fit threshhold |
* Eliminate block-local decls to simplify tracing and debugging. |
* Support another case of realloc via move into top |
* Fix error occuring when initial sbrk_base not word-aligned. |
* Rely on page size for units instead of SBRK_UNIT to |
avoid surprises about sbrk alignment conventions. |
* Add mallinfo, mallopt. Thanks to Raymond Nijssen |
(raymond@es.ele.tue.nl) for the suggestion. |
* Add `pad' argument to malloc_trim and top_pad mallopt parameter. |
* More precautions for cases where other routines call sbrk, |
courtesy of Wolfram Gloger (Gloger@lrz.uni-muenchen.de). |
* Added macros etc., allowing use in linux libc from |
H.J. Lu (hjl@gnu.ai.mit.edu) |
* Inverted this history list |
V2.6.1 Sat Dec 2 14:10:57 1995 Doug Lea (dl at gee) |
* Re-tuned and fixed to behave more nicely with V2.6.0 changes. |
* Removed all preallocation code since under current scheme |
the work required to undo bad preallocations exceeds |
the work saved in good cases for most test programs. |
* No longer use return list or unconsolidated bins since |
no scheme using them consistently outperforms those that don't |
given above changes. |
* Use best fit for very large chunks to prevent some worst-cases. |
* Added some support for debugging |
V2.6.0 Sat Nov 4 07:05:23 1995 Doug Lea (dl at gee) |
* Removed footers when chunks are in use. Thanks to |
Paul Wilson (wilson@cs.texas.edu) for the suggestion. |
V2.5.4 Wed Nov 1 07:54:51 1995 Doug Lea (dl at gee) |
* Added malloc_trim, with help from Wolfram Gloger |
(wmglo@Dent.MED.Uni-Muenchen.DE). |
V2.5.3 Tue Apr 26 10:16:01 1994 Doug Lea (dl at g) |
V2.5.2 Tue Apr 5 16:20:40 1994 Doug Lea (dl at g) |
* realloc: try to expand in both directions |
* malloc: swap order of clean-bin strategy; |
* realloc: only conditionally expand backwards |
* Try not to scavenge used bins |
* Use bin counts as a guide to preallocation |
* Occasionally bin return list chunks in first scan |
* Add a few optimizations from colin@nyx10.cs.du.edu |
V2.5.1 Sat Aug 14 15:40:43 1993 Doug Lea (dl at g) |
* faster bin computation & slightly different binning |
* merged all consolidations to one part of malloc proper |
(eliminating old malloc_find_space & malloc_clean_bin) |
* Scan 2 returns chunks (not just 1) |
* Propagate failure in realloc if malloc returns 0 |
* Add stuff to allow compilation on non-ANSI compilers |
from kpv@research.att.com |
V2.5 Sat Aug 7 07:41:59 1993 Doug Lea (dl at g.oswego.edu) |
* removed potential for odd address access in prev_chunk |
* removed dependency on getpagesize.h |
* misc cosmetics and a bit more internal documentation |
* anticosmetics: mangled names in macros to evade debugger strangeness |
* tested on sparc, hp-700, dec-mips, rs6000 |
with gcc & native cc (hp, dec only) allowing |
Detlefs & Zorn comparison study (in SIGPLAN Notices.) |
Trial version Fri Aug 28 13:14:29 1992 Doug Lea (dl at g.oswego.edu) |
* Based loosely on libg++-1.2X malloc. (It retains some of the overall |
structure of old version, but most details differ.) |
*/ |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libc/Makefile.toolchain |
---|
0,0 → 1,81 |
# |
# Copyright (C) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
DEFS = -DARCH=$(ARCH) |
CFLAGS = -fno-builtin -Wall -Werror-implicit-function-declaration -Wmissing-prototypes -O3 -nostdlib -nostdinc -I$(LIBC_PREFIX)/include |
LFLAGS = -M -N $(SOFTINT_PREFIX)/libsoftint.a |
AFLAGS = |
#-Werror |
## Setup platform configuration |
# |
include $(LIBC_PREFIX)/arch/$(ARCH)/Makefile.inc |
## Simple detection of the host system |
# |
HOST = $(shell uname) |
## On Solaris, some utilities have different names |
# |
ifeq ($(HOST),SunOS) |
BINUTILS_PREFIX = "g" |
else |
BINUTILS_PREFIX = "" |
endif |
## Toolchain configuration |
# |
ifeq ($(COMPILER),gcc_native) |
CC = gcc |
AS = $(BINUTILS_PREFIX)as |
LD = $(BINUTILS_PREFIX)ld |
AR = $(BINUTILS_PREFIX)ar |
OBJCOPY = $(BINUTILS_PREFIX)objcopy |
OBJDUMP = $(BINUTILS_PREFIX)objdump |
endif |
ifeq ($(COMPILER),icc_native) |
CC = icc |
AS = as |
LD = ld |
AR = ar |
OBJCOPY = objcopy |
OBJDUMP = objdump |
endif |
ifeq ($(COMPILER),gcc_cross) |
CC = $(TOOLCHAIN_DIR)/$(TARGET)-gcc |
AS = $(TOOLCHAIN_DIR)/$(TARGET)-as |
LD = $(TOOLCHAIN_DIR)/$(TARGET)-ld |
AR = $(TOOLCHAIN_DIR)/$(TARGET)-ar |
OBJCOPY = $(TOOLCHAIN_DIR)/$(TARGET)-objcopy |
OBJDUMP = $(TOOLCHAIN_DIR)/$(TARGET)-objdump |
endif |
/tags/0.3.0/uspace/lib/libfs/libfs.c |
---|
0,0 → 1,322 |
/* |
* Copyright (c) 2008 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libfs |
* @{ |
*/ |
/** |
* @file |
* Glue code which is commonod to all FS implementations. |
*/ |
#include "libfs.h" |
#include "../../srv/vfs/vfs.h" |
#include <errno.h> |
#include <async.h> |
#include <ipc/ipc.h> |
#include <as.h> |
#include <assert.h> |
#include <dirent.h> |
/** Register file system server. |
* |
* This function abstracts away the tedious registration protocol from |
* file system implementations and lets them to reuse this registration glue |
* code. |
* |
* @param vfs_phone Open phone for communication with VFS. |
* @param reg File system registration structure. It will be |
* initialized by this function. |
* @param info VFS info structure supplied by the file system |
* implementation. |
* @param conn Connection fibril for handling all calls originating in |
* VFS. |
* |
* @return EOK on success or a non-zero error code on errror. |
*/ |
int fs_register(int vfs_phone, fs_reg_t *reg, vfs_info_t *info, |
async_client_conn_t conn) |
{ |
/* |
* Tell VFS that we are here and want to get registered. |
* We use the async framework because VFS will answer the request |
* out-of-order, when it knows that the operation succeeded or failed. |
*/ |
ipc_call_t answer; |
aid_t req = async_send_0(vfs_phone, VFS_REGISTER, &answer); |
/* |
* Send our VFS info structure to VFS. |
*/ |
int rc = ipc_data_write_start(vfs_phone, info, sizeof(*info)); |
if (rc != EOK) { |
async_wait_for(req, NULL); |
return rc; |
} |
/* |
* Ask VFS for callback connection. |
*/ |
ipc_connect_to_me(vfs_phone, 0, 0, 0, ®->vfs_phonehash); |
/* |
* Allocate piece of address space for PLB. |
*/ |
reg->plb_ro = as_get_mappable_page(PLB_SIZE); |
if (!reg->plb_ro) { |
async_wait_for(req, NULL); |
return ENOMEM; |
} |
/* |
* Request sharing the Path Lookup Buffer with VFS. |
*/ |
rc = ipc_share_in_start_0_0(vfs_phone, reg->plb_ro, PLB_SIZE); |
if (rc) { |
async_wait_for(req, NULL); |
return rc; |
} |
/* |
* Pick up the answer for the request to the VFS_REQUEST call. |
*/ |
async_wait_for(req, NULL); |
reg->fs_handle = (int) IPC_GET_ARG1(answer); |
/* |
* Create a connection fibril to handle the callback connection. |
*/ |
async_new_connection(reg->vfs_phonehash, 0, NULL, conn); |
/* |
* Tell the async framework that other connections are to be handled by |
* the same connection fibril as well. |
*/ |
async_set_client_connection(conn); |
return IPC_GET_RETVAL(answer); |
} |
/** Lookup VFS triplet by name in the file system name space. |
* |
* The path passed in the PLB must be in the canonical file system path format |
* as returned by the canonify() function. |
* |
* @param ops libfs operations structure with function pointers to |
* file system implementation |
* @param fs_handle File system handle of the file system where to perform |
* the lookup. |
* @param rid Request ID of the VFS_LOOKUP request. |
* @param request VFS_LOOKUP request data itself. |
*/ |
void libfs_lookup(libfs_ops_t *ops, fs_handle_t fs_handle, ipc_callid_t rid, |
ipc_call_t *request) |
{ |
unsigned next = IPC_GET_ARG1(*request); |
unsigned last = IPC_GET_ARG2(*request); |
dev_handle_t dev_handle = IPC_GET_ARG3(*request); |
int lflag = IPC_GET_ARG4(*request); |
fs_index_t index = IPC_GET_ARG5(*request); /* when L_LINK specified */ |
if (last < next) |
last += PLB_SIZE; |
void *par = NULL; |
void *cur = ops->root_get(); |
void *tmp = ops->child_get(cur); |
if (ops->plb_get_char(next) == '/') |
next++; /* eat slash */ |
char component[NAME_MAX + 1]; |
int len = 0; |
while (tmp && next <= last) { |
/* collect the component */ |
if (ops->plb_get_char(next) != '/') { |
if (len + 1 == NAME_MAX) { |
/* comopnent length overflow */ |
ipc_answer_0(rid, ENAMETOOLONG); |
return; |
} |
component[len++] = ops->plb_get_char(next); |
next++; /* process next character */ |
if (next <= last) |
continue; |
} |
assert(len); |
component[len] = '\0'; |
next++; /* eat slash */ |
len = 0; |
/* match the component */ |
while (tmp && !ops->match(cur, tmp, component)) |
tmp = ops->sibling_get(tmp); |
/* handle miss: match amongst siblings */ |
if (!tmp) { |
if (next <= last) { |
/* there are unprocessed components */ |
ipc_answer_0(rid, ENOENT); |
return; |
} |
/* miss in the last component */ |
if (lflag & (L_CREATE | L_LINK)) { |
/* request to create a new link */ |
if (!ops->is_directory(cur)) { |
ipc_answer_0(rid, ENOTDIR); |
return; |
} |
void *nodep; |
if (lflag & L_CREATE) |
nodep = ops->create(lflag); |
else |
nodep = ops->node_get(fs_handle, |
dev_handle, index); |
if (nodep) { |
if (!ops->link(cur, nodep, component)) { |
if (lflag & L_CREATE) |
ops->destroy(nodep); |
ipc_answer_0(rid, ENOSPC); |
} else { |
ipc_answer_5(rid, EOK, |
fs_handle, dev_handle, |
ops->index_get(nodep), |
ops->size_get(nodep), |
ops->lnkcnt_get(nodep)); |
} |
} else { |
ipc_answer_0(rid, ENOSPC); |
} |
return; |
} else if (lflag & L_PARENT) { |
/* return parent */ |
ipc_answer_5(rid, EOK, fs_handle, dev_handle, |
ops->index_get(cur), ops->size_get(cur), |
ops->lnkcnt_get(cur)); |
} |
ipc_answer_0(rid, ENOENT); |
return; |
} |
/* descend one level */ |
par = cur; |
cur = tmp; |
tmp = ops->child_get(tmp); |
} |
/* handle miss: excessive components */ |
if (!tmp && next <= last) { |
if (lflag & (L_CREATE | L_LINK)) { |
if (!ops->is_directory(cur)) { |
ipc_answer_0(rid, ENOTDIR); |
return; |
} |
/* collect next component */ |
while (next <= last) { |
if (ops->plb_get_char(next) == '/') { |
/* more than one component */ |
ipc_answer_0(rid, ENOENT); |
return; |
} |
if (len + 1 == NAME_MAX) { |
/* component length overflow */ |
ipc_answer_0(rid, ENAMETOOLONG); |
return; |
} |
component[len++] = ops->plb_get_char(next); |
next++; /* process next character */ |
} |
assert(len); |
component[len] = '\0'; |
len = 0; |
void *nodep; |
if (lflag & L_CREATE) |
nodep = ops->create(lflag); |
else |
nodep = ops->node_get(fs_handle, dev_handle, |
index); |
if (nodep) { |
if (!ops->link(cur, nodep, component)) { |
if (lflag & L_CREATE) |
ops->destroy(nodep); |
ipc_answer_0(rid, ENOSPC); |
} else { |
ipc_answer_5(rid, EOK, |
fs_handle, dev_handle, |
ops->index_get(nodep), |
ops->size_get(nodep), |
ops->lnkcnt_get(nodep)); |
} |
} else { |
ipc_answer_0(rid, ENOSPC); |
} |
return; |
} |
ipc_answer_0(rid, ENOENT); |
return; |
} |
/* handle hit */ |
if (lflag & L_PARENT) { |
cur = par; |
if (!cur) { |
ipc_answer_0(rid, ENOENT); |
return; |
} |
} |
if (lflag & L_UNLINK) { |
unsigned old_lnkcnt = ops->lnkcnt_get(cur); |
int res = ops->unlink(par, cur); |
ipc_answer_5(rid, (ipcarg_t)res, fs_handle, dev_handle, |
ops->index_get(cur), ops->size_get(cur), old_lnkcnt); |
return; |
} |
if (((lflag & (L_CREATE | L_EXCLUSIVE)) == (L_CREATE | L_EXCLUSIVE)) || |
(lflag & L_LINK)) { |
ipc_answer_0(rid, EEXIST); |
return; |
} |
if ((lflag & L_FILE) && (ops->is_directory(cur))) { |
ipc_answer_0(rid, EISDIR); |
return; |
} |
if ((lflag & L_DIRECTORY) && (ops->is_file(cur))) { |
ipc_answer_0(rid, ENOTDIR); |
return; |
} |
ipc_answer_5(rid, EOK, fs_handle, dev_handle, ops->index_get(cur), |
ops->size_get(cur), ops->lnkcnt_get(cur)); |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libfs/libfs.h |
---|
0,0 → 1,83 |
/* |
* Copyright (c) 2007 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup libfs |
* @{ |
*/ |
/** |
* @file |
*/ |
#ifndef LIBFS_LIBFS_H_ |
#define LIBFS_LIBFS_H_ |
#include "../../srv/vfs/vfs.h" |
#include <stdint.h> |
#include <ipc/ipc.h> |
#include <async.h> |
typedef struct { |
bool (* match)(void *, void *, const char *); |
void * (* node_get)(fs_handle_t, dev_handle_t, fs_index_t); |
void * (* create)(int); |
void (* destroy)(void *); |
bool (* link)(void *, void *, const char *); |
int (* unlink)(void *, void *); |
fs_index_t (* index_get)(void *); |
size_t (* size_get)(void *); |
unsigned (* lnkcnt_get)(void *); |
void *(* child_get)(void *); |
void *(* sibling_get)(void *); |
void *(* root_get)(void); |
char (* plb_get_char)(unsigned pos); |
bool (* is_directory)(void *); |
bool (* is_file)(void *); |
} libfs_ops_t; |
typedef struct { |
int fs_handle; /**< File system handle. */ |
ipcarg_t vfs_phonehash; /**< Initial VFS phonehash. */ |
uint8_t *plb_ro; /**< Read-only PLB view. */ |
} fs_reg_t; |
extern int fs_register(int, fs_reg_t *, vfs_info_t *, async_client_conn_t); |
extern int block_read(int, unsigned long, void *); |
extern int block_write(int, unsigned long, void *); |
extern void node_add_mp(int, unsigned long); |
extern void node_del_mp(int, unsigned long); |
extern bool node_is_mp(int, unsigned long); |
extern void libfs_lookup(libfs_ops_t *, fs_handle_t, ipc_callid_t, ipc_call_t *); |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/libfs/Makefile |
---|
0,0 → 1,66 |
# |
# Copyright (c) 2005 Martin Decky |
# Copyright (c) 2007 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
## Common compiler flags |
# |
LIBC_PREFIX = ../libc |
## Setup toolchain |
# |
include $(LIBC_PREFIX)/Makefile.toolchain |
CFLAGS += -Iinclude |
## Sources |
# |
SOURCES = \ |
libfs.c |
OBJECTS := $(addsuffix .o,$(basename $(SOURCES))) |
.PHONY: all clean depend |
all: libfs.a |
-include Makefile.depend |
clean: |
-rm -f libfs.a Makefile.depend |
find . -name '*.o' -follow -exec rm \{\} \; |
depend: |
-makedepend $(DEFS) $(CFLAGS) -f - $(SOURCES) > Makefile.depend 2> /dev/null |
libfs.a: depend $(OBJECTS) |
$(AR) rc libfs.a $(OBJECTS) |
%.o: %.c |
$(CC) $(DEFS) $(CFLAGS) -c $< -o $@ |
/tags/0.3.0/uspace/lib/softfloat/arch/arm32/include/functions.h |
---|
0,0 → 1,76 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup softfloatarm32 arm32 |
* @ingroup sfl |
* @brief Softfloat architecture dependent definitions. |
* @{ |
*/ |
/** @file |
* @brief Softfloat architecture dependent definitions. |
*/ |
#ifndef __SOFTFLOAT_FUNCTIONS_H__ |
#define __SOFTFLOAT_FUNCTIONS_H__ |
#define float32_to_int(X) float32_to_int32(X); |
#define float32_to_long(X) float32_to_int32(X); |
#define float32_to_longlong(X) float32_to_int64(X); |
#define float64_to_int(X) float64_to_int32(X); |
#define float64_to_long(X) float64_to_int32(X); |
#define float64_to_longlong(X) float64_to_int64(X); |
#define float32_to_uint(X) float32_to_uint32(X); |
#define float32_to_ulong(X) float32_to_uint32(X); |
#define float32_to_ulonglong(X) float32_to_uint64(X); |
#define float64_to_uint(X) float64_to_uint32(X); |
#define float64_to_ulong(X) float64_to_uint32(X); |
#define float64_to_ulonglong(X) float64_to_uint64(X); |
#define int_to_float32(X) int32_to_float32(X); |
#define long_to_float32(X) int32_to_float32(X); |
#define longlong_to_float32(X) int64_to_float32(X); |
#define int_to_float64(X) int32_to_float64(X); |
#define long_to_float64(X) int32_to_float64(X); |
#define longlong_to_float64(X) int64_to_float64(X); |
#define uint_to_float32(X) uint32_to_float32(X); |
#define ulong_to_float32(X) uint32_to_float32(X); |
#define ulonglong_to_float32(X) uint64_to_float32(X); |
#define uint_to_float64(X) uint32_to_float64(X); |
#define ulong_to_float64(X) uint32_to_float64(X); |
#define ulonglong_to_float64(X) uint64_to_float64(X); |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/softfloat/arch/sparc64/include/functions.h |
---|
0,0 → 1,77 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup softfloatsparc64 sparc64 |
* @ingroup sfl |
* @brief softfloat architecture dependent definitions |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __SOFTFLOAT_FUNCTIONS_H__ |
#define __SOFTFLOAT_FUNCTIONS_H__ |
#define float32_to_int(X) float32_to_int32(X); |
#define float32_to_long(X) float32_to_int64(X); |
#define float32_to_longlong(X) float32_to_int64(X); |
#define float64_to_int(X) float64_to_int32(X); |
#define float64_to_long(X) float64_to_int64(X); |
#define float64_to_longlong(X) float64_to_int64(X); |
#define float32_to_uint(X) float32_to_uint32(X); |
#define float32_to_ulong(X) float32_to_uint64(X); |
#define float32_to_ulonglong(X) float32_to_uint64(X); |
#define float64_to_uint(X) float64_to_uint32(X); |
#define float64_to_ulong(X) float64_to_uint64(X); |
#define float64_to_ulonglong(X) float64_to_uint64(X); |
#define int_to_float32(X) int32_to_float32(X); |
#define long_to_float32(X) int64_to_float32(X); |
#define longlong_to_float32(X) int64_to_float32(X); |
#define int_to_float64(X) int32_to_float64(X); |
#define long_to_float64(X) int64_to_float64(X); |
#define longlong_to_float64(X) int64_to_float64(X); |
#define uint_to_float32(X) uint32_to_float32(X); |
#define ulong_to_float32(X) uint64_to_float32(X); |
#define ulonglong_to_float32(X) uint64_to_float32(X); |
#define uint_to_float64(X) uint32_to_float64(X); |
#define ulong_to_float64(X) uint64_to_float64(X); |
#define ulonglong_to_float64(X) uint64_to_float64(X); |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/softfloat/arch/ia64/include/functions.h |
---|
0,0 → 1,77 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup softfloatia64 ia64 |
* @ingroup sfl |
* @brief softfloat architecture dependent definitions |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __SOFTFLOAT_FUNCTIONS_H__ |
#define __SOFTFLOAT_FUNCTIONS_H__ |
#define float32_to_int(X) float32_to_int32(X); |
#define float32_to_long(X) float32_to_int64(X); |
#define float32_to_longlong(X) float32_to_int64(X); |
#define float64_to_int(X) float64_to_int32(X); |
#define float64_to_long(X) float64_to_int64(X); |
#define float64_to_longlong(X) float64_to_int64(X); |
#define float32_to_uint(X) float32_to_uint32(X); |
#define float32_to_ulong(X) float32_to_uint64(X); |
#define float32_to_ulonglong(X) float32_to_uint64(X); |
#define float64_to_uint(X) float64_to_uint32(X); |
#define float64_to_ulong(X) float64_to_uint64(X); |
#define float64_to_ulonglong(X) float64_to_uint64(X); |
#define int_to_float32(X) int32_to_float32(X); |
#define long_to_float32(X) int64_to_float32(X); |
#define longlong_to_float32(X) int64_to_float32(X); |
#define int_to_float64(X) int32_to_float64(X); |
#define long_to_float64(X) int64_to_float64(X); |
#define longlong_to_float64(X) int64_to_float64(X); |
#define uint_to_float32(X) uint32_to_float32(X); |
#define ulong_to_float32(X) uint64_to_float32(X); |
#define ulonglong_to_float32(X) uint64_to_float32(X); |
#define uint_to_float64(X) uint32_to_float64(X); |
#define ulong_to_float64(X) uint64_to_float64(X); |
#define ulonglong_to_float64(X) uint64_to_float64(X); |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/softfloat/arch/mips32eb/include/functions.h |
---|
0,0 → 1,77 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup softfloatmipseb32 mipseb32 |
* @ingroup sfl |
* @brief softfloat architecture dependent definitions |
* * @{ |
*/ |
/** @file |
*/ |
#ifndef __SOFTFLOAT_FUNCTIONS_H__ |
#define __SOFTFLOAT_FUNCTIONS_H__ |
#define float32_to_int(X) float32_to_int32(X); |
#define float32_to_long(X) float32_to_int32(X); |
#define float32_to_longlong(X) float32_to_int64(X); |
#define float64_to_int(X) float64_to_int32(X); |
#define float64_to_long(X) float64_to_int32(X); |
#define float64_to_longlong(X) float64_to_int64(X); |
#define float32_to_uint(X) float32_to_uint32(X); |
#define float32_to_ulong(X) float32_to_uint32(X); |
#define float32_to_ulonglong(X) float32_to_uint64(X); |
#define float64_to_uint(X) float64_to_uint32(X); |
#define float64_to_ulong(X) float64_to_uint32(X); |
#define float64_to_ulonglong(X) float64_to_uint64(X); |
#define int_to_float32(X) int32_to_float32(X); |
#define long_to_float32(X) int32_to_float32(X); |
#define longlong_to_float32(X) int64_to_float32(X); |
#define int_to_float64(X) int32_to_float64(X); |
#define long_to_float64(X) int32_to_float64(X); |
#define longlong_to_float64(X) int64_to_float64(X); |
#define uint_to_float32(X) uint32_to_float32(X); |
#define ulong_to_float32(X) uint32_to_float32(X); |
#define ulonglong_to_float32(X) uint64_to_float32(X); |
#define uint_to_float64(X) uint32_to_float64(X); |
#define ulong_to_float64(X) uint32_to_float64(X); |
#define ulonglong_to_float64(X) uint64_to_float64(X); |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/softfloat/arch/ppc32/include/functions.h |
---|
0,0 → 1,77 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup softfloatppc32 ppc32 |
* @ingroup sfl |
* @brief softfloat architecture dependent definitions |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __SOFTFLOAT_FUNCTIONS_H__ |
#define __SOFTFLOAT_FUNCTIONS_H__ |
#define float32_to_int(X) float32_to_int32(X); |
#define float32_to_long(X) float32_to_int32(X); |
#define float32_to_longlong(X) float32_to_int64(X); |
#define float64_to_int(X) float64_to_int32(X); |
#define float64_to_long(X) float64_to_int32(X); |
#define float64_to_longlong(X) float64_to_int64(X); |
#define float32_to_uint(X) float32_to_uint32(X); |
#define float32_to_ulong(X) float32_to_uint32(X); |
#define float32_to_ulonglong(X) float32_to_uint64(X); |
#define float64_to_uint(X) float64_to_uint32(X); |
#define float64_to_ulong(X) float64_to_uint32(X); |
#define float64_to_ulonglong(X) float64_to_uint64(X); |
#define int_to_float32(X) int32_to_float32(X); |
#define long_to_float32(X) int32_to_float32(X); |
#define longlong_to_float32(X) int64_to_float32(X); |
#define int_to_float64(X) int32_to_float64(X); |
#define long_to_float64(X) int32_to_float64(X); |
#define longlong_to_float64(X) int64_to_float64(X); |
#define uint_to_float32(X) uint32_to_float32(X); |
#define ulong_to_float32(X) uint32_to_float32(X); |
#define ulonglong_to_float32(X) uint64_to_float32(X); |
#define uint_to_float64(X) uint32_to_float64(X); |
#define ulong_to_float64(X) uint32_to_float64(X); |
#define ulonglong_to_float64(X) uint64_to_float64(X); |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/softfloat/arch/amd64/include/functions.h |
---|
0,0 → 1,77 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup softfloatamd64 amd64 |
* @ingroup sfl |
* @brief softfloat architecture dependent definitions |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __SOFTFLOAT_FUNCTIONS_H__ |
#define __SOFTFLOAT_FUNCTIONS_H__ |
#define float32_to_int(X) float32_to_int32(X); |
#define float32_to_long(X) float32_to_int64(X); |
#define float32_to_longlong(X) float32_to_int64(X); |
#define float64_to_int(X) float64_to_int32(X); |
#define float64_to_long(X) float64_to_int64(X); |
#define float64_to_longlong(X) float64_to_int64(X); |
#define float32_to_uint(X) float32_to_uint32(X); |
#define float32_to_ulong(X) float32_to_uint64(X); |
#define float32_to_ulonglong(X) float32_to_uint64(X); |
#define float64_to_uint(X) float64_to_uint32(X); |
#define float64_to_ulong(X) float64_to_uint64(X); |
#define float64_to_ulonglong(X) float64_to_uint64(X); |
#define int_to_float32(X) int32_to_float32(X); |
#define long_to_float32(X) int64_to_float32(X); |
#define longlong_to_float32(X) int64_to_float32(X); |
#define int_to_float64(X) int32_to_float64(X); |
#define long_to_float64(X) int64_to_float64(X); |
#define longlong_to_float64(X) int64_to_float64(X); |
#define uint_to_float32(X) uint32_to_float32(X); |
#define ulong_to_float32(X) uint64_to_float32(X); |
#define ulonglong_to_float32(X) uint64_to_float32(X); |
#define uint_to_float64(X) uint32_to_float64(X); |
#define ulong_to_float64(X) uint64_to_float64(X); |
#define ulonglong_to_float64(X) uint64_to_float64(X); |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/softfloat/arch/ppc64/include/functions.h |
---|
0,0 → 1,76 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup softfloatppc64 ppc64 |
* @ingroup sfl |
* @brief softfloat architecture dependent definitions |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __SOFTFLOAT_FUNCTIONS_H__ |
#define __SOFTFLOAT_FUNCTIONS_H__ |
#define float32_to_int(X) float32_to_int32(X); |
#define float32_to_long(X) float32_to_int64(X); |
#define float32_to_longlong(X) float32_to_int64(X); |
#define float64_to_int(X) float64_to_int32(X); |
#define float64_to_long(X) float64_to_int64(X); |
#define float64_to_longlong(X) float64_to_int64(X); |
#define float32_to_uint(X) float32_to_uint32(X); |
#define float32_to_ulong(X) float32_to_uint64(X); |
#define float32_to_ulonglong(X) float32_to_uint64(X); |
#define float64_to_uint(X) float64_to_uint32(X); |
#define float64_to_ulong(X) float64_to_uint64(X); |
#define float64_to_ulonglong(X) float64_to_uint64(X); |
#define int_to_float32(X) int32_to_float32(X); |
#define long_to_float32(X) int64_to_float32(X); |
#define longlong_to_float32(X) int64_to_float32(X); |
#define int_to_float64(X) int32_to_float64(X); |
#define long_to_float64(X) int64_to_float64(X); |
#define longlong_to_float64(X) int64_to_float64(X); |
#define uint_to_float32(X) uint32_to_float32(X); |
#define ulong_to_float32(X) uint64_to_float32(X); |
#define ulonglong_to_float32(X) uint64_to_float32(X); |
#define uint_to_float64(X) uint32_to_float64(X); |
#define ulong_to_float64(X) uint64_to_float64(X); |
#define ulonglong_to_float64(X) uint64_to_float64(X); |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/softfloat/arch/mips32/include/functions.h |
---|
0,0 → 1,77 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup softfloatmips32 mips32 |
* @ingroup sfl |
* @brief softfloat architecture dependent definitions |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __SOFTFLOAT_FUNCTIONS_H__ |
#define __SOFTFLOAT_FUNCTIONS_H__ |
#define float32_to_int(X) float32_to_int32(X); |
#define float32_to_long(X) float32_to_int32(X); |
#define float32_to_longlong(X) float32_to_int64(X); |
#define float64_to_int(X) float64_to_int32(X); |
#define float64_to_long(X) float64_to_int32(X); |
#define float64_to_longlong(X) float64_to_int64(X); |
#define float32_to_uint(X) float32_to_uint32(X); |
#define float32_to_ulong(X) float32_to_uint32(X); |
#define float32_to_ulonglong(X) float32_to_uint64(X); |
#define float64_to_uint(X) float64_to_uint32(X); |
#define float64_to_ulong(X) float64_to_uint32(X); |
#define float64_to_ulonglong(X) float64_to_uint64(X); |
#define int_to_float32(X) int32_to_float32(X); |
#define long_to_float32(X) int32_to_float32(X); |
#define longlong_to_float32(X) int64_to_float32(X); |
#define int_to_float64(X) int32_to_float64(X); |
#define long_to_float64(X) int32_to_float64(X); |
#define longlong_to_float64(X) int64_to_float64(X); |
#define uint_to_float32(X) uint32_to_float32(X); |
#define ulong_to_float32(X) uint32_to_float32(X); |
#define ulonglong_to_float32(X) uint64_to_float32(X); |
#define uint_to_float64(X) uint32_to_float64(X); |
#define ulong_to_float64(X) uint32_to_float64(X); |
#define ulonglong_to_float64(X) uint64_to_float64(X); |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/softfloat/arch/ia32/include/functions.h |
---|
0,0 → 1,75 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup softfloatia32 ia32 |
* @ingroup sfl |
* @brief softfloat architecture dependent definitions |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __SOFTFLOAT_FUNCTIONS_H__ |
#define __SOFTFLOAT_FUNCTIONS_H__ |
#define float32_to_int(X) float32_to_int32(X); |
#define float32_to_long(X) float32_to_int32(X); |
#define float32_to_longlong(X) float32_to_int64(X); |
#define float64_to_int(X) float64_to_int32(X); |
#define float64_to_long(X) float64_to_int32(X); |
#define float64_to_longlong(X) float64_to_int64(X); |
#define float32_to_uint(X) float32_to_uint32(X); |
#define float32_to_ulong(X) float32_to_uint32(X); |
#define float32_to_ulonglong(X) float32_to_uint64(X); |
#define float64_to_uint(X) float64_to_uint32(X); |
#define float64_to_ulong(X) float64_to_uint32(X); |
#define float64_to_ulonglong(X) float64_to_uint64(X); |
#define int_to_float32(X) int32_to_float32(X); |
#define long_to_float32(X) int32_to_float32(X); |
#define longlong_to_float32(X) int64_to_float32(X); |
#define int_to_float64(X) int32_to_float64(X); |
#define long_to_float64(X) int32_to_float64(X); |
#define longlong_to_float64(X) int64_to_float64(X); |
#define uint_to_float32(X) uint32_to_float32(X); |
#define ulong_to_float32(X) uint32_to_float32(X); |
#define ulonglong_to_float32(X) uint64_to_float32(X); |
#define uint_to_float64(X) uint32_to_float64(X); |
#define ulong_to_float64(X) uint32_to_float64(X); |
#define ulonglong_to_float64(X) uint64_to_float64(X); |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/softfloat/include/sub.h |
---|
0,0 → 1,47 |
/* |
* Copyright (c) 2005 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup softfloat |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __SUB_H__ |
#define __SUB_H__ |
float32 subFloat32(float32 a, float32 b); |
float64 subFloat64(float64 a, float64 b); |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/softfloat/include/comparison.h |
---|
0,0 → 1,59 |
/* |
* Copyright (c) 2005 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup softfloat |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __COMPARISON_H__ |
#define __COMPARISON_H__ |
inline int isFloat32NaN(float32 f); |
inline int isFloat32SigNaN(float32 f); |
inline int isFloat32Infinity(float32 f); |
inline int isFloat32Zero(float32 f); |
inline int isFloat64NaN(float64 d); |
inline int isFloat64SigNaN(float64 d); |
inline int isFloat64Infinity(float64 d); |
inline int isFloat64Zero(float64 d); |
inline int isFloat32eq(float32 a, float32 b); |
inline int isFloat32lt(float32 a, float32 b); |
inline int isFloat32gt(float32 a, float32 b); |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/softfloat/include/mul.h |
---|
0,0 → 1,49 |
/* |
* Copyright (c) 2005 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup softfloat |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __MUL_H__ |
#define __MUL_H__ |
float32 mulFloat32(float32 a, float32 b); |
float64 mulFloat64(float64 a, float64 b); |
void mul64integers(uint64_t a,uint64_t b, uint64_t *lo, uint64_t *hi); |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/softfloat/include/sftypes.h |
---|
0,0 → 1,112 |
/* |
* Copyright (c) 2005 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup softfloat |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __SFTYPES_H__ |
#define __SFTYPES_H__ |
#include <endian.h> |
#include <stdint.h> |
typedef union { |
float f; |
uint32_t binary; |
struct { |
#if __BYTE_ORDER == __BIG_ENDIAN |
uint32_t sign:1; |
uint32_t exp:8; |
uint32_t fraction:23; |
#elif __BYTE_ORDER == __LITTLE_ENDIAN |
uint32_t fraction:23; |
uint32_t exp:8; |
uint32_t sign:1; |
#else |
#error "Unknown endians." |
#endif |
} parts __attribute__ ((packed)); |
} float32; |
typedef union { |
double d; |
uint64_t binary; |
struct { |
#if __BYTE_ORDER == __BIG_ENDIAN |
uint64_t sign:1; |
uint64_t exp:11; |
uint64_t fraction:52; |
#elif __BYTE_ORDER == __LITTLE_ENDIAN |
uint64_t fraction:52; |
uint64_t exp:11; |
uint64_t sign:1; |
#else |
#error "Unknown endians." |
#endif |
} parts __attribute__ ((packed)); |
} float64; |
#define FLOAT32_MAX 0x7f800000 |
#define FLOAT32_MIN 0xff800000 |
#define FLOAT64_MAX |
#define FLOAT64_MIN |
/* For recognizing NaNs or infinity use isFloat32NaN and is Float32Inf, comparing with this constants is not sufficient */ |
#define FLOAT32_NAN 0x7FC00001 |
#define FLOAT32_SIGNAN 0x7F800001 |
#define FLOAT32_INF 0x7F800000 |
#define FLOAT64_NAN 0x7FF8000000000001ll |
#define FLOAT64_SIGNAN 0x7FF0000000000001ll |
#define FLOAT64_INF 0x7FF0000000000000ll |
#define FLOAT32_FRACTION_SIZE 23 |
#define FLOAT64_FRACTION_SIZE 52 |
#define FLOAT32_HIDDEN_BIT_MASK 0x800000 |
#define FLOAT64_HIDDEN_BIT_MASK 0x10000000000000ll |
#define FLOAT32_MAX_EXPONENT 0xFF |
#define FLOAT64_MAX_EXPONENT 0x7FF |
#define FLOAT32_BIAS 0x7F |
#define FLOAT64_BIAS 0x3FF |
#define FLOAT80_BIAS 0x3FFF |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/softfloat/include/other.h |
---|
0,0 → 1,43 |
/* |
* Copyright (c) 2005 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup softfloat |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __OTHER_H__ |
#define __OTHER_H__ |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/softfloat/include/softfloat.h |
---|
0,0 → 1,174 |
/* |
* Copyright (c) 2005 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup softfloat |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __SOFTFLOAT_H__ |
#define __SOFTFLOAT_H__ |
float __addsf3(float a, float b); |
double __adddf3(double a, double b); |
long double __addtf3(long double a, long double b); |
long double __addxf3(long double a, long double b); |
float __subsf3(float a, float b); |
double __subdf3(double a, double b); |
long double __subtf3(long double a, long double b); |
long double __subxf3(long double a, long double b); |
float __mulsf3(float a, float b); |
double __muldf3(double a, double b); |
long double __multf3(long double a, long double b); |
long double __mulxf3(long double a, long double b); |
float __divsf3(float a, float b); |
double __divdf3(double a, double b); |
long double __divtf3(long double a, long double b); |
long double __divxf3(long double a, long double b); |
float __negsf2(float a); |
double __negdf2(double a); |
long double __negtf2(long double a); |
long double __negxf2(long double a); |
double __extendsfdf2(float a); |
long double __extendsftf2(float a); |
long double __extendsfxf2(float a); |
long double __extenddftf2(double a); |
long double __extenddfxf2(double a); |
double __truncxfdf2(long double a); |
double __trunctfdf2(long double a); |
float __truncxfsf2(long double a); |
float __trunctfsf2(long double a); |
float __truncdfsf2(double a); |
int __fixsfsi(float a); |
int __fixdfsi(double a); |
int __fixtfsi(long double a); |
int __fixxfsi(long double a); |
long __fixsfdi(float a); |
long __fixdfdi(double a); |
long __fixtfdi(long double a); |
long __fixxfdi(long double a); |
long long __fixsfti(float a); |
long long __fixdfti(double a); |
long long __fixtfti(long double a); |
long long __fixxfti(long double a); |
unsigned int __fixunssfsi(float a); |
unsigned int __fixunsdfsi(double a); |
unsigned int __fixunstfsi(long double a); |
unsigned int __fixunsxfsi(long double a); |
unsigned long __fixunssfdi(float a); |
unsigned long __fixunsdfdi(double a); |
unsigned long __fixunstfdi(long double a); |
unsigned long __fixunsxfdi(long double a); |
unsigned long long __fixunssfti(float a); |
unsigned long long __fixunsdfti(double a); |
unsigned long long __fixunstfti(long double a); |
unsigned long long __fixunsxfti(long double a); |
float __floatsisf(int i); |
double __floatsidf(int i); |
long double __floatsitf(int i); |
long double __floatsixf(int i); |
float __floatdisf(long i); |
double __floatdidf(long i); |
long double __floatditf(long i); |
long double __floatdixf(long i); |
float __floattisf(long long i); |
double __floattidf(long long i); |
long double __floattitf(long long i); |
long double __floattixf(long long i); |
float __floatunsisf(unsigned int i); |
double __floatunsidf(unsigned int i); |
long double __floatunsitf(unsigned int i); |
long double __floatunsixf(unsigned int i); |
float __floatundisf(unsigned long i); |
double __floatundidf(unsigned long i); |
long double __floatunditf(unsigned long i); |
long double __floatundixf(unsigned long i); |
float __floatuntisf(unsigned long long i); |
double __floatuntidf(unsigned long long i); |
long double __floatuntitf(unsigned long long i); |
long double __floatuntixf(unsigned long long i); |
int __cmpsf2(float a, float b); |
int __cmpdf2(double a, double b); |
int __cmptf2(long double a, long double b); |
int __unordsf2(float a, float b); |
int __unorddf2(double a, double b); |
int __unordtf2(long double a, long double b); |
int __eqsf2(float a, float b); |
int __eqdf2(double a, double b); |
int __eqtf2(long double a, long double b); |
int __nesf2(float a, float b); |
int __nedf2(double a, double b); |
int __netf2(long double a, long double b); |
int __gesf2(float a, float b); |
int __gedf2(double a, double b); |
int __getf2(long double a, long double b); |
int __ltsf2(float a, float b); |
int __ltdf2(double a, double b); |
int __lttf2(long double a, long double b); |
int __lesf2(float a, float b); |
int __ledf2(double a, double b); |
int __letf2(long double a, long double b); |
int __gtsf2(float a, float b); |
int __gtdf2(double a, double b); |
int __gttf2(long double a, long double b); |
/* Not implemented yet*/ |
float __powisf2(float a, int b); |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/softfloat/include/div.h |
---|
0,0 → 1,48 |
/* |
* Copyright (c) 2005 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup softfloat |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __DIV_H__ |
#define __DIV_H__ |
float32 divFloat32(float32 a, float32 b); |
float64 divFloat64(float64 a, float64 b); |
uint64_t divFloat64estim(uint64_t a, uint64_t b); |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/softfloat/include/conversion.h |
---|
0,0 → 1,71 |
/* |
* Copyright (c) 2005 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup softfloat |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __CONVERSION_H__ |
#define __CONVERSION_H__ |
float64 convertFloat32ToFloat64(float32 a); |
float32 convertFloat64ToFloat32(float64 a); |
uint32_t float32_to_uint32(float32 a); |
int32_t float32_to_int32(float32 a); |
uint64_t float32_to_uint64(float32 a); |
int64_t float32_to_int64(float32 a); |
uint64_t float64_to_uint64(float64 a); |
int64_t float64_to_int64(float64 a); |
uint32_t float64_to_uint32(float64 a); |
int32_t float64_to_int32(float64 a); |
float32 uint32_to_float32(uint32_t i); |
float32 int32_to_float32(int32_t i); |
float32 uint64_to_float32(uint64_t i); |
float32 int64_to_float32(int64_t i); |
float64 uint32_to_float64(uint32_t i); |
float64 int32_to_float64(int32_t i); |
float64 uint64_to_float64(uint64_t i); |
float64 int64_to_float64(int64_t i); |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/softfloat/include/add.h |
---|
0,0 → 1,47 |
/* |
* Copyright (c) 2005 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup softfloat |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __ADD_H__ |
#define __ADD_H__ |
float32 addFloat32(float32 a, float32 b); |
float64 addFloat64(float64 a, float64 b); |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/softfloat/include/common.h |
---|
0,0 → 1,53 |
/* |
* Copyright (c) 2005 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup softfloat |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __COMMON_H__ |
#define __COMMON_H__ |
#include<sftypes.h> |
float64 finishFloat64(int32_t cexp, uint64_t cfrac, char sign); |
int countZeroes64(uint64_t i); |
int countZeroes32(uint32_t i); |
int countZeroes8(uint8_t i); |
void roundFloat32(int32_t *exp, uint32_t *fraction); |
void roundFloat64(int32_t *exp, uint64_t *fraction); |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/softfloat/generic/other.c |
---|
0,0 → 1,37 |
/* |
* Copyright (c) 2005 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup softfloat |
* @{ |
*/ |
/** @file |
*/ |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/softfloat/generic/softfloat.c |
---|
0,0 → 1,499 |
/* |
* Copyright (c) 2005 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup softfloat generic |
* @ingroup sfl |
* @brief Architecture independent parts of FPU software emulation library. |
* @{ |
*/ |
/** @file |
*/ |
#include<softfloat.h> |
#include<sftypes.h> |
#include<add.h> |
#include<sub.h> |
#include<mul.h> |
#include<div.h> |
#include<conversion.h> |
#include<comparison.h> |
#include<other.h> |
#include<functions.h> |
/* Arithmetic functions */ |
float __addsf3(float a, float b) |
{ |
float32 fa, fb; |
fa.f = a; |
fb.f = b; |
if (fa.parts.sign != fb.parts.sign) { |
if (fa.parts.sign) { |
fa.parts.sign = 0; |
return subFloat32(fb, fa).f; |
}; |
fb.parts.sign = 0; |
return subFloat32(fa, fb).f; |
} |
return addFloat32(fa, fb).f; |
} |
double __adddf3(double a, double b) |
{ |
float64 da, db; |
da.d = a; |
db.d = b; |
if (da.parts.sign != db.parts.sign) { |
if (da.parts.sign) { |
da.parts.sign = 0; |
return subFloat64(db, da).d; |
}; |
db.parts.sign = 0; |
return subFloat64(da, db).d; |
} |
return addFloat64(da, db).d; |
} |
float __subsf3(float a, float b) |
{ |
float32 fa, fb; |
fa.f = a; |
fb.f = b; |
if (fa.parts.sign != fb.parts.sign) { |
fb.parts.sign = !fb.parts.sign; |
return addFloat32(fa, fb).f; |
} |
return subFloat32(fa, fb).f; |
} |
double __subdf3(double a, double b) |
{ |
float64 da, db; |
da.d = a; |
db.d = b; |
if (da.parts.sign != db.parts.sign) { |
db.parts.sign = !db.parts.sign; |
return addFloat64(da, db).d; |
} |
return subFloat64(da, db).d; |
} |
float __mulsf3(float a, float b) |
{ |
float32 fa, fb; |
fa.f = a; |
fb.f = b; |
return mulFloat32(fa, fb).f; |
} |
double __muldf3(double a, double b) |
{ |
float64 da, db; |
da.d = a; |
db.d = b; |
return mulFloat64(da, db).d; |
} |
float __divsf3(float a, float b) |
{ |
float32 fa, fb; |
fa.f = a; |
fb.f = b; |
return divFloat32(fa, fb).f; |
} |
double __divdf3(double a, double b) |
{ |
float64 da, db; |
da.d = a; |
db.d = b; |
return divFloat64(da, db).d; |
} |
float __negsf2(float a) |
{ |
float32 fa; |
fa.f = a; |
fa.parts.sign = !fa.parts.sign; |
return fa.f; |
} |
double __negdf2(double a) |
{ |
float64 fa; |
fa.d = a; |
fa.parts.sign = !fa.parts.sign; |
return fa.d; |
} |
/* Conversion functions */ |
double __extendsfdf2(float a) |
{ |
float32 fa; |
fa.f = a; |
return convertFloat32ToFloat64(fa).d; |
} |
float __truncdfsf2(double a) |
{ |
float64 da; |
da.d = a; |
return convertFloat64ToFloat32(da).f; |
} |
int __fixsfsi(float a) |
{ |
float32 fa; |
fa.f = a; |
return float32_to_int(fa); |
} |
int __fixdfsi(double a) |
{ |
float64 da; |
da.d = a; |
return float64_to_int(da); |
} |
long __fixsfdi(float a) |
{ |
float32 fa; |
fa.f = a; |
return float32_to_long(fa); |
} |
long __fixdfdi(double a) |
{ |
float64 da; |
da.d = a; |
return float64_to_long(da); |
} |
long long __fixsfti(float a) |
{ |
float32 fa; |
fa.f = a; |
return float32_to_longlong(fa); |
} |
long long __fixdfti(double a) |
{ |
float64 da; |
da.d = a; |
return float64_to_longlong(da); |
} |
unsigned int __fixunssfsi(float a) |
{ |
float32 fa; |
fa.f = a; |
return float32_to_uint(fa); |
} |
unsigned int __fixunsdfsi(double a) |
{ |
float64 da; |
da.d = a; |
return float64_to_uint(da); |
} |
unsigned long __fixunssfdi(float a) |
{ |
float32 fa; |
fa.f = a; |
return float32_to_ulong(fa); |
} |
unsigned long __fixunsdfdi(double a) |
{ |
float64 da; |
da.d = a; |
return float64_to_ulong(da); |
} |
unsigned long long __fixunssfti(float a) |
{ |
float32 fa; |
fa.f = a; |
return float32_to_ulonglong(fa); |
} |
unsigned long long __fixunsdfti(double a) |
{ |
float64 da; |
da.d = a; |
return float64_to_ulonglong(da); |
} |
float __floatsisf(int i) |
{ |
float32 fa; |
fa = int_to_float32(i); |
return fa.f; |
} |
double __floatsidf(int i) |
{ |
float64 da; |
da = int_to_float64(i); |
return da.d; |
} |
float __floatdisf(long i) |
{ |
float32 fa; |
fa = long_to_float32(i); |
return fa.f; |
} |
double __floatdidf(long i) |
{ |
float64 da; |
da = long_to_float64(i); |
return da.d; |
} |
float __floattisf(long long i) |
{ |
float32 fa; |
fa = longlong_to_float32(i); |
return fa.f; |
} |
double __floattidf(long long i) |
{ |
float64 da; |
da = longlong_to_float64(i); |
return da.d; |
} |
float __floatunsisf(unsigned int i) |
{ |
float32 fa; |
fa = uint_to_float32(i); |
return fa.f; |
} |
double __floatunsidf(unsigned int i) |
{ |
float64 da; |
da = uint_to_float64(i); |
return da.d; |
} |
float __floatundisf(unsigned long i) |
{ |
float32 fa; |
fa = ulong_to_float32(i); |
return fa.f; |
} |
double __floatundidf(unsigned long i) |
{ |
float64 da; |
da = ulong_to_float64(i); |
return da.d; |
} |
float __floatuntisf(unsigned long long i) |
{ |
float32 fa; |
fa = ulonglong_to_float32(i); |
return fa.f; |
} |
double __floatuntidf(unsigned long long i) |
{ |
float64 da; |
da = ulonglong_to_float64(i); |
return da.d; |
} |
/* Comparison functions */ |
/* Comparison functions */ |
/* a<b .. -1 |
* a=b .. 0 |
* a>b .. 1 |
* */ |
int __cmpsf2(float a, float b) |
{ |
float32 fa, fb; |
fa.f = a; |
fb.f = b; |
if ( (isFloat32NaN(fa)) || (isFloat32NaN(fb)) ) { |
return 1; /* no special constant for unordered - maybe signaled? */ |
}; |
if (isFloat32eq(fa, fb)) { |
return 0; |
}; |
if (isFloat32lt(fa, fb)) { |
return -1; |
}; |
return 1; |
} |
int __unordsf2(float a, float b) |
{ |
float32 fa, fb; |
fa.f = a; |
fb.f = b; |
return ( (isFloat32NaN(fa)) || (isFloat32NaN(fb)) ); |
} |
/** |
* @return zero, if neither argument is a NaN and are equal |
* */ |
int __eqsf2(float a, float b) |
{ |
float32 fa, fb; |
fa.f = a; |
fb.f = b; |
if ( (isFloat32NaN(fa)) || (isFloat32NaN(fb)) ) { |
/* TODO: sigNaNs*/ |
return 1; |
}; |
return isFloat32eq(fa, fb) - 1; |
} |
/* strange behavior, but it was in gcc documentation */ |
int __nesf2(float a, float b) |
{ |
return __eqsf2(a, b); |
} |
/* return value >= 0 if a>=b and neither is NaN */ |
int __gesf2(float a, float b) |
{ |
float32 fa, fb; |
fa.f = a; |
fb.f = b; |
if ( (isFloat32NaN(fa)) || (isFloat32NaN(fb)) ) { |
/* TODO: sigNaNs*/ |
return -1; |
}; |
if (isFloat32eq(fa, fb)) { |
return 0; |
}; |
if (isFloat32gt(fa, fb)) { |
return 1; |
}; |
return -1; |
} |
/** Return negative value, if a<b and neither is NaN*/ |
int __ltsf2(float a, float b) |
{ |
float32 fa, fb; |
fa.f = a; |
fb.f = b; |
if ( (isFloat32NaN(fa)) || (isFloat32NaN(fb)) ) { |
/* TODO: sigNaNs*/ |
return 1; |
}; |
if (isFloat32lt(fa, fb)) { |
return -1; |
}; |
return 0; |
} |
/* return value <= 0 if a<=b and neither is NaN */ |
int __lesf2(float a, float b) |
{ |
float32 fa, fb; |
fa.f = a; |
fb.f = b; |
if ( (isFloat32NaN(fa)) || (isFloat32NaN(fb)) ) { |
/* TODO: sigNaNs*/ |
return 1; |
}; |
if (isFloat32eq(fa, fb)) { |
return 0; |
}; |
if (isFloat32lt(fa, fb)) { |
return -1; |
}; |
return 1; |
} |
/** Return positive value, if a>b and neither is NaN*/ |
int __gtsf2(float a, float b) |
{ |
float32 fa, fb; |
fa.f = a; |
fb.f = b; |
if ( (isFloat32NaN(fa)) || (isFloat32NaN(fb)) ) { |
/* TODO: sigNaNs*/ |
return -1; |
}; |
if (isFloat32gt(fa, fb)) { |
return 1; |
}; |
return 0; |
} |
/* Other functions */ |
float __powisf2(float a, int b) |
{ |
/* TODO: */ |
float32 fa; |
fa.binary = FLOAT32_NAN; |
return fa.f; |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/softfloat/generic/div.c |
---|
0,0 → 1,364 |
/* |
* Copyright (c) 2005 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup softfloat |
* @{ |
*/ |
/** @file |
*/ |
#include<sftypes.h> |
#include<add.h> |
#include<div.h> |
#include<comparison.h> |
#include<mul.h> |
#include<common.h> |
float32 divFloat32(float32 a, float32 b) |
{ |
float32 result; |
int32_t aexp, bexp, cexp; |
uint64_t afrac, bfrac, cfrac; |
result.parts.sign = a.parts.sign ^ b.parts.sign; |
if (isFloat32NaN(a)) { |
if (isFloat32SigNaN(a)) { |
/*FIXME: SigNaN*/ |
} |
/*NaN*/ |
return a; |
} |
if (isFloat32NaN(b)) { |
if (isFloat32SigNaN(b)) { |
/*FIXME: SigNaN*/ |
} |
/*NaN*/ |
return b; |
} |
if (isFloat32Infinity(a)) { |
if (isFloat32Infinity(b)) { |
/*FIXME: inf / inf */ |
result.binary = FLOAT32_NAN; |
return result; |
} |
/* inf / num */ |
result.parts.exp = a.parts.exp; |
result.parts.fraction = a.parts.fraction; |
return result; |
} |
if (isFloat32Infinity(b)) { |
if (isFloat32Zero(a)) { |
/* FIXME 0 / inf */ |
result.parts.exp = 0; |
result.parts.fraction = 0; |
return result; |
} |
/* FIXME: num / inf*/ |
result.parts.exp = 0; |
result.parts.fraction = 0; |
return result; |
} |
if (isFloat32Zero(b)) { |
if (isFloat32Zero(a)) { |
/*FIXME: 0 / 0*/ |
result.binary = FLOAT32_NAN; |
return result; |
} |
/* FIXME: division by zero */ |
result.parts.exp = 0; |
result.parts.fraction = 0; |
return result; |
} |
afrac = a.parts.fraction; |
aexp = a.parts.exp; |
bfrac = b.parts.fraction; |
bexp = b.parts.exp; |
/* denormalized numbers */ |
if (aexp == 0) { |
if (afrac == 0) { |
result.parts.exp = 0; |
result.parts.fraction = 0; |
return result; |
} |
/* normalize it*/ |
afrac <<= 1; |
/* afrac is nonzero => it must stop */ |
while (! (afrac & FLOAT32_HIDDEN_BIT_MASK) ) { |
afrac <<= 1; |
aexp--; |
} |
} |
if (bexp == 0) { |
bfrac <<= 1; |
/* bfrac is nonzero => it must stop */ |
while (! (bfrac & FLOAT32_HIDDEN_BIT_MASK) ) { |
bfrac <<= 1; |
bexp--; |
} |
} |
afrac = (afrac | FLOAT32_HIDDEN_BIT_MASK ) << (32 - FLOAT32_FRACTION_SIZE - 1 ); |
bfrac = (bfrac | FLOAT32_HIDDEN_BIT_MASK ) << (32 - FLOAT32_FRACTION_SIZE ); |
if ( bfrac <= (afrac << 1) ) { |
afrac >>= 1; |
aexp++; |
} |
cexp = aexp - bexp + FLOAT32_BIAS - 2; |
cfrac = (afrac << 32) / bfrac; |
if (( cfrac & 0x3F ) == 0) { |
cfrac |= ( bfrac * cfrac != afrac << 32 ); |
} |
/* pack and round */ |
/* find first nonzero digit and shift result and detect possibly underflow */ |
while ((cexp > 0) && (cfrac) && (!(cfrac & (FLOAT32_HIDDEN_BIT_MASK << 7 )))) { |
cexp--; |
cfrac <<= 1; |
/* TODO: fix underflow */ |
}; |
cfrac += (0x1 << 6); /* FIXME: 7 is not sure*/ |
if (cfrac & (FLOAT32_HIDDEN_BIT_MASK << 7)) { |
++cexp; |
cfrac >>= 1; |
} |
/* check overflow */ |
if (cexp >= FLOAT32_MAX_EXPONENT ) { |
/* FIXME: overflow, return infinity */ |
result.parts.exp = FLOAT32_MAX_EXPONENT; |
result.parts.fraction = 0; |
return result; |
} |
if (cexp < 0) { |
/* FIXME: underflow */ |
result.parts.exp = 0; |
if ((cexp + FLOAT32_FRACTION_SIZE) < 0) { |
result.parts.fraction = 0; |
return result; |
} |
cfrac >>= 1; |
while (cexp < 0) { |
cexp ++; |
cfrac >>= 1; |
} |
} else { |
result.parts.exp = (uint32_t)cexp; |
} |
result.parts.fraction = ((cfrac >> 6) & (~FLOAT32_HIDDEN_BIT_MASK)); |
return result; |
} |
float64 divFloat64(float64 a, float64 b) |
{ |
float64 result; |
int64_t aexp, bexp, cexp; |
uint64_t afrac, bfrac, cfrac; |
uint64_t remlo, remhi; |
result.parts.sign = a.parts.sign ^ b.parts.sign; |
if (isFloat64NaN(a)) { |
if (isFloat64SigNaN(b)) { |
/*FIXME: SigNaN*/ |
return b; |
} |
if (isFloat64SigNaN(a)) { |
/*FIXME: SigNaN*/ |
} |
/*NaN*/ |
return a; |
} |
if (isFloat64NaN(b)) { |
if (isFloat64SigNaN(b)) { |
/*FIXME: SigNaN*/ |
} |
/*NaN*/ |
return b; |
} |
if (isFloat64Infinity(a)) { |
if (isFloat64Infinity(b) || isFloat64Zero(b)) { |
/*FIXME: inf / inf */ |
result.binary = FLOAT64_NAN; |
return result; |
} |
/* inf / num */ |
result.parts.exp = a.parts.exp; |
result.parts.fraction = a.parts.fraction; |
return result; |
} |
if (isFloat64Infinity(b)) { |
if (isFloat64Zero(a)) { |
/* FIXME 0 / inf */ |
result.parts.exp = 0; |
result.parts.fraction = 0; |
return result; |
} |
/* FIXME: num / inf*/ |
result.parts.exp = 0; |
result.parts.fraction = 0; |
return result; |
} |
if (isFloat64Zero(b)) { |
if (isFloat64Zero(a)) { |
/*FIXME: 0 / 0*/ |
result.binary = FLOAT64_NAN; |
return result; |
} |
/* FIXME: division by zero */ |
result.parts.exp = 0; |
result.parts.fraction = 0; |
return result; |
} |
afrac = a.parts.fraction; |
aexp = a.parts.exp; |
bfrac = b.parts.fraction; |
bexp = b.parts.exp; |
/* denormalized numbers */ |
if (aexp == 0) { |
if (afrac == 0) { |
result.parts.exp = 0; |
result.parts.fraction = 0; |
return result; |
} |
/* normalize it*/ |
aexp++; |
/* afrac is nonzero => it must stop */ |
while (! (afrac & FLOAT64_HIDDEN_BIT_MASK) ) { |
afrac <<= 1; |
aexp--; |
} |
} |
if (bexp == 0) { |
bexp++; |
/* bfrac is nonzero => it must stop */ |
while (! (bfrac & FLOAT64_HIDDEN_BIT_MASK) ) { |
bfrac <<= 1; |
bexp--; |
} |
} |
afrac = (afrac | FLOAT64_HIDDEN_BIT_MASK ) << (64 - FLOAT64_FRACTION_SIZE - 2 ); |
bfrac = (bfrac | FLOAT64_HIDDEN_BIT_MASK ) << (64 - FLOAT64_FRACTION_SIZE - 1); |
if ( bfrac <= (afrac << 1) ) { |
afrac >>= 1; |
aexp++; |
} |
cexp = aexp - bexp + FLOAT64_BIAS - 2; |
cfrac = divFloat64estim(afrac, bfrac); |
if (( cfrac & 0x1FF ) <= 2) { /*FIXME:?? */ |
mul64integers( bfrac, cfrac, &remlo, &remhi); |
/* (__u128)afrac << 64 - ( ((__u128)remhi<<64) + (__u128)remlo )*/ |
remhi = afrac - remhi - ( remlo > 0); |
remlo = - remlo; |
while ((int64_t) remhi < 0) { |
cfrac--; |
remlo += bfrac; |
remhi += ( remlo < bfrac ); |
} |
cfrac |= ( remlo != 0 ); |
} |
/* round and shift */ |
result = finishFloat64(cexp, cfrac, result.parts.sign); |
return result; |
} |
uint64_t divFloat64estim(uint64_t a, uint64_t b) |
{ |
uint64_t bhi; |
uint64_t remhi, remlo; |
uint64_t result; |
if ( b <= a ) { |
return 0xFFFFFFFFFFFFFFFFull; |
} |
bhi = b >> 32; |
result = ((bhi << 32) <= a) ?( 0xFFFFFFFFull << 32) : ( a / bhi) << 32; |
mul64integers(b, result, &remlo, &remhi); |
remhi = a - remhi - (remlo > 0); |
remlo = - remlo; |
b <<= 32; |
while ( (int64_t) remhi < 0 ) { |
result -= 0x1ll << 32; |
remlo += b; |
remhi += bhi + ( remlo < b ); |
} |
remhi = (remhi << 32) | (remlo >> 32); |
if (( bhi << 32) <= remhi) { |
result |= 0xFFFFFFFF; |
} else { |
result |= remhi / bhi; |
} |
return result; |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/softfloat/generic/conversion.c |
---|
0,0 → 1,593 |
/* |
* Copyright (c) 2005 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup softfloat |
* @{ |
*/ |
/** @file |
*/ |
#include "sftypes.h" |
#include "conversion.h" |
#include "comparison.h" |
#include "common.h" |
float64 convertFloat32ToFloat64(float32 a) |
{ |
float64 result; |
uint64_t frac; |
result.parts.sign = a.parts.sign; |
result.parts.fraction = a.parts.fraction; |
result.parts.fraction <<= (FLOAT64_FRACTION_SIZE - FLOAT32_FRACTION_SIZE ); |
if ((isFloat32Infinity(a))||(isFloat32NaN(a))) { |
result.parts.exp = 0x7FF; |
/* TODO; check if its correct for SigNaNs*/ |
return result; |
}; |
result.parts.exp = a.parts.exp + ( (int)FLOAT64_BIAS - FLOAT32_BIAS ); |
if (a.parts.exp == 0) { |
/* normalize denormalized numbers */ |
if (result.parts.fraction == 0ll) { /* fix zero */ |
result.parts.exp = 0ll; |
return result; |
} |
frac = result.parts.fraction; |
while (!(frac & (0x10000000000000ll))) { |
frac <<= 1; |
--result.parts.exp; |
}; |
++result.parts.exp; |
result.parts.fraction = frac; |
}; |
return result; |
} |
float32 convertFloat64ToFloat32(float64 a) |
{ |
float32 result; |
int32_t exp; |
uint64_t frac; |
result.parts.sign = a.parts.sign; |
if (isFloat64NaN(a)) { |
result.parts.exp = 0xFF; |
if (isFloat64SigNaN(a)) { |
result.parts.fraction = 0x400000; /* set first bit of fraction nonzero */ |
return result; |
} |
result.parts.fraction = 0x1; /* fraction nonzero but its first bit is zero */ |
return result; |
}; |
if (isFloat64Infinity(a)) { |
result.parts.fraction = 0; |
result.parts.exp = 0xFF; |
return result; |
}; |
exp = (int)a.parts.exp - FLOAT64_BIAS + FLOAT32_BIAS; |
if (exp >= 0xFF) { |
/*FIXME: overflow*/ |
result.parts.fraction = 0; |
result.parts.exp = 0xFF; |
return result; |
} else if (exp <= 0 ) { |
/* underflow or denormalized */ |
result.parts.exp = 0; |
exp *= -1; |
if (exp > FLOAT32_FRACTION_SIZE ) { |
/* FIXME: underflow */ |
result.parts.fraction = 0; |
return result; |
}; |
/* denormalized */ |
frac = a.parts.fraction; |
frac |= 0x10000000000000ll; /* denormalize and set hidden bit */ |
frac >>= (FLOAT64_FRACTION_SIZE - FLOAT32_FRACTION_SIZE + 1); |
while (exp > 0) { |
--exp; |
frac >>= 1; |
}; |
result.parts.fraction = frac; |
return result; |
}; |
result.parts.exp = exp; |
result.parts.fraction = a.parts.fraction >> (FLOAT64_FRACTION_SIZE - FLOAT32_FRACTION_SIZE); |
return result; |
} |
/** Helping procedure for converting float32 to uint32 |
* @param a floating point number in normalized form (no NaNs or Inf are checked ) |
* @return unsigned integer |
*/ |
static uint32_t _float32_to_uint32_helper(float32 a) |
{ |
uint32_t frac; |
if (a.parts.exp < FLOAT32_BIAS) { |
/*TODO: rounding*/ |
return 0; |
} |
frac = a.parts.fraction; |
frac |= FLOAT32_HIDDEN_BIT_MASK; |
/* shift fraction to left so hidden bit will be the most significant bit */ |
frac <<= 32 - FLOAT32_FRACTION_SIZE - 1; |
frac >>= 32 - (a.parts.exp - FLOAT32_BIAS) - 1; |
if ((a.parts.sign == 1) && (frac != 0)) { |
frac = ~frac; |
++frac; |
} |
return frac; |
} |
/* Convert float to unsigned int32 |
* FIXME: Im not sure what to return if overflow/underflow happens |
* - now its the biggest or the smallest int |
*/ |
uint32_t float32_to_uint32(float32 a) |
{ |
if (isFloat32NaN(a)) { |
return MAX_UINT32; |
} |
if (isFloat32Infinity(a) || (a.parts.exp >= (32 + FLOAT32_BIAS))) { |
if (a.parts.sign) { |
return MIN_UINT32; |
} |
return MAX_UINT32; |
} |
return _float32_to_uint32_helper(a); |
} |
/* Convert float to signed int32 |
* FIXME: Im not sure what to return if overflow/underflow happens |
* - now its the biggest or the smallest int |
*/ |
int32_t float32_to_int32(float32 a) |
{ |
if (isFloat32NaN(a)) { |
return MAX_INT32; |
} |
if (isFloat32Infinity(a) || (a.parts.exp >= (32 + FLOAT32_BIAS))) { |
if (a.parts.sign) { |
return MIN_INT32; |
} |
return MAX_INT32; |
} |
return _float32_to_uint32_helper(a); |
} |
/** Helping procedure for converting float64 to uint64 |
* @param a floating point number in normalized form (no NaNs or Inf are checked ) |
* @return unsigned integer |
*/ |
static uint64_t _float64_to_uint64_helper(float64 a) |
{ |
uint64_t frac; |
if (a.parts.exp < FLOAT64_BIAS) { |
/*TODO: rounding*/ |
return 0; |
} |
frac = a.parts.fraction; |
frac |= FLOAT64_HIDDEN_BIT_MASK; |
/* shift fraction to left so hidden bit will be the most significant bit */ |
frac <<= 64 - FLOAT64_FRACTION_SIZE - 1; |
frac >>= 64 - (a.parts.exp - FLOAT64_BIAS) - 1; |
if ((a.parts.sign == 1) && (frac != 0)) { |
frac = ~frac; |
++frac; |
} |
return frac; |
} |
/* Convert float to unsigned int64 |
* FIXME: Im not sure what to return if overflow/underflow happens |
* - now its the biggest or the smallest int |
*/ |
uint64_t float64_to_uint64(float64 a) |
{ |
if (isFloat64NaN(a)) { |
return MAX_UINT64; |
} |
if (isFloat64Infinity(a) || (a.parts.exp >= (64 + FLOAT64_BIAS))) { |
if (a.parts.sign) { |
return MIN_UINT64; |
} |
return MAX_UINT64; |
} |
return _float64_to_uint64_helper(a); |
} |
/* Convert float to signed int64 |
* FIXME: Im not sure what to return if overflow/underflow happens |
* - now its the biggest or the smallest int |
*/ |
int64_t float64_to_int64(float64 a) |
{ |
if (isFloat64NaN(a)) { |
return MAX_INT64; |
} |
if (isFloat64Infinity(a) || (a.parts.exp >= (64 + FLOAT64_BIAS))) { |
if (a.parts.sign) { |
return MIN_INT64; |
} |
return MAX_INT64; |
} |
return _float64_to_uint64_helper(a); |
} |
/** Helping procedure for converting float32 to uint64 |
* @param a floating point number in normalized form (no NaNs or Inf are checked ) |
* @return unsigned integer |
*/ |
static uint64_t _float32_to_uint64_helper(float32 a) |
{ |
uint64_t frac; |
if (a.parts.exp < FLOAT32_BIAS) { |
/*TODO: rounding*/ |
return 0; |
} |
frac = a.parts.fraction; |
frac |= FLOAT32_HIDDEN_BIT_MASK; |
/* shift fraction to left so hidden bit will be the most significant bit */ |
frac <<= 64 - FLOAT32_FRACTION_SIZE - 1; |
frac >>= 64 - (a.parts.exp - FLOAT32_BIAS) - 1; |
if ((a.parts.sign == 1) && (frac != 0)) { |
frac = ~frac; |
++frac; |
} |
return frac; |
} |
/* Convert float to unsigned int64 |
* FIXME: Im not sure what to return if overflow/underflow happens |
* - now its the biggest or the smallest int |
*/ |
uint64_t float32_to_uint64(float32 a) |
{ |
if (isFloat32NaN(a)) { |
return MAX_UINT64; |
} |
if (isFloat32Infinity(a) || (a.parts.exp >= (64 + FLOAT32_BIAS))) { |
if (a.parts.sign) { |
return MIN_UINT64; |
} |
return MAX_UINT64; |
} |
return _float32_to_uint64_helper(a); |
} |
/* Convert float to signed int64 |
* FIXME: Im not sure what to return if overflow/underflow happens |
* - now its the biggest or the smallest int |
*/ |
int64_t float32_to_int64(float32 a) |
{ |
if (isFloat32NaN(a)) { |
return MAX_INT64; |
} |
if (isFloat32Infinity(a) || (a.parts.exp >= (64 + FLOAT32_BIAS))) { |
if (a.parts.sign) { |
return (MIN_INT64); |
} |
return MAX_INT64; |
} |
return _float32_to_uint64_helper(a); |
} |
/* Convert float64 to unsigned int32 |
* FIXME: Im not sure what to return if overflow/underflow happens |
* - now its the biggest or the smallest int |
*/ |
uint32_t float64_to_uint32(float64 a) |
{ |
if (isFloat64NaN(a)) { |
return MAX_UINT32; |
} |
if (isFloat64Infinity(a) || (a.parts.exp >= (32 + FLOAT64_BIAS))) { |
if (a.parts.sign) { |
return MIN_UINT32; |
} |
return MAX_UINT32; |
} |
return (uint32_t)_float64_to_uint64_helper(a); |
} |
/* Convert float64 to signed int32 |
* FIXME: Im not sure what to return if overflow/underflow happens |
* - now its the biggest or the smallest int |
*/ |
int32_t float64_to_int32(float64 a) |
{ |
if (isFloat64NaN(a)) { |
return MAX_INT32; |
} |
if (isFloat64Infinity(a) || (a.parts.exp >= (32 + FLOAT64_BIAS))) { |
if (a.parts.sign) { |
return MIN_INT32; |
} |
return MAX_INT32; |
} |
return (int32_t)_float64_to_uint64_helper(a); |
} |
/** Convert unsigned integer to float32 |
* |
* |
*/ |
float32 uint32_to_float32(uint32_t i) |
{ |
int counter; |
int32_t exp; |
float32 result; |
result.parts.sign = 0; |
result.parts.fraction = 0; |
counter = countZeroes32(i); |
exp = FLOAT32_BIAS + 32 - counter - 1; |
if (counter == 32) { |
result.binary = 0; |
return result; |
} |
if (counter > 0) { |
i <<= counter - 1; |
} else { |
i >>= 1; |
} |
roundFloat32(&exp, &i); |
result.parts.fraction = i >> 7; |
result.parts.exp = exp; |
return result; |
} |
float32 int32_to_float32(int32_t i) |
{ |
float32 result; |
if (i < 0) { |
result = uint32_to_float32((uint32_t)(-i)); |
} else { |
result = uint32_to_float32((uint32_t)i); |
} |
result.parts.sign = i < 0; |
return result; |
} |
float32 uint64_to_float32(uint64_t i) |
{ |
int counter; |
int32_t exp; |
uint32_t j; |
float32 result; |
result.parts.sign = 0; |
result.parts.fraction = 0; |
counter = countZeroes64(i); |
exp = FLOAT32_BIAS + 64 - counter - 1; |
if (counter == 64) { |
result.binary = 0; |
return result; |
} |
/* Shift all to the first 31 bits (31. will be hidden 1)*/ |
if (counter > 33) { |
i <<= counter - 1 - 32; |
} else { |
i >>= 1 + 32 - counter; |
} |
j = (uint32_t)i; |
roundFloat32(&exp, &j); |
result.parts.fraction = j >> 7; |
result.parts.exp = exp; |
return result; |
} |
float32 int64_to_float32(int64_t i) |
{ |
float32 result; |
if (i < 0) { |
result = uint64_to_float32((uint64_t)(-i)); |
} else { |
result = uint64_to_float32((uint64_t)i); |
} |
result.parts.sign = i < 0; |
return result; |
} |
/** Convert unsigned integer to float64 |
* |
* |
*/ |
float64 uint32_to_float64(uint32_t i) |
{ |
int counter; |
int32_t exp; |
float64 result; |
uint64_t frac; |
result.parts.sign = 0; |
result.parts.fraction = 0; |
counter = countZeroes32(i); |
exp = FLOAT64_BIAS + 32 - counter - 1; |
if (counter == 32) { |
result.binary = 0; |
return result; |
} |
frac = i; |
frac <<= counter + 32 - 1; |
roundFloat64(&exp, &frac); |
result.parts.fraction = frac >> 10; |
result.parts.exp = exp; |
return result; |
} |
float64 int32_to_float64(int32_t i) |
{ |
float64 result; |
if (i < 0) { |
result = uint32_to_float64((uint32_t)(-i)); |
} else { |
result = uint32_to_float64((uint32_t)i); |
} |
result.parts.sign = i < 0; |
return result; |
} |
float64 uint64_to_float64(uint64_t i) |
{ |
int counter; |
int32_t exp; |
float64 result; |
result.parts.sign = 0; |
result.parts.fraction = 0; |
counter = countZeroes64(i); |
exp = FLOAT64_BIAS + 64 - counter - 1; |
if (counter == 64) { |
result.binary = 0; |
return result; |
} |
if (counter > 0) { |
i <<= counter - 1; |
} else { |
i >>= 1; |
} |
roundFloat64(&exp, &i); |
result.parts.fraction = i >> 10; |
result.parts.exp = exp; |
return result; |
} |
float64 int64_to_float64(int64_t i) |
{ |
float64 result; |
if (i < 0) { |
result = uint64_to_float64((uint64_t)(-i)); |
} else { |
result = uint64_to_float64((uint64_t)i); |
} |
result.parts.sign = i < 0; |
return result; |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/softfloat/generic/add.c |
---|
0,0 → 1,259 |
/* |
* Copyright (c) 2005 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup softfloat |
* @{ |
*/ |
/** @file |
*/ |
#include<sftypes.h> |
#include<add.h> |
#include<comparison.h> |
/** Add two Float32 numbers with same signs |
*/ |
float32 addFloat32(float32 a, float32 b) |
{ |
int expdiff; |
uint32_t exp1, exp2,frac1, frac2; |
expdiff = a.parts.exp - b.parts.exp; |
if (expdiff < 0) { |
if (isFloat32NaN(b)) { |
/* TODO: fix SigNaN */ |
if (isFloat32SigNaN(b)) { |
}; |
return b; |
}; |
if (b.parts.exp == FLOAT32_MAX_EXPONENT) { |
return b; |
} |
frac1 = b.parts.fraction; |
exp1 = b.parts.exp; |
frac2 = a.parts.fraction; |
exp2 = a.parts.exp; |
expdiff *= -1; |
} else { |
if ((isFloat32NaN(a)) || (isFloat32NaN(b))) { |
/* TODO: fix SigNaN */ |
if (isFloat32SigNaN(a) || isFloat32SigNaN(b)) { |
}; |
return (isFloat32NaN(a)?a:b); |
}; |
if (a.parts.exp == FLOAT32_MAX_EXPONENT) { |
return a; |
} |
frac1 = a.parts.fraction; |
exp1 = a.parts.exp; |
frac2 = b.parts.fraction; |
exp2 = b.parts.exp; |
}; |
if (exp1 == 0) { |
/* both are denormalized */ |
frac1 += frac2; |
if (frac1 & FLOAT32_HIDDEN_BIT_MASK ) { |
/* result is not denormalized */ |
a.parts.exp = 1; |
}; |
a.parts.fraction = frac1; |
return a; |
}; |
frac1 |= FLOAT32_HIDDEN_BIT_MASK; /* add hidden bit */ |
if (exp2 == 0) { |
/* second operand is denormalized */ |
--expdiff; |
} else { |
/* add hidden bit to second operand */ |
frac2 |= FLOAT32_HIDDEN_BIT_MASK; |
}; |
/* create some space for rounding */ |
frac1 <<= 6; |
frac2 <<= 6; |
if (expdiff < (FLOAT32_FRACTION_SIZE + 2) ) { |
frac2 >>= expdiff; |
frac1 += frac2; |
} else { |
a.parts.exp = exp1; |
a.parts.fraction = (frac1 >> 6) & (~(FLOAT32_HIDDEN_BIT_MASK)); |
return a; |
} |
if (frac1 & (FLOAT32_HIDDEN_BIT_MASK << 7) ) { |
++exp1; |
frac1 >>= 1; |
}; |
/* rounding - if first bit after fraction is set then round up */ |
frac1 += (0x1 << 5); |
if (frac1 & (FLOAT32_HIDDEN_BIT_MASK << 7)) { |
/* rounding overflow */ |
++exp1; |
frac1 >>= 1; |
}; |
if ((exp1 == FLOAT32_MAX_EXPONENT ) || (exp2 > exp1)) { |
/* overflow - set infinity as result */ |
a.parts.exp = FLOAT32_MAX_EXPONENT; |
a.parts.fraction = 0; |
return a; |
} |
a.parts.exp = exp1; |
/*Clear hidden bit and shift */ |
a.parts.fraction = ((frac1 >> 6) & (~FLOAT32_HIDDEN_BIT_MASK)) ; |
return a; |
} |
/** Add two Float64 numbers with same signs |
*/ |
float64 addFloat64(float64 a, float64 b) |
{ |
int expdiff; |
uint32_t exp1, exp2; |
uint64_t frac1, frac2; |
expdiff = ((int )a.parts.exp) - b.parts.exp; |
if (expdiff < 0) { |
if (isFloat64NaN(b)) { |
/* TODO: fix SigNaN */ |
if (isFloat64SigNaN(b)) { |
}; |
return b; |
}; |
/* b is infinity and a not */ |
if (b.parts.exp == FLOAT64_MAX_EXPONENT ) { |
return b; |
} |
frac1 = b.parts.fraction; |
exp1 = b.parts.exp; |
frac2 = a.parts.fraction; |
exp2 = a.parts.exp; |
expdiff *= -1; |
} else { |
if (isFloat64NaN(a)) { |
/* TODO: fix SigNaN */ |
if (isFloat64SigNaN(a) || isFloat64SigNaN(b)) { |
}; |
return a; |
}; |
/* a is infinity and b not */ |
if (a.parts.exp == FLOAT64_MAX_EXPONENT ) { |
return a; |
} |
frac1 = a.parts.fraction; |
exp1 = a.parts.exp; |
frac2 = b.parts.fraction; |
exp2 = b.parts.exp; |
}; |
if (exp1 == 0) { |
/* both are denormalized */ |
frac1 += frac2; |
if (frac1 & FLOAT64_HIDDEN_BIT_MASK) { |
/* result is not denormalized */ |
a.parts.exp = 1; |
}; |
a.parts.fraction = frac1; |
return a; |
}; |
/* add hidden bit - frac1 is sure not denormalized */ |
frac1 |= FLOAT64_HIDDEN_BIT_MASK; |
/* second operand ... */ |
if (exp2 == 0) { |
/* ... is denormalized */ |
--expdiff; |
} else { |
/* is not denormalized */ |
frac2 |= FLOAT64_HIDDEN_BIT_MASK; |
}; |
/* create some space for rounding */ |
frac1 <<= 6; |
frac2 <<= 6; |
if (expdiff < (FLOAT64_FRACTION_SIZE + 2) ) { |
frac2 >>= expdiff; |
frac1 += frac2; |
} else { |
a.parts.exp = exp1; |
a.parts.fraction = (frac1 >> 6) & (~(FLOAT64_HIDDEN_BIT_MASK)); |
return a; |
} |
if (frac1 & (FLOAT64_HIDDEN_BIT_MASK << 7) ) { |
++exp1; |
frac1 >>= 1; |
}; |
/* rounding - if first bit after fraction is set then round up */ |
frac1 += (0x1 << 5); |
if (frac1 & (FLOAT64_HIDDEN_BIT_MASK << 7)) { |
/* rounding overflow */ |
++exp1; |
frac1 >>= 1; |
}; |
if ((exp1 == FLOAT64_MAX_EXPONENT ) || (exp2 > exp1)) { |
/* overflow - set infinity as result */ |
a.parts.exp = FLOAT64_MAX_EXPONENT; |
a.parts.fraction = 0; |
return a; |
} |
a.parts.exp = exp1; |
/*Clear hidden bit and shift */ |
a.parts.fraction = ( (frac1 >> 6 ) & (~FLOAT64_HIDDEN_BIT_MASK)); |
return a; |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/softfloat/generic/common.c |
---|
0,0 → 1,215 |
/* |
* Copyright (c) 2005 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup softfloat |
* @{ |
*/ |
/** @file |
*/ |
#include<sftypes.h> |
#include<common.h> |
/* Table for fast leading zeroes counting */ |
char zeroTable[256] = { |
8, 7, 7, 6, 6, 6, 6, 4, 4, 4, 4, 4, 4, 4, 4, \ |
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, \ |
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \ |
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \ |
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ |
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ |
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ |
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ |
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ |
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ |
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ |
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ |
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ |
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ |
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ |
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 |
}; |
/** Take fraction shifted by 10 bits to left, round it, normalize it and detect exceptions |
* @param cexp exponent with bias |
* @param cfrac fraction shifted 10 places left with added hidden bit |
* @param sign |
* @return valied float64 |
*/ |
float64 finishFloat64(int32_t cexp, uint64_t cfrac, char sign) |
{ |
float64 result; |
result.parts.sign = sign; |
/* find first nonzero digit and shift result and detect possibly underflow */ |
while ((cexp > 0) && (cfrac) && (!(cfrac & (FLOAT64_HIDDEN_BIT_MASK << (64 - FLOAT64_FRACTION_SIZE - 1 ) )))) { |
cexp--; |
cfrac <<= 1; |
/* TODO: fix underflow */ |
}; |
if ((cexp < 0) || ( cexp == 0 && (!(cfrac & (FLOAT64_HIDDEN_BIT_MASK << (64 - FLOAT64_FRACTION_SIZE - 1)))))) { |
/* FIXME: underflow */ |
result.parts.exp = 0; |
if ((cexp + FLOAT64_FRACTION_SIZE + 1) < 0) { /* +1 is place for rounding */ |
result.parts.fraction = 0; |
return result; |
} |
while (cexp < 0) { |
cexp++; |
cfrac >>= 1; |
} |
cfrac += (0x1 << (64 - FLOAT64_FRACTION_SIZE - 3)); |
if (!(cfrac & (FLOAT64_HIDDEN_BIT_MASK << (64 - FLOAT64_FRACTION_SIZE - 1)))) { |
result.parts.fraction = ((cfrac >>(64 - FLOAT64_FRACTION_SIZE - 2) ) & (~FLOAT64_HIDDEN_BIT_MASK)); |
return result; |
} |
} else { |
cfrac += (0x1 << (64 - FLOAT64_FRACTION_SIZE - 3)); |
} |
++cexp; |
if (cfrac & (FLOAT64_HIDDEN_BIT_MASK << (64 - FLOAT64_FRACTION_SIZE - 1 ))) { |
++cexp; |
cfrac >>= 1; |
} |
/* check overflow */ |
if (cexp >= FLOAT64_MAX_EXPONENT ) { |
/* FIXME: overflow, return infinity */ |
result.parts.exp = FLOAT64_MAX_EXPONENT; |
result.parts.fraction = 0; |
return result; |
} |
result.parts.exp = (uint32_t)cexp; |
result.parts.fraction = ((cfrac >>(64 - FLOAT64_FRACTION_SIZE - 2 ) ) & (~FLOAT64_HIDDEN_BIT_MASK)); |
return result; |
} |
/** Counts leading zeroes in 64bit unsigned integer |
* @param i |
*/ |
int countZeroes64(uint64_t i) |
{ |
int j; |
for (j =0; j < 64; j += 8) { |
if ( i & (0xFFll << (56 - j))) { |
return (j + countZeroes8(i >> (56 - j))); |
} |
} |
return 64; |
} |
/** Counts leading zeroes in 32bit unsigned integer |
* @param i |
*/ |
int countZeroes32(uint32_t i) |
{ |
int j; |
for (j =0; j < 32; j += 8) { |
if ( i & (0xFF << (24 - j))) { |
return (j + countZeroes8(i >> (24 - j))); |
} |
} |
return 32; |
} |
/** Counts leading zeroes in byte |
* @param i |
*/ |
int countZeroes8(uint8_t i) |
{ |
return zeroTable[i]; |
} |
/** Round and normalize number expressed by exponent and fraction with first bit (equal to hidden bit) at 30. bit |
* @param exp exponent |
* @param fraction part with hidden bit shifted to 30. bit |
*/ |
void roundFloat32(int32_t *exp, uint32_t *fraction) |
{ |
/* rounding - if first bit after fraction is set then round up */ |
(*fraction) += (0x1 << 6); |
if ((*fraction) & (FLOAT32_HIDDEN_BIT_MASK << 8)) { |
/* rounding overflow */ |
++(*exp); |
(*fraction) >>= 1; |
}; |
if (((*exp) >= FLOAT32_MAX_EXPONENT ) || ((*exp) < 0)) { |
/* overflow - set infinity as result */ |
(*exp) = FLOAT32_MAX_EXPONENT; |
(*fraction) = 0; |
return; |
} |
return; |
} |
/** Round and normalize number expressed by exponent and fraction with first bit (equal to hidden bit) at 62. bit |
* @param exp exponent |
* @param fraction part with hidden bit shifted to 62. bit |
*/ |
void roundFloat64(int32_t *exp, uint64_t *fraction) |
{ |
/* rounding - if first bit after fraction is set then round up */ |
(*fraction) += (0x1 << 9); |
if ((*fraction) & (FLOAT64_HIDDEN_BIT_MASK << 11)) { |
/* rounding overflow */ |
++(*exp); |
(*fraction) >>= 1; |
}; |
if (((*exp) >= FLOAT64_MAX_EXPONENT ) || ((*exp) < 0)) { |
/* overflow - set infinity as result */ |
(*exp) = FLOAT64_MAX_EXPONENT; |
(*fraction) = 0; |
return; |
} |
return; |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/softfloat/generic/sub.c |
---|
0,0 → 1,265 |
/* |
* Copyright (c) 2005 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup softfloat |
* @{ |
*/ |
/** @file |
*/ |
#include<sftypes.h> |
#include<sub.h> |
#include<comparison.h> |
/** Subtract two float32 numbers with same signs |
*/ |
float32 subFloat32(float32 a, float32 b) |
{ |
int expdiff; |
uint32_t exp1, exp2, frac1, frac2; |
float32 result; |
result.f = 0; |
expdiff = a.parts.exp - b.parts.exp; |
if ((expdiff < 0 ) || ((expdiff == 0) && (a.parts.fraction < b.parts.fraction))) { |
if (isFloat32NaN(b)) { |
/* TODO: fix SigNaN */ |
if (isFloat32SigNaN(b)) { |
}; |
return b; |
}; |
if (b.parts.exp == FLOAT32_MAX_EXPONENT) { |
b.parts.sign = !b.parts.sign; /* num -(+-inf) = -+inf */ |
return b; |
} |
result.parts.sign = !a.parts.sign; |
frac1 = b.parts.fraction; |
exp1 = b.parts.exp; |
frac2 = a.parts.fraction; |
exp2 = a.parts.exp; |
expdiff *= -1; |
} else { |
if (isFloat32NaN(a)) { |
/* TODO: fix SigNaN */ |
if (isFloat32SigNaN(a) || isFloat32SigNaN(b)) { |
}; |
return a; |
}; |
if (a.parts.exp == FLOAT32_MAX_EXPONENT) { |
if (b.parts.exp == FLOAT32_MAX_EXPONENT) { |
/* inf - inf => nan */ |
/* TODO: fix exception */ |
result.binary = FLOAT32_NAN; |
return result; |
}; |
return a; |
} |
result.parts.sign = a.parts.sign; |
frac1 = a.parts.fraction; |
exp1 = a.parts.exp; |
frac2 = b.parts.fraction; |
exp2 = b.parts.exp; |
}; |
if (exp1 == 0) { |
/* both are denormalized */ |
result.parts.fraction = frac1-frac2; |
if (result.parts.fraction > frac1) { |
/* TODO: underflow exception */ |
return result; |
}; |
result.parts.exp = 0; |
return result; |
}; |
/* add hidden bit */ |
frac1 |= FLOAT32_HIDDEN_BIT_MASK; |
if (exp2 == 0) { |
/* denormalized */ |
--expdiff; |
} else { |
/* normalized */ |
frac2 |= FLOAT32_HIDDEN_BIT_MASK; |
}; |
/* create some space for rounding */ |
frac1 <<= 6; |
frac2 <<= 6; |
if (expdiff > FLOAT32_FRACTION_SIZE + 1) { |
goto done; |
}; |
frac1 = frac1 - (frac2 >> expdiff); |
done: |
/* TODO: find first nonzero digit and shift result and detect possibly underflow */ |
while ((exp1 > 0) && (!(frac1 & (FLOAT32_HIDDEN_BIT_MASK << 6 )))) { |
--exp1; |
frac1 <<= 1; |
/* TODO: fix underflow - frac1 == 0 does not necessary means underflow... */ |
}; |
/* rounding - if first bit after fraction is set then round up */ |
frac1 += 0x20; |
if (frac1 & (FLOAT32_HIDDEN_BIT_MASK << 7)) { |
++exp1; |
frac1 >>= 1; |
}; |
/*Clear hidden bit and shift */ |
result.parts.fraction = ((frac1 >> 6) & (~FLOAT32_HIDDEN_BIT_MASK)); |
result.parts.exp = exp1; |
return result; |
} |
/** Subtract two float64 numbers with same signs |
*/ |
float64 subFloat64(float64 a, float64 b) |
{ |
int expdiff; |
uint32_t exp1, exp2; |
uint64_t frac1, frac2; |
float64 result; |
result.d = 0; |
expdiff = a.parts.exp - b.parts.exp; |
if ((expdiff < 0 ) || ((expdiff == 0) && (a.parts.fraction < b.parts.fraction))) { |
if (isFloat64NaN(b)) { |
/* TODO: fix SigNaN */ |
if (isFloat64SigNaN(b)) { |
}; |
return b; |
}; |
if (b.parts.exp == FLOAT64_MAX_EXPONENT) { |
b.parts.sign = !b.parts.sign; /* num -(+-inf) = -+inf */ |
return b; |
} |
result.parts.sign = !a.parts.sign; |
frac1 = b.parts.fraction; |
exp1 = b.parts.exp; |
frac2 = a.parts.fraction; |
exp2 = a.parts.exp; |
expdiff *= -1; |
} else { |
if (isFloat64NaN(a)) { |
/* TODO: fix SigNaN */ |
if (isFloat64SigNaN(a) || isFloat64SigNaN(b)) { |
}; |
return a; |
}; |
if (a.parts.exp == FLOAT64_MAX_EXPONENT) { |
if (b.parts.exp == FLOAT64_MAX_EXPONENT) { |
/* inf - inf => nan */ |
/* TODO: fix exception */ |
result.binary = FLOAT64_NAN; |
return result; |
}; |
return a; |
} |
result.parts.sign = a.parts.sign; |
frac1 = a.parts.fraction; |
exp1 = a.parts.exp; |
frac2 = b.parts.fraction; |
exp2 = b.parts.exp; |
}; |
if (exp1 == 0) { |
/* both are denormalized */ |
result.parts.fraction = frac1 - frac2; |
if (result.parts.fraction > frac1) { |
/* TODO: underflow exception */ |
return result; |
}; |
result.parts.exp = 0; |
return result; |
}; |
/* add hidden bit */ |
frac1 |= FLOAT64_HIDDEN_BIT_MASK; |
if (exp2 == 0) { |
/* denormalized */ |
--expdiff; |
} else { |
/* normalized */ |
frac2 |= FLOAT64_HIDDEN_BIT_MASK; |
}; |
/* create some space for rounding */ |
frac1 <<= 6; |
frac2 <<= 6; |
if (expdiff > FLOAT64_FRACTION_SIZE + 1) { |
goto done; |
}; |
frac1 = frac1 - (frac2 >> expdiff); |
done: |
/* TODO: find first nonzero digit and shift result and detect possibly underflow */ |
while ((exp1 > 0) && (!(frac1 & (FLOAT64_HIDDEN_BIT_MASK << 6 )))) { |
--exp1; |
frac1 <<= 1; |
/* TODO: fix underflow - frac1 == 0 does not necessary means underflow... */ |
}; |
/* rounding - if first bit after fraction is set then round up */ |
frac1 += 0x20; |
if (frac1 & (FLOAT64_HIDDEN_BIT_MASK << 7)) { |
++exp1; |
frac1 >>= 1; |
}; |
/*Clear hidden bit and shift */ |
result.parts.fraction = ((frac1 >> 6) & (~FLOAT64_HIDDEN_BIT_MASK)); |
result.parts.exp = exp1; |
return result; |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/softfloat/generic/comparison.c |
---|
0,0 → 1,129 |
/* |
* Copyright (c) 2005 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup softfloat |
* @{ |
*/ |
/** @file |
*/ |
#include<sftypes.h> |
#include<comparison.h> |
inline int isFloat32NaN(float32 f) |
{ /* NaN : exp = 0xff and nonzero fraction */ |
return ((f.parts.exp==0xFF)&&(f.parts.fraction)); |
} |
inline int isFloat64NaN(float64 d) |
{ /* NaN : exp = 0x7ff and nonzero fraction */ |
return ((d.parts.exp==0x7FF)&&(d.parts.fraction)); |
} |
inline int isFloat32SigNaN(float32 f) |
{ /* SigNaN : exp = 0xff fraction = 0xxxxx..x (binary), where at least one x is nonzero */ |
return ((f.parts.exp==0xFF)&&(f.parts.fraction<0x400000)&&(f.parts.fraction)); |
} |
inline int isFloat64SigNaN(float64 d) |
{ /* SigNaN : exp = 0x7ff fraction = 0xxxxx..x (binary), where at least one x is nonzero */ |
return ((d.parts.exp==0x7FF)&&(d.parts.fraction)&&(d.parts.fraction<0x8000000000000ll)); |
} |
inline int isFloat32Infinity(float32 f) |
{ |
return ((f.parts.exp==0xFF)&&(f.parts.fraction==0x0)); |
} |
inline int isFloat64Infinity(float64 d) |
{ |
return ((d.parts.exp==0x7FF)&&(d.parts.fraction==0x0)); |
} |
inline int isFloat32Zero(float32 f) |
{ |
return (((f.binary) & 0x7FFFFFFF) == 0); |
} |
inline int isFloat64Zero(float64 d) |
{ |
return (((d.binary) & 0x7FFFFFFFFFFFFFFFll) == 0); |
} |
/** |
* @return 1, if both floats are equal - but NaNs are not recognized |
*/ |
inline int isFloat32eq(float32 a, float32 b) |
{ |
return ((a.binary==b.binary)||(((a.binary| b.binary)&0x7FFFFFFF)==0)); /* a equals to b or both are zeros (with any sign) */ |
} |
/** |
* @return 1, if a<b - but NaNs are not recognized |
*/ |
inline int isFloat32lt(float32 a, float32 b) |
{ |
if (((a.binary| b.binary)&0x7FFFFFFF)==0) { |
return 0; /* +- zeroes */ |
}; |
if ((a.parts.sign)&&(b.parts.sign)) { |
/*if both are negative, smaller is that with greater binary value*/ |
return (a.binary>b.binary); |
}; |
/* lets negate signs - now will be positive numbers allways bigger than negative (first bit will be set for unsigned integer comparison)*/ |
a.parts.sign=!a.parts.sign; |
b.parts.sign=!b.parts.sign; |
return (a.binary<b.binary); |
} |
/** |
* @return 1, if a>b - but NaNs are not recognized |
*/ |
inline int isFloat32gt(float32 a, float32 b) |
{ |
if (((a.binary| b.binary)&0x7FFFFFFF)==0) { |
return 0; /* zeroes are equal with any sign */ |
}; |
if ((a.parts.sign)&&(b.parts.sign)) { |
/*if both are negative, greater is that with smaller binary value*/ |
return (a.binary<b.binary); |
}; |
/* lets negate signs - now will be positive numbers allways bigger than negative (first bit will be set for unsigned integer comparison)*/ |
a.parts.sign=!a.parts.sign; |
b.parts.sign=!b.parts.sign; |
return (a.binary>b.binary); |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/softfloat/generic/mul.c |
---|
0,0 → 1,294 |
/* |
* Copyright (c) 2005 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup softfloat |
* @{ |
*/ |
/** @file |
*/ |
#include<sftypes.h> |
#include<mul.h> |
#include<comparison.h> |
#include<common.h> |
/** Multiply two 32 bit float numbers |
* |
*/ |
float32 mulFloat32(float32 a, float32 b) |
{ |
float32 result; |
uint64_t frac1, frac2; |
int32_t exp; |
result.parts.sign = a.parts.sign ^ b.parts.sign; |
if (isFloat32NaN(a) || isFloat32NaN(b) ) { |
/* TODO: fix SigNaNs */ |
if (isFloat32SigNaN(a)) { |
result.parts.fraction = a.parts.fraction; |
result.parts.exp = a.parts.exp; |
return result; |
}; |
if (isFloat32SigNaN(b)) { /* TODO: fix SigNaN */ |
result.parts.fraction = b.parts.fraction; |
result.parts.exp = b.parts.exp; |
return result; |
}; |
/* set NaN as result */ |
result.binary = FLOAT32_NAN; |
return result; |
}; |
if (isFloat32Infinity(a)) { |
if (isFloat32Zero(b)) { |
/* FIXME: zero * infinity */ |
result.binary = FLOAT32_NAN; |
return result; |
} |
result.parts.fraction = a.parts.fraction; |
result.parts.exp = a.parts.exp; |
return result; |
} |
if (isFloat32Infinity(b)) { |
if (isFloat32Zero(a)) { |
/* FIXME: zero * infinity */ |
result.binary = FLOAT32_NAN; |
return result; |
} |
result.parts.fraction = b.parts.fraction; |
result.parts.exp = b.parts.exp; |
return result; |
} |
/* exp is signed so we can easy detect underflow */ |
exp = a.parts.exp + b.parts.exp; |
exp -= FLOAT32_BIAS; |
if (exp >= FLOAT32_MAX_EXPONENT) { |
/* FIXME: overflow */ |
/* set infinity as result */ |
result.binary = FLOAT32_INF; |
result.parts.sign = a.parts.sign ^ b.parts.sign; |
return result; |
}; |
if (exp < 0) { |
/* FIXME: underflow */ |
/* return signed zero */ |
result.parts.fraction = 0x0; |
result.parts.exp = 0x0; |
return result; |
}; |
frac1 = a.parts.fraction; |
if (a.parts.exp > 0) { |
frac1 |= FLOAT32_HIDDEN_BIT_MASK; |
} else { |
++exp; |
}; |
frac2 = b.parts.fraction; |
if (b.parts.exp > 0) { |
frac2 |= FLOAT32_HIDDEN_BIT_MASK; |
} else { |
++exp; |
}; |
frac1 <<= 1; /* one bit space for rounding */ |
frac1 = frac1 * frac2; |
/* round and return */ |
while ((exp < FLOAT32_MAX_EXPONENT) && (frac1 >= ( 1 << (FLOAT32_FRACTION_SIZE + 2)))) { |
/* 23 bits of fraction + one more for hidden bit (all shifted 1 bit left)*/ |
++exp; |
frac1 >>= 1; |
}; |
/* rounding */ |
/* ++frac1; FIXME: not works - without it is ok */ |
frac1 >>= 1; /* shift off rounding space */ |
if ((exp < FLOAT32_MAX_EXPONENT) && (frac1 >= (1 << (FLOAT32_FRACTION_SIZE + 1)))) { |
++exp; |
frac1 >>= 1; |
}; |
if (exp >= FLOAT32_MAX_EXPONENT ) { |
/* TODO: fix overflow */ |
/* return infinity*/ |
result.parts.exp = FLOAT32_MAX_EXPONENT; |
result.parts.fraction = 0x0; |
return result; |
} |
exp -= FLOAT32_FRACTION_SIZE; |
if (exp <= FLOAT32_FRACTION_SIZE) { |
/* denormalized number */ |
frac1 >>= 1; /* denormalize */ |
while ((frac1 > 0) && (exp < 0)) { |
frac1 >>= 1; |
++exp; |
}; |
if (frac1 == 0) { |
/* FIXME : underflow */ |
result.parts.exp = 0; |
result.parts.fraction = 0; |
return result; |
}; |
}; |
result.parts.exp = exp; |
result.parts.fraction = frac1 & ( (1 << FLOAT32_FRACTION_SIZE) - 1); |
return result; |
} |
/** Multiply two 64 bit float numbers |
* |
*/ |
float64 mulFloat64(float64 a, float64 b) |
{ |
float64 result; |
uint64_t frac1, frac2; |
int32_t exp; |
result.parts.sign = a.parts.sign ^ b.parts.sign; |
if (isFloat64NaN(a) || isFloat64NaN(b) ) { |
/* TODO: fix SigNaNs */ |
if (isFloat64SigNaN(a)) { |
result.parts.fraction = a.parts.fraction; |
result.parts.exp = a.parts.exp; |
return result; |
}; |
if (isFloat64SigNaN(b)) { /* TODO: fix SigNaN */ |
result.parts.fraction = b.parts.fraction; |
result.parts.exp = b.parts.exp; |
return result; |
}; |
/* set NaN as result */ |
result.binary = FLOAT64_NAN; |
return result; |
}; |
if (isFloat64Infinity(a)) { |
if (isFloat64Zero(b)) { |
/* FIXME: zero * infinity */ |
result.binary = FLOAT64_NAN; |
return result; |
} |
result.parts.fraction = a.parts.fraction; |
result.parts.exp = a.parts.exp; |
return result; |
} |
if (isFloat64Infinity(b)) { |
if (isFloat64Zero(a)) { |
/* FIXME: zero * infinity */ |
result.binary = FLOAT64_NAN; |
return result; |
} |
result.parts.fraction = b.parts.fraction; |
result.parts.exp = b.parts.exp; |
return result; |
} |
/* exp is signed so we can easy detect underflow */ |
exp = a.parts.exp + b.parts.exp - FLOAT64_BIAS; |
frac1 = a.parts.fraction; |
if (a.parts.exp > 0) { |
frac1 |= FLOAT64_HIDDEN_BIT_MASK; |
} else { |
++exp; |
}; |
frac2 = b.parts.fraction; |
if (b.parts.exp > 0) { |
frac2 |= FLOAT64_HIDDEN_BIT_MASK; |
} else { |
++exp; |
}; |
frac1 <<= (64 - FLOAT64_FRACTION_SIZE - 1); |
frac2 <<= (64 - FLOAT64_FRACTION_SIZE - 2); |
mul64integers(frac1, frac2, &frac1, &frac2); |
frac2 |= (frac1 != 0); |
if (frac2 & (0x1ll << 62)) { |
frac2 <<= 1; |
exp--; |
} |
result = finishFloat64(exp, frac2, result.parts.sign); |
return result; |
} |
/** Multiply two 64 bit numbers and return result in two parts |
* @param a first operand |
* @param b second operand |
* @param lo lower part from result |
* @param hi higher part of result |
*/ |
void mul64integers(uint64_t a,uint64_t b, uint64_t *lo, uint64_t *hi) |
{ |
uint64_t low, high, middle1, middle2; |
uint32_t alow, blow; |
alow = a & 0xFFFFFFFF; |
blow = b & 0xFFFFFFFF; |
a >>= 32; |
b >>= 32; |
low = ((uint64_t)alow) * blow; |
middle1 = a * blow; |
middle2 = alow * b; |
high = a * b; |
middle1 += middle2; |
high += (((uint64_t)(middle1 < middle2)) << 32) + (middle1 >> 32); |
middle1 <<= 32; |
low += middle1; |
high += (low < middle1); |
*lo = low; |
*hi = high; |
return; |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/softfloat/Makefile |
---|
0,0 → 1,81 |
# |
# Copyright (c) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
## Common compiler flags |
# |
LIBC_PREFIX = ../libc |
## Setup toolchain |
# |
include $(LIBC_PREFIX)/Makefile.toolchain |
CFLAGS +=-Iinclude -Iarch/$(ARCH)/include/ |
## Sources |
# |
GENERIC_SOURCES = \ |
generic/add.c \ |
generic/common.c \ |
generic/comparison.c \ |
generic/conversion.c \ |
generic/div.c \ |
generic/mul.c \ |
generic/other.c \ |
generic/softfloat.c \ |
generic/sub.c |
ARCH_SOURCES = |
GENERIC_OBJECTS := $(addsuffix .o,$(basename $(GENERIC_SOURCES))) |
.PHONY: all clean depend |
all: libsoftfloat.a |
-include Makefile.depend |
clean: |
-rm -f libsoftfloat.a Makefile.depend |
find generic/ -name '*.o' -follow -exec rm \{\} \; |
depend: |
-makedepend $(DEFS) $(CFLAGS) -f - $(GENERIC_SOURCES) > Makefile.depend 2> /dev/null |
libsoftfloat.a: depend $(ARCH_OBJECTS) $(GENERIC_OBJECTS) |
$(AR) rc libsoftfloat.a $(ARCH_OBJECTS) $(GENERIC_OBJECTS) |
%.o: %.S |
$(CC) $(DEFS) $(AFLAGS) $(CFLAGS) -D__ASM__ -c $< -o $@ |
%.o: %.s |
$(AS) $(AFLAGS) $< -o $@ |
%.o: %.c |
$(CC) $(DEFS) $(CFLAGS) -c $< -o $@ |
/tags/0.3.0/uspace/lib/softint/include/division.h |
---|
0,0 → 1,70 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup softint |
* @{ |
*/ |
/** |
* @file |
*/ |
#ifndef __SOFTINT_DIVISION_H__ |
#define __SOFTINT_DIVISION_H__ |
/* 32bit integer division */ |
int __divsi3(int a, int b); |
/* 64bit integer division */ |
long long __divdi3(long long a, long long b); |
/* 32bit unsigned integer division */ |
unsigned int __udivsi3(unsigned int a, unsigned int b); |
/* 64bit unsigned integer division */ |
unsigned long long __udivdi3(unsigned long long a, unsigned long long b); |
/* 32bit remainder of the signed division */ |
int __modsi3(int a, int b); |
/* 64bit remainder of the signed division */ |
long long __moddi3(long long a, long long b); |
/* 32bit remainder of the unsigned division */ |
unsigned int __umodsi3(unsigned int a, unsigned int b); |
/* 64bit remainder of the unsigned division */ |
unsigned long long __umoddi3(unsigned long long a, unsigned long long b); |
unsigned long long __udivmoddi3(unsigned long long a, unsigned long long b, unsigned long long *c); |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/softint/generic/division.c |
---|
0,0 → 1,197 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup softint |
* @{ |
*/ |
/** |
* @file |
* SW implementation of 32 and 64 bit division and modulo. |
*/ |
#include <division.h> |
#define ABSVAL(x) ( (x) > 0 ? (x) : -(x)) |
#define SGN(x) ( (x) >= 0 ? 1 : 0 ) |
static unsigned int divandmod32(unsigned int a, unsigned int b, unsigned int *remainder) |
{ |
unsigned int result; |
int steps = sizeof(unsigned int) * 8; |
*remainder = 0; |
result = 0; |
if (b == 0) { |
/* FIXME: division by zero */ |
return 0; |
} |
if ( a < b) { |
*remainder = a; |
return 0; |
} |
for ( ; steps > 0; steps--) { |
/* shift one bit to remainder */ |
*remainder = ( (*remainder) << 1) | (( a >> 31) & 0x1); |
result <<= 1; |
if (*remainder >= b) { |
*remainder -= b; |
result |= 0x1; |
} |
a <<= 1; |
} |
return result; |
} |
static unsigned long long divandmod64(unsigned long long a, unsigned long long b, unsigned long long *remainder) |
{ |
unsigned long long result; |
int steps = sizeof(unsigned long long) * 8; |
*remainder = 0; |
result = 0; |
if (b == 0) { |
/* FIXME: division by zero */ |
return 0; |
} |
if ( a < b) { |
*remainder = a; |
return 0; |
} |
for ( ; steps > 0; steps--) { |
/* shift one bit to remainder */ |
*remainder = ( (*remainder) << 1) | ((a >> 63) & 0x1); |
result <<= 1; |
if (*remainder >= b) { |
*remainder -= b; |
result |= 0x1; |
} |
a <<= 1; |
} |
return result; |
} |
/* 32bit integer division */ |
int __divsi3(int a, int b) |
{ |
unsigned int rem; |
int result; |
result = (int)divandmod32(ABSVAL(a), ABSVAL(b), &rem); |
if ( SGN(a) == SGN(b)) return result; |
return -result; |
} |
/* 64bit integer division */ |
long long __divdi3(long long a, long long b) |
{ |
unsigned long long rem; |
long long result; |
result = (long long)divandmod64(ABSVAL(a), ABSVAL(b), &rem); |
if ( SGN(a) == SGN(b)) return result; |
return -result; |
} |
/* 32bit unsigned integer division */ |
unsigned int __udivsi3(unsigned int a, unsigned int b) |
{ |
unsigned int rem; |
return divandmod32(a, b, &rem); |
} |
/* 64bit unsigned integer division */ |
unsigned long long __udivdi3(unsigned long long a, unsigned long long b) |
{ |
unsigned long long rem; |
return divandmod64(a, b, &rem); |
} |
/* 32bit remainder of the signed division */ |
int __modsi3(int a, int b) |
{ |
unsigned int rem; |
divandmod32(a, b, &rem); |
/* if divident is negative, remainder must be too */ |
if (!(SGN(a))) { |
return -((int)rem); |
} |
return (int)rem; |
} |
/* 64bit remainder of the signed division */ |
long long __moddi3(long long a,long long b) |
{ |
unsigned long long rem; |
divandmod64(a, b, &rem); |
/* if divident is negative, remainder must be too */ |
if (!(SGN(a))) { |
return -((long long)rem); |
} |
return (long long)rem; |
} |
/* 32bit remainder of the unsigned division */ |
unsigned int __umodsi3(unsigned int a, unsigned int b) |
{ |
unsigned int rem; |
divandmod32(a, b, &rem); |
return rem; |
} |
/* 64bit remainder of the unsigned division */ |
unsigned long long __umoddi3(unsigned long long a, unsigned long long b) |
{ |
unsigned long long rem; |
divandmod64(a, b, &rem); |
return rem; |
} |
unsigned long long __udivmoddi3(unsigned long long a, unsigned long long b, unsigned long long *c) |
{ |
return divandmod64(a, b, c); |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/lib/softint/Makefile |
---|
0,0 → 1,73 |
# |
# Copyright (c) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
## Common compiler flags |
# |
LIBC_PREFIX = ../libc |
## Setup toolchain |
# |
include $(LIBC_PREFIX)/Makefile.toolchain |
CFLAGS += -Iinclude |
## Sources |
# |
ARCH_SOURCES = |
GENERIC_SOURCES = \ |
generic/division.c |
GENERIC_OBJECTS := $(addsuffix .o,$(basename $(GENERIC_SOURCES))) |
.PHONY: all clean depend |
all: libsoftint.a |
-include Makefile.depend |
clean: |
-rm -f libsoftint.a Makefile.depend |
find generic/ -name '*.o' -follow -exec rm \{\} \; |
depend: |
-makedepend $(DEFS) $(CFLAGS) -f - $(GENERIC_SOURCES) > Makefile.depend 2> /dev/null |
libsoftint.a: depend $(ARCH_OBJECTS) $(GENERIC_OBJECTS) |
$(AR) rc libsoftint.a $(ARCH_OBJECTS) $(GENERIC_OBJECTS) |
%.o: %.S |
$(CC) $(DEFS) $(AFLAGS) $(CFLAGS) -D__ASM__ -c $< -o $@ |
%.o: %.s |
$(AS) $(AFLAGS) $< -o $@ |
%.o: %.c |
$(CC) $(DEFS) $(CFLAGS) -c $< -o $@ |
/tags/0.3.0/uspace/srv/fs/tmpfs/tmpfs.h |
---|
0,0 → 1,73 |
/* |
* Copyright (c) 2008 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup fs |
* @{ |
*/ |
#ifndef TMPFS_TMPFS_H_ |
#define TMPFS_TMPFS_H_ |
#include <ipc/ipc.h> |
#include <libfs.h> |
#include <atomic.h> |
#include <sys/types.h> |
#include <bool.h> |
#include <libadt/hash_table.h> |
#define dprintf(...) printf(__VA_ARGS__) |
typedef struct tmpfs_dentry { |
fs_index_t index; /**< TMPFS node index. */ |
link_t dh_link; /**< Dentries hash table link. */ |
struct tmpfs_dentry *sibling; |
struct tmpfs_dentry *child; |
hash_table_t names; /**< All names linking to this TMPFS node. */ |
enum { |
TMPFS_NONE, |
TMPFS_FILE, |
TMPFS_DIRECTORY |
} type; |
unsigned lnkcnt; /**< Link count. */ |
size_t size; /**< File size if type is TMPFS_FILE. */ |
void *data; /**< File content's if type is TMPFS_FILE. */ |
} tmpfs_dentry_t; |
extern fs_reg_t tmpfs_reg; |
extern void tmpfs_lookup(ipc_callid_t, ipc_call_t *); |
extern void tmpfs_read(ipc_callid_t, ipc_call_t *); |
extern void tmpfs_write(ipc_callid_t, ipc_call_t *); |
extern void tmpfs_truncate(ipc_callid_t, ipc_call_t *); |
extern void tmpfs_destroy(ipc_callid_t, ipc_call_t *); |
#endif |
/** |
* @} |
*/ |
/tags/0.3.0/uspace/srv/fs/tmpfs/tmpfs_ops.c |
---|
0,0 → 1,587 |
/* |
* Copyright (c) 2008 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup fs |
* @{ |
*/ |
/** |
* @file tmpfs_ops.c |
* @brief Implementation of VFS operations for the TMPFS file system |
* server. |
*/ |
#include "tmpfs.h" |
#include "../../vfs/vfs.h" |
#include <ipc/ipc.h> |
#include <async.h> |
#include <errno.h> |
#include <atomic.h> |
#include <stdlib.h> |
#include <string.h> |
#include <stdio.h> |
#include <assert.h> |
#include <sys/types.h> |
#include <libadt/hash_table.h> |
#include <as.h> |
#include <libfs.h> |
#define min(a, b) ((a) < (b) ? (a) : (b)) |
#define max(a, b) ((a) > (b) ? (a) : (b)) |
#define DENTRIES_BUCKETS 256 |
#define NAMES_BUCKETS 4 |
/* |
* For now, we don't distinguish between different dev_handles/instances. All |
* requests resolve to the only instance, rooted in the following variable. |
*/ |
static tmpfs_dentry_t *root; |
/* |
* Implementation of the libfs interface. |
*/ |
/* Forward declarations of static functions. */ |
static bool tmpfs_match(void *, void *, const char *); |
static void *tmpfs_node_get(fs_handle_t, dev_handle_t, fs_index_t); |
static void *tmpfs_create_node(int); |
static bool tmpfs_link_node(void *, void *, const char *); |
static int tmpfs_unlink_node(void *, void *); |
static void tmpfs_destroy_node(void *); |
/* Implementation of helper functions. */ |
static fs_index_t tmpfs_index_get(void *nodep) |
{ |
return ((tmpfs_dentry_t *) nodep)->index; |
} |
static size_t tmpfs_size_get(void *nodep) |
{ |
return ((tmpfs_dentry_t *) nodep)->size; |
} |
static unsigned tmpfs_lnkcnt_get(void *nodep) |
{ |
return ((tmpfs_dentry_t *) nodep)->lnkcnt; |
} |
static void *tmpfs_child_get(void *nodep) |
{ |
return ((tmpfs_dentry_t *) nodep)->child; |
} |
static void *tmpfs_sibling_get(void *nodep) |
{ |
return ((tmpfs_dentry_t *) nodep)->sibling; |
} |
static void *tmpfs_root_get(void) |
{ |
return root; |
} |
static char tmpfs_plb_get_char(unsigned pos) |
{ |
return tmpfs_reg.plb_ro[pos % PLB_SIZE]; |
} |
static bool tmpfs_is_directory(void *nodep) |
{ |
return ((tmpfs_dentry_t *) nodep)->type == TMPFS_DIRECTORY; |
} |
static bool tmpfs_is_file(void *nodep) |
{ |
return ((tmpfs_dentry_t *) nodep)->type == TMPFS_FILE; |
} |
/** libfs operations */ |
libfs_ops_t tmpfs_libfs_ops = { |
.match = tmpfs_match, |
.node_get = tmpfs_node_get, |
.create = tmpfs_create_node, |
.destroy = tmpfs_destroy_node, |
.link = tmpfs_link_node, |
.unlink = tmpfs_unlink_node, |
.index_get = tmpfs_index_get, |
.size_get = tmpfs_size_get, |
.lnkcnt_get = tmpfs_lnkcnt_get, |
.child_get = tmpfs_child_get, |
.sibling_get = tmpfs_sibling_get, |
.root_get = tmpfs_root_get, |
.plb_get_char = tmpfs_plb_get_char, |
.is_directory = tmpfs_is_directory, |
.is_file = tmpfs_is_file |
}; |
/** Hash table of all directory entries. */ |
hash_table_t dentries; |
/* Implementation of hash table interface for the dentries hash table. */ |
static hash_index_t dentries_hash(unsigned long *key) |
{ |
return *key % DENTRIES_BUCKETS; |
} |
static int dentries_compare(unsigned long *key, hash_count_t keys, |
link_t *item) |
{ |
tmpfs_dentry_t *dentry = hash_table_get_instance(item, tmpfs_dentry_t, |
dh_link); |
return dentry->index == *key; |
} |
static void dentries_remove_callback(link_t *item) |
{ |
} |
/** TMPFS dentries hash table operations. */ |
hash_table_operations_t dentries_ops = { |
.hash = dentries_hash, |
.compare = dentries_compare, |
.remove_callback = dentries_remove_callback |
}; |
fs_index_t tmpfs_next_index = 1; |
typedef struct { |
char *name; |
tmpfs_dentry_t *parent; |
link_t link; |
} tmpfs_name_t; |
/* Implementation of hash table interface for the names hash table. */ |
static hash_index_t names_hash(unsigned long *key) |
{ |
tmpfs_dentry_t *dentry = (tmpfs_dentry_t *) *key; |
return dentry->index % NAMES_BUCKETS; |
} |
static int names_compare(unsigned long *key, hash_count_t keys, link_t *item) |
{ |
tmpfs_dentry_t *dentry = (tmpfs_dentry_t *) *key; |
tmpfs_name_t *namep = hash_table_get_instance(item, tmpfs_name_t, |
link); |
return dentry == namep->parent; |
} |
static void names_remove_callback(link_t *item) |
{ |
tmpfs_name_t *namep = hash_table_get_instance(item, tmpfs_name_t, |
link); |
free(namep->name); |
free(namep); |
} |
/** TMPFS node names hash table operations. */ |
static hash_table_operations_t names_ops = { |
.hash = names_hash, |
.compare = names_compare, |
.remove_callback = names_remove_callback |
}; |
static void tmpfs_name_initialize(tmpfs_name_t *namep) |
{ |
namep->name = NULL; |
namep->parent = NULL; |
link_initialize(&namep->link); |
} |
static bool tmpfs_dentry_initialize(tmpfs_dentry_t *dentry) |
{ |
dentry->index = 0; |
dentry->sibling = NULL; |
dentry->child = NULL; |
dentry->type = TMPFS_NONE; |
dentry->lnkcnt = 0; |
dentry->size = 0; |
dentry->data = NULL; |
link_initialize(&dentry->dh_link); |
return (bool)hash_table_create(&dentry->names, NAMES_BUCKETS, 1, |
&names_ops); |
} |
static bool tmpfs_init(void) |
{ |
if (!hash_table_create(&dentries, DENTRIES_BUCKETS, 1, &dentries_ops)) |
return false; |
root = (tmpfs_dentry_t *) tmpfs_create_node(L_DIRECTORY); |
if (!root) { |
hash_table_destroy(&dentries); |
return false; |
} |
root->lnkcnt = 1; |
return true; |
} |
/** Compare one component of path to a directory entry. |
* |
* @param prnt Node from which we descended. |
* @param chld Node to compare the path component with. |
* @param component Array of characters holding component name. |
* |
* @return True on match, false otherwise. |
*/ |
bool tmpfs_match(void *prnt, void *chld, const char *component) |
{ |
tmpfs_dentry_t *parentp = (tmpfs_dentry_t *) prnt; |
tmpfs_dentry_t *childp = (tmpfs_dentry_t *) chld; |
unsigned long key = (unsigned long) parentp; |
link_t *hlp = hash_table_find(&childp->names, &key); |
assert(hlp); |
tmpfs_name_t *namep = hash_table_get_instance(hlp, tmpfs_name_t, link); |
return !strcmp(namep->name, component); |
} |
void * |
tmpfs_node_get(fs_handle_t fs_handle, dev_handle_t dev_handle, fs_index_t index) |
{ |
unsigned long key = index; |
link_t *lnk = hash_table_find(&dentries, &key); |
if (!lnk) |
return NULL; |
return hash_table_get_instance(lnk, tmpfs_dentry_t, dh_link); |
} |
void *tmpfs_create_node(int lflag) |
{ |
assert((lflag & L_FILE) ^ (lflag & L_DIRECTORY)); |
tmpfs_dentry_t *node = malloc(sizeof(tmpfs_dentry_t)); |
if (!node) |
return NULL; |
if (!tmpfs_dentry_initialize(node)) { |
free(node); |
return NULL; |
} |
node->index = tmpfs_next_index++; |
if (lflag & L_DIRECTORY) |
node->type = TMPFS_DIRECTORY; |
else |
node->type = TMPFS_FILE; |
/* Insert the new node into the dentry hash table. */ |
unsigned long key = node->index; |
hash_table_insert(&dentries, &key, &node->dh_link); |
return (void *) node; |
} |
bool tmpfs_link_node(void *prnt, void *chld, const char *nm) |
{ |
tmpfs_dentry_t *parentp = (tmpfs_dentry_t *) prnt; |
tmpfs_dentry_t *childp = (tmpfs_dentry_t *) chld; |
assert(parentp->type == TMPFS_DIRECTORY); |
tmpfs_name_t *namep = malloc(sizeof(tmpfs_name_t)); |
if (!namep) |
return false; |
tmpfs_name_initialize(namep); |
size_t len = strlen(nm); |
namep->name = malloc(len + 1); |
if (!namep->name) { |
free(namep); |
return false; |
} |
strcpy(namep->name, nm); |
namep->parent = parentp; |
childp->lnkcnt++; |
unsigned long key = (unsigned long) parentp; |
hash_table_insert(&childp->names, &key, &namep->link); |
/* Insert the new node into the namespace. */ |
if (parentp->child) { |
tmpfs_dentry_t *tmp = parentp->child; |
while (tmp->sibling) |
tmp = tmp->sibling; |
tmp->sibling = childp; |
} else { |
parentp->child = childp; |
} |
return true; |
} |
int tmpfs_unlink_node(void *prnt, void *chld) |
{ |
tmpfs_dentry_t *parentp = (tmpfs_dentry_t *)prnt; |
tmpfs_dentry_t *childp = (tmpfs_dentry_t *)chld; |
if (!parentp) |
return EBUSY; |
if (childp->child) |
return ENOTEMPTY; |
if (parentp->child == childp) { |
parentp->child = childp->sibling; |
} else { |
/* TODO: consider doubly linked list for organizing siblings. */ |
tmpfs_dentry_t *tmp = parentp->child; |
while (tmp->sibling != childp) |
tmp = tmp->sibling; |
tmp->sibling = childp->sibling; |
} |
childp->sibling = NULL; |
unsigned long key = (unsigned long) parentp; |
hash_table_remove(&childp->names, &key, 1); |
childp->lnkcnt--; |
return EOK; |
} |
void tmpfs_destroy_node(void *nodep) |
{ |
tmpfs_dentry_t *dentry = (tmpfs_dentry_t *) nodep; |
assert(!dentry->lnkcnt); |
assert(!dentry->child); |
assert(!dentry->sibling); |
unsigned long key = dentry->index; |
hash_table_remove(&dentries, &key, 1); |
hash_table_destroy(&dentry->names); |
if (dentry->type == TMPFS_FILE) |
free(dentry->data); |
free(dentry); |
} |
void tmpfs_lookup(ipc_callid_t rid, ipc_call_t *request) |
{ |
/* Initialize TMPFS. */ |
if (!root && !tmpfs_init()) { |
ipc_answer_0(rid, ENOMEM); |
return; |
} |
libfs_lookup(&tmpfs_libfs_ops, tmpfs_reg.fs_handle, rid, request); |
} |
void tmpfs_read(ipc_callid_t rid, ipc_call_t *request) |
{ |
dev_handle_t dev_handle = (dev_handle_t)IPC_GET_ARG1(*request); |
fs_index_t index = (fs_index_t)IPC_GET_ARG2(*request); |
off_t pos = (off_t)IPC_GET_ARG3(*request); |
/* |
* Lookup the respective dentry. |
*/ |
link_t *hlp; |
unsigned long key = index; |
hlp = hash_table_find(&dentries, &key); |
if (!hlp) { |
ipc_answer_0(rid, ENOENT); |
return; |
} |
tmpfs_dentry_t *dentry = hash_table_get_instance(hlp, tmpfs_dentry_t, |
dh_link); |
/* |
* Receive the read request. |
*/ |
ipc_callid_t callid; |
size_t len; |
if (!ipc_data_read_receive(&callid, &len)) { |
ipc_answer_0(callid, EINVAL); |
ipc_answer_0(rid, EINVAL); |
return; |
} |
size_t bytes; |
if (dentry->type == TMPFS_FILE) { |
bytes = max(0, min(dentry->size - pos, len)); |
(void) ipc_data_read_finalize(callid, dentry->data + pos, |
bytes); |
} else { |
int i; |
tmpfs_dentry_t *cur; |
assert(dentry->type == TMPFS_DIRECTORY); |
/* |
* Yes, we really use O(n) algorithm here. |
* If it bothers someone, it could be fixed by introducing a |
* hash table. |
*/ |
for (i = 0, cur = dentry->child; i < pos && cur; i++, |
cur = cur->sibling) |
; |
if (!cur) { |
ipc_answer_0(callid, ENOENT); |
ipc_answer_1(rid, ENOENT, 0); |
return; |
} |
unsigned long key = (unsigned long) dentry; |
link_t *hlp = hash_table_find(&cur->names, &key); |
assert(hlp); |
tmpfs_name_t *namep = hash_table_get_instance(hlp, tmpfs_name_t, |
link); |
(void) ipc_data_read_finalize(callid, namep->name, |
strlen(namep->name) + 1); |
bytes = 1; |
} |
/* |
* Answer the VFS_READ call. |
*/ |
ipc_answer_1(rid, EOK, bytes); |
} |
void tmpfs_write(ipc_callid_t rid, ipc_call_t *request) |
{ |
dev_handle_t dev_handle = (dev_handle_t)IPC_GET_ARG1(*request); |
fs_index_t index = (fs_index_t)IPC_GET_ARG2(*request); |
off_t pos = (off_t)IPC_GET_ARG3(*request); |
/* |
* Lookup the respective dentry. |
*/ |
link_t *hlp; |
unsigned long key = index; |
hlp = hash_table_find(&dentries, &key); |
if (!hlp) { |
ipc_answer_0(rid, ENOENT); |
return; |
} |
tmpfs_dentry_t *dentry = hash_table_get_instance(hlp, tmpfs_dentry_t, |
dh_link); |
/* |
* Receive the write request. |
*/ |
ipc_callid_t callid; |
size_t len; |
if (!ipc_data_write_receive(&callid, &len)) { |
ipc_answer_0(callid, EINVAL); |
ipc_answer_0(rid, EINVAL); |
return; |
} |
/* |
* Check whether the file needs to grow. |
*/ |
if (pos + len <= dentry->size) { |
/* The file size is not changing. */ |
(void) ipc_data_write_finalize(callid, dentry->data + pos, len); |
ipc_answer_2(rid, EOK, len, dentry->size); |
return; |
} |
size_t delta = (pos + len) - dentry->size; |
/* |
* At this point, we are deliberately extremely straightforward and |
* simply realloc the contents of the file on every write that grows the |
* file. In the end, the situation might not be as bad as it may look: |
* our heap allocator can save us and just grow the block whenever |
* possible. |
*/ |
void *newdata = realloc(dentry->data, dentry->size + delta); |
if (!newdata) { |
ipc_answer_0(callid, ENOMEM); |
ipc_answer_2(rid, EOK, 0, dentry->size); |
return; |
} |
/* Clear any newly allocated memory in order to emulate gaps. */ |
memset(newdata + dentry->size, 0, delta); |
dentry->size += delta; |
dentry->data = newdata; |
(void) ipc_data_write_finalize(callid, dentry->data + pos, len); |
ipc_answer_2(rid, EOK, len, dentry->size); |
} |
void tmpfs_truncate(ipc_callid_t rid, ipc_call_t *request) |
{ |
dev_handle_t dev_handle = (dev_handle_t)IPC_GET_ARG1(*request); |
fs_index_t index = (fs_index_t)IPC_GET_ARG2(*request); |
size_t size = (off_t)IPC_GET_ARG3(*request); |
/* |
* Lookup the respective dentry. |
*/ |
link_t *hlp; |
unsigned long key = index; |
hlp = hash_table_find(&dentries, &key); |
if (!hlp) { |
ipc_answer_0(rid, ENOENT); |
return; |
} |
tmpfs_dentry_t *dentry = hash_table_get_instance(hlp, tmpfs_dentry_t, |
dh_link); |
if (size == dentry->size) { |
ipc_answer_0(rid, EOK); |
return; |
} |
void *newdata = realloc(dentry->data, size); |
if (!newdata) { |
ipc_answer_0(rid, ENOMEM); |
return; |
} |
if (size > dentry->size) { |
size_t delta = size - dentry->size; |
memset(newdata + dentry->size, 0, delta); |
} |
dentry->size = size; |
dentry->data = newdata; |
ipc_answer_0(rid, EOK); |
} |
void tmpfs_destroy(ipc_callid_t rid, ipc_call_t *request) |
{ |
dev_handle_t dev_handle = (dev_handle_t)IPC_GET_ARG1(*request); |
fs_index_t index = (fs_index_t)IPC_GET_ARG2(*request); |
link_t *hlp; |
unsigned long key = index; |
hlp = hash_table_find(&dentries, &key); |
if (!hlp) { |
ipc_answer_0(rid, ENOENT); |
return; |
} |
tmpfs_dentry_t *dentry = hash_table_get_instance(hlp, tmpfs_dentry_t, |
dh_link); |
tmpfs_destroy_node(dentry); |
ipc_answer_0(rid, EOK); |
} |
/** |
* @} |
*/ |
/tags/0.3.0/uspace/srv/fs/tmpfs/tmpfs.c |
---|
0,0 → 1,158 |
/* |
* Copyright (c) 2006 Martin Decky |
* Copyright (c) 2008 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup fs |
* @{ |
*/ |
/** |
* @file tmpfs.c |
* @brief File system driver for in-memory file system. |
* |
* Every instance of tmpfs exists purely in memory and has neither a disk layout |
* nor any permanent storage (e.g. disk blocks). With each system reboot, data |
* stored in a tmpfs file system is lost. |
*/ |
#include "tmpfs.h" |
#include <ipc/ipc.h> |
#include <ipc/services.h> |
#include <async.h> |
#include <errno.h> |
#include <unistd.h> |
#include <stdio.h> |
#include <libfs.h> |
#include "../../vfs/vfs.h" |
vfs_info_t tmpfs_vfs_info = { |
.name = "tmpfs", |
.ops = { |
[IPC_METHOD_TO_VFS_OP(VFS_LOOKUP)] = VFS_OP_DEFINED, |
[IPC_METHOD_TO_VFS_OP(VFS_READ)] = VFS_OP_DEFINED, |
[IPC_METHOD_TO_VFS_OP(VFS_WRITE)] = VFS_OP_DEFINED, |
[IPC_METHOD_TO_VFS_OP(VFS_TRUNCATE)] = VFS_OP_DEFINED, |
[IPC_METHOD_TO_VFS_OP(VFS_MOUNT)] = VFS_OP_NULL, |
[IPC_METHOD_TO_VFS_OP(VFS_UNMOUNT)] = VFS_OP_NULL, |
[IPC_METHOD_TO_VFS_OP(VFS_DESTROY)] = VFS_OP_DEFINED, |
} |
}; |
fs_reg_t tmpfs_reg; |
/** |
* This connection fibril processes VFS requests from VFS. |
* |
* In order to support simultaneous VFS requests, our design is as follows. |
* The connection fibril accepts VFS requests from VFS. If there is only one |
* instance of the fibril, VFS will need to serialize all VFS requests it sends |
* to FAT. To overcome this bottleneck, VFS can send TMPFS the |
* IPC_M_CONNECT_ME_TO call. In that case, a new connection fibril will be |
* created, which in turn will accept the call. Thus, a new phone will be |
* opened for VFS. |
* |
* There are few issues with this arrangement. First, VFS can run out of |
* available phones. In that case, VFS can close some other phones or use one |
* phone for more serialized requests. Similarily, TMPFS can refuse to duplicate |
* the connection. VFS should then just make use of already existing phones and |
* route its requests through them. To avoid paying the fibril creation price |
* upon each request, TMPFS might want to keep the connections open after the |
* request has been completed. |
*/ |
static void tmpfs_connection(ipc_callid_t iid, ipc_call_t *icall) |
{ |
if (iid) { |
/* |
* This only happens for connections opened by |
* IPC_M_CONNECT_ME_TO calls as opposed to callback connections |
* created by IPC_M_CONNECT_TO_ME. |
*/ |
ipc_answer_0(iid, EOK); |
} |
dprintf("VFS-TMPFS connection established.\n"); |
while (1) { |
ipc_callid_t callid; |
ipc_call_t call; |
callid = async_get_call(&call); |
switch (IPC_GET_METHOD(call)) { |
case VFS_LOOKUP: |
tmpfs_lookup(callid, &call); |
break; |
case VFS_READ: |
tmpfs_read(callid, &call); |
break; |
case VFS_WRITE: |
tmpfs_write(callid, &call); |
break; |
case VFS_TRUNCATE: |
tmpfs_truncate(callid, &call); |
break; |
case VFS_DESTROY: |
tmpfs_destroy(callid, &call); |
break; |
default: |
ipc_answer_0(callid, ENOTSUP); |
break; |
} |
} |
} |
int main(int argc, char **argv) |
{ |
int vfs_phone; |
printf("TMPFS: HelenOS TMPFS file system server.\n"); |
vfs_phone = ipc_connect_me_to(PHONE_NS, SERVICE_VFS, 0, 0); |
while (vfs_phone < EOK) { |
usleep(10000); |
vfs_phone = ipc_connect_me_to(PHONE_NS, SERVICE_VFS, 0, 0); |
} |
int rc; |
rc = fs_register(vfs_phone, &tmpfs_reg, &tmpfs_vfs_info, |
tmpfs_connection); |
if (rc != EOK) { |
printf("Failed to register the TMPFS file system (%d)\n", rc); |
return rc; |
} |
dprintf("TMPFS filesystem registered, fs_handle=%d.\n", |
tmpfs_reg.fs_handle); |
async_manager(); |
/* not reached */ |
return 0; |
} |
/** |
* @} |
*/ |
/tags/0.3.0/uspace/srv/fs/tmpfs/Makefile |
---|
0,0 → 1,76 |
# |
# Copyright (c) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
## Setup toolchain |
# |
LIBC_PREFIX = ../../../lib/libc |
LIBFS_PREFIX = ../../../lib/libfs |
SOFTINT_PREFIX = ../../../lib/softint |
include $(LIBC_PREFIX)/Makefile.toolchain |
CFLAGS += -I $(LIBFS_PREFIX) |
LIBS = $(LIBC_PREFIX)/libc.a $(LIBFS_PREFIX)/libfs.a |
## Sources |
# |
OUTPUT = tmpfs |
SOURCES = \ |
tmpfs.c \ |
tmpfs_ops.c |
OBJECTS := $(addsuffix .o,$(basename $(SOURCES))) |
.PHONY: all clean depend disasm |
all: $(OUTPUT) disasm |
-include Makefile.depend |
clean: |
-rm -f $(OUTPUT) $(OUTPUT).map $(OUTPUT).disasm Makefile.depend |
depend: |
$(CC) $(DEFS) $(CFLAGS) -M $(SOURCES) > Makefile.depend |
$(OUTPUT): $(OBJECTS) $(LIBS) |
$(LD) -T $(LIBC_PREFIX)/arch/$(ARCH)/_link.ld $(OBJECTS) $(LIBS) $(LFLAGS) -o $@ -Map $(OUTPUT).map |
disasm: |
$(OBJDUMP) -d $(OUTPUT) >$(OUTPUT).disasm |
%.o: %.S |
$(CC) $(DEFS) $(AFLAGS) $(CFLAGS) -D__ASM__ -c $< -o $@ |
%.o: %.s |
$(AS) $(AFLAGS) $< -o $@ |
%.o: %.c |
$(CC) $(DEFS) $(CFLAGS) -c $< -o $@ |
/tags/0.3.0/uspace/srv/fs/fat/fat.c |
---|
0,0 → 1,139 |
/* |
* Copyright (c) 2006 Martin Decky |
* Copyright (c) 2008 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup fs |
* @{ |
*/ |
/** |
* @file fat.c |
* @brief FAT file system driver for HelenOS. |
*/ |
#include "fat.h" |
#include <ipc/ipc.h> |
#include <ipc/services.h> |
#include <async.h> |
#include <errno.h> |
#include <unistd.h> |
#include <stdio.h> |
#include <libfs.h> |
#include "../../vfs/vfs.h" |
vfs_info_t fat_vfs_info = { |
.name = "fat", |
.ops = { |
[IPC_METHOD_TO_VFS_OP(VFS_LOOKUP)] = VFS_OP_DEFINED, |
[IPC_METHOD_TO_VFS_OP(VFS_READ)] = VFS_OP_DEFINED, |
[IPC_METHOD_TO_VFS_OP(VFS_WRITE)] = VFS_OP_NULL, |
[IPC_METHOD_TO_VFS_OP(VFS_TRUNCATE)] = VFS_OP_NULL, |
[IPC_METHOD_TO_VFS_OP(VFS_MOUNT)] = VFS_OP_NULL, |
[IPC_METHOD_TO_VFS_OP(VFS_UNMOUNT)] = VFS_OP_NULL, |
} |
}; |
fs_reg_t fat_reg; |
/** |
* This connection fibril processes VFS requests from VFS. |
* |
* In order to support simultaneous VFS requests, our design is as follows. |
* The connection fibril accepts VFS requests from VFS. If there is only one |
* instance of the fibril, VFS will need to serialize all VFS requests it sends |
* to FAT. To overcome this bottleneck, VFS can send FAT the IPC_M_CONNECT_ME_TO |
* call. In that case, a new connection fibril will be created, which in turn |
* will accept the call. Thus, a new phone will be opened for VFS. |
* |
* There are few issues with this arrangement. First, VFS can run out of |
* available phones. In that case, VFS can close some other phones or use one |
* phone for more serialized requests. Similarily, FAT can refuse to duplicate |
* the connection. VFS should then just make use of already existing phones and |
* route its requests through them. To avoid paying the fibril creation price |
* upon each request, FAT might want to keep the connections open after the |
* request has been completed. |
*/ |
static void fat_connection(ipc_callid_t iid, ipc_call_t *icall) |
{ |
if (iid) { |
/* |
* This only happens for connections opened by |
* IPC_M_CONNECT_ME_TO calls as opposed to callback connections |
* created by IPC_M_CONNECT_TO_ME. |
*/ |
ipc_answer_0(iid, EOK); |
} |
dprintf("VFS-FAT connection established.\n"); |
while (1) { |
ipc_callid_t callid; |
ipc_call_t call; |
callid = async_get_call(&call); |
switch (IPC_GET_METHOD(call)) { |
case VFS_LOOKUP: |
fat_lookup(callid, &call); |
break; |
default: |
ipc_answer_0(callid, ENOTSUP); |
break; |
} |
} |
} |
int main(int argc, char **argv) |
{ |
int vfs_phone; |
printf("FAT: HelenOS FAT file system server.\n"); |
vfs_phone = ipc_connect_me_to(PHONE_NS, SERVICE_VFS, 0, 0); |
while (vfs_phone < EOK) { |
usleep(10000); |
vfs_phone = ipc_connect_me_to(PHONE_NS, SERVICE_VFS, 0, 0); |
} |
int rc; |
rc = fs_register(vfs_phone, &fat_reg, &fat_vfs_info, fat_connection); |
if (rc != EOK) { |
printf("Failed to register the FAT file system (%d)\n", rc); |
return rc; |
} |
dprintf("FAT filesystem registered, fs_handle=%d.\n", |
fat_reg.fs_handle); |
async_manager(); |
/* not reached */ |
return 0; |
} |
/** |
* @} |
*/ |
/tags/0.3.0/uspace/srv/fs/fat/fat.h |
---|
0,0 → 1,145 |
/* |
* Copyright (c) 2007 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup fs |
* @{ |
*/ |
#ifndef FAT_FAT_H_ |
#define FAT_FAT_H_ |
#include <ipc/ipc.h> |
#include <libfs.h> |
#include <atomic.h> |
#include <sys/types.h> |
#include <bool.h> |
#define dprintf(...) printf(__VA_ARGS__) |
typedef struct { |
uint8_t ji[3]; /**< Jump instruction. */ |
uint8_t oem_name[8]; |
/* BIOS Parameter Block */ |
uint16_t bps; /**< Bytes per sector. */ |
uint8_t spc; /**< Sectors per cluster. */ |
uint16_t rsc; /**< Reserved sector count. */ |
uint8_t fatcnt; /**< Number of FATs. */ |
uint16_t root_ent_max; /**< Maximum number of root directory |
entries. */ |
uint16_t totsec; /**< Total sectors. */ |
uint8_t mdesc; /**< Media descriptor. */ |
uint16_t sec_per_fat; /**< Sectors per FAT12/FAT16. */ |
uint16_t sec_per_track; /**< Sectors per track. */ |
uint16_t headcnt; /**< Number of heads. */ |
uint32_t hidden_sec; /**< Hidden sectors. */ |
uint32_t total_sec; /**< Total sectors. */ |
union { |
struct { |
/* FAT12/FAT16 only: Extended BIOS Parameter Block */ |
/** Physical drive number. */ |
uint8_t pdn; |
uint8_t reserved; |
/** Extended boot signature. */ |
uint8_t ebs; |
/** Serial number. */ |
uint32_t id; |
/** Volume label. */ |
uint8_t label[11]; |
/** FAT type. */ |
uint8_t type[8]; |
/** Boot code. */ |
uint8_t boot_code[448]; |
/** Boot sector signature. */ |
uint16_t signature; |
} __attribute__ ((packed)); |
struct { |
/* FAT32 only */ |
/** Sectors per FAT. */ |
uint32_t sectors_per_fat; |
/** FAT flags. */ |
uint16_t flags; |
/** Version. */ |
uint16_t version; |
/** Cluster number of root directory. */ |
uint32_t root_cluster; |
/** Sector number of file system information sector. */ |
uint16_t fsinfo_sec; |
/** Sector number of boot sector copy. */ |
uint16_t bscopy_sec; |
uint8_t reserved1[12]; |
/** Physical drive number. */ |
uint8_t pdn; |
uint8_t reserved2; |
/** Extended boot signature. */ |
uint8_t ebs; |
/** Serial number. */ |
uint32_t id; |
/** Volume label. */ |
uint8_t label; |
/** FAT type. */ |
uint8_t type[8]; |
/** Boot code. */ |
uint8_t boot_code[420]; |
/** Signature. */ |
uint16_t signature; |
} __attribute__ ((packed)); |
}; |
} __attribute__ ((packed)) fat_bs_t; |
typedef struct { |
uint8_t name[8]; |
uint8_t ext[3]; |
uint8_t attr; |
uint8_t reserved; |
uint8_t ctime_fine; |
uint16_t ctime; |
uint16_t cdate; |
uint16_t adate; |
union { |
uint16_t eaidx; /* FAT12/FAT16 */ |
uint16_t firstc_hi; /* FAT32 */ |
}; |
uint16_t mtime; |
uint16_t mdate; |
union { |
uint16_t firstc; /* FAT12/FAT16 */ |
uint16_t firstc_lo; /* FAT32 */ |
}; |
uint32_t size; |
} __attribute__ ((packed)) fat_dentry_t; |
extern fs_reg_t fat_reg; |
extern void fat_lookup(ipc_callid_t, ipc_call_t *); |
#endif |
/** |
* @} |
*/ |
/tags/0.3.0/uspace/srv/fs/fat/fat_ops.c |
---|
0,0 → 1,142 |
/* |
* Copyright (c) 2007 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup fs |
* @{ |
*/ |
/** |
* @file fat_ops.c |
* @brief Implementation of VFS operations for the FAT file system server. |
*/ |
#include "fat.h" |
#include "../../vfs/vfs.h" |
#include <ipc/ipc.h> |
#include <async.h> |
#include <errno.h> |
#define PLB_GET_CHAR(i) (fat_reg.plb_ro[(i) % PLB_SIZE]) |
#define FAT_NAME_LEN 8 |
#define FAT_EXT_LEN 3 |
#define FAT_PAD ' ' |
#define FAT_DENTRY_UNUSED 0x00 |
#define FAT_DENTRY_E5_ESC 0x05 |
#define FAT_DENTRY_DOT 0x2e |
#define FAT_DENTRY_ERASED 0xe5 |
/** Compare one component of path to a directory entry. |
* |
* @param dentry Directory entry to compare the path component with. |
* @param start Index into PLB where the path component starts. |
* @param last Index of the last character of the path in PLB. |
* |
* @return Zero on failure or delta such that (index + delta) % |
* PLB_SIZE points to a new path component in PLB. |
*/ |
static unsigned match_path_component(fat_dentry_t *dentry, unsigned start, |
unsigned last) |
{ |
unsigned cur; /* current position in PLB */ |
int pos; /* current position in dentry->name or dentry->ext */ |
bool name_processed = false; |
bool dot_processed = false; |
bool ext_processed = false; |
if (last < start) |
last += PLB_SIZE; |
for (pos = 0, cur = start; (cur <= last) && (PLB_GET_CHAR(cur) != '/'); |
pos++, cur++) { |
if (!name_processed) { |
if ((pos == FAT_NAME_LEN - 1) || |
(dentry->name[pos + 1] == FAT_PAD)) { |
/* this is the last character in name */ |
name_processed = true; |
} |
if (dentry->name[0] == FAT_PAD) { |
/* name is empty */ |
name_processed = true; |
} else if ((pos == 0) && (dentry->name[pos] == |
FAT_DENTRY_E5_ESC)) { |
if (PLB_GET_CHAR(cur) == 0xe5) |
continue; |
else |
return 0; /* character mismatch */ |
} else { |
if (PLB_GET_CHAR(cur) == dentry->name[pos]) |
continue; |
else |
return 0; /* character mismatch */ |
} |
} |
if (!dot_processed) { |
dot_processed = true; |
pos = -1; |
if (PLB_GET_CHAR(cur) != '.') |
return 0; |
continue; |
} |
if (!ext_processed) { |
if ((pos == FAT_EXT_LEN - 1) || |
(dentry->ext[pos + 1] == FAT_PAD)) { |
/* this is the last character in ext */ |
ext_processed = true; |
} |
if (dentry->ext[0] == FAT_PAD) { |
/* ext is empty; the match will fail */ |
ext_processed = true; |
} else if (PLB_GET_CHAR(cur) == dentry->ext[pos]) { |
continue; |
} else { |
/* character mismatch */ |
return 0; |
} |
} |
return 0; /* extra characters in the component */ |
} |
if (ext_processed || (name_processed && dentry->ext[0] == FAT_PAD)) |
return cur - start; |
else |
return 0; |
} |
void fat_lookup(ipc_callid_t rid, ipc_call_t *request) |
{ |
int first = IPC_GET_ARG1(*request); |
int second = IPC_GET_ARG2(*request); |
int dev_handle = IPC_GET_ARG3(*request); |
} |
/** |
* @} |
*/ |
/tags/0.3.0/uspace/srv/fs/fat/Makefile |
---|
0,0 → 1,76 |
# |
# Copyright (c) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
## Setup toolchain |
# |
LIBC_PREFIX = ../../../lib/libc |
LIBFS_PREFIX = ../../../lib/libfs |
SOFTINT_PREFIX = ../../../lib/softint |
include $(LIBC_PREFIX)/Makefile.toolchain |
CFLAGS += -I $(LIBFS_PREFIX) |
LIBS = $(LIBC_PREFIX)/libc.a $(LIBFS_PREFIX)/libfs.a |
## Sources |
# |
OUTPUT = fat |
SOURCES = \ |
fat.c \ |
fat_ops.c |
OBJECTS := $(addsuffix .o,$(basename $(SOURCES))) |
.PHONY: all clean depend disasm |
all: $(OUTPUT) disasm |
-include Makefile.depend |
clean: |
-rm -f $(OUTPUT) $(OUTPUT).map $(OUTPUT).disasm Makefile.depend |
depend: |
$(CC) $(DEFS) $(CFLAGS) -M $(SOURCES) > Makefile.depend |
$(OUTPUT): $(OBJECTS) $(LIBS) |
$(LD) -T $(LIBC_PREFIX)/arch/$(ARCH)/_link.ld $(OBJECTS) $(LIBS) $(LFLAGS) -o $@ -Map $(OUTPUT).map |
disasm: |
$(OBJDUMP) -d $(OUTPUT) >$(OUTPUT).disasm |
%.o: %.S |
$(CC) $(DEFS) $(AFLAGS) $(CFLAGS) -D__ASM__ -c $< -o $@ |
%.o: %.s |
$(AS) $(AFLAGS) $< -o $@ |
%.o: %.c |
$(CC) $(DEFS) $(CFLAGS) -c $< -o $@ |
/tags/0.3.0/uspace/srv/vfs/vfs_ops.c |
---|
0,0 → 1,868 |
/* |
* Copyright (c) 2008 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup fs |
* @{ |
*/ |
/** |
* @file vfs_ops.c |
* @brief Operations that VFS offers to its clients. |
*/ |
#include "vfs.h" |
#include <ipc/ipc.h> |
#include <async.h> |
#include <errno.h> |
#include <stdio.h> |
#include <stdlib.h> |
#include <string.h> |
#include <bool.h> |
#include <futex.h> |
#include <rwlock.h> |
#include <libadt/list.h> |
#include <unistd.h> |
#include <ctype.h> |
#include <fcntl.h> |
#include <assert.h> |
#include <vfs/canonify.h> |
/* Forward declarations of static functions. */ |
static int vfs_truncate_internal(fs_handle_t, dev_handle_t, fs_index_t, size_t); |
/** |
* This rwlock prevents the race between a triplet-to-VFS-node resolution and a |
* concurrent VFS operation which modifies the file system namespace. |
*/ |
RWLOCK_INITIALIZE(namespace_rwlock); |
futex_t rootfs_futex = FUTEX_INITIALIZER; |
vfs_triplet_t rootfs = { |
.fs_handle = 0, |
.dev_handle = 0, |
.index = 0, |
}; |
static int |
lookup_root(fs_handle_t fs_handle, dev_handle_t dev_handle, |
vfs_lookup_res_t *result) |
{ |
vfs_pair_t altroot = { |
.fs_handle = fs_handle, |
.dev_handle = dev_handle, |
}; |
return vfs_lookup_internal("/", L_DIRECTORY, result, &altroot); |
} |
void vfs_mount(ipc_callid_t rid, ipc_call_t *request) |
{ |
dev_handle_t dev_handle; |
vfs_node_t *mp_node = NULL; |
/* |
* We expect the library to do the device-name to device-handle |
* translation for us, thus the device handle will arrive as ARG1 |
* in the request. |
*/ |
dev_handle = (dev_handle_t)IPC_GET_ARG1(*request); |
/* |
* For now, don't make use of ARG2 and ARG3, but they can be used to |
* carry mount options in the future. |
*/ |
ipc_callid_t callid; |
size_t size; |
/* |
* Now, we expect the client to send us data with the name of the file |
* system. |
*/ |
if (!ipc_data_write_receive(&callid, &size)) { |
ipc_answer_0(callid, EINVAL); |
ipc_answer_0(rid, EINVAL); |
return; |
} |
/* |
* Don't receive more than is necessary for storing a full file system |
* name. |
*/ |
if (size < 1 || size > FS_NAME_MAXLEN) { |
ipc_answer_0(callid, EINVAL); |
ipc_answer_0(rid, EINVAL); |
return; |
} |
/* Deliver the file system name. */ |
char fs_name[FS_NAME_MAXLEN + 1]; |
(void) ipc_data_write_finalize(callid, fs_name, size); |
fs_name[size] = '\0'; |
/* |
* Check if we know a file system with the same name as is in fs_name. |
* This will also give us its file system handle. |
*/ |
fs_handle_t fs_handle = fs_name_to_handle(fs_name, true); |
if (!fs_handle) { |
ipc_answer_0(rid, ENOENT); |
return; |
} |
/* Now, we want the client to send us the mount point. */ |
if (!ipc_data_write_receive(&callid, &size)) { |
ipc_answer_0(callid, EINVAL); |
ipc_answer_0(rid, EINVAL); |
return; |
} |
/* Check whether size is reasonable wrt. the mount point. */ |
if (size < 1 || size > MAX_PATH_LEN) { |
ipc_answer_0(callid, EINVAL); |
ipc_answer_0(rid, EINVAL); |
return; |
} |
/* Allocate buffer for the mount point data being received. */ |
uint8_t *buf; |
buf = malloc(size + 1); |
if (!buf) { |
ipc_answer_0(callid, ENOMEM); |
ipc_answer_0(rid, ENOMEM); |
return; |
} |
/* Deliver the mount point. */ |
(void) ipc_data_write_finalize(callid, buf, size); |
buf[size] = '\0'; |
/* |
* Lookup the root node of the filesystem being mounted. |
* In this case, we don't need to take the namespace_futex as the root |
* node cannot be removed. However, we do take a reference to it so |
* that we can track how many times it has been mounted. |
*/ |
int rc; |
vfs_lookup_res_t mr_res; |
rc = lookup_root(fs_handle, dev_handle, &mr_res); |
if (rc != EOK) { |
free(buf); |
ipc_answer_0(rid, rc); |
return; |
} |
vfs_node_t *mr_node = vfs_node_get(&mr_res); |
if (!mr_node) { |
free(buf); |
ipc_answer_0(rid, ENOMEM); |
return; |
} |
/* Finally, we need to resolve the path to the mountpoint. */ |
vfs_lookup_res_t mp_res; |
futex_down(&rootfs_futex); |
if (rootfs.fs_handle) { |
/* We already have the root FS. */ |
rwlock_write_lock(&namespace_rwlock); |
rc = vfs_lookup_internal(buf, L_DIRECTORY, &mp_res, NULL); |
if (rc != EOK) { |
/* The lookup failed for some reason. */ |
rwlock_write_unlock(&namespace_rwlock); |
futex_up(&rootfs_futex); |
vfs_node_put(mr_node); /* failed -> drop reference */ |
free(buf); |
ipc_answer_0(rid, rc); |
return; |
} |
mp_node = vfs_node_get(&mp_res); |
if (!mp_node) { |
rwlock_write_unlock(&namespace_rwlock); |
futex_up(&rootfs_futex); |
vfs_node_put(mr_node); /* failed -> drop reference */ |
free(buf); |
ipc_answer_0(rid, ENOMEM); |
return; |
} |
/* |
* Now we hold a reference to mp_node. |
* It will be dropped upon the corresponding VFS_UNMOUNT. |
* This prevents the mount point from being deleted. |
*/ |
rwlock_write_unlock(&namespace_rwlock); |
} else { |
/* We still don't have the root file system mounted. */ |
if ((size == 1) && (buf[0] == '/')) { |
/* For this simple, but important case, we are done. */ |
rootfs = mr_res.triplet; |
futex_up(&rootfs_futex); |
free(buf); |
ipc_answer_0(rid, EOK); |
return; |
} else { |
/* |
* We can't resolve this without the root filesystem |
* being mounted first. |
*/ |
futex_up(&rootfs_futex); |
free(buf); |
vfs_node_put(mr_node); /* failed -> drop reference */ |
ipc_answer_0(rid, ENOENT); |
return; |
} |
} |
futex_up(&rootfs_futex); |
free(buf); /* The buffer is not needed anymore. */ |
/* |
* At this point, we have all necessary pieces: file system and device |
* handles, and we know the mount point VFS node and also the root node |
* of the file system being mounted. |
*/ |
int phone = vfs_grab_phone(mp_res.triplet.fs_handle); |
/* Later we can use ARG3 to pass mode/flags. */ |
aid_t req1 = async_send_3(phone, VFS_MOUNT, |
(ipcarg_t) mp_res.triplet.dev_handle, |
(ipcarg_t) mp_res.triplet.index, 0, NULL); |
/* The second call uses the same method. */ |
aid_t req2 = async_send_3(phone, VFS_MOUNT, |
(ipcarg_t) mr_res.triplet.fs_handle, |
(ipcarg_t) mr_res.triplet.dev_handle, |
(ipcarg_t) mr_res.triplet.index, NULL); |
vfs_release_phone(phone); |
ipcarg_t rc1; |
ipcarg_t rc2; |
async_wait_for(req1, &rc1); |
async_wait_for(req2, &rc2); |
if ((rc1 != EOK) || (rc2 != EOK)) { |
/* Mount failed, drop references to mr_node and mp_node. */ |
vfs_node_put(mr_node); |
if (mp_node) |
vfs_node_put(mp_node); |
} |
if (rc2 == EOK) |
ipc_answer_0(rid, rc1); |
else if (rc1 == EOK) |
ipc_answer_0(rid, rc2); |
else |
ipc_answer_0(rid, rc1); |
} |
void vfs_open(ipc_callid_t rid, ipc_call_t *request) |
{ |
if (!vfs_files_init()) { |
ipc_answer_0(rid, ENOMEM); |
return; |
} |
/* |
* The POSIX interface is open(path, oflag, mode). |
* We can receive oflags and mode along with the VFS_OPEN call; the path |
* will need to arrive in another call. |
* |
* We also receive one private, non-POSIX set of flags called lflag |
* used to pass information to vfs_lookup_internal(). |
*/ |
int lflag = IPC_GET_ARG1(*request); |
int oflag = IPC_GET_ARG2(*request); |
int mode = IPC_GET_ARG3(*request); |
size_t len; |
if (oflag & O_CREAT) |
lflag |= L_CREATE; |
if (oflag & O_EXCL) |
lflag |= L_EXCLUSIVE; |
ipc_callid_t callid; |
if (!ipc_data_write_receive(&callid, &len)) { |
ipc_answer_0(callid, EINVAL); |
ipc_answer_0(rid, EINVAL); |
return; |
} |
char *path = malloc(len + 1); |
if (!path) { |
ipc_answer_0(callid, ENOMEM); |
ipc_answer_0(rid, ENOMEM); |
return; |
} |
int rc; |
if ((rc = ipc_data_write_finalize(callid, path, len))) { |
ipc_answer_0(rid, rc); |
free(path); |
return; |
} |
path[len] = '\0'; |
/* |
* Avoid the race condition in which the file can be deleted before we |
* find/create-and-lock the VFS node corresponding to the looked-up |
* triplet. |
*/ |
if (lflag & L_CREATE) |
rwlock_write_lock(&namespace_rwlock); |
else |
rwlock_read_lock(&namespace_rwlock); |
/* The path is now populated and we can call vfs_lookup_internal(). */ |
vfs_lookup_res_t lr; |
rc = vfs_lookup_internal(path, lflag, &lr, NULL); |
if (rc) { |
if (lflag & L_CREATE) |
rwlock_write_unlock(&namespace_rwlock); |
else |
rwlock_read_unlock(&namespace_rwlock); |
ipc_answer_0(rid, rc); |
free(path); |
return; |
} |
/* Path is no longer needed. */ |
free(path); |
vfs_node_t *node = vfs_node_get(&lr); |
if (lflag & L_CREATE) |
rwlock_write_unlock(&namespace_rwlock); |
else |
rwlock_read_unlock(&namespace_rwlock); |
/* Truncate the file if requested and if necessary. */ |
if (oflag & O_TRUNC) { |
rwlock_write_lock(&node->contents_rwlock); |
if (node->size) { |
rc = vfs_truncate_internal(node->fs_handle, |
node->dev_handle, node->index, 0); |
if (rc) { |
rwlock_write_unlock(&node->contents_rwlock); |
vfs_node_put(node); |
ipc_answer_0(rid, rc); |
return; |
} |
node->size = 0; |
} |
rwlock_write_unlock(&node->contents_rwlock); |
} |
/* |
* Get ourselves a file descriptor and the corresponding vfs_file_t |
* structure. |
*/ |
int fd = vfs_fd_alloc(); |
if (fd < 0) { |
vfs_node_put(node); |
ipc_answer_0(rid, fd); |
return; |
} |
vfs_file_t *file = vfs_file_get(fd); |
file->node = node; |
if (oflag & O_APPEND) |
file->append = true; |
/* |
* The following increase in reference count is for the fact that the |
* file is being opened and that a file structure is pointing to it. |
* It is necessary so that the file will not disappear when |
* vfs_node_put() is called. The reference will be dropped by the |
* respective VFS_CLOSE. |
*/ |
vfs_node_addref(node); |
vfs_node_put(node); |
/* Success! Return the new file descriptor to the client. */ |
ipc_answer_1(rid, EOK, fd); |
} |
void vfs_close(ipc_callid_t rid, ipc_call_t *request) |
{ |
int fd = IPC_GET_ARG1(*request); |
if (fd >= MAX_OPEN_FILES) { |
ipc_answer_0(rid, EBADF); |
return; |
} |
vfs_fd_free(fd); |
ipc_answer_0(rid, EOK); |
} |
static void vfs_rdwr(ipc_callid_t rid, ipc_call_t *request, bool read) |
{ |
/* |
* The following code strongly depends on the fact that the files data |
* structure can be only accessed by a single fibril and all file |
* operations are serialized (i.e. the reads and writes cannot |
* interleave and a file cannot be closed while it is being read). |
* |
* Additional synchronization needs to be added once the table of |
* open files supports parallel access! |
*/ |
int fd = IPC_GET_ARG1(*request); |
/* Lookup the file structure corresponding to the file descriptor. */ |
vfs_file_t *file = vfs_file_get(fd); |
if (!file) { |
ipc_answer_0(rid, ENOENT); |
return; |
} |
/* |
* Now we need to receive a call with client's |
* IPC_M_DATA_READ/IPC_M_DATA_WRITE request. |
*/ |
ipc_callid_t callid; |
int res; |
if (read) |
res = ipc_data_read_receive(&callid, NULL); |
else |
res = ipc_data_write_receive(&callid, NULL); |
if (!res) { |
ipc_answer_0(callid, EINVAL); |
ipc_answer_0(rid, EINVAL); |
return; |
} |
/* |
* Lock the open file structure so that no other thread can manipulate |
* the same open file at a time. |
*/ |
futex_down(&file->lock); |
/* |
* Lock the file's node so that no other client can read/write to it at |
* the same time. |
*/ |
if (read) |
rwlock_read_lock(&file->node->contents_rwlock); |
else |
rwlock_write_lock(&file->node->contents_rwlock); |
int fs_phone = vfs_grab_phone(file->node->fs_handle); |
/* Make a VFS_READ/VFS_WRITE request at the destination FS server. */ |
aid_t msg; |
ipc_call_t answer; |
if (!read && file->append) |
file->pos = file->node->size; |
msg = async_send_3(fs_phone, IPC_GET_METHOD(*request), |
file->node->dev_handle, file->node->index, file->pos, &answer); |
/* |
* Forward the IPC_M_DATA_READ/IPC_M_DATA_WRITE request to the |
* destination FS server. The call will be routed as if sent by |
* ourselves. Note that call arguments are immutable in this case so we |
* don't have to bother. |
*/ |
ipc_forward_fast(callid, fs_phone, 0, 0, 0, IPC_FF_ROUTE_FROM_ME); |
vfs_release_phone(fs_phone); |
/* Wait for reply from the FS server. */ |
ipcarg_t rc; |
async_wait_for(msg, &rc); |
size_t bytes = IPC_GET_ARG1(answer); |
/* Unlock the VFS node. */ |
if (read) |
rwlock_read_unlock(&file->node->contents_rwlock); |
else { |
/* Update the cached version of node's size. */ |
if (rc == EOK) |
file->node->size = IPC_GET_ARG2(answer); |
rwlock_write_unlock(&file->node->contents_rwlock); |
} |
/* Update the position pointer and unlock the open file. */ |
if (rc == EOK) |
file->pos += bytes; |
futex_up(&file->lock); |
/* |
* FS server's reply is the final result of the whole operation we |
* return to the client. |
*/ |
ipc_answer_1(rid, rc, bytes); |
} |
void vfs_read(ipc_callid_t rid, ipc_call_t *request) |
{ |
vfs_rdwr(rid, request, true); |
} |
void vfs_write(ipc_callid_t rid, ipc_call_t *request) |
{ |
vfs_rdwr(rid, request, false); |
} |
void vfs_seek(ipc_callid_t rid, ipc_call_t *request) |
{ |
int fd = (int) IPC_GET_ARG1(*request); |
off_t off = (off_t) IPC_GET_ARG2(*request); |
int whence = (int) IPC_GET_ARG3(*request); |
/* Lookup the file structure corresponding to the file descriptor. */ |
vfs_file_t *file = vfs_file_get(fd); |
if (!file) { |
ipc_answer_0(rid, ENOENT); |
return; |
} |
off_t newpos; |
futex_down(&file->lock); |
if (whence == SEEK_SET) { |
file->pos = off; |
futex_up(&file->lock); |
ipc_answer_1(rid, EOK, off); |
return; |
} |
if (whence == SEEK_CUR) { |
if (file->pos + off < file->pos) { |
futex_up(&file->lock); |
ipc_answer_0(rid, EOVERFLOW); |
return; |
} |
file->pos += off; |
newpos = file->pos; |
futex_up(&file->lock); |
ipc_answer_1(rid, EOK, newpos); |
return; |
} |
if (whence == SEEK_END) { |
rwlock_read_lock(&file->node->contents_rwlock); |
size_t size = file->node->size; |
rwlock_read_unlock(&file->node->contents_rwlock); |
if (size + off < size) { |
futex_up(&file->lock); |
ipc_answer_0(rid, EOVERFLOW); |
return; |
} |
newpos = size + off; |
futex_up(&file->lock); |
ipc_answer_1(rid, EOK, newpos); |
return; |
} |
futex_up(&file->lock); |
ipc_answer_0(rid, EINVAL); |
} |
int |
vfs_truncate_internal(fs_handle_t fs_handle, dev_handle_t dev_handle, |
fs_index_t index, size_t size) |
{ |
ipcarg_t rc; |
int fs_phone; |
fs_phone = vfs_grab_phone(fs_handle); |
rc = async_req_3_0(fs_phone, VFS_TRUNCATE, (ipcarg_t)dev_handle, |
(ipcarg_t)index, (ipcarg_t)size); |
vfs_release_phone(fs_phone); |
return (int)rc; |
} |
void vfs_truncate(ipc_callid_t rid, ipc_call_t *request) |
{ |
int fd = IPC_GET_ARG1(*request); |
size_t size = IPC_GET_ARG2(*request); |
int rc; |
vfs_file_t *file = vfs_file_get(fd); |
if (!file) { |
ipc_answer_0(rid, ENOENT); |
return; |
} |
futex_down(&file->lock); |
rwlock_write_lock(&file->node->contents_rwlock); |
rc = vfs_truncate_internal(file->node->fs_handle, |
file->node->dev_handle, file->node->index, size); |
if (rc == EOK) |
file->node->size = size; |
rwlock_write_unlock(&file->node->contents_rwlock); |
futex_up(&file->lock); |
ipc_answer_0(rid, (ipcarg_t)rc); |
} |
void vfs_mkdir(ipc_callid_t rid, ipc_call_t *request) |
{ |
int mode = IPC_GET_ARG1(*request); |
size_t len; |
ipc_callid_t callid; |
if (!ipc_data_write_receive(&callid, &len)) { |
ipc_answer_0(callid, EINVAL); |
ipc_answer_0(rid, EINVAL); |
return; |
} |
char *path = malloc(len + 1); |
if (!path) { |
ipc_answer_0(callid, ENOMEM); |
ipc_answer_0(rid, ENOMEM); |
return; |
} |
int rc; |
if ((rc = ipc_data_write_finalize(callid, path, len))) { |
ipc_answer_0(rid, rc); |
free(path); |
return; |
} |
path[len] = '\0'; |
rwlock_write_lock(&namespace_rwlock); |
int lflag = L_DIRECTORY | L_CREATE | L_EXCLUSIVE; |
rc = vfs_lookup_internal(path, lflag, NULL, NULL); |
rwlock_write_unlock(&namespace_rwlock); |
free(path); |
ipc_answer_0(rid, rc); |
} |
void vfs_unlink(ipc_callid_t rid, ipc_call_t *request) |
{ |
int lflag = IPC_GET_ARG1(*request); |
size_t len; |
ipc_callid_t callid; |
if (!ipc_data_write_receive(&callid, &len)) { |
ipc_answer_0(callid, EINVAL); |
ipc_answer_0(rid, EINVAL); |
return; |
} |
char *path = malloc(len + 1); |
if (!path) { |
ipc_answer_0(callid, ENOMEM); |
ipc_answer_0(rid, ENOMEM); |
return; |
} |
int rc; |
if ((rc = ipc_data_write_finalize(callid, path, len))) { |
ipc_answer_0(rid, rc); |
free(path); |
return; |
} |
path[len] = '\0'; |
rwlock_write_lock(&namespace_rwlock); |
lflag &= L_DIRECTORY; /* sanitize lflag */ |
vfs_lookup_res_t lr; |
rc = vfs_lookup_internal(path, lflag | L_UNLINK, &lr, NULL); |
free(path); |
if (rc != EOK) { |
rwlock_write_unlock(&namespace_rwlock); |
ipc_answer_0(rid, rc); |
return; |
} |
/* |
* The name has already been unlinked by vfs_lookup_internal(). |
* We have to get and put the VFS node to ensure that it is |
* VFS_DESTROY'ed after the last reference to it is dropped. |
*/ |
vfs_node_t *node = vfs_node_get(&lr); |
futex_down(&nodes_futex); |
node->lnkcnt--; |
futex_up(&nodes_futex); |
rwlock_write_unlock(&namespace_rwlock); |
vfs_node_put(node); |
ipc_answer_0(rid, EOK); |
} |
void vfs_rename(ipc_callid_t rid, ipc_call_t *request) |
{ |
size_t len; |
ipc_callid_t callid; |
int rc; |
/* Retrieve the old path. */ |
if (!ipc_data_write_receive(&callid, &len)) { |
ipc_answer_0(callid, EINVAL); |
ipc_answer_0(rid, EINVAL); |
return; |
} |
char *old = malloc(len + 1); |
if (!old) { |
ipc_answer_0(callid, ENOMEM); |
ipc_answer_0(rid, ENOMEM); |
return; |
} |
if ((rc = ipc_data_write_finalize(callid, old, len))) { |
ipc_answer_0(rid, rc); |
free(old); |
return; |
} |
old[len] = '\0'; |
/* Retrieve the new path. */ |
if (!ipc_data_write_receive(&callid, &len)) { |
ipc_answer_0(callid, EINVAL); |
ipc_answer_0(rid, EINVAL); |
free(old); |
return; |
} |
char *new = malloc(len + 1); |
if (!new) { |
ipc_answer_0(callid, ENOMEM); |
ipc_answer_0(rid, ENOMEM); |
free(old); |
return; |
} |
if ((rc = ipc_data_write_finalize(callid, new, len))) { |
ipc_answer_0(rid, rc); |
free(old); |
free(new); |
return; |
} |
new[len] = '\0'; |
char *oldc = canonify(old, &len); |
char *newc = canonify(new, NULL); |
if (!oldc || !newc) { |
ipc_answer_0(rid, EINVAL); |
free(old); |
free(new); |
return; |
} |
if (!strncmp(newc, oldc, len)) { |
/* oldc is a prefix of newc */ |
ipc_answer_0(rid, EINVAL); |
free(old); |
free(new); |
return; |
} |
vfs_lookup_res_t old_lr; |
vfs_lookup_res_t new_lr; |
vfs_lookup_res_t new_par_lr; |
rwlock_write_lock(&namespace_rwlock); |
/* Lookup the node belonging to the old file name. */ |
rc = vfs_lookup_internal(oldc, L_NONE, &old_lr, NULL); |
if (rc != EOK) { |
rwlock_write_unlock(&namespace_rwlock); |
ipc_answer_0(rid, rc); |
free(old); |
free(new); |
return; |
} |
vfs_node_t *old_node = vfs_node_get(&old_lr); |
if (!old_node) { |
rwlock_write_unlock(&namespace_rwlock); |
ipc_answer_0(rid, ENOMEM); |
free(old); |
free(new); |
return; |
} |
/* Lookup parent of the new file name. */ |
rc = vfs_lookup_internal(newc, L_PARENT, &new_par_lr, NULL); |
if (rc != EOK) { |
rwlock_write_unlock(&namespace_rwlock); |
ipc_answer_0(rid, rc); |
free(old); |
free(new); |
return; |
} |
/* Check whether linking to the same file system instance. */ |
if ((old_node->fs_handle != new_par_lr.triplet.fs_handle) || |
(old_node->dev_handle != new_par_lr.triplet.dev_handle)) { |
rwlock_write_unlock(&namespace_rwlock); |
ipc_answer_0(rid, EXDEV); /* different file systems */ |
free(old); |
free(new); |
return; |
} |
/* Destroy the old link for the new name. */ |
vfs_node_t *new_node = NULL; |
rc = vfs_lookup_internal(newc, L_UNLINK, &new_lr, NULL); |
switch (rc) { |
case ENOENT: |
/* simply not in our way */ |
break; |
case EOK: |
new_node = vfs_node_get(&new_lr); |
if (!new_node) { |
rwlock_write_unlock(&namespace_rwlock); |
ipc_answer_0(rid, ENOMEM); |
free(old); |
free(new); |
return; |
} |
futex_down(&nodes_futex); |
new_node->lnkcnt--; |
futex_up(&nodes_futex); |
break; |
default: |
rwlock_write_unlock(&namespace_rwlock); |
ipc_answer_0(rid, ENOTEMPTY); |
free(old); |
free(new); |
return; |
} |
/* Create the new link for the new name. */ |
rc = vfs_lookup_internal(newc, L_LINK, NULL, NULL, old_node->index); |
if (rc != EOK) { |
rwlock_write_unlock(&namespace_rwlock); |
if (new_node) |
vfs_node_put(new_node); |
ipc_answer_0(rid, rc); |
free(old); |
free(new); |
return; |
} |
futex_down(&nodes_futex); |
old_node->lnkcnt++; |
futex_up(&nodes_futex); |
/* Destroy the link for the old name. */ |
rc = vfs_lookup_internal(oldc, L_UNLINK, NULL, NULL); |
if (rc != EOK) { |
rwlock_write_unlock(&namespace_rwlock); |
vfs_node_put(old_node); |
if (new_node) |
vfs_node_put(new_node); |
ipc_answer_0(rid, rc); |
free(old); |
free(new); |
return; |
} |
futex_down(&nodes_futex); |
old_node->lnkcnt--; |
futex_up(&nodes_futex); |
rwlock_write_unlock(&namespace_rwlock); |
vfs_node_put(old_node); |
if (new_node) |
vfs_node_put(new_node); |
free(old); |
free(new); |
ipc_answer_0(rid, EOK); |
} |
/** |
* @} |
*/ |
/tags/0.3.0/uspace/srv/vfs/vfs_register.c |
---|
0,0 → 1,411 |
/* |
* Copyright (c) 2008 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup fs |
* @{ |
*/ |
/** |
* @file vfs_register.c |
* @brief |
*/ |
#include <ipc/ipc.h> |
#include <ipc/services.h> |
#include <async.h> |
#include <fibril.h> |
#include <errno.h> |
#include <stdio.h> |
#include <stdlib.h> |
#include <string.h> |
#include <ctype.h> |
#include <bool.h> |
#include <futex.h> |
#include <libadt/list.h> |
#include <as.h> |
#include <assert.h> |
#include <atomic.h> |
#include "vfs.h" |
atomic_t fs_head_futex = FUTEX_INITIALIZER; |
link_t fs_head; |
atomic_t fs_handle_next = { |
.count = 1 |
}; |
/** Verify the VFS info structure. |
* |
* @param info Info structure to be verified. |
* |
* @return Non-zero if the info structure is sane, zero otherwise. |
*/ |
static bool vfs_info_sane(vfs_info_t *info) |
{ |
int i; |
/* |
* Check if the name is non-empty and is composed solely of ASCII |
* characters [a-z]+[a-z0-9_-]*. |
*/ |
if (!islower(info->name[0])) { |
dprintf("The name doesn't start with a lowercase character.\n"); |
return false; |
} |
for (i = 1; i < FS_NAME_MAXLEN; i++) { |
if (!(islower(info->name[i]) || isdigit(info->name[i])) && |
(info->name[i] != '-') && (info->name[i] != '_')) { |
if (info->name[i] == '\0') { |
break; |
} else { |
dprintf("The name contains illegal " |
"characters.\n"); |
return false; |
} |
} |
} |
/* |
* This check is not redundant. It ensures that the name is |
* NULL-terminated, even if FS_NAME_MAXLEN characters are used. |
*/ |
if (info->name[i] != '\0') { |
dprintf("The name is not properly NULL-terminated.\n"); |
return false; |
} |
/* |
* Check if the FS implements mandatory VFS operations. |
*/ |
if (info->ops[IPC_METHOD_TO_VFS_OP(VFS_LOOKUP)] != VFS_OP_DEFINED) { |
dprintf("Operation VFS_LOOKUP not defined by the client.\n"); |
return false; |
} |
if (info->ops[IPC_METHOD_TO_VFS_OP(VFS_READ)] != VFS_OP_DEFINED) { |
dprintf("Operation VFS_READ not defined by the client.\n"); |
return false; |
} |
/* |
* Check if each operation is either not defined, defined or default. |
*/ |
for (i = VFS_FIRST; i < VFS_LAST_CLNT; i++) { |
if ((info->ops[IPC_METHOD_TO_VFS_OP(i)] != VFS_OP_NULL) && |
(info->ops[IPC_METHOD_TO_VFS_OP(i)] != VFS_OP_DEFAULT) && |
(info->ops[IPC_METHOD_TO_VFS_OP(i)] != VFS_OP_DEFINED)) { |
dprintf("Operation info not understood.\n"); |
return false; |
} |
} |
return true; |
} |
/** VFS_REGISTER protocol function. |
* |
* @param rid Hash of the call with the request. |
* @param request Call structure with the request. |
*/ |
void vfs_register(ipc_callid_t rid, ipc_call_t *request) |
{ |
ipc_callid_t callid; |
ipc_call_t call; |
int rc; |
size_t size; |
dprintf("Processing VFS_REGISTER request received from %p.\n", |
request->in_phone_hash); |
/* |
* The first call has to be IPC_M_DATA_SEND in which we receive the |
* VFS info structure from the client FS. |
*/ |
if (!ipc_data_write_receive(&callid, &size)) { |
/* |
* The client doesn't obey the same protocol as we do. |
*/ |
dprintf("Receiving of VFS info failed.\n"); |
ipc_answer_0(callid, EINVAL); |
ipc_answer_0(rid, EINVAL); |
return; |
} |
dprintf("VFS info received, size = %d\n", size); |
/* |
* We know the size of the VFS info structure. See if the client |
* understands this easy concept too. |
*/ |
if (size != sizeof(vfs_info_t)) { |
/* |
* The client is sending us something, which cannot be |
* the info structure. |
*/ |
dprintf("Received VFS info has bad size.\n"); |
ipc_answer_0(callid, EINVAL); |
ipc_answer_0(rid, EINVAL); |
return; |
} |
/* |
* Allocate and initialize a buffer for the fs_info structure. |
*/ |
fs_info_t *fs_info; |
fs_info = (fs_info_t *) malloc(sizeof(fs_info_t)); |
if (!fs_info) { |
dprintf("Could not allocate memory for FS info.\n"); |
ipc_answer_0(callid, ENOMEM); |
ipc_answer_0(rid, ENOMEM); |
return; |
} |
link_initialize(&fs_info->fs_link); |
futex_initialize(&fs_info->phone_futex, 1); |
rc = ipc_data_write_finalize(callid, &fs_info->vfs_info, size); |
if (rc != EOK) { |
dprintf("Failed to deliver the VFS info into our AS, rc=%d.\n", |
rc); |
free(fs_info); |
ipc_answer_0(callid, rc); |
ipc_answer_0(rid, rc); |
return; |
} |
dprintf("VFS info delivered.\n"); |
if (!vfs_info_sane(&fs_info->vfs_info)) { |
free(fs_info); |
ipc_answer_0(callid, EINVAL); |
ipc_answer_0(rid, EINVAL); |
return; |
} |
futex_down(&fs_head_futex); |
fibril_inc_sercount(); |
/* |
* Check for duplicit registrations. |
*/ |
if (fs_name_to_handle(fs_info->vfs_info.name, false)) { |
/* |
* We already register a fs like this. |
*/ |
dprintf("FS is already registered.\n"); |
fibril_dec_sercount(); |
futex_up(&fs_head_futex); |
free(fs_info); |
ipc_answer_0(callid, EEXISTS); |
ipc_answer_0(rid, EEXISTS); |
return; |
} |
/* |
* Add fs_info to the list of registered FS's. |
*/ |
dprintf("Inserting FS into the list of registered file systems.\n"); |
list_append(&fs_info->fs_link, &fs_head); |
/* |
* Now we want the client to send us the IPC_M_CONNECT_TO_ME call so |
* that a callback connection is created and we have a phone through |
* which to forward VFS requests to it. |
*/ |
callid = async_get_call(&call); |
if (IPC_GET_METHOD(call) != IPC_M_CONNECT_TO_ME) { |
dprintf("Unexpected call, method = %d\n", IPC_GET_METHOD(call)); |
list_remove(&fs_info->fs_link); |
fibril_dec_sercount(); |
futex_up(&fs_head_futex); |
free(fs_info); |
ipc_answer_0(callid, EINVAL); |
ipc_answer_0(rid, EINVAL); |
return; |
} |
fs_info->phone = IPC_GET_ARG5(call); |
ipc_answer_0(callid, EOK); |
dprintf("Callback connection to FS created.\n"); |
/* |
* The client will want us to send him the address space area with PLB. |
*/ |
if (!ipc_share_in_receive(&callid, &size)) { |
dprintf("Unexpected call, method = %d\n", IPC_GET_METHOD(call)); |
list_remove(&fs_info->fs_link); |
fibril_dec_sercount(); |
futex_up(&fs_head_futex); |
ipc_hangup(fs_info->phone); |
free(fs_info); |
ipc_answer_0(callid, EINVAL); |
ipc_answer_0(rid, EINVAL); |
return; |
} |
/* |
* We can only send the client address space area PLB_SIZE bytes long. |
*/ |
if (size != PLB_SIZE) { |
dprintf("Client suggests wrong size of PFB, size = %d\n", size); |
list_remove(&fs_info->fs_link); |
fibril_dec_sercount(); |
futex_up(&fs_head_futex); |
ipc_hangup(fs_info->phone); |
free(fs_info); |
ipc_answer_0(callid, EINVAL); |
ipc_answer_0(rid, EINVAL); |
return; |
} |
/* |
* Commit to read-only sharing the PLB with the client. |
*/ |
(void) ipc_share_in_finalize(callid, plb, |
AS_AREA_READ | AS_AREA_CACHEABLE); |
dprintf("Sharing PLB.\n"); |
/* |
* That was it. The FS has been registered. |
* In reply to the VFS_REGISTER request, we assign the client file |
* system a global file system handle. |
*/ |
fs_info->fs_handle = (fs_handle_t) atomic_postinc(&fs_handle_next); |
ipc_answer_1(rid, EOK, (ipcarg_t) fs_info->fs_handle); |
fibril_dec_sercount(); |
futex_up(&fs_head_futex); |
dprintf("\"%.*s\" filesystem successfully registered, handle=%d.\n", |
FS_NAME_MAXLEN, fs_info->vfs_info.name, fs_info->fs_handle); |
} |
/** For a given file system handle, implement policy for allocating a phone. |
* |
* @param handle File system handle. |
* |
* @return Phone over which a multi-call request can be safely |
* sent. Return 0 if no phone was found. |
*/ |
int vfs_grab_phone(fs_handle_t handle) |
{ |
/* |
* For now, we don't try to be very clever and very fast. |
* We simply lookup the phone in the fs_head list. We currently don't |
* open any additional phones (even though that itself would be pretty |
* straightforward; housekeeping multiple open phones to a FS task would |
* be more demanding). Instead, we simply take the respective |
* phone_futex and keep it until vfs_release_phone(). |
*/ |
futex_down(&fs_head_futex); |
link_t *cur; |
fs_info_t *fs; |
for (cur = fs_head.next; cur != &fs_head; cur = cur->next) { |
fs = list_get_instance(cur, fs_info_t, fs_link); |
if (fs->fs_handle == handle) { |
futex_up(&fs_head_futex); |
/* |
* For now, take the futex unconditionally. |
* Oh yeah, serialization rocks. |
* It will be up'ed in vfs_release_phone(). |
*/ |
futex_down(&fs->phone_futex); |
/* |
* Avoid deadlock with other fibrils in the same thread |
* by disabling fibril preemption. |
*/ |
fibril_inc_sercount(); |
return fs->phone; |
} |
} |
futex_up(&fs_head_futex); |
return 0; |
} |
/** Tell VFS that the phone is in use for any request. |
* |
* @param phone Phone to FS task. |
*/ |
void vfs_release_phone(int phone) |
{ |
bool found = false; |
/* |
* Undo the fibril_inc_sercount() done in vfs_grab_phone(). |
*/ |
fibril_dec_sercount(); |
futex_down(&fs_head_futex); |
link_t *cur; |
for (cur = fs_head.next; cur != &fs_head; cur = cur->next) { |
fs_info_t *fs = list_get_instance(cur, fs_info_t, fs_link); |
if (fs->phone == phone) { |
found = true; |
futex_up(&fs_head_futex); |
futex_up(&fs->phone_futex); |
return; |
} |
} |
futex_up(&fs_head_futex); |
/* |
* Not good to get here. |
*/ |
assert(found == true); |
} |
/** Convert file system name to its handle. |
* |
* @param name File system name. |
* @param lock If true, the function will down and up the |
* fs_head_futex. |
* |
* @return File system handle or zero if file system not found. |
*/ |
fs_handle_t fs_name_to_handle(char *name, bool lock) |
{ |
int handle = 0; |
if (lock) |
futex_down(&fs_head_futex); |
link_t *cur; |
for (cur = fs_head.next; cur != &fs_head; cur = cur->next) { |
fs_info_t *fs = list_get_instance(cur, fs_info_t, fs_link); |
if (strncmp(fs->vfs_info.name, name, |
sizeof(fs->vfs_info.name)) == 0) { |
handle = fs->fs_handle; |
break; |
} |
} |
if (lock) |
futex_up(&fs_head_futex); |
return handle; |
} |
/** |
* @} |
*/ |
/tags/0.3.0/uspace/srv/vfs/vfs.h |
---|
0,0 → 1,305 |
/* |
* Copyright (c) 2008 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup fs |
* @{ |
*/ |
#ifndef VFS_VFS_H_ |
#define VFS_VFS_H_ |
#include <ipc/ipc.h> |
#include <libadt/list.h> |
#include <futex.h> |
#include <rwlock.h> |
#include <sys/types.h> |
#include <bool.h> |
#define dprintf(...) printf(__VA_ARGS__) |
#define VFS_FIRST IPC_FIRST_USER_METHOD |
#define IPC_METHOD_TO_VFS_OP(m) ((m) - VFS_FIRST) |
/* Basic types. */ |
typedef int16_t fs_handle_t; |
typedef int16_t dev_handle_t; |
typedef uint32_t fs_index_t; |
typedef enum { |
VFS_READ = VFS_FIRST, |
VFS_WRITE, |
VFS_TRUNCATE, |
VFS_MOUNT, |
VFS_UNMOUNT, |
VFS_LAST_CMN, /* keep this the last member of this enum */ |
} vfs_request_cmn_t; |
typedef enum { |
VFS_LOOKUP = VFS_LAST_CMN, |
VFS_DESTROY, |
VFS_LAST_CLNT, /* keep this the last member of this enum */ |
} vfs_request_clnt_t; |
typedef enum { |
VFS_REGISTER = VFS_LAST_CMN, |
VFS_OPEN, |
VFS_CLOSE, |
VFS_SEEK, |
VFS_MKDIR, |
VFS_UNLINK, |
VFS_RENAME, |
VFS_LAST_SRV, /* keep this the last member of this enum */ |
} vfs_request_srv_t; |
/** |
* An instance of this structure is associated with a particular FS operation. |
* It tells VFS if the FS supports the operation or maybe if a default one |
* should be used. |
*/ |
typedef enum { |
VFS_OP_NULL = 0, |
VFS_OP_DEFAULT, |
VFS_OP_DEFINED |
} vfs_op_t; |
#define FS_NAME_MAXLEN 20 |
/** |
* A structure like this is passed to VFS by each individual FS upon its |
* registration. It assosiates a human-readable identifier with each |
* registered FS. More importantly, through this structure, the FS announces |
* what operations it supports. |
*/ |
typedef struct { |
/** Unique identifier of the fs. */ |
char name[FS_NAME_MAXLEN + 1]; |
/** Operations. */ |
vfs_op_t ops[VFS_LAST_CLNT - VFS_FIRST]; |
} vfs_info_t; |
/** |
* A structure like this will be allocated for each registered file system. |
*/ |
typedef struct { |
link_t fs_link; |
vfs_info_t vfs_info; |
fs_handle_t fs_handle; |
futex_t phone_futex; /**< Phone serializing futex. */ |
ipcarg_t phone; |
} fs_info_t; |
/** |
* VFS_PAIR uniquely represents a file system instance. |
*/ |
#define VFS_PAIR \ |
fs_handle_t fs_handle; \ |
dev_handle_t dev_handle; |
/** |
* VFS_TRIPLET uniquely identifies a file system node (e.g. directory, file) but |
* doesn't contain any state. For a stateful structure, see vfs_node_t. |
* |
* @note fs_handle, dev_handle and index are meant to be returned in one |
* IPC reply. |
*/ |
#define VFS_TRIPLET \ |
VFS_PAIR; \ |
fs_index_t index; |
typedef struct { |
VFS_PAIR; |
} vfs_pair_t; |
typedef struct { |
VFS_TRIPLET; |
} vfs_triplet_t; |
/* |
* Lookup flags. |
*/ |
/** |
* No lookup flags used. |
*/ |
#define L_NONE 0 |
/** |
* Lookup will succeed only if the object is a regular file. If L_CREATE is |
* specified, an empty file will be created. This flag is mutually exclusive |
* with L_DIRECTORY. |
*/ |
#define L_FILE 1 |
/** |
* Lookup wil succeed only if the object is a directory. If L_CREATE is |
* specified, an empty directory will be created. This flag is mutually |
* exclusive with L_FILE. |
*/ |
#define L_DIRECTORY 2 |
/** |
* When used with L_CREATE, L_EXCLUSIVE will cause the lookup to fail if the |
* object already exists. L_EXCLUSIVE is implied when L_DIRECTORY is used. |
*/ |
#define L_EXCLUSIVE 4 |
/** |
* L_CREATE is used for creating both regular files and directories. |
*/ |
#define L_CREATE 8 |
/** |
* L_LINK is used for linking to an already existing nodes. |
*/ |
#define L_LINK 16 |
/** |
* L_UNLINK is used to remove leaves from the file system namespace. This flag |
* cannot be passed directly by the client, but will be set by VFS during |
* VFS_UNLINK. |
*/ |
#define L_UNLINK 32 |
/** |
* L_PARENT performs a lookup but returns the triplet of the parent node. |
* This flag may not be combined with any other lookup flag. |
*/ |
#define L_PARENT 64 |
typedef struct { |
vfs_triplet_t triplet; |
size_t size; |
unsigned lnkcnt; |
} vfs_lookup_res_t; |
/** |
* Instances of this type represent an active, in-memory VFS node and any state |
* which may be associated with it. |
*/ |
typedef struct { |
VFS_TRIPLET; /**< Identity of the node. */ |
/** |
* Usage counter. This includes, but is not limited to, all vfs_file_t |
* structures that reference this node. |
*/ |
unsigned refcnt; |
/** Number of names this node has in the file system namespace. */ |
unsigned lnkcnt; |
link_t nh_link; /**< Node hash-table link. */ |
size_t size; /**< Cached size of the file. */ |
/** |
* Holding this rwlock prevents modifications of the node's contents. |
*/ |
rwlock_t contents_rwlock; |
} vfs_node_t; |
/** |
* Instances of this type represent an open file. If the file is opened by more |
* than one task, there will be a separate structure allocated for each task. |
*/ |
typedef struct { |
/** Serializes access to this open file. */ |
futex_t lock; |
vfs_node_t *node; |
/** Number of file handles referencing this file. */ |
unsigned refcnt; |
/** Append on write. */ |
bool append; |
/** Current position in the file. */ |
off_t pos; |
} vfs_file_t; |
extern futex_t nodes_futex; |
extern link_t fs_head; /**< List of registered file systems. */ |
extern vfs_triplet_t rootfs; /**< Root node of the root file system. */ |
#define MAX_PATH_LEN (64 * 1024) |
#define PLB_SIZE (2 * MAX_PATH_LEN) |
/** Each instance of this type describes one path lookup in progress. */ |
typedef struct { |
link_t plb_link; /**< Active PLB entries list link. */ |
unsigned index; /**< Index of the first character in PLB. */ |
size_t len; /**< Number of characters in this PLB entry. */ |
} plb_entry_t; |
extern futex_t plb_futex; /**< Futex protecting plb and plb_head. */ |
extern uint8_t *plb; /**< Path Lookup Buffer */ |
extern link_t plb_head; /**< List of active PLB entries. */ |
/** Holding this rwlock prevents changes in file system namespace. */ |
extern rwlock_t namespace_rwlock; |
extern int vfs_grab_phone(fs_handle_t); |
extern void vfs_release_phone(int); |
extern fs_handle_t fs_name_to_handle(char *, bool); |
extern int vfs_lookup_internal(char *, int, vfs_lookup_res_t *, vfs_pair_t *, |
...); |
extern bool vfs_nodes_init(void); |
extern vfs_node_t *vfs_node_get(vfs_lookup_res_t *); |
extern void vfs_node_put(vfs_node_t *); |
#define MAX_OPEN_FILES 128 |
extern bool vfs_files_init(void); |
extern vfs_file_t *vfs_file_get(int); |
extern int vfs_fd_alloc(void); |
extern void vfs_fd_free(int); |
extern void vfs_file_addref(vfs_file_t *); |
extern void vfs_file_delref(vfs_file_t *); |
extern void vfs_node_addref(vfs_node_t *); |
extern void vfs_node_delref(vfs_node_t *); |
extern void vfs_register(ipc_callid_t, ipc_call_t *); |
extern void vfs_mount(ipc_callid_t, ipc_call_t *); |
extern void vfs_open(ipc_callid_t, ipc_call_t *); |
extern void vfs_close(ipc_callid_t, ipc_call_t *); |
extern void vfs_read(ipc_callid_t, ipc_call_t *); |
extern void vfs_write(ipc_callid_t, ipc_call_t *); |
extern void vfs_seek(ipc_callid_t, ipc_call_t *); |
extern void vfs_truncate(ipc_callid_t, ipc_call_t *); |
extern void vfs_mkdir(ipc_callid_t, ipc_call_t *); |
extern void vfs_unlink(ipc_callid_t, ipc_call_t *); |
extern void vfs_rename(ipc_callid_t, ipc_call_t *); |
#endif |
/** |
* @} |
*/ |
/tags/0.3.0/uspace/srv/vfs/vfs_lookup.c |
---|
0,0 → 1,192 |
/* |
* Copyright (c) 2008 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup fs |
* @{ |
*/ |
/** |
* @file vfs_lookup.c |
* @brief |
*/ |
#include "vfs.h" |
#include <ipc/ipc.h> |
#include <async.h> |
#include <errno.h> |
#include <string.h> |
#include <stdarg.h> |
#include <bool.h> |
#include <futex.h> |
#include <libadt/list.h> |
#include <vfs/canonify.h> |
#define min(a, b) ((a) < (b) ? (a) : (b)) |
futex_t plb_futex = FUTEX_INITIALIZER; |
link_t plb_head; /**< PLB entry ring buffer. */ |
uint8_t *plb = NULL; |
/** Perform a path lookup. |
* |
* @param path Path to be resolved; it must be a NULL-terminated |
* string. |
* @param lflag Flags to be used during lookup. |
* @param result Empty structure where the lookup result will be stored. |
* Can be NULL. |
* @param altroot If non-empty, will be used instead of rootfs as the root |
* of the whole VFS tree. |
* |
* @return EOK on success or an error code from errno.h. |
*/ |
int vfs_lookup_internal(char *path, int lflag, vfs_lookup_res_t *result, |
vfs_pair_t *altroot, ...) |
{ |
vfs_pair_t *root; |
if (altroot) |
root = altroot; |
else |
root = (vfs_pair_t *) &rootfs; |
if (!root->fs_handle) |
return ENOENT; |
size_t len; |
path = canonify(path, &len); |
if (!path) |
return EINVAL; |
fs_index_t index = 0; |
if (lflag & L_LINK) { |
va_list ap; |
va_start(ap, altroot); |
index = va_arg(ap, fs_index_t); |
va_end(ap); |
} |
futex_down(&plb_futex); |
plb_entry_t entry; |
link_initialize(&entry.plb_link); |
entry.len = len; |
off_t first; /* the first free index */ |
off_t last; /* the last free index */ |
if (list_empty(&plb_head)) { |
first = 0; |
last = PLB_SIZE - 1; |
} else { |
plb_entry_t *oldest = list_get_instance(plb_head.next, |
plb_entry_t, plb_link); |
plb_entry_t *newest = list_get_instance(plb_head.prev, |
plb_entry_t, plb_link); |
first = (newest->index + newest->len) % PLB_SIZE; |
last = (oldest->index - 1) % PLB_SIZE; |
} |
if (first <= last) { |
if ((last - first) + 1 < len) { |
/* |
* The buffer cannot absorb the path. |
*/ |
futex_up(&plb_futex); |
return ELIMIT; |
} |
} else { |
if (PLB_SIZE - ((first - last) + 1) < len) { |
/* |
* The buffer cannot absorb the path. |
*/ |
futex_up(&plb_futex); |
return ELIMIT; |
} |
} |
/* |
* We know the first free index in PLB and we also know that there is |
* enough space in the buffer to hold our path. |
*/ |
entry.index = first; |
entry.len = len; |
/* |
* Claim PLB space by inserting the entry into the PLB entry ring |
* buffer. |
*/ |
list_append(&entry.plb_link, &plb_head); |
futex_up(&plb_futex); |
/* |
* Copy the path into PLB. |
*/ |
size_t cnt1 = min(len, (PLB_SIZE - first) + 1); |
size_t cnt2 = len - cnt1; |
memcpy(&plb[first], path, cnt1); |
memcpy(plb, &path[cnt1], cnt2); |
ipc_call_t answer; |
int phone = vfs_grab_phone(root->fs_handle); |
aid_t req = async_send_5(phone, VFS_LOOKUP, (ipcarg_t) first, |
(ipcarg_t) (first + len - 1) % PLB_SIZE, |
(ipcarg_t) root->dev_handle, (ipcarg_t) lflag, (ipcarg_t) index, |
&answer); |
vfs_release_phone(phone); |
ipcarg_t rc; |
async_wait_for(req, &rc); |
futex_down(&plb_futex); |
list_remove(&entry.plb_link); |
/* |
* Erasing the path from PLB will come handy for debugging purposes. |
*/ |
memset(&plb[first], 0, cnt1); |
memset(plb, 0, cnt2); |
futex_up(&plb_futex); |
if ((rc == EOK) && result) { |
result->triplet.fs_handle = (fs_handle_t) IPC_GET_ARG1(answer); |
result->triplet.dev_handle = (dev_handle_t) IPC_GET_ARG2(answer); |
result->triplet.index = (fs_index_t) IPC_GET_ARG3(answer); |
result->size = (size_t) IPC_GET_ARG4(answer); |
result->lnkcnt = (unsigned) IPC_GET_ARG5(answer); |
} |
return rc; |
} |
/** |
* @} |
*/ |
/tags/0.3.0/uspace/srv/vfs/vfs_node.c |
---|
0,0 → 1,229 |
/* |
* Copyright (c) 2008 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup fs |
* @{ |
*/ |
/** |
* @file vfs_node.c |
* @brief Various operations on VFS nodes have their home in this file. |
*/ |
#include "vfs.h" |
#include <stdlib.h> |
#include <string.h> |
#include <futex.h> |
#include <rwlock.h> |
#include <libadt/hash_table.h> |
#include <assert.h> |
#include <async.h> |
#include <errno.h> |
/** Futex protecting the VFS node hash table. */ |
futex_t nodes_futex = FUTEX_INITIALIZER; |
#define NODES_BUCKETS_LOG 8 |
#define NODES_BUCKETS (1 << NODES_BUCKETS_LOG) |
/** VFS node hash table containing all active, in-memory VFS nodes. */ |
hash_table_t nodes; |
#define KEY_FS_HANDLE 0 |
#define KEY_DEV_HANDLE 1 |
#define KEY_INDEX 2 |
static hash_index_t nodes_hash(unsigned long []); |
static int nodes_compare(unsigned long [], hash_count_t, link_t *); |
static void nodes_remove_callback(link_t *); |
/** VFS node hash table operations. */ |
hash_table_operations_t nodes_ops = { |
.hash = nodes_hash, |
.compare = nodes_compare, |
.remove_callback = nodes_remove_callback |
}; |
/** Initialize the VFS node hash table. |
* |
* @return Return true on success, false on failure. |
*/ |
bool vfs_nodes_init(void) |
{ |
return hash_table_create(&nodes, NODES_BUCKETS, 3, &nodes_ops); |
} |
static inline void _vfs_node_addref(vfs_node_t *node) |
{ |
node->refcnt++; |
} |
/** Increment reference count of a VFS node. |
* |
* @param node VFS node that will have its refcnt incremented. |
*/ |
void vfs_node_addref(vfs_node_t *node) |
{ |
futex_down(&nodes_futex); |
_vfs_node_addref(node); |
futex_up(&nodes_futex); |
} |
/** Decrement reference count of a VFS node. |
* |
* This function handles the case when the reference count drops to zero. |
* |
* @param node VFS node that will have its refcnt decremented. |
*/ |
void vfs_node_delref(vfs_node_t *node) |
{ |
bool free_vfs_node = false; |
bool free_fs_node = false; |
futex_down(&nodes_futex); |
if (node->refcnt-- == 1) { |
/* |
* We are dropping the last reference to this node. |
* Remove it from the VFS node hash table. |
*/ |
unsigned long key[] = { |
[KEY_FS_HANDLE] = node->fs_handle, |
[KEY_DEV_HANDLE] = node->dev_handle, |
[KEY_INDEX] = node->index |
}; |
hash_table_remove(&nodes, key, 3); |
free_vfs_node = true; |
if (!node->lnkcnt) |
free_fs_node = true; |
} |
futex_up(&nodes_futex); |
if (free_fs_node) { |
/* |
* The node is not visible in the file system namespace. |
* Free up its resources. |
*/ |
int phone = vfs_grab_phone(node->fs_handle); |
ipcarg_t rc; |
rc = async_req_2_0(phone, VFS_DESTROY, |
(ipcarg_t)node->dev_handle, (ipcarg_t)node->index); |
assert(rc == EOK); |
vfs_release_phone(phone); |
} |
if (free_vfs_node) |
free(node); |
} |
/** Find VFS node. |
* |
* This function will try to lookup the given triplet in the VFS node hash |
* table. In case the triplet is not found there, a new VFS node is created. |
* In any case, the VFS node will have its reference count incremented. Every |
* node returned by this call should be eventually put back by calling |
* vfs_node_put() on it. |
* |
* @param result Populated lookup result structure. |
* |
* @return VFS node corresponding to the given triplet. |
*/ |
vfs_node_t *vfs_node_get(vfs_lookup_res_t *result) |
{ |
unsigned long key[] = { |
[KEY_FS_HANDLE] = result->triplet.fs_handle, |
[KEY_DEV_HANDLE] = result->triplet.dev_handle, |
[KEY_INDEX] = result->triplet.index |
}; |
link_t *tmp; |
vfs_node_t *node; |
futex_down(&nodes_futex); |
tmp = hash_table_find(&nodes, key); |
if (!tmp) { |
node = (vfs_node_t *) malloc(sizeof(vfs_node_t)); |
if (!node) { |
futex_up(&nodes_futex); |
return NULL; |
} |
memset(node, 0, sizeof(vfs_node_t)); |
node->fs_handle = result->triplet.fs_handle; |
node->dev_handle = result->triplet.dev_handle; |
node->index = result->triplet.index; |
node->size = result->size; |
node->lnkcnt = result->lnkcnt; |
link_initialize(&node->nh_link); |
rwlock_initialize(&node->contents_rwlock); |
hash_table_insert(&nodes, key, &node->nh_link); |
} else { |
node = hash_table_get_instance(tmp, vfs_node_t, nh_link); |
} |
assert(node->size == result->size); |
assert(node->lnkcnt == result->lnkcnt); |
_vfs_node_addref(node); |
futex_up(&nodes_futex); |
return node; |
} |
/** Return VFS node when no longer needed by the caller. |
* |
* This function will remove the reference on the VFS node created by |
* vfs_node_get(). This function can only be called as a closing bracket to the |
* preceding vfs_node_get() call. |
* |
* @param node VFS node being released. |
*/ |
void vfs_node_put(vfs_node_t *node) |
{ |
vfs_node_delref(node); |
} |
hash_index_t nodes_hash(unsigned long key[]) |
{ |
hash_index_t a = key[KEY_FS_HANDLE] << (NODES_BUCKETS_LOG / 4); |
hash_index_t b = (a | key[KEY_DEV_HANDLE]) << (NODES_BUCKETS_LOG / 2); |
return (b | key[KEY_INDEX]) & (NODES_BUCKETS - 1); |
} |
int nodes_compare(unsigned long key[], hash_count_t keys, link_t *item) |
{ |
vfs_node_t *node = hash_table_get_instance(item, vfs_node_t, nh_link); |
return (node->fs_handle == key[KEY_FS_HANDLE]) && |
(node->dev_handle == key[KEY_DEV_HANDLE]) && |
(node->index == key[KEY_INDEX]); |
} |
void nodes_remove_callback(link_t *item) |
{ |
} |
/** |
* @} |
*/ |
/tags/0.3.0/uspace/srv/vfs/vfs.c |
---|
0,0 → 1,184 |
/* |
* Copyright (c) 2008 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup fs |
* @{ |
*/ |
/** |
* @file vfs.c |
* @brief VFS service for HelenOS. |
*/ |
#include <ipc/ipc.h> |
#include <ipc/services.h> |
#include <async.h> |
#include <errno.h> |
#include <stdio.h> |
#include <bool.h> |
#include <string.h> |
#include <as.h> |
#include <libadt/list.h> |
#include <atomic.h> |
#include "vfs.h" |
#define dprintf(...) printf(__VA_ARGS__) |
static void vfs_connection(ipc_callid_t iid, ipc_call_t *icall) |
{ |
bool keep_on_going = 1; |
printf("Connection opened from %p\n", icall->in_phone_hash); |
/* |
* The connection was opened via the IPC_CONNECT_ME_TO call. |
* This call needs to be answered. |
*/ |
ipc_answer_0(iid, EOK); |
/* |
* Here we enter the main connection fibril loop. |
* The logic behind this loop and the protocol is that we'd like to keep |
* each connection open until the client hangs up. When the client hangs |
* up, we will free its VFS state. The act of hanging up the connection |
* by the client is equivalent to client termination because we cannot |
* distinguish one from the other. On the other hand, the client can |
* hang up arbitrarily if it has no open files and reestablish the |
* connection later. |
*/ |
while (keep_on_going) { |
ipc_callid_t callid; |
ipc_call_t call; |
callid = async_get_call(&call); |
printf("Received call, method=%d\n", IPC_GET_METHOD(call)); |
switch (IPC_GET_METHOD(call)) { |
case IPC_M_PHONE_HUNGUP: |
keep_on_going = false; |
break; |
case VFS_REGISTER: |
vfs_register(callid, &call); |
keep_on_going = false; |
break; |
case VFS_MOUNT: |
vfs_mount(callid, &call); |
break; |
case VFS_OPEN: |
vfs_open(callid, &call); |
break; |
case VFS_CLOSE: |
vfs_close(callid, &call); |
break; |
case VFS_READ: |
vfs_read(callid, &call); |
break; |
case VFS_WRITE: |
vfs_write(callid, &call); |
break; |
case VFS_SEEK: |
vfs_seek(callid, &call); |
break; |
case VFS_TRUNCATE: |
vfs_truncate(callid, &call); |
break; |
case VFS_MKDIR: |
vfs_mkdir(callid, &call); |
break; |
case VFS_UNLINK: |
vfs_unlink(callid, &call); |
break; |
case VFS_RENAME: |
vfs_rename(callid, &call); |
break; |
default: |
ipc_answer_0(callid, ENOTSUP); |
break; |
} |
} |
/* TODO: cleanup after the client */ |
} |
int main(int argc, char **argv) |
{ |
ipcarg_t phonead; |
printf("VFS: HelenOS VFS server\n"); |
/* |
* Initialize the list of registered file systems. |
*/ |
list_initialize(&fs_head); |
/* |
* Initialize VFS node hash table. |
*/ |
if (!vfs_nodes_init()) { |
printf("Failed to initialize the VFS node hash table.\n"); |
return ENOMEM; |
} |
/* |
* Allocate and initialize the Path Lookup Buffer. |
*/ |
list_initialize(&plb_head); |
plb = as_get_mappable_page(PLB_SIZE); |
if (!plb) { |
printf("Cannot allocate a mappable piece of address space\n"); |
return ENOMEM; |
} |
if (as_area_create(plb, PLB_SIZE, AS_AREA_READ | AS_AREA_WRITE | |
AS_AREA_CACHEABLE) != plb) { |
printf("Cannot create address space area.\n"); |
return ENOMEM; |
} |
memset(plb, 0, PLB_SIZE); |
/* |
* Set a connectio handling function/fibril. |
*/ |
async_set_client_connection(vfs_connection); |
/* |
* Register at the naming service. |
*/ |
ipc_connect_to_me(PHONE_NS, SERVICE_VFS, 0, 0, &phonead); |
/* |
* Start accepting connections. |
*/ |
async_manager(); |
return 0; |
} |
/** |
* @} |
*/ |
/tags/0.3.0/uspace/srv/vfs/vfs_file.c |
---|
0,0 → 1,156 |
/* |
* Copyright (c) 2007 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup fs |
* @{ |
*/ |
/** |
* @file vfs_file.c |
* @brief Various operations on files have their home in this file. |
*/ |
#include <errno.h> |
#include <stdlib.h> |
#include <string.h> |
#include <assert.h> |
#include <bool.h> |
#include "vfs.h" |
/** |
* This is a per-connection table of open files. |
* Our assumption is that each client opens only one connection and therefore |
* there is one table of open files per task. However, this may not be the case |
* and the client can open more connections to VFS. In that case, there will be |
* several tables and several file handle name spaces per task. Besides of this, |
* the functionality will stay unchanged. So unless the client knows what it is |
* doing, it should open one connection to VFS only. |
* |
* Allocation of the open files table is deferred until the client makes the |
* first VFS_OPEN operation. |
* |
* This resource being per-connection and, in the first place, per-fibril, we |
* don't need to protect it by a futex. |
*/ |
__thread vfs_file_t **files = NULL; |
/** Initialize the table of open files. */ |
bool vfs_files_init(void) |
{ |
if (!files) { |
files = malloc(MAX_OPEN_FILES * sizeof(vfs_file_t *)); |
if (!files) |
return false; |
memset(files, 0, MAX_OPEN_FILES * sizeof(vfs_file_t *)); |
} |
return true; |
} |
/** Allocate a file descriptor. |
* |
* @return First available file descriptor or a negative error |
* code. |
*/ |
int vfs_fd_alloc(void) |
{ |
int i; |
for (i = 0; i < MAX_OPEN_FILES; i++) { |
if (!files[i]) { |
files[i] = (vfs_file_t *) malloc(sizeof(vfs_file_t)); |
if (!files[i]) |
return ENOMEM; |
memset(files[i], 0, sizeof(vfs_file_t)); |
futex_initialize(&files[i]->lock, 1); |
vfs_file_addref(files[i]); |
return i; |
} |
} |
return EMFILE; |
} |
/** Release file descriptor. |
* |
* @param fd File descriptor being released. |
*/ |
void vfs_fd_free(int fd) |
{ |
assert(fd < MAX_OPEN_FILES); |
assert(files[fd] != NULL); |
vfs_file_delref(files[fd]); |
files[fd] = NULL; |
} |
/** Increment reference count of VFS file structure. |
* |
* @param file File structure that will have reference count |
* incremented. |
*/ |
void vfs_file_addref(vfs_file_t *file) |
{ |
/* |
* File structures are per-connection, so no-one, except the current |
* fibril, should have a reference to them. This is the reason we don't |
* do any synchronization here. |
*/ |
file->refcnt++; |
} |
/** Decrement reference count of VFS file structure. |
* |
* @param file File structure that will have reference count |
* decremented. |
*/ |
void vfs_file_delref(vfs_file_t *file) |
{ |
if (file->refcnt-- == 1) { |
/* |
* Lost the last reference to a file, need to drop our reference |
* to the underlying VFS node. |
*/ |
vfs_node_delref(file->node); |
free(file); |
} |
} |
/** Find VFS file structure for a given file descriptor. |
* |
* @param fd File descriptor. |
* |
* @return VFS file structure corresponding to fd. |
*/ |
vfs_file_t *vfs_file_get(int fd) |
{ |
if (fd < MAX_OPEN_FILES) |
return files[fd]; |
return NULL; |
} |
/** |
* @} |
*/ |
/tags/0.3.0/uspace/srv/vfs/Makefile |
---|
0,0 → 1,78 |
# |
# Copyright (c) 2006 Martin Decky |
# Copyright (c) 2008 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
## Setup toolchain |
# |
LIBC_PREFIX = ../../lib/libc |
SOFTINT_PREFIX = ../../lib/softint |
include $(LIBC_PREFIX)/Makefile.toolchain |
LIBS = $(LIBC_PREFIX)/libc.a |
## Sources |
# |
OUTPUT = vfs |
SOURCES = \ |
vfs.c \ |
vfs_node.c \ |
vfs_file.c \ |
vfs_ops.c \ |
vfs_lookup.c \ |
vfs_register.c |
OBJECTS := $(addsuffix .o,$(basename $(SOURCES))) |
.PHONY: all clean depend disasm |
all: $(OUTPUT) disasm |
-include Makefile.depend |
clean: |
-rm -f $(OUTPUT) $(OUTPUT).map $(OUTPUT).disasm Makefile.depend |
depend: |
$(CC) $(DEFS) $(CFLAGS) -M $(SOURCES) > Makefile.depend |
$(OUTPUT): $(OBJECTS) $(LIBS) |
$(LD) -T $(LIBC_PREFIX)/arch/$(ARCH)/_link.ld $(OBJECTS) $(LIBS) $(LFLAGS) -o $@ -Map $(OUTPUT).map |
disasm: |
$(OBJDUMP) -d $(OUTPUT) >$(OUTPUT).disasm |
%.o: %.S |
$(CC) $(DEFS) $(AFLAGS) $(CFLAGS) -D__ASM__ -c $< -o $@ |
%.o: %.s |
$(AS) $(AFLAGS) $< -o $@ |
%.o: %.c |
$(CC) $(DEFS) $(CFLAGS) -c $< -o $@ |
/tags/0.3.0/uspace/srv/console/console.c |
---|
0,0 → 1,563 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup console |
* @{ |
*/ |
/** @file |
*/ |
#include <libc.h> |
#include <fb.h> |
#include <ipc/ipc.h> |
#include <keys.h> |
#include <ipc/fb.h> |
#include <ipc/services.h> |
#include <errno.h> |
#include <key_buffer.h> |
#include <console.h> |
#include <unistd.h> |
#include <async.h> |
#include <libadt/fifo.h> |
#include <screenbuffer.h> |
#include <sys/mman.h> |
#include "gcons.h" |
#define MAX_KEYREQUESTS_BUFFERED 32 |
#define NAME "CONSOLE" |
/** Index of currently used virtual console. |
*/ |
int active_console = 0; |
/** Information about framebuffer |
*/ |
struct { |
int phone; /**< Framebuffer phone */ |
ipcarg_t rows; /**< Framebuffer rows */ |
ipcarg_t cols; /**< Framebuffer columns */ |
} fb_info; |
typedef struct { |
keybuffer_t keybuffer; /**< Buffer for incoming keys. */ |
/** Buffer for unsatisfied request for keys. */ |
FIFO_CREATE_STATIC(keyrequests, ipc_callid_t, |
MAX_KEYREQUESTS_BUFFERED); |
int keyrequest_counter; /**< Number of requests in buffer. */ |
int client_phone; /**< Phone to connected client. */ |
int used; /**< 1 if this virtual console is |
* connected to some client.*/ |
screenbuffer_t screenbuffer; /**< Screenbuffer for saving screen |
* contents and related settings. */ |
} connection_t; |
static connection_t connections[CONSOLE_COUNT]; /**< Array of data for virtual |
* consoles */ |
static keyfield_t *interbuffer = NULL; /**< Pointer to memory shared |
* with framebufer used for |
* faster virtual console |
* switching */ |
static int kernel_pixmap = -1; /**< Number of fb pixmap, where kernel |
* console is stored */ |
/** Find unused virtual console. |
* |
*/ |
static int find_free_connection(void) |
{ |
int i; |
for (i = 0; i < CONSOLE_COUNT; i++) { |
if (!connections[i].used) |
return i; |
} |
return -1; |
} |
static void clrscr(void) |
{ |
async_msg_0(fb_info.phone, FB_CLEAR); |
} |
static void curs_visibility(int v) |
{ |
async_msg_1(fb_info.phone, FB_CURSOR_VISIBILITY, v); |
} |
static void curs_goto(int row, int col) |
{ |
async_msg_2(fb_info.phone, FB_CURSOR_GOTO, row, col); |
} |
static void set_style(style_t *style) |
{ |
async_msg_2(fb_info.phone, FB_SET_STYLE, style->fg_color, |
style->bg_color); |
} |
static void set_style_col(int fgcolor, int bgcolor) |
{ |
async_msg_2(fb_info.phone, FB_SET_STYLE, fgcolor, bgcolor); |
} |
static void prtchr(char c, int row, int col) |
{ |
async_msg_3(fb_info.phone, FB_PUTCHAR, c, row, col); |
} |
/** Check key and process special keys. |
* |
* |
*/ |
static void write_char(int console, char key) |
{ |
screenbuffer_t *scr = &(connections[console].screenbuffer); |
switch (key) { |
case '\n': |
scr->position_y++; |
scr->position_x = 0; |
break; |
case '\r': |
break; |
case '\t': |
scr->position_x += 8; |
scr->position_x -= scr->position_x % 8; |
break; |
case '\b': |
if (scr->position_x == 0) |
break; |
scr->position_x--; |
if (console == active_console) |
prtchr(' ', scr->position_y, scr->position_x); |
screenbuffer_putchar(scr, ' '); |
break; |
default: |
if (console == active_console) |
prtchr(key, scr->position_y, scr->position_x); |
screenbuffer_putchar(scr, key); |
scr->position_x++; |
} |
scr->position_y += (scr->position_x >= scr->size_x); |
if (scr->position_y >= scr->size_y) { |
scr->position_y = scr->size_y - 1; |
screenbuffer_clear_line(scr, scr->top_line); |
scr->top_line = (scr->top_line + 1) % scr->size_y; |
if (console == active_console) |
async_msg_1(fb_info.phone, FB_SCROLL, 1); |
} |
scr->position_x = scr->position_x % scr->size_x; |
if (console == active_console) |
curs_goto(scr->position_y, scr->position_x); |
} |
/** Save current screen to pixmap, draw old pixmap |
* |
* @param oldpixmap Old pixmap |
* @return ID of pixmap of current screen |
*/ |
static int switch_screens(int oldpixmap) |
{ |
int newpmap; |
/* Save screen */ |
newpmap = async_req_0_0(fb_info.phone, FB_VP2PIXMAP); |
if (newpmap < 0) |
return -1; |
if (oldpixmap != -1) { |
/* Show old screen */ |
async_msg_2(fb_info.phone, FB_VP_DRAW_PIXMAP, 0, oldpixmap); |
/* Drop old pixmap */ |
async_msg_1(fb_info.phone, FB_DROP_PIXMAP, oldpixmap); |
} |
return newpmap; |
} |
/** Switch to new console */ |
static void change_console(int newcons) |
{ |
connection_t *conn; |
static int console_pixmap = -1; |
int i, j, rc; |
keyfield_t *field; |
style_t *style; |
if (newcons == active_console) |
return; |
if (newcons == KERNEL_CONSOLE) { |
if (active_console == KERNEL_CONSOLE) |
return; |
active_console = KERNEL_CONSOLE; |
curs_visibility(0); |
async_serialize_start(); |
if (kernel_pixmap == -1) { |
/* store/restore unsupported */ |
set_style_col(DEFAULT_FOREGROUND, DEFAULT_BACKGROUND); |
clrscr(); |
} else { |
gcons_in_kernel(); |
console_pixmap = switch_screens(kernel_pixmap); |
kernel_pixmap = -1; |
} |
async_serialize_end(); |
__SYSCALL0(SYS_DEBUG_ENABLE_CONSOLE); |
return; |
} |
async_serialize_start(); |
if (console_pixmap != -1) { |
kernel_pixmap = switch_screens(console_pixmap); |
console_pixmap = -1; |
} |
active_console = newcons; |
gcons_change_console(newcons); |
conn = &connections[active_console]; |
set_style(&conn->screenbuffer.style); |
curs_visibility(0); |
if (interbuffer) { |
for (i = 0; i < conn->screenbuffer.size_x; i++) |
for (j = 0; j < conn->screenbuffer.size_y; j++) { |
unsigned int size_x; |
size_x = conn->screenbuffer.size_x; |
interbuffer[i + j * size_x] = |
*get_field_at(&conn->screenbuffer, i, j); |
} |
/* This call can preempt, but we are already at the end */ |
rc = async_req_0_0(fb_info.phone, FB_DRAW_TEXT_DATA); |
} |
if ((!interbuffer) || (rc != 0)) { |
set_style(&conn->screenbuffer.style); |
clrscr(); |
style = &conn->screenbuffer.style; |
for (j = 0; j < conn->screenbuffer.size_y; j++) |
for (i = 0; i < conn->screenbuffer.size_x; i++) { |
field = get_field_at(&conn->screenbuffer, i, j); |
if (!style_same(*style, field->style)) |
set_style(&field->style); |
style = &field->style; |
if ((field->character == ' ') && |
(style_same(field->style, |
conn->screenbuffer.style))) |
continue; |
prtchr(field->character, j, i); |
} |
} |
curs_goto(conn->screenbuffer.position_y, |
conn->screenbuffer.position_x); |
curs_visibility(conn->screenbuffer.is_cursor_visible); |
async_serialize_end(); |
} |
/** Handler for keyboard */ |
static void keyboard_events(ipc_callid_t iid, ipc_call_t *icall) |
{ |
ipc_callid_t callid; |
ipc_call_t call; |
int retval; |
int c; |
connection_t *conn; |
int newcon; |
/* Ignore parameters, the connection is alread opened */ |
while (1) { |
callid = async_get_call(&call); |
switch (IPC_GET_METHOD(call)) { |
case IPC_M_PHONE_HUNGUP: |
/* TODO: Handle hangup */ |
return; |
case KBD_MS_LEFT: |
newcon = gcons_mouse_btn(IPC_GET_ARG1(call)); |
if (newcon != -1) |
change_console(newcon); |
retval = 0; |
break; |
case KBD_MS_MOVE: |
gcons_mouse_move(IPC_GET_ARG1(call), |
IPC_GET_ARG2(call)); |
retval = 0; |
break; |
case KBD_PUSHCHAR: |
/* got key from keyboard driver */ |
retval = 0; |
c = IPC_GET_ARG1(call); |
/* switch to another virtual console */ |
conn = &connections[active_console]; |
/* |
* if ((c >= KBD_KEY_F1) && (c < KBD_KEY_F1 + |
* CONSOLE_COUNT)) { |
*/ |
if ((c >= 0x101) && (c < 0x101 + CONSOLE_COUNT)) { |
if (c == 0x112) |
change_console(KERNEL_CONSOLE); |
else |
change_console(c - 0x101); |
break; |
} |
/* if client is awaiting key, send it */ |
if (conn->keyrequest_counter > 0) { |
conn->keyrequest_counter--; |
ipc_answer_1(fifo_pop(conn->keyrequests), EOK, |
c); |
break; |
} |
keybuffer_push(&conn->keybuffer, c); |
retval = 0; |
break; |
default: |
retval = ENOENT; |
} |
ipc_answer_0(callid, retval); |
} |
} |
/** Default thread for new connections */ |
static void client_connection(ipc_callid_t iid, ipc_call_t *icall) |
{ |
ipc_callid_t callid; |
ipc_call_t call; |
int consnum; |
ipcarg_t arg1, arg2; |
connection_t *conn; |
if ((consnum = find_free_connection()) == -1) { |
ipc_answer_0(iid, ELIMIT); |
return; |
} |
conn = &connections[consnum]; |
conn->used = 1; |
async_serialize_start(); |
gcons_notify_connect(consnum); |
conn->client_phone = IPC_GET_ARG5(*icall); |
screenbuffer_clear(&conn->screenbuffer); |
/* Accept the connection */ |
ipc_answer_0(iid, EOK); |
while (1) { |
async_serialize_end(); |
callid = async_get_call(&call); |
async_serialize_start(); |
arg1 = 0; |
arg2 = 0; |
switch (IPC_GET_METHOD(call)) { |
case IPC_M_PHONE_HUNGUP: |
gcons_notify_disconnect(consnum); |
/* Answer all pending requests */ |
while (conn->keyrequest_counter > 0) { |
conn->keyrequest_counter--; |
ipc_answer_0(fifo_pop(conn->keyrequests), |
ENOENT); |
break; |
} |
conn->used = 0; |
return; |
case CONSOLE_PUTCHAR: |
write_char(consnum, IPC_GET_ARG1(call)); |
gcons_notify_char(consnum); |
break; |
case CONSOLE_CLEAR: |
/* Send message to fb */ |
if (consnum == active_console) { |
async_msg_0(fb_info.phone, FB_CLEAR); |
} |
screenbuffer_clear(&conn->screenbuffer); |
break; |
case CONSOLE_GOTO: |
screenbuffer_goto(&conn->screenbuffer, |
IPC_GET_ARG2(call), IPC_GET_ARG1(call)); |
if (consnum == active_console) |
curs_goto(IPC_GET_ARG1(call), |
IPC_GET_ARG2(call)); |
break; |
case CONSOLE_GETSIZE: |
arg1 = fb_info.rows; |
arg2 = fb_info.cols; |
break; |
case CONSOLE_FLUSH: |
if (consnum == active_console) |
async_req_0_0(fb_info.phone, FB_FLUSH); |
break; |
case CONSOLE_SET_STYLE: |
arg1 = IPC_GET_ARG1(call); |
arg2 = IPC_GET_ARG2(call); |
screenbuffer_set_style(&conn->screenbuffer, arg1, |
arg2); |
if (consnum == active_console) |
set_style_col(arg1, arg2); |
break; |
case CONSOLE_CURSOR_VISIBILITY: |
arg1 = IPC_GET_ARG1(call); |
conn->screenbuffer.is_cursor_visible = arg1; |
if (consnum == active_console) |
curs_visibility(arg1); |
break; |
case CONSOLE_GETCHAR: |
if (keybuffer_empty(&conn->keybuffer)) { |
/* buffer is empty -> store request */ |
if (conn->keyrequest_counter < |
MAX_KEYREQUESTS_BUFFERED) { |
fifo_push(conn->keyrequests, callid); |
conn->keyrequest_counter++; |
} else { |
/* |
* No key available and too many |
* requests => fail. |
*/ |
ipc_answer_0(callid, ELIMIT); |
} |
continue; |
} |
keybuffer_pop(&conn->keybuffer, (int *) &arg1); |
break; |
} |
ipc_answer_2(callid, EOK, arg1, arg2); |
} |
} |
int main(int argc, char *argv[]) |
{ |
ipcarg_t phonehash; |
int kbd_phone; |
int i; |
async_set_client_connection(client_connection); |
/* Connect to keyboard driver */ |
kbd_phone = ipc_connect_me_to(PHONE_NS, SERVICE_KEYBOARD, 0, 0); |
while (kbd_phone < 0) { |
usleep(10000); |
kbd_phone = ipc_connect_me_to(PHONE_NS, SERVICE_KEYBOARD, 0, 0); |
} |
if (ipc_connect_to_me(kbd_phone, SERVICE_CONSOLE, 0, 0, &phonehash) != 0) |
return -1; |
async_new_connection(phonehash, 0, NULL, keyboard_events); |
/* Connect to framebuffer driver */ |
fb_info.phone = ipc_connect_me_to(PHONE_NS, SERVICE_VIDEO, 0, 0); |
while (fb_info.phone < 0) { |
usleep(10000); |
fb_info.phone = ipc_connect_me_to(PHONE_NS, SERVICE_VIDEO, 0, 0); |
} |
/* Save old kernel screen */ |
kernel_pixmap = switch_screens(-1); |
/* Initialize gcons */ |
gcons_init(fb_info.phone); |
/* Synchronize, the gcons can have something in queue */ |
async_req_0_0(fb_info.phone, FB_FLUSH); |
/* Enable double buffering */ |
async_msg_2(fb_info.phone, FB_VIEWPORT_DB, (sysarg_t) -1, 1); |
async_req_0_2(fb_info.phone, FB_GET_CSIZE, &fb_info.rows, |
&fb_info.cols); |
set_style_col(DEFAULT_FOREGROUND, DEFAULT_BACKGROUND); |
clrscr(); |
/* Init virtual consoles */ |
for (i = 0; i < CONSOLE_COUNT; i++) { |
connections[i].used = 0; |
keybuffer_init(&connections[i].keybuffer); |
connections[i].keyrequests.head = 0; |
connections[i].keyrequests.tail = 0; |
connections[i].keyrequests.items = MAX_KEYREQUESTS_BUFFERED; |
connections[i].keyrequest_counter = 0; |
if (screenbuffer_init(&connections[i].screenbuffer, |
fb_info.cols, fb_info.rows) == NULL) { |
/* FIXME: handle error */ |
return -1; |
} |
} |
connections[KERNEL_CONSOLE].used = 1; |
interbuffer = mmap(NULL, |
sizeof(keyfield_t) * fb_info.cols * fb_info.rows, |
PROTO_READ | PROTO_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, 0, 0); |
if (!interbuffer) { |
if (ipc_share_out_start(fb_info.phone, interbuffer, |
AS_AREA_READ) != EOK) { |
munmap(interbuffer, |
sizeof(keyfield_t) * fb_info.cols * fb_info.rows); |
interbuffer = NULL; |
} |
} |
curs_goto(0, 0); |
curs_visibility( |
connections[active_console].screenbuffer.is_cursor_visible); |
/* Register at NS */ |
if (ipc_connect_to_me(PHONE_NS, SERVICE_CONSOLE, 0, 0, &phonehash) != 0) { |
return -1; |
} |
async_manager(); |
return 0; |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/srv/console/gcons.c |
---|
0,0 → 1,518 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup console |
* @{ |
*/ |
/** @file |
*/ |
#include <ipc/fb.h> |
#include <ipc/ipc.h> |
#include <async.h> |
#include <stdio.h> |
#include <sys/mman.h> |
#include <string.h> |
#include <align.h> |
#include "console.h" |
#include "gcons.h" |
#define CONSOLE_TOP 66 |
#define CONSOLE_MARGIN 6 |
#define STATUS_START 110 |
#define STATUS_TOP 8 |
#define STATUS_SPACE 4 |
#define STATUS_WIDTH 48 |
#define STATUS_HEIGHT 48 |
#define MAIN_COLOR 0xffffff |
static int use_gcons = 0; |
static ipcarg_t xres,yres; |
enum butstate { |
CONS_DISCONNECTED = 0, |
CONS_SELECTED, |
CONS_IDLE, |
CONS_HAS_DATA, |
CONS_KERNEL, |
CONS_DISCONNECTED_SEL, |
CONS_LAST |
}; |
static int console_vp; |
static int cstatus_vp[CONSOLE_COUNT]; |
static enum butstate console_state[CONSOLE_COUNT]; |
static int fbphone; |
/** List of pixmaps identifying these icons */ |
static int ic_pixmaps[CONS_LAST] = {-1, -1, -1, -1, -1, -1}; |
static int animation = -1; |
static int active_console = 0; |
static void vp_switch(int vp) |
{ |
async_msg_1(fbphone,FB_VIEWPORT_SWITCH, vp); |
} |
/** Create view port */ |
static int vp_create(unsigned int x, unsigned int y, unsigned int width, |
unsigned int height) |
{ |
return async_req_2_0(fbphone, FB_VIEWPORT_CREATE, (x << 16) | y, |
(width << 16) | height); |
} |
static void clear(void) |
{ |
async_msg_0(fbphone, FB_CLEAR); |
} |
static void set_style(int fgcolor, int bgcolor) |
{ |
async_msg_2(fbphone, FB_SET_STYLE, fgcolor, bgcolor); |
} |
/** Transparent putchar */ |
static void tran_putch(char c, int row, int col) |
{ |
async_msg_3(fbphone, FB_TRANS_PUTCHAR, c, row, col); |
} |
/** Redraw the button showing state of a given console */ |
static void redraw_state(int consnum) |
{ |
char data[5]; |
int i; |
enum butstate state = console_state[consnum]; |
vp_switch(cstatus_vp[consnum]); |
if (ic_pixmaps[state] != -1) |
async_msg_2(fbphone, FB_VP_DRAW_PIXMAP, cstatus_vp[consnum], |
ic_pixmaps[state]); |
if (state != CONS_DISCONNECTED && state != CONS_KERNEL && |
state != CONS_DISCONNECTED_SEL) { |
snprintf(data, 5, "%d", consnum + 1); |
for (i = 0; data[i]; i++) |
tran_putch(data[i], 1, 2 + i); |
} |
} |
/** Notification run on changing console (except kernel console) */ |
void gcons_change_console(int consnum) |
{ |
int i; |
if (!use_gcons) |
return; |
if (active_console == KERNEL_CONSOLE) { |
for (i = 0; i < CONSOLE_COUNT; i++) |
redraw_state(i); |
if (animation != -1) |
async_msg_1(fbphone, FB_ANIM_START, animation); |
} else { |
if (console_state[active_console] == CONS_DISCONNECTED_SEL) |
console_state[active_console] = CONS_DISCONNECTED; |
else |
console_state[active_console] = CONS_IDLE; |
redraw_state(active_console); |
} |
active_console = consnum; |
if (console_state[consnum] == CONS_DISCONNECTED) { |
console_state[consnum] = CONS_DISCONNECTED_SEL; |
redraw_state(consnum); |
} else |
console_state[consnum] = CONS_SELECTED; |
redraw_state(consnum); |
vp_switch(console_vp); |
} |
/** Notification function that gets called on new output to virtual console */ |
void gcons_notify_char(int consnum) |
{ |
if (!use_gcons) |
return; |
if (consnum == active_console || |
console_state[consnum] == CONS_HAS_DATA) |
return; |
console_state[consnum] = CONS_HAS_DATA; |
if (active_console == KERNEL_CONSOLE) |
return; |
redraw_state(consnum); |
vp_switch(console_vp); |
} |
/** Notification function called on service disconnect from console */ |
void gcons_notify_disconnect(int consnum) |
{ |
if (!use_gcons) |
return; |
if (active_console == consnum) |
console_state[consnum] = CONS_DISCONNECTED_SEL; |
else |
console_state[consnum] = CONS_DISCONNECTED; |
if (active_console == KERNEL_CONSOLE) |
return; |
redraw_state(consnum); |
vp_switch(console_vp); |
} |
/** Notification function called on console connect */ |
void gcons_notify_connect(int consnum) |
{ |
if (!use_gcons) |
return; |
if (active_console == consnum) |
console_state[consnum] = CONS_SELECTED; |
else |
console_state[consnum] = CONS_IDLE; |
if (active_console == KERNEL_CONSOLE) |
return; |
redraw_state(consnum); |
vp_switch(console_vp); |
} |
/** Change to kernel console */ |
void gcons_in_kernel(void) |
{ |
if (console_state[active_console] == CONS_DISCONNECTED_SEL) |
console_state[active_console] = CONS_DISCONNECTED; |
else |
console_state[active_console] = CONS_IDLE; |
redraw_state(active_console); |
if (animation != -1) |
async_msg_1(fbphone, FB_ANIM_STOP, animation); |
active_console = KERNEL_CONSOLE; /* Set to kernel console */ |
vp_switch(0); |
} |
/** Return x, where left <= x <= right && |a-x|==min(|a-x|) is smallest */ |
static inline int limit(int a,int left, int right) |
{ |
if (a < left) |
a = left; |
if (a >= right) |
a = right - 1; |
return a; |
} |
int mouse_x, mouse_y; |
int btn_pressed, btn_x, btn_y; |
/** Handle mouse move |
* |
* @param dx Delta X of mouse move |
* @param dy Delta Y of mouse move |
*/ |
void gcons_mouse_move(int dx, int dy) |
{ |
mouse_x = limit(mouse_x+dx, 0, xres); |
mouse_y = limit(mouse_y+dy, 0, yres); |
async_msg_2(fbphone, FB_POINTER_MOVE, mouse_x, mouse_y); |
} |
static int gcons_find_conbut(int x, int y) |
{ |
int status_start = STATUS_START + (xres - 800) / 2;; |
if (y < STATUS_TOP || y >= STATUS_TOP + STATUS_HEIGHT) |
return -1; |
if (x < status_start) |
return -1; |
if (x >= status_start + (STATUS_WIDTH + STATUS_SPACE) * CONSOLE_COUNT) |
return -1; |
if (((x - status_start) % (STATUS_WIDTH+STATUS_SPACE)) < STATUS_SPACE) |
return -1; |
return (x - status_start) / (STATUS_WIDTH+STATUS_SPACE); |
} |
/** Handle mouse click |
* |
* @param state New state (1-pressed, 0-depressed) |
*/ |
int gcons_mouse_btn(int state) |
{ |
int conbut; |
if (state) { |
conbut = gcons_find_conbut(mouse_x, mouse_y); |
if (conbut != -1) { |
btn_pressed = 1; |
btn_x = mouse_x; |
btn_y = mouse_y; |
} |
return -1; |
} |
if (!state && !btn_pressed) |
return -1; |
btn_pressed = 0; |
conbut = gcons_find_conbut(mouse_x, mouse_y); |
if (conbut == gcons_find_conbut(btn_x, btn_y)) |
return conbut; |
return -1; |
} |
/** Draw a PPM pixmap to framebuffer |
* |
* @param logo Pointer to PPM data |
* @param size Size of PPM data |
* @param x Coordinate of upper left corner |
* @param y Coordinate of upper left corner |
*/ |
static void draw_pixmap(char *logo, size_t size, int x, int y) |
{ |
char *shm; |
int rc; |
/* Create area */ |
shm = mmap(NULL, size, PROTO_READ | PROTO_WRITE, MAP_SHARED | |
MAP_ANONYMOUS, 0, 0); |
if (shm == MAP_FAILED) |
return; |
memcpy(shm, logo, size); |
/* Send area */ |
rc = async_req_1_0(fbphone, FB_PREPARE_SHM, (ipcarg_t) shm); |
if (rc) |
goto exit; |
rc = ipc_share_out_start(fbphone, shm, PROTO_READ); |
if (rc) |
goto drop; |
/* Draw logo */ |
async_msg_2(fbphone, FB_DRAW_PPM, x, y); |
drop: |
/* Drop area */ |
async_msg_0(fbphone, FB_DROP_SHM); |
exit: |
/* Remove area */ |
munmap(shm, size); |
} |
extern char _binary_helenos_ppm_start[0]; |
extern int _binary_helenos_ppm_size; |
extern char _binary_nameic_ppm_start[0]; |
extern int _binary_nameic_ppm_size; |
/** Redraws console graphics */ |
static void gcons_redraw_console(void) |
{ |
int i; |
if (!use_gcons) |
return; |
vp_switch(0); |
set_style(MAIN_COLOR, MAIN_COLOR); |
clear(); |
draw_pixmap(_binary_helenos_ppm_start, |
(size_t) &_binary_helenos_ppm_size, xres - 66, 2); |
draw_pixmap(_binary_nameic_ppm_start, |
(size_t) &_binary_nameic_ppm_size, 5, 17); |
for (i = 0; i < CONSOLE_COUNT; i++) |
redraw_state(i); |
vp_switch(console_vp); |
} |
/** Creates a pixmap on framebuffer |
* |
* @param data PPM data |
* @param size PPM data size |
* @return Pixmap identification |
*/ |
static int make_pixmap(char *data, int size) |
{ |
char *shm; |
int rc; |
int pxid = -1; |
/* Create area */ |
shm = mmap(NULL, size, PROTO_READ | PROTO_WRITE, MAP_SHARED | |
MAP_ANONYMOUS, 0, 0); |
if (shm == MAP_FAILED) |
return -1; |
memcpy(shm, data, size); |
/* Send area */ |
rc = async_req_1_0(fbphone, FB_PREPARE_SHM, (ipcarg_t) shm); |
if (rc) |
goto exit; |
rc = ipc_share_out_start(fbphone, shm, PROTO_READ); |
if (rc) |
goto drop; |
/* Obtain pixmap */ |
rc = async_req_0_0(fbphone, FB_SHM2PIXMAP); |
if (rc < 0) |
goto drop; |
pxid = rc; |
drop: |
/* Drop area */ |
async_msg_0(fbphone, FB_DROP_SHM); |
exit: |
/* Remove area */ |
munmap(shm, size); |
return pxid; |
} |
extern char _binary_anim_1_ppm_start[0]; |
extern int _binary_anim_1_ppm_size; |
extern char _binary_anim_2_ppm_start[0]; |
extern int _binary_anim_2_ppm_size; |
extern char _binary_anim_3_ppm_start[0]; |
extern int _binary_anim_3_ppm_size; |
extern char _binary_anim_4_ppm_start[0]; |
extern int _binary_anim_4_ppm_size; |
static void make_anim(void) |
{ |
int an; |
int pm; |
an = async_req_1_0(fbphone, FB_ANIM_CREATE, cstatus_vp[KERNEL_CONSOLE]); |
if (an < 0) |
return; |
pm = make_pixmap(_binary_anim_1_ppm_start, |
(int) &_binary_anim_1_ppm_size); |
async_msg_2(fbphone, FB_ANIM_ADDPIXMAP, an, pm); |
pm = make_pixmap(_binary_anim_2_ppm_start, |
(int) &_binary_anim_2_ppm_size); |
async_msg_2(fbphone, FB_ANIM_ADDPIXMAP, an, pm); |
pm = make_pixmap(_binary_anim_3_ppm_start, |
(int) &_binary_anim_3_ppm_size); |
async_msg_2(fbphone, FB_ANIM_ADDPIXMAP, an, pm); |
pm = make_pixmap(_binary_anim_4_ppm_start, |
(int) &_binary_anim_4_ppm_size); |
async_msg_2(fbphone, FB_ANIM_ADDPIXMAP, an, pm); |
async_msg_1(fbphone, FB_ANIM_START, an); |
animation = an; |
} |
extern char _binary_cons_selected_ppm_start[0]; |
extern int _binary_cons_selected_ppm_size; |
extern char _binary_cons_idle_ppm_start[0]; |
extern int _binary_cons_idle_ppm_size; |
extern char _binary_cons_has_data_ppm_start[0]; |
extern int _binary_cons_has_data_ppm_size; |
extern char _binary_cons_kernel_ppm_start[0]; |
extern int _binary_cons_kernel_ppm_size; |
/** Initialize nice graphical console environment */ |
void gcons_init(int phone) |
{ |
int rc; |
int i; |
int status_start = STATUS_START; |
fbphone = phone; |
rc = async_req_0_2(phone, FB_GET_RESOLUTION, &xres, &yres); |
if (rc) |
return; |
if (xres < 800 || yres < 600) |
return; |
/* create console viewport */ |
/* Align width & height to character size */ |
console_vp = vp_create(CONSOLE_MARGIN, CONSOLE_TOP, |
ALIGN_DOWN(xres - 2 * CONSOLE_MARGIN, 8), |
ALIGN_DOWN(yres - (CONSOLE_TOP + CONSOLE_MARGIN), 16)); |
if (console_vp < 0) |
return; |
/* Create status buttons */ |
status_start += (xres - 800) / 2; |
for (i = 0; i < CONSOLE_COUNT; i++) { |
cstatus_vp[i] = vp_create(status_start + CONSOLE_MARGIN + |
i * (STATUS_WIDTH + STATUS_SPACE), STATUS_TOP, |
STATUS_WIDTH, STATUS_HEIGHT); |
if (cstatus_vp[i] < 0) |
return; |
vp_switch(cstatus_vp[i]); |
set_style(0x202020, 0xffffff); |
} |
/* Initialize icons */ |
ic_pixmaps[CONS_SELECTED] = |
make_pixmap(_binary_cons_selected_ppm_start, |
(int) &_binary_cons_selected_ppm_size); |
ic_pixmaps[CONS_IDLE] = make_pixmap(_binary_cons_idle_ppm_start, |
(int) &_binary_cons_idle_ppm_size); |
ic_pixmaps[CONS_HAS_DATA] = |
make_pixmap(_binary_cons_has_data_ppm_start, |
(int) &_binary_cons_has_data_ppm_size); |
ic_pixmaps[CONS_DISCONNECTED] = |
make_pixmap(_binary_cons_idle_ppm_start, |
(int) &_binary_cons_idle_ppm_size); |
ic_pixmaps[CONS_KERNEL] = make_pixmap(_binary_cons_kernel_ppm_start, |
(int) &_binary_cons_kernel_ppm_size); |
ic_pixmaps[CONS_DISCONNECTED_SEL] = ic_pixmaps[CONS_SELECTED]; |
make_anim(); |
use_gcons = 1; |
console_state[0] = CONS_DISCONNECTED_SEL; |
console_state[KERNEL_CONSOLE] = CONS_KERNEL; |
gcons_redraw_console(); |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/srv/console/Makefile |
---|
0,0 → 1,88 |
# |
# Copyright (c) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
## Setup toolchain |
# |
LIBC_PREFIX = ../../lib/libc |
SOFTINT_PREFIX = ../../lib/softint |
include $(LIBC_PREFIX)/Makefile.toolchain |
CFLAGS += -I. -I../kbd/include -I../fb |
LIBS = $(LIBC_PREFIX)/libc.a |
## Sources |
# |
OUTPUT = console |
GENERIC_SOURCES = \ |
console.c \ |
screenbuffer.c \ |
../kbd/generic/key_buffer.c \ |
gcons.c |
IMAGES = helenos.ppm nameic.ppm cons_selected.ppm cons_idle.ppm \ |
cons_has_data.ppm cons_kernel.ppm anim_1.ppm anim_2.ppm anim_3.ppm \ |
anim_4.ppm |
ARCH_SOURCES = |
GENERIC_OBJECTS := $(addsuffix .o,$(basename $(GENERIC_SOURCES))) \ |
$(addsuffix .o,$(basename $(IMAGES))) |
ARCH_OBJECTS := $(addsuffix .o,$(basename $(ARCH_SOURCES))) |
.PHONY: all clean depend disasm |
all: $(OUTPUT) disasm |
-include Makefile.depend |
clean: |
-rm -f $(OUTPUT) $(OUTPUT).map $(OUTPUT).disasm Makefile.depend |
depend: |
$(CC) $(DEFS) $(CFLAGS) -M $(SOURCES) > Makefile.depend |
$(OUTPUT): $(ARCH_OBJECTS) $(GENERIC_OBJECTS) $(LIBS) |
$(LD) -T $(LIBC_PREFIX)/arch/$(ARCH)/_link.ld -e __entry_driver $(GENERIC_OBJECTS) $(ARCH_OBJECTS) $(LIBS) $(LFLAGS) -o $@ -Map $(OUTPUT).map |
disasm: |
$(OBJDUMP) -d $(OUTPUT) >$(OUTPUT).disasm |
%.o: %.S |
$(CC) $(DEFS) $(AFLAGS) $(CFLAGS) -D__ASM__ -c $< -o $@ |
%.o: %.s |
$(AS) $(AFLAGS) $< -o $@ |
%.o: %.c |
$(CC) $(DEFS) $(CFLAGS) -c $< -o $@ |
%.o: %.ppm |
$(OBJCOPY) -I binary -O $(BFD_NAME) -B $(BFD_ARCH) $< $@ |
/tags/0.3.0/uspace/srv/console/console.h |
---|
0,0 → 1,54 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup console |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __CONSOLE_H__ |
#define __CONSOLE_H__ |
#define KERNEL_CONSOLE 11 |
#define CONSOLE_COUNT 12 |
#define CONSOLE_GETCHAR 1026 |
#define CONSOLE_PUTCHAR 1027 |
#define CONSOLE_CLEAR 1028 |
#define CONSOLE_GOTO 1029 |
#define CONSOLE_GETSIZE 1030 |
#define CONSOLE_FLUSH 1031 |
#define CONSOLE_SET_STYLE 1032 |
#define CONSOLE_CURSOR_VISIBILITY 1033 |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/srv/console/screenbuffer.c |
---|
0,0 → 1,147 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup console |
* @{ |
*/ |
/** @file |
*/ |
#include <screenbuffer.h> |
#include <malloc.h> |
#include <unistd.h> |
/** Store one character to screenbuffer. Its position is determined by |
* scr->position_x and scr->position_y. |
* |
* @param scr screenbuffer |
* @param c stored character |
*/ |
void screenbuffer_putchar(screenbuffer_t *scr, char c) |
{ |
keyfield_t *field; |
field = get_field_at(scr, scr->position_x, scr->position_y); |
field->character = c; |
field->style = scr->style; |
} |
/** Initilize screenbuffer. Allocate space for screen content in accordance to given size. |
* @param scr initialized screenbuffer |
* @param size_x width in characters |
* @param size_y height in characters |
* @return pointer to screenbuffer (same as scr parameter) or NULL |
*/ |
screenbuffer_t *screenbuffer_init(screenbuffer_t *scr, int size_x, int size_y) |
{ |
scr->buffer = (keyfield_t *) malloc(sizeof(keyfield_t) * size_x * size_y); |
if (!scr->buffer) { |
return NULL; |
} |
scr->size_x = size_x; |
scr->size_y = size_y; |
scr->style.fg_color = DEFAULT_FOREGROUND; |
scr->style.bg_color = DEFAULT_BACKGROUND; |
scr->is_cursor_visible = 1; |
screenbuffer_clear(scr); |
return scr; |
} |
/** Clear screenbuffer. |
* @param scr screenbuffer |
*/ |
void screenbuffer_clear(screenbuffer_t *scr) |
{ |
unsigned int i; |
for (i = 0; i < (scr->size_x * scr->size_y); i++) { |
scr->buffer[i].character = ' '; |
scr->buffer[i].style = scr->style; |
} |
scr->top_line = 0; |
scr->position_y = 0; |
scr->position_x = 0; |
} |
/** Clear one buffer line. |
* @param scr |
* @param line One buffer line (not a screen line!) |
*/ |
void screenbuffer_clear_line(screenbuffer_t *scr, unsigned int line) |
{ |
unsigned int i; |
for (i = 0; i < scr->size_x; i++) { |
scr->buffer[i + line * scr->size_x].character = ' '; |
scr->buffer[i + line * scr->size_x].style = scr->style; |
} |
} |
/** Copy content buffer from screenbuffer to given memory. |
* @param scr source screenbuffer |
* @param dest destination |
*/ |
void screenbuffer_copy_buffer(screenbuffer_t *scr, keyfield_t *dest) |
{ |
unsigned int i; |
for (i = 0; i < scr->size_x * scr->size_y; i++) { |
dest[i] = scr->buffer[i]; |
} |
} |
/** Set new cursor position in screenbuffer. |
* @param scr |
* @param x |
* @param y |
*/ |
void screenbuffer_goto(screenbuffer_t *scr, unsigned int x, unsigned int y) |
{ |
scr->position_x = x % scr->size_x; |
scr->position_y = y % scr->size_y; |
} |
/** Set new style. |
* @param scr |
* @param fg_color |
* @param bg_color |
*/ |
void screenbuffer_set_style(screenbuffer_t *scr, unsigned int fg_color, unsigned int bg_color) |
{ |
scr->style.fg_color = fg_color; |
scr->style.bg_color = bg_color; |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/srv/console/gcons.h |
---|
0,0 → 1,50 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup console |
* @{ |
*/ |
/** @file |
*/ |
#ifndef _GCONS_H_ |
#define _GCONS_H_ |
void gcons_init(int phone); |
void gcons_change_console(int consnum); |
void gcons_notify_char(int consnum); |
void gcons_in_kernel(void); |
void gcons_notify_connect(int consnum); |
void gcons_notify_disconnect(int consnum); |
void gcons_mouse_move(int dx, int dy); |
int gcons_mouse_btn(int state); |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/srv/console/screenbuffer.h |
---|
0,0 → 1,100 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup console |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __SCREENBUFFER_H__ |
#define __SCREENBUFFER_H__ |
#define DEFAULT_FOREGROUND 0x0 /**< default console foreground color */ |
#define DEFAULT_BACKGROUND 0xf0f0f0 /**< default console background color */ |
typedef struct { |
unsigned int bg_color; /**< background color */ |
unsigned int fg_color; /**< foreground color */ |
} style_t; |
/** One field on screen. It contain one character and its attributes. */ |
typedef struct { |
char character; /**< Character itself */ |
style_t style; /**< Character`s attributes */ |
} keyfield_t; |
/** Structure for buffering state of one virtual console. |
*/ |
typedef struct { |
keyfield_t *buffer; /**< Screen content - characters and its style. Used as cyclyc buffer. */ |
unsigned int size_x, size_y; /**< Number of columns and rows */ |
unsigned int position_x, position_y; /**< Coordinates of last printed character for determining cursor position */ |
style_t style; /**< Current style */ |
unsigned int top_line; /**< Points to buffer[][] line that will be printed at screen as the first line */ |
unsigned char is_cursor_visible; /**< Cursor state - default is visible */ |
} screenbuffer_t; |
/** Returns keyfield for position on screen. Screenbuffer->buffer is cyclic buffer so we must couted in index of the topmost line. |
* @param scr screenbuffer |
* @param x position on screen |
* @param y position on screen |
* @return keyfield structure with character and its attributes on x,y |
*/ |
static inline keyfield_t *get_field_at(screenbuffer_t *scr, unsigned int x, unsigned int y) |
{ |
return scr->buffer + x + ((y + scr->top_line) % scr->size_y) * scr->size_x; |
} |
/** Compares two styles. |
* @param s1 first style |
* @param s2 second style |
* @return nonzero on equality |
*/ |
static inline int style_same(style_t s1, style_t s2) |
{ |
return s1.fg_color == s2.fg_color && s1.bg_color == s2.bg_color; |
} |
void screenbuffer_putchar(screenbuffer_t *scr, char c); |
screenbuffer_t *screenbuffer_init(screenbuffer_t *scr, int size_x, int size_y); |
void screenbuffer_clear(screenbuffer_t *scr); |
void screenbuffer_clear_line(screenbuffer_t *scr, unsigned int line); |
void screenbuffer_copy_buffer(screenbuffer_t *scr, keyfield_t *dest); |
void screenbuffer_goto(screenbuffer_t *scr, unsigned int x, unsigned int y); |
void screenbuffer_set_style(screenbuffer_t *scr, unsigned int fg_color, unsigned int bg_color); |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/srv/console/cons_kernel.ppm |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/tags/0.3.0/uspace/srv/console/anim_1.ppm |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/tags/0.3.0/uspace/srv/console/anim_2.ppm |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/tags/0.3.0/uspace/srv/console/anim_3.ppm |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/tags/0.3.0/uspace/srv/console/anim_4.ppm |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/tags/0.3.0/uspace/srv/console/cons_has_data.ppm |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/tags/0.3.0/uspace/srv/console/cons_selected.ppm |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/tags/0.3.0/uspace/srv/console/cons_idle.ppm |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/tags/0.3.0/uspace/srv/console/nameic.ppm |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/tags/0.3.0/uspace/srv/console/helenos.ppm |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/tags/0.3.0/uspace/srv/rd/rd.c |
---|
0,0 → 1,228 |
/* |
* Copyright (c) 2007 Michal Konopa |
* Copyright (c) 2007 Martin Jelen |
* Copyright (c) 2007 Peter Majer |
* Copyright (c) 2007 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup rd |
* @{ |
*/ |
/** |
* @file rd.c |
* @brief Initial RAM disk for HelenOS. |
*/ |
#include <ipc/ipc.h> |
#include <ipc/services.h> |
#include <ipc/ns.h> |
#include <sysinfo.h> |
#include <as.h> |
#include <ddi.h> |
#include <align.h> |
#include <bool.h> |
#include <errno.h> |
#include <async.h> |
#include <align.h> |
#include <async.h> |
#include <futex.h> |
#include "rd.h" |
/** Pointer to the ramdisk's image. */ |
static void *rd_addr; |
/** Size of the ramdisk. */ |
static size_t rd_size; |
/** |
* This futex protects the ramdisk's data. |
* If we were to serve multiple requests (read + write or several writes) |
* concurrently (i.e. from two or more threads), each read and write needs to be |
* protected by this futex. |
*/ |
atomic_t rd_futex = FUTEX_INITIALIZER; |
/** Handle one connection to ramdisk. |
* |
* @param iid Hash of the request that opened the connection. |
* @param icall Call data of the request that opened the connection. |
*/ |
static void rd_connection(ipc_callid_t iid, ipc_call_t *icall) |
{ |
ipc_callid_t callid; |
ipc_call_t call; |
int retval; |
void *fs_va = NULL; |
ipcarg_t offset; |
/* |
* We allocate VA for communication per connection. |
* This allows us to potentionally have more clients and work |
* concurrently. |
*/ |
fs_va = as_get_mappable_page(ALIGN_UP(BLOCK_SIZE, PAGE_SIZE)); |
if (!fs_va) { |
/* |
* Hang up the phone if we cannot proceed any further. |
* This is the answer to the call that opened the connection. |
*/ |
ipc_answer_0(iid, EHANGUP); |
return; |
} else { |
/* |
* Answer the first IPC_M_CONNECT_ME_TO call. |
* Return supported block size as ARG1. |
*/ |
ipc_answer_1(iid, EOK, BLOCK_SIZE); |
} |
/* |
* Now we wait for the client to send us its communication as_area. |
*/ |
size_t size; |
if (ipc_share_out_receive(&callid, &size, NULL)) { |
if (size >= BLOCK_SIZE) { |
/* |
* The client sends an as_area that can absorb the whole |
* block. |
*/ |
(void) ipc_share_out_finalize(callid, fs_va); |
} else { |
/* |
* The client offered as_area too small. |
* Close the connection. |
*/ |
ipc_answer_0(callid, EHANGUP); |
return; |
} |
} else { |
/* |
* The client doesn't speak the same protocol. |
* At this point we can't handle protocol variations. |
* Close the connection. |
*/ |
ipc_answer_0(callid, EHANGUP); |
return; |
} |
while (1) { |
callid = async_get_call(&call); |
switch (IPC_GET_METHOD(call)) { |
case IPC_M_PHONE_HUNGUP: |
/* |
* The other side has hung up. |
* Answer the message and exit the fibril. |
*/ |
ipc_answer_0(callid, EOK); |
return; |
case RD_READ_BLOCK: |
offset = IPC_GET_ARG1(call); |
if (offset * BLOCK_SIZE > rd_size - BLOCK_SIZE) { |
/* |
* Reading past the end of the device. |
*/ |
retval = ELIMIT; |
break; |
} |
futex_down(&rd_futex); |
memcpy(fs_va, rd_addr + offset, BLOCK_SIZE); |
futex_up(&rd_futex); |
retval = EOK; |
break; |
case RD_WRITE_BLOCK: |
offset = IPC_GET_ARG1(call); |
if (offset * BLOCK_SIZE > rd_size - BLOCK_SIZE) { |
/* |
* Writing past the end of the device. |
*/ |
retval = ELIMIT; |
break; |
} |
futex_up(&rd_futex); |
memcpy(rd_addr + offset, fs_va, BLOCK_SIZE); |
futex_down(&rd_futex); |
retval = EOK; |
break; |
default: |
/* |
* The client doesn't speak the same protocol. |
* Instead of closing the connection, we just ignore |
* the call. This can be useful if the client uses a |
* newer version of the protocol. |
*/ |
retval = EINVAL; |
break; |
} |
ipc_answer_0(callid, retval); |
} |
} |
/** Prepare the ramdisk image for operation. */ |
static bool rd_init(void) |
{ |
int retval, flags; |
rd_size = sysinfo_value("rd.size"); |
void *rd_ph_addr = (void *) sysinfo_value("rd.address.physical"); |
if (rd_size == 0) |
return false; |
rd_addr = as_get_mappable_page(rd_size); |
flags = AS_AREA_READ | AS_AREA_WRITE | AS_AREA_CACHEABLE; |
retval = physmem_map(rd_ph_addr, rd_addr, |
ALIGN_UP(rd_size, PAGE_SIZE) >> PAGE_WIDTH, flags); |
if (retval < 0) |
return false; |
return true; |
} |
int main(int argc, char **argv) |
{ |
if (rd_init()) { |
ipcarg_t phonead; |
async_set_client_connection(rd_connection); |
/* Register service at nameserver */ |
if (ipc_connect_to_me(PHONE_NS, SERVICE_RD, 0, 0, &phonead) != 0) |
return -1; |
async_manager(); |
/* Never reached */ |
return 0; |
} |
return -1; |
} |
/** |
* @} |
*/ |
/tags/0.3.0/uspace/srv/rd/Makefile |
---|
0,0 → 1,72 |
# |
# Copyright (c) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
## Setup toolchain |
# |
LIBC_PREFIX = ../../lib/libc |
SOFTINT_PREFIX = ../../lib/softint |
include $(LIBC_PREFIX)/Makefile.toolchain |
LIBS = $(LIBC_PREFIX)/libc.a |
## Sources |
# |
OUTPUT = rd |
SOURCES = \ |
rd.c |
OBJECTS := $(addsuffix .o,$(basename $(SOURCES))) |
.PHONY: all clean depend disasm |
all: $(OUTPUT) disasm |
-include Makefile.depend |
clean: |
-rm -f $(OUTPUT) $(OUTPUT).map $(OUTPUT).disasm Makefile.depend |
depend: |
$(CC) $(DEFS) $(CFLAGS) -M $(SOURCES) > Makefile.depend |
$(OUTPUT): $(OBJECTS) $(LIBS) |
$(LD) -T $(LIBC_PREFIX)/arch/$(ARCH)/_link.ld -e __entry_driver $(OBJECTS) $(LIBS) $(LFLAGS) -o $@ -Map $(OUTPUT).map |
disasm: |
$(OBJDUMP) -d $(OUTPUT) >$(OUTPUT).disasm |
%.o: %.S |
$(CC) $(DEFS) $(AFLAGS) $(CFLAGS) -D__ASM__ -c $< -o $@ |
%.o: %.s |
$(AS) $(AFLAGS) $< -o $@ |
%.o: %.c |
$(CC) $(DEFS) $(CFLAGS) -c $< -o $@ |
/tags/0.3.0/uspace/srv/rd/rd.h |
---|
0,0 → 1,52 |
/* |
* Copyright (c) 2007 Michal Konopa |
* Copyright (c) 2007 Martin Jelen |
* Copyright (c) 2007 Peter Majer |
* Copyright (c) 2007 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup rd |
* @{ |
*/ |
/** |
* @file rd.h |
* @brief Initial RAM disk for HelenOS - header |
*/ |
/* Basic constants. */ |
#ifndef RD_RD_H_ |
#define RD_RD_H_ |
#define BLOCK_SIZE 1024 /**< Working block size */ |
#define RD_BASE 1024 |
#define RD_READ_BLOCK (RD_BASE + 1) /**< Method for reading block. */ |
#define RD_WRITE_BLOCK (RD_BASE + 2) /**< Method for writing block. */ |
#endif |
/tags/0.3.0/uspace/srv/devmap/devmap.c |
---|
0,0 → 1,750 |
/* |
* Copyright (c) 2007 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** |
* @defgroup devmap Device mapper. |
* @brief HelenOS device mapper. |
* @{ |
*/ |
/** @file |
*/ |
#include <ipc/services.h> |
#include <ipc/ns.h> |
#include <async.h> |
#include <stdio.h> |
#include <errno.h> |
#include <bool.h> |
#include <futex.h> |
#include <stdlib.h> |
#include <string.h> |
#include "devmap.h" |
LIST_INITIALIZE(devices_list); |
LIST_INITIALIZE(drivers_list); |
/* order of locking: |
* drivers_list_futex |
* devices_list_futex |
* (devmap_driver_t *)->devices_futex |
* create_handle_futex |
**/ |
static atomic_t devices_list_futex = FUTEX_INITIALIZER; |
static atomic_t drivers_list_futex = FUTEX_INITIALIZER; |
static atomic_t create_handle_futex = FUTEX_INITIALIZER; |
static int devmap_create_handle(void) |
{ |
static int last_handle = 0; |
int handle; |
/* TODO: allow reusing old handles after their unregistration |
and implement some version of LRU algorithm */ |
/* FIXME: overflow */ |
futex_down(&create_handle_futex); |
last_handle += 1; |
handle = last_handle; |
futex_up(&create_handle_futex); |
return handle; |
} |
/** Initialize device mapper. |
* |
* |
*/ |
static int devmap_init() |
{ |
/* TODO: */ |
return EOK; |
} |
/** Find device with given name. |
* |
*/ |
static devmap_device_t *devmap_device_find_name(const char *name) |
{ |
link_t *item; |
devmap_device_t *device = NULL; |
item = devices_list.next; |
while (item != &devices_list) { |
device = list_get_instance(item, devmap_device_t, devices); |
if (0 == strcmp(device->name, name)) { |
break; |
} |
item = item->next; |
} |
if (item == &devices_list) { |
printf("DEVMAP: no device named %s.\n", name); |
return NULL; |
} |
device = list_get_instance(item, devmap_device_t, devices); |
return device; |
} |
/** Find device with given handle. |
* @todo: use hash table |
*/ |
static devmap_device_t *devmap_device_find_handle(int handle) |
{ |
link_t *item; |
devmap_device_t *device = NULL; |
futex_down(&devices_list_futex); |
item = (&devices_list)->next; |
while (item != &devices_list) { |
device = list_get_instance(item, devmap_device_t, devices); |
if (device->handle == handle) { |
break; |
} |
item = item->next; |
} |
if (item == &devices_list) { |
futex_up(&devices_list_futex); |
return NULL; |
} |
device = list_get_instance(item, devmap_device_t, devices); |
futex_up(&devices_list_futex); |
return device; |
} |
/** |
* Unregister device and free it. It's assumed that driver's device list is |
* already locked. |
*/ |
static int devmap_device_unregister_core(devmap_device_t *device) |
{ |
list_remove(&(device->devices)); |
list_remove(&(device->driver_devices)); |
free(device->name); |
free(device); |
return EOK; |
} |
/** |
* Read info about new driver and add it into linked list of registered |
* drivers. |
*/ |
static void devmap_driver_register(devmap_driver_t **odriver) |
{ |
size_t name_size; |
ipc_callid_t callid; |
ipc_call_t call; |
devmap_driver_t *driver; |
ipc_callid_t iid; |
ipc_call_t icall; |
*odriver = NULL; |
iid = async_get_call(&icall); |
if (IPC_GET_METHOD(icall) != DEVMAP_DRIVER_REGISTER) { |
ipc_answer_0(iid, EREFUSED); |
return; |
} |
if (NULL == |
(driver = (devmap_driver_t *)malloc(sizeof(devmap_driver_t)))) { |
ipc_answer_0(iid, ENOMEM); |
return; |
} |
/* |
* Get driver name |
*/ |
if (!ipc_data_write_receive(&callid, &name_size)) { |
printf("Unexpected request.\n"); |
free(driver); |
ipc_answer_0(callid, EREFUSED); |
ipc_answer_0(iid, EREFUSED); |
return; |
} |
if (name_size > DEVMAP_NAME_MAXLEN) { |
printf("Too logn name: %u: maximum is %u.\n", name_size, |
DEVMAP_NAME_MAXLEN); |
free(driver); |
ipc_answer_0(callid, EINVAL); |
ipc_answer_0(iid, EREFUSED); |
return; |
} |
/* |
* Allocate buffer for device name. |
*/ |
if (NULL == (driver->name = (char *)malloc(name_size + 1))) { |
printf("Cannot allocate space for driver name.\n"); |
free(driver); |
ipc_answer_0(callid, ENOMEM); |
ipc_answer_0(iid, EREFUSED); |
return; |
} |
/* |
* Send confirmation to sender and get data into buffer. |
*/ |
if (EOK != ipc_data_write_finalize(callid, driver->name, name_size)) { |
printf("Cannot read driver name.\n"); |
free(driver->name); |
free(driver); |
ipc_answer_0(iid, EREFUSED); |
return; |
} |
driver->name[name_size] = 0; |
printf("Read driver name: '%s'.\n", driver->name); |
/* Initialize futex for list of devices owned by this driver */ |
futex_initialize(&(driver->devices_futex), 1); |
/* |
* Initialize list of asociated devices |
*/ |
list_initialize(&(driver->devices)); |
/* |
* Create connection to the driver |
*/ |
callid = async_get_call(&call); |
if (IPC_M_CONNECT_TO_ME != IPC_GET_METHOD(call)) { |
printf("DEVMAP: Unexpected method: %u.\n", |
IPC_GET_METHOD(call)); |
ipc_answer_0(callid, ENOTSUP); |
free(driver->name); |
free(driver); |
ipc_answer_0(iid, ENOTSUP); |
return; |
} |
driver->phone = IPC_GET_ARG5(call); |
ipc_answer_0(callid, EOK); |
list_initialize(&(driver->drivers)); |
futex_down(&drivers_list_futex); |
/* TODO: |
* check that no driver with name equal to driver->name is registered |
*/ |
/* |
* Insert new driver into list of registered drivers |
*/ |
list_append(&(driver->drivers), &drivers_list); |
futex_up(&drivers_list_futex); |
ipc_answer_0(iid, EOK); |
printf("Driver registered.\n"); |
*odriver = driver; |
return; |
} |
/** Unregister device driver, unregister all its devices and free driver |
* structure. |
*/ |
static int devmap_driver_unregister(devmap_driver_t *driver) |
{ |
devmap_device_t *device; |
if (NULL == driver) { |
printf("Error: driver == NULL.\n"); |
return EEXISTS; |
} |
printf("Unregister driver '%s'.\n", driver->name); |
futex_down(&drivers_list_futex); |
ipc_hangup(driver->phone); |
/* remove it from list of drivers */ |
list_remove(&(driver->drivers)); |
/* unregister all its devices */ |
futex_down(&devices_list_futex); |
futex_down(&(driver->devices_futex)); |
while (!list_empty(&(driver->devices))) { |
device = list_get_instance(driver->devices.next, |
devmap_device_t, driver_devices); |
printf("Unregister device '%s'.\n", device->name); |
devmap_device_unregister_core(device); |
} |
futex_up(&(driver->devices_futex)); |
futex_up(&devices_list_futex); |
futex_up(&drivers_list_futex); |
/* free name and driver */ |
if (NULL != driver->name) { |
free(driver->name); |
} |
free(driver); |
printf("Driver unregistered.\n"); |
return EOK; |
} |
/** Register instance of device |
* |
*/ |
static void devmap_device_register(ipc_callid_t iid, ipc_call_t *icall, |
devmap_driver_t *driver) |
{ |
ipc_callid_t callid; |
size_t size; |
devmap_device_t *device; |
if (NULL == driver) { |
printf("Invalid driver registration.\n"); |
ipc_answer_0(iid, EREFUSED); |
return; |
} |
/* Create new device entry */ |
if (NULL == |
(device = (devmap_device_t *)malloc(sizeof(devmap_device_t)))) { |
printf("Cannot allocate new device.\n"); |
ipc_answer_0(iid, ENOMEM); |
return; |
} |
/* Get device name */ |
if (!ipc_data_write_receive(&callid, &size)) { |
free(device); |
printf("Cannot read device name.\n"); |
ipc_answer_0(iid, EREFUSED); |
return; |
} |
if (size > DEVMAP_NAME_MAXLEN) { |
printf("Too long device name: %u.\n", size); |
free(device); |
ipc_answer_0(callid, EINVAL); |
ipc_answer_0(iid, EREFUSED); |
return; |
} |
/* +1 for terminating \0 */ |
device->name = (char *)malloc(size + 1); |
if (NULL == device->name) { |
printf("Cannot read device name.\n"); |
free(device); |
ipc_answer_0(callid, ENOMEM); |
ipc_answer_0(iid, EREFUSED); |
return; |
} |
ipc_data_write_finalize(callid, device->name, size); |
device->name[size] = 0; |
list_initialize(&(device->devices)); |
list_initialize(&(device->driver_devices)); |
futex_down(&devices_list_futex); |
/* Check that device with such name is not already registered */ |
if (NULL != devmap_device_find_name(device->name)) { |
printf("Device '%s' already registered.\n", device->name); |
futex_up(&devices_list_futex); |
free(device->name); |
free(device); |
ipc_answer_0(iid, EEXISTS); |
return; |
} |
/* Get unique device handle */ |
device->handle = devmap_create_handle(); |
device->driver = driver; |
/* Insert device into list of all devices */ |
list_append(&device->devices, &devices_list); |
/* Insert device into list of devices that belog to one driver */ |
futex_down(&device->driver->devices_futex); |
list_append(&device->driver_devices, &device->driver->devices); |
futex_up(&device->driver->devices_futex); |
futex_up(&devices_list_futex); |
printf("Device '%s' registered.\n", device->name); |
ipc_answer_1(iid, EOK, device->handle); |
return; |
} |
/** |
* |
*/ |
static int devmap_device_unregister(ipc_callid_t iid, ipc_call_t *icall, |
devmap_driver_t *driver) |
{ |
/* TODO */ |
return EOK; |
} |
/** Connect client to the device. |
* Find device driver owning requested device and forward |
* the message to it. |
*/ |
static void devmap_forward(ipc_callid_t callid, ipc_call_t *call) |
{ |
devmap_device_t *dev; |
int handle; |
/* |
* Get handle from request |
*/ |
handle = IPC_GET_ARG2(*call); |
dev = devmap_device_find_handle(handle); |
if (NULL == dev) { |
printf("DEVMAP: No registered device with handle %d.\n", |
handle); |
ipc_answer_0(callid, ENOENT); |
return; |
} |
ipc_forward_fast(callid, dev->driver->phone, (ipcarg_t)(dev->handle), |
IPC_GET_ARG3(*call), 0, IPC_FF_NONE); |
return; |
} |
/** Find handle for device instance identified by name. |
* In answer will be send EOK and device handle in arg1 or a error |
* code from errno.h. |
*/ |
static void devmap_get_handle(ipc_callid_t iid, ipc_call_t *icall) |
{ |
char *name = NULL; |
size_t name_size; |
const devmap_device_t *dev; |
ipc_callid_t callid; |
ipcarg_t retval; |
/* |
* Wait for incoming message with device name (but do not |
* read the name itself until the buffer is allocated). |
*/ |
if (!ipc_data_write_receive(&callid, &name_size)) { |
ipc_answer_0(callid, EREFUSED); |
ipc_answer_0(iid, EREFUSED); |
return; |
} |
if (name_size > DEVMAP_NAME_MAXLEN) { |
ipc_answer_0(callid, EINVAL); |
ipc_answer_0(iid, EREFUSED); |
return; |
} |
/* |
* Allocate buffer for device name. |
*/ |
if (NULL == (name = (char *)malloc(name_size))) { |
ipc_answer_0(callid, ENOMEM); |
ipc_answer_0(iid, EREFUSED); |
return; |
} |
/* |
* Send confirmation to sender and get data into buffer. |
*/ |
if (EOK != (retval = ipc_data_write_finalize(callid, name, |
name_size))) { |
ipc_answer_0(iid, EREFUSED); |
return; |
} |
/* |
* Find device name in linked list of known devices. |
*/ |
dev = devmap_device_find_name(name); |
/* |
* Device was not found. |
*/ |
if (NULL == dev) { |
printf("DEVMAP: device %s has not been registered.\n", name); |
ipc_answer_0(iid, ENOENT); |
return; |
} |
printf("DEVMAP: device %s has handler %d.\n", name, dev->handle); |
ipc_answer_1(iid, EOK, dev->handle); |
return; |
} |
/** Find name of device identified by id and send it to caller. |
* |
*/ |
static void devmap_get_name(ipc_callid_t iid, ipc_call_t *icall) |
{ |
const devmap_device_t *device; |
size_t name_size; |
device = devmap_device_find_handle(IPC_GET_ARG1(*icall)); |
/* |
* Device not found. |
*/ |
if (NULL == device) { |
ipc_answer_0(iid, ENOENT); |
return; |
} |
ipc_answer_0(iid, EOK); |
name_size = strlen(device->name); |
/* FIXME: |
we have no channel from DEVMAP to client -> |
sending must be initiated by client |
int rc = ipc_data_write_send(phone, device->name, name_size); |
if (rc != EOK) { |
async_wait_for(req, NULL); |
return rc; |
} |
*/ |
/* TODO: send name in response */ |
return; |
} |
/** Handle connection with device driver. |
* |
*/ |
static void |
devmap_connection_driver(ipc_callid_t iid, ipc_call_t *icall) |
{ |
ipc_callid_t callid; |
ipc_call_t call; |
bool cont = true; |
devmap_driver_t *driver = NULL; |
ipc_answer_0(iid, EOK); |
devmap_driver_register(&driver); |
if (NULL == driver) { |
printf("DEVMAP: driver registration failed.\n"); |
return; |
} |
while (cont) { |
callid = async_get_call(&call); |
switch (IPC_GET_METHOD(call)) { |
case IPC_M_PHONE_HUNGUP: |
printf("DEVMAP: connection hung up.\n"); |
cont = false; |
continue; /* Exit thread */ |
case DEVMAP_DRIVER_UNREGISTER: |
printf("DEVMAP: unregister driver.\n"); |
if (NULL == driver) { |
printf("DEVMAP: driver was not registered!\n"); |
ipc_answer_0(callid, ENOENT); |
} else { |
ipc_answer_0(callid, EOK); |
} |
break; |
case DEVMAP_DEVICE_REGISTER: |
/* Register one instance of device */ |
devmap_device_register(callid, &call, driver); |
break; |
case DEVMAP_DEVICE_UNREGISTER: |
/* Remove instance of device identified by handler */ |
devmap_device_unregister(callid, &call, driver); |
break; |
case DEVMAP_DEVICE_GET_HANDLE: |
devmap_get_handle(callid, &call); |
break; |
case DEVMAP_DEVICE_GET_NAME: |
devmap_get_handle(callid, &call); |
break; |
default: |
if (!(callid & IPC_CALLID_NOTIFICATION)) { |
ipc_answer_0(callid, ENOENT); |
} |
} |
} |
if (NULL != driver) { |
/* |
* Unregister the device driver and all its devices. |
*/ |
devmap_driver_unregister(driver); |
driver = NULL; |
} |
} |
/** Handle connection with device client. |
* |
*/ |
static void |
devmap_connection_client(ipc_callid_t iid, ipc_call_t *icall) |
{ |
ipc_callid_t callid; |
ipc_call_t call; |
bool cont = true; |
ipc_answer_0(iid, EOK); /* Accept connection */ |
while (cont) { |
callid = async_get_call(&call); |
switch (IPC_GET_METHOD(call)) { |
case IPC_M_PHONE_HUNGUP: |
printf("DEVMAP: connection hung up.\n"); |
cont = false; |
continue; /* Exit thread */ |
case DEVMAP_DEVICE_GET_HANDLE: |
devmap_get_handle(callid, &call); |
break; |
case DEVMAP_DEVICE_GET_NAME: |
/* TODO */ |
devmap_get_name(callid, &call); |
break; |
default: |
if (!(callid & IPC_CALLID_NOTIFICATION)) { |
ipc_answer_0(callid, ENOENT); |
} |
} |
} |
} |
/** Function for handling connections to devmap |
* |
*/ |
static void |
devmap_connection(ipc_callid_t iid, ipc_call_t *icall) |
{ |
printf("DEVMAP: new connection.\n"); |
/* Select interface */ |
switch ((ipcarg_t)(IPC_GET_ARG1(*icall))) { |
case DEVMAP_DRIVER: |
devmap_connection_driver(iid, icall); |
break; |
case DEVMAP_CLIENT: |
devmap_connection_client(iid, icall); |
break; |
case DEVMAP_CONNECT_TO_DEVICE: |
/* Connect client to selected device */ |
printf("DEVMAP: connect to device %d.\n", |
IPC_GET_ARG2(*icall)); |
devmap_forward(iid, icall); |
break; |
default: |
ipc_answer_0(iid, ENOENT); /* No such interface */ |
printf("DEVMAP: Unknown interface %u.\n", |
(ipcarg_t)(IPC_GET_ARG1(*icall))); |
} |
/* Cleanup */ |
printf("DEVMAP: connection closed.\n"); |
return; |
} |
/** |
* |
*/ |
int main(int argc, char *argv[]) |
{ |
ipcarg_t phonead; |
printf("DEVMAP: HelenOS device mapper.\n"); |
if (devmap_init() != 0) { |
printf("Error while initializing DEVMAP service.\n"); |
return -1; |
} |
/* Set a handler of incomming connections */ |
async_set_client_connection(devmap_connection); |
/* Register device mapper at naming service */ |
if (ipc_connect_to_me(PHONE_NS, SERVICE_DEVMAP, 0, 0, &phonead) != 0) |
return -1; |
async_manager(); |
/* Never reached */ |
return 0; |
} |
/** |
* @} |
*/ |
/tags/0.3.0/uspace/srv/devmap/devmap.h |
---|
0,0 → 1,99 |
/* |
* Copyright (c) 2007 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup devmap |
* @{ |
*/ |
#ifndef DEVMAP_DEVMAP_H_ |
#define DEVMAP_DEVMAP_H_ |
#include <ipc/ipc.h> |
#include <libadt/list.h> |
#define DEVMAP_NAME_MAXLEN 512 |
typedef enum { |
DEVMAP_DRIVER_REGISTER = IPC_FIRST_USER_METHOD, |
DEVMAP_DRIVER_UNREGISTER, |
DEVMAP_DEVICE_REGISTER, |
DEVMAP_DEVICE_UNREGISTER, |
DEVMAP_DEVICE_GET_NAME, |
DEVMAP_DEVICE_GET_HANDLE |
} devmap_request_t; |
/** Representation of device driver. |
* Each driver is responsible for a set of devices. |
*/ |
typedef struct { |
/** Pointers to previous and next drivers in linked list */ |
link_t drivers; |
/** Pointer to the linked list of devices controlled by |
* this driver */ |
link_t devices; |
/** Phone asociated with this driver */ |
ipcarg_t phone; |
/** Device driver name */ |
char *name; |
/** Futex for list of devices owned by this driver */ |
atomic_t devices_futex; |
} devmap_driver_t; |
/** Info about registered device |
* |
*/ |
typedef struct { |
/** Pointer to the previous and next device in the list of all devices */ |
link_t devices; |
/** Pointer to the previous and next device in the list of devices |
owned by one driver */ |
link_t driver_devices; |
/** Unique device identifier */ |
int handle; |
/** Device name */ |
char *name; |
/** Device driver handling this device */ |
devmap_driver_t *driver; |
} devmap_device_t; |
/** Interface provided by devmap. |
* Every process that connects to devmap must ask one of following |
* interfaces otherwise connection will be refused. |
*/ |
typedef enum { |
/** Connect as device driver */ |
DEVMAP_DRIVER = 1, |
/** Connect as client */ |
DEVMAP_CLIENT, |
/** Create new connection to instance of device that |
* is specified by second argument of call. */ |
DEVMAP_CONNECT_TO_DEVICE |
} devmap_interface_t; |
#endif |
/tags/0.3.0/uspace/srv/devmap/Makefile |
---|
0,0 → 1,76 |
# |
# Copyright (c) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
## Setup toolchain |
# |
LIBC_PREFIX = ../../lib/libc |
SOFTINT_PREFIX = ../../lib/softint |
include $(LIBC_PREFIX)/Makefile.toolchain |
CFLAGS += -I../libipc/include |
LIBS = $(LIBC_PREFIX)/libc.a |
## Sources |
# |
OUTPUT = devmap |
SOURCES = \ |
devmap.c |
CFLAGS += -D$(ARCH) |
OBJECTS := $(addsuffix .o,$(basename $(SOURCES))) |
.PHONY: all clean depend disasm |
all: $(OUTPUT) disasm |
-include Makefile.depend |
clean: |
-rm -f $(OUTPUT) $(OUTPUT).map $(OUTPUT).disasm Makefile.depend |
depend: |
$(CC) $(DEFS) $(CFLAGS) -M $(SOURCES) > Makefile.depend |
$(OUTPUT): $(OBJECTS) $(LIBS) |
$(LD) -T $(LIBC_PREFIX)/arch/$(ARCH)/_link.ld $(OBJECTS) $(LIBS) $(LFLAGS) -o $@ -Map $(OUTPUT).map |
disasm: |
$(OBJDUMP) -d $(OUTPUT) >$(OUTPUT).disasm |
%.o: %.S |
$(CC) $(DEFS) $(AFLAGS) $(CFLAGS) -D__ASM__ -c $< -o $@ |
%.o: %.s |
$(AS) $(AFLAGS) $< -o $@ |
%.o: %.c |
$(CC) $(DEFS) $(CFLAGS) -c $< -o $@ |
/tags/0.3.0/uspace/srv/ns/ns.c |
---|
0,0 → 1,272 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup ns |
* @{ |
*/ |
/** |
* @file ns.c |
* @brief Naming service for HelenOS IPC. |
*/ |
#include <ipc/ipc.h> |
#include <ipc/ns.h> |
#include <ipc/services.h> |
#include <stdio.h> |
#include <unistd.h> |
#include <stdlib.h> |
#include <errno.h> |
#include <assert.h> |
#include <libadt/list.h> |
#include <libadt/hash_table.h> |
#include <sysinfo.h> |
#include <ddi.h> |
#include <as.h> |
#define NAME "NS" |
#define NS_HASH_TABLE_CHAINS 20 |
static int register_service(ipcarg_t service, ipcarg_t phone, ipc_call_t *call); |
static int connect_to_service(ipcarg_t service, ipc_call_t *call, |
ipc_callid_t callid); |
/* Static functions implementing NS hash table operations. */ |
static hash_index_t ns_hash(unsigned long *key); |
static int ns_compare(unsigned long *key, hash_count_t keys, link_t *item); |
static void ns_remove(link_t *item); |
/** Operations for NS hash table. */ |
static hash_table_operations_t ns_hash_table_ops = { |
.hash = ns_hash, |
.compare = ns_compare, |
.remove_callback = ns_remove |
}; |
/** NS hash table structure. */ |
static hash_table_t ns_hash_table; |
/** NS hash table item. */ |
typedef struct { |
link_t link; |
ipcarg_t service; /**< Number of the service. */ |
ipcarg_t phone; /**< Phone registered with the service. */ |
ipcarg_t in_phone_hash; /**< Incoming phone hash. */ |
} hashed_service_t; |
static void *clockaddr = NULL; |
static void *klogaddr = NULL; |
static void get_as_area(ipc_callid_t callid, ipc_call_t *call, char *name, |
void **addr) |
{ |
void *ph_addr; |
if (!*addr) { |
ph_addr = (void *) sysinfo_value(name); |
if (!ph_addr) { |
ipc_answer_0(callid, ENOENT); |
return; |
} |
*addr = as_get_mappable_page(PAGE_SIZE); |
physmem_map(ph_addr, *addr, 1, |
AS_AREA_READ | AS_AREA_CACHEABLE); |
} |
ipc_answer_2(callid, EOK, (ipcarg_t) *addr, AS_AREA_READ); |
} |
int main(int argc, char **argv) |
{ |
ipc_call_t call; |
ipc_callid_t callid; |
ipcarg_t retval; |
if (!hash_table_create(&ns_hash_table, NS_HASH_TABLE_CHAINS, 3, |
&ns_hash_table_ops)) { |
return ENOMEM; |
} |
while (1) { |
callid = ipc_wait_for_call(&call); |
switch (IPC_GET_METHOD(call)) { |
case IPC_M_SHARE_IN: |
switch (IPC_GET_ARG3(call)) { |
case SERVICE_MEM_REALTIME: |
get_as_area(callid, &call, "clock.faddr", |
&clockaddr); |
break; |
case SERVICE_MEM_KLOG: |
get_as_area(callid, &call, "klog.faddr", |
&klogaddr); |
break; |
default: |
ipc_answer_0(callid, ENOENT); |
} |
continue; |
case IPC_M_PHONE_HUNGUP: |
retval = EOK; |
break; |
case IPC_M_CONNECT_TO_ME: |
/* |
* Server requests service registration. |
*/ |
retval = register_service(IPC_GET_ARG1(call), |
IPC_GET_ARG5(call), &call); |
break; |
case IPC_M_CONNECT_ME_TO: |
/* |
* Client requests to be connected to a service. |
*/ |
retval = connect_to_service(IPC_GET_ARG1(call), &call, |
callid); |
break; |
default: |
retval = ENOENT; |
break; |
} |
if (!(callid & IPC_CALLID_NOTIFICATION)) { |
ipc_answer_0(callid, retval); |
} |
} |
} |
/** Register service. |
* |
* @param service Service to be registered. |
* @param phone Phone to be used for connections to the service. |
* @param call Pointer to call structure. |
* |
* @return Zero on success or a value from @ref errno.h. |
*/ |
int register_service(ipcarg_t service, ipcarg_t phone, ipc_call_t *call) |
{ |
unsigned long keys[3] = { |
service, |
call->in_phone_hash, |
0 |
}; |
hashed_service_t *hs; |
if (hash_table_find(&ns_hash_table, keys)) { |
return EEXISTS; |
} |
hs = (hashed_service_t *) malloc(sizeof(hashed_service_t)); |
if (!hs) { |
return ENOMEM; |
} |
link_initialize(&hs->link); |
hs->service = service; |
hs->phone = phone; |
hs->in_phone_hash = call->in_phone_hash; |
hash_table_insert(&ns_hash_table, keys, &hs->link); |
return 0; |
} |
/** Connect client to service. |
* |
* @param service Service to be connected to. |
* @param call Pointer to call structure. |
* @param callid Call ID of the request. |
* |
* @return Zero on success or a value from @ref errno.h. |
*/ |
int connect_to_service(ipcarg_t service, ipc_call_t *call, ipc_callid_t callid) |
{ |
unsigned long keys[3] = { service, 0, 0 }; |
link_t *hlp; |
hashed_service_t *hs; |
hlp = hash_table_find(&ns_hash_table, keys); |
if (!hlp) { |
return ENOENT; |
} |
hs = hash_table_get_instance(hlp, hashed_service_t, link); |
return ipc_forward_fast(callid, hs->phone, IPC_GET_ARG2(*call), |
IPC_GET_ARG3(*call), 0, IPC_FF_NONE); |
} |
/** Compute hash index into NS hash table. |
* |
* @param key Pointer keys. However, only the first key (i.e. service number) |
* is used to compute the hash index. |
* @return Hash index corresponding to key[0]. |
*/ |
hash_index_t ns_hash(unsigned long *key) |
{ |
assert(key); |
return *key % NS_HASH_TABLE_CHAINS; |
} |
/** Compare a key with hashed item. |
* |
* This compare function always ignores the third key. |
* It exists only to make it possible to remove records |
* originating from connection with key[1] in_phone_hash |
* value. Note that this is close to being classified |
* as a nasty hack. |
* |
* @param key Array of keys. |
* @param keys Must be lesser or equal to 3. |
* @param item Pointer to a hash table item. |
* @return Non-zero if the key matches the item, zero otherwise. |
*/ |
int ns_compare(unsigned long key[], hash_count_t keys, link_t *item) |
{ |
hashed_service_t *hs; |
assert(key); |
assert(keys <= 3); |
assert(item); |
hs = hash_table_get_instance(item, hashed_service_t, link); |
if (keys == 2) |
return key[1] == hs->in_phone_hash; |
else |
return key[0] == hs->service; |
} |
/** Perform actions after removal of item from the hash table. |
* |
* @param item Item that was removed from the hash table. |
*/ |
void ns_remove(link_t *item) |
{ |
assert(item); |
free(hash_table_get_instance(item, hashed_service_t, link)); |
} |
/** |
* @} |
*/ |
/tags/0.3.0/uspace/srv/ns/Makefile |
---|
0,0 → 1,72 |
# |
# Copyright (c) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
## Setup toolchain |
# |
LIBC_PREFIX = ../../lib/libc |
SOFTINT_PREFIX = ../../lib/softint |
include $(LIBC_PREFIX)/Makefile.toolchain |
LIBS = $(LIBC_PREFIX)/libc.a |
## Sources |
# |
OUTPUT = ns |
SOURCES = \ |
ns.c |
OBJECTS := $(addsuffix .o,$(basename $(SOURCES))) |
.PHONY: all clean depend disasm |
all: $(OUTPUT) disasm |
-include Makefile.depend |
clean: |
-rm -f $(OUTPUT) $(OUTPUT).map $(OUTPUT).disasm Makefile.depend |
depend: |
$(CC) $(DEFS) $(CFLAGS) -M $(SOURCES) > Makefile.depend |
$(OUTPUT): $(OBJECTS) $(LIBS) |
$(LD) -T $(LIBC_PREFIX)/arch/$(ARCH)/_link.ld -e __entry_driver $(OBJECTS) $(LIBS) $(LFLAGS) -o $@ -Map $(OUTPUT).map |
disasm: |
$(OBJDUMP) -d $(OUTPUT) >$(OUTPUT).disasm |
%.o: %.S |
$(CC) $(DEFS) $(AFLAGS) $(CFLAGS) -D__ASM__ -c $< -o $@ |
%.o: %.s |
$(AS) $(AFLAGS) $< -o $@ |
%.o: %.c |
$(CC) $(DEFS) $(CFLAGS) -c $< -o $@ |
/tags/0.3.0/uspace/srv/fb/fb.c |
---|
0,0 → 1,1384 |
/* |
* Copyright (c) 2006 Jakub Vana |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** |
* @defgroup fb Graphical framebuffer |
* @brief HelenOS graphical framebuffer. |
* @ingroup fbs |
* @{ |
*/ |
/** @file |
*/ |
#include <stdlib.h> |
#include <unistd.h> |
#include <string.h> |
#include <ddi.h> |
#include <sysinfo.h> |
#include <align.h> |
#include <as.h> |
#include <ipc/fb.h> |
#include <ipc/ipc.h> |
#include <ipc/ns.h> |
#include <ipc/services.h> |
#include <kernel/errno.h> |
#include <kernel/genarch/fb/visuals.h> |
#include <async.h> |
#include <bool.h> |
#include "font-8x16.h" |
#include "fb.h" |
#include "main.h" |
#include "../console/screenbuffer.h" |
#include "ppm.h" |
#include "pointer.xbm" |
#include "pointer_mask.xbm" |
#define DEFAULT_BGCOLOR 0xf0f0f0 |
#define DEFAULT_FGCOLOR 0x0 |
/***************************************************************/ |
/* Pixel specific fuctions */ |
typedef void (*conv2scr_fn_t)(void *, int); |
typedef int (*conv2rgb_fn_t)(void *); |
struct { |
uint8_t *fbaddress; |
unsigned int xres; |
unsigned int yres; |
unsigned int scanline; |
unsigned int pixelbytes; |
unsigned int invert_colors; |
conv2scr_fn_t rgb2scr; |
conv2rgb_fn_t scr2rgb; |
} screen; |
typedef struct { |
int initialized; |
unsigned int x, y; |
unsigned int width, height; |
/* Text support in window */ |
unsigned int rows, cols; |
/* Style for text printing */ |
style_t style; |
/* Auto-cursor position */ |
int cursor_active, cur_col, cur_row; |
int cursor_shown; |
/* Double buffering */ |
uint8_t *dbdata; |
unsigned int dboffset; |
unsigned int paused; |
} viewport_t; |
#define MAX_ANIM_LEN 8 |
#define MAX_ANIMATIONS 4 |
typedef struct { |
int initialized; |
int enabled; |
unsigned int vp; |
unsigned int pos; |
unsigned int animlen; |
unsigned int pixmaps[MAX_ANIM_LEN]; |
} animation_t; |
static animation_t animations[MAX_ANIMATIONS]; |
static int anims_enabled; |
/** Maximum number of saved pixmaps |
* Pixmap is a saved rectangle |
*/ |
#define MAX_PIXMAPS 256 |
typedef struct { |
unsigned int width; |
unsigned int height; |
uint8_t *data; |
} pixmap_t; |
static pixmap_t pixmaps[MAX_PIXMAPS]; |
/* Viewport is a rectangular area on the screen */ |
#define MAX_VIEWPORTS 128 |
static viewport_t viewports[128]; |
/* Allow only 1 connection */ |
static int client_connected = 0; |
#define RED(x, bits) ((x >> (16 + 8 - bits)) & ((1 << bits) - 1)) |
#define GREEN(x, bits) ((x >> (8 + 8 - bits)) & ((1 << bits) - 1)) |
#define BLUE(x, bits) ((x >> (8 - bits)) & ((1 << bits) - 1)) |
#define COL_WIDTH 8 |
#define ROW_BYTES (screen.scanline * FONT_SCANLINES) |
#define POINTPOS(x, y) ((y) * screen.scanline + (x) * screen.pixelbytes) |
static inline int COLOR(int color) |
{ |
return screen.invert_colors ? ~color : color; |
} |
/* Conversion routines between different color representations */ |
static void |
rgb_byte0888(void *dst, int rgb) |
{ |
*(int *)dst = rgb; |
} |
static int |
byte0888_rgb(void *src) |
{ |
return (*(int *)src) & 0xffffff; |
} |
static void |
bgr_byte0888(void *dst, int rgb) |
{ |
*((uint32_t *) dst) = BLUE(rgb, 8) << 16 | GREEN(rgb, 8) << 8 | |
RED(rgb, 8); |
} |
static int |
byte0888_bgr(void *src) |
{ |
int color = *(uint32_t *)(src); |
return ((color & 0xff) << 16) | (((color >> 8) & 0xff) << 8) | |
((color >> 16) & 0xff); |
} |
static void |
rgb_byte888(void *dst, int rgb) |
{ |
uint8_t *scr = dst; |
#if defined(FB_INVERT_ENDIAN) |
scr[0] = RED(rgb, 8); |
scr[1] = GREEN(rgb, 8); |
scr[2] = BLUE(rgb, 8); |
#else |
scr[2] = RED(rgb, 8); |
scr[1] = GREEN(rgb, 8); |
scr[0] = BLUE(rgb, 8); |
#endif |
} |
static int |
byte888_rgb(void *src) |
{ |
uint8_t *scr = src; |
#if defined(FB_INVERT_ENDIAN) |
return scr[0] << 16 | scr[1] << 8 | scr[2]; |
#else |
return scr[2] << 16 | scr[1] << 8 | scr[0]; |
#endif |
} |
/** 16-bit depth (5:5:5) */ |
static void |
rgb_byte555(void *dst, int rgb) |
{ |
/* 5-bit, 5-bits, 5-bits */ |
*((uint16_t *)(dst)) = RED(rgb, 5) << 10 | GREEN(rgb, 5) << 5 | |
BLUE(rgb, 5); |
} |
/** 16-bit depth (5:5:5) */ |
static int |
byte555_rgb(void *src) |
{ |
int color = *(uint16_t *)(src); |
return (((color >> 10) & 0x1f) << (16 + 3)) | |
(((color >> 5) & 0x1f) << (8 + 3)) | ((color & 0x1f) << 3); |
} |
/** 16-bit depth (5:6:5) */ |
static void |
rgb_byte565(void *dst, int rgb) |
{ |
/* 5-bit, 6-bits, 5-bits */ |
*((uint16_t *)(dst)) = RED(rgb, 5) << 11 | GREEN(rgb, 6) << 5 | |
BLUE(rgb, 5); |
} |
/** 16-bit depth (5:6:5) */ |
static int |
byte565_rgb(void *src) |
{ |
int color = *(uint16_t *)(src); |
return (((color >> 11) & 0x1f) << (16 + 3)) | |
(((color >> 5) & 0x3f) << (8 + 2)) | ((color & 0x1f) << 3); |
} |
/** Put pixel - 8-bit depth (3:2:3) */ |
static void |
rgb_byte8(void *dst, int rgb) |
{ |
*(uint8_t *)dst = RED(rgb, 3) << 5 | GREEN(rgb, 2) << 3 | BLUE(rgb, 3); |
} |
/** Return pixel color - 8-bit depth (3:2:3) */ |
static int |
byte8_rgb(void *src) |
{ |
int color = *(uint8_t *)src; |
return (((color >> 5) & 0x7) << (16 + 5)) | |
(((color >> 3) & 0x3) << (8 + 6)) | ((color & 0x7) << 5); |
} |
/** Put pixel into viewport |
* |
* @param vport Viewport identification |
* @param x X coord relative to viewport |
* @param y Y coord relative to viewport |
* @param color RGB color |
*/ |
static void |
putpixel(viewport_t *vport, unsigned int x, unsigned int y, int color) |
{ |
int dx = vport->x + x; |
int dy = vport->y + y; |
if (! (vport->paused && vport->dbdata)) |
(*screen.rgb2scr)(&screen.fbaddress[POINTPOS(dx,dy)], |
COLOR(color)); |
if (vport->dbdata) { |
int dline = (y + vport->dboffset) % vport->height; |
int doffset = screen.pixelbytes * (dline * vport->width + x); |
(*screen.rgb2scr)(&vport->dbdata[doffset], COLOR(color)); |
} |
} |
/** Get pixel from viewport */ |
static int |
getpixel(viewport_t *vport, unsigned int x, unsigned int y) |
{ |
int dx = vport->x + x; |
int dy = vport->y + y; |
return COLOR((*screen.scr2rgb)(&screen.fbaddress[POINTPOS(dx, dy)])); |
} |
static inline void |
putpixel_mem(char *mem, unsigned int x, unsigned int y, int color) |
{ |
(*screen.rgb2scr)(&mem[POINTPOS(x, y)], COLOR(color)); |
} |
static void |
draw_rectangle(viewport_t *vport, unsigned int sx, unsigned int sy, |
unsigned int width, unsigned int height, int color) |
{ |
unsigned int x, y; |
static void *tmpline; |
if (!tmpline) |
tmpline = malloc(screen.scanline * screen.pixelbytes); |
/* Clear first line */ |
for (x = 0; x < width; x++) |
putpixel_mem(tmpline, x, 0, color); |
if (!vport->paused) { |
/* Recompute to screen coords */ |
sx += vport->x; |
sy += vport->y; |
/* Copy the rest */ |
for (y = sy;y < sy+height; y++) |
memcpy(&screen.fbaddress[POINTPOS(sx,y)], tmpline, |
screen.pixelbytes * width); |
} |
if (vport->dbdata) { |
for (y = sy; y < sy + height; y++) { |
int rline = (y + vport->dboffset) % vport->height; |
int rpos = (rline * vport->width + sx) * |
screen.pixelbytes; |
memcpy(&vport->dbdata[rpos], tmpline, |
screen.pixelbytes * width); |
} |
} |
} |
/** Fill viewport with background color */ |
static void |
clear_port(viewport_t *vport) |
{ |
draw_rectangle(vport, 0, 0, vport->width, vport->height, |
vport->style.bg_color); |
} |
/** Scroll unbuffered viewport up/down |
* |
* @param vport Viewport to scroll |
* @param lines Positive number - scroll up, negative - scroll down |
*/ |
static void |
scroll_port_nodb(viewport_t *vport, int lines) |
{ |
int y; |
if (lines > 0) { |
for (y = vport->y; y < vport->y+vport->height - lines; y++) |
memcpy(&screen.fbaddress[POINTPOS(vport->x,y)], |
&screen.fbaddress[POINTPOS(vport->x,y + lines)], |
screen.pixelbytes * vport->width); |
draw_rectangle(vport, 0, vport->height - lines, vport->width, |
lines, vport->style.bg_color); |
} else if (lines < 0) { |
lines = -lines; |
for (y = vport->y + vport->height-1; y >= vport->y + lines; y--) |
memcpy(&screen.fbaddress[POINTPOS(vport->x,y)], |
&screen.fbaddress[POINTPOS(vport->x,y - lines)], |
screen.pixelbytes * vport->width); |
draw_rectangle(vport, 0, 0, vport->width, lines, |
vport->style.bg_color); |
} |
} |
/** Refresh given viewport from double buffer */ |
static void |
refresh_viewport_db(viewport_t *vport) |
{ |
unsigned int y, srcy, srcoff, dsty, dstx; |
for (y = 0; y < vport->height; y++) { |
srcy = (y + vport->dboffset) % vport->height; |
srcoff = (vport->width * srcy) * screen.pixelbytes; |
dstx = vport->x; |
dsty = vport->y + y; |
memcpy(&screen.fbaddress[POINTPOS(dstx,dsty)], |
&vport->dbdata[srcoff], vport->width * screen.pixelbytes); |
} |
} |
/** Scroll viewport that has double buffering enabled */ |
static void |
scroll_port_db(viewport_t *vport, int lines) |
{ |
++vport->paused; |
if (lines > 0) { |
draw_rectangle(vport, 0, 0, vport->width, lines, |
vport->style.bg_color); |
vport->dboffset += lines; |
vport->dboffset %= vport->height; |
} else if (lines < 0) { |
lines = -lines; |
draw_rectangle(vport, 0, vport->height-lines, vport->width, |
lines, vport->style.bg_color); |
if (vport->dboffset < lines) |
vport->dboffset += vport->height; |
vport->dboffset -= lines; |
} |
--vport->paused; |
refresh_viewport_db(vport); |
} |
/** Scrolls viewport given number of lines */ |
static void |
scroll_port(viewport_t *vport, int lines) |
{ |
if (vport->dbdata) |
scroll_port_db(vport, lines); |
else |
scroll_port_nodb(vport, lines); |
} |
static void |
invert_pixel(viewport_t *vport, unsigned int x, unsigned int y) |
{ |
putpixel(vport, x, y, ~getpixel(vport, x, y)); |
} |
/***************************************************************/ |
/* Character-console functions */ |
/** Draw character at given position |
* |
* @param vport Viewport where the character is printed |
* @param sx Coordinates of top-left of the character |
* @param sy Coordinates of top-left of the character |
* @param style Color of the character |
* @param transparent If false, print background color |
*/ |
static void |
draw_glyph(viewport_t *vport,uint8_t glyph, unsigned int sx, unsigned int sy, |
style_t style, int transparent) |
{ |
int i; |
unsigned int y; |
unsigned int glline; |
for (y = 0; y < FONT_SCANLINES; y++) { |
glline = fb_font[glyph * FONT_SCANLINES + y]; |
for (i = 0; i < 8; i++) { |
if (glline & (1 << (7 - i))) |
putpixel(vport, sx + i, sy + y, style.fg_color); |
else if (!transparent) |
putpixel(vport, sx + i, sy + y, style.bg_color); |
} |
} |
} |
/** Invert character at given position */ |
static void |
invert_char(viewport_t *vport,unsigned int row, unsigned int col) |
{ |
unsigned int x; |
unsigned int y; |
for (x = 0; x < COL_WIDTH; x++) |
for (y = 0; y < FONT_SCANLINES; y++) |
invert_pixel(vport, col * COL_WIDTH + x, row * |
FONT_SCANLINES + y); |
} |
/***************************************************************/ |
/* Stdout specific functions */ |
/** Create new viewport |
* |
* @return New viewport number |
*/ |
static int |
viewport_create(unsigned int x, unsigned int y,unsigned int width, |
unsigned int height) |
{ |
int i; |
for (i = 0; i < MAX_VIEWPORTS; i++) { |
if (!viewports[i].initialized) |
break; |
} |
if (i == MAX_VIEWPORTS) |
return ELIMIT; |
viewports[i].x = x; |
viewports[i].y = y; |
viewports[i].width = width; |
viewports[i].height = height; |
viewports[i].rows = height / FONT_SCANLINES; |
viewports[i].cols = width / COL_WIDTH; |
viewports[i].style.bg_color = DEFAULT_BGCOLOR; |
viewports[i].style.fg_color = DEFAULT_FGCOLOR; |
viewports[i].cur_col = 0; |
viewports[i].cur_row = 0; |
viewports[i].cursor_active = 0; |
viewports[i].initialized = 1; |
return i; |
} |
/** Initialize framebuffer as a chardev output device |
* |
* @param addr Address of theframebuffer |
* @param xres Screen width in pixels |
* @param yres Screen height in pixels |
* @param visual Bits per pixel (8, 16, 24, 32) |
* @param scan Bytes per one scanline |
* @param invert_colors Inverted colors. |
* |
*/ |
static bool |
screen_init(void *addr, unsigned int xres, unsigned int yres, |
unsigned int scan, unsigned int visual, bool invert_colors) |
{ |
switch (visual) { |
case VISUAL_INDIRECT_8: |
screen.rgb2scr = rgb_byte8; |
screen.scr2rgb = byte8_rgb; |
screen.pixelbytes = 1; |
break; |
case VISUAL_RGB_5_5_5: |
screen.rgb2scr = rgb_byte555; |
screen.scr2rgb = byte555_rgb; |
screen.pixelbytes = 2; |
break; |
case VISUAL_RGB_5_6_5: |
screen.rgb2scr = rgb_byte565; |
screen.scr2rgb = byte565_rgb; |
screen.pixelbytes = 2; |
break; |
case VISUAL_RGB_8_8_8: |
screen.rgb2scr = rgb_byte888; |
screen.scr2rgb = byte888_rgb; |
screen.pixelbytes = 3; |
break; |
case VISUAL_RGB_8_8_8_0: |
screen.rgb2scr = rgb_byte888; |
screen.scr2rgb = byte888_rgb; |
screen.pixelbytes = 4; |
break; |
case VISUAL_RGB_0_8_8_8: |
screen.rgb2scr = rgb_byte0888; |
screen.scr2rgb = byte0888_rgb; |
screen.pixelbytes = 4; |
break; |
case VISUAL_BGR_0_8_8_8: |
screen.rgb2scr = bgr_byte0888; |
screen.scr2rgb = byte0888_bgr; |
screen.pixelbytes = 4; |
break; |
default: |
return false; |
} |
screen.fbaddress = (unsigned char *) addr; |
screen.xres = xres; |
screen.yres = yres; |
screen.scanline = scan; |
screen.invert_colors = invert_colors; |
/* Create first viewport */ |
viewport_create(0, 0, xres, yres); |
return true; |
} |
/** Hide cursor if it is shown */ |
static void |
cursor_hide(viewport_t *vport) |
{ |
if (vport->cursor_active && vport->cursor_shown) { |
invert_char(vport, vport->cur_row, vport->cur_col); |
vport->cursor_shown = 0; |
} |
} |
/** Show cursor if cursor showing is enabled */ |
static void |
cursor_print(viewport_t *vport) |
{ |
/* Do not check for cursor_shown */ |
if (vport->cursor_active) { |
invert_char(vport, vport->cur_row, vport->cur_col); |
vport->cursor_shown = 1; |
} |
} |
/** Invert cursor, if it is enabled */ |
static void |
cursor_blink(viewport_t *vport) |
{ |
if (vport->cursor_shown) |
cursor_hide(vport); |
else |
cursor_print(vport); |
} |
/** Draw character at given position relative to viewport |
* |
* @param vport Viewport identification |
* @param c Character to print |
* @param row Screen position relative to viewport |
* @param col Screen position relative to viewport |
* @param transparent If false, print background color with character |
*/ |
static void |
draw_char(viewport_t *vport, char c, unsigned int row, unsigned int col, |
style_t style, int transparent) |
{ |
/* Optimize - do not hide cursor if we are going to overwrite it */ |
if (vport->cursor_active && vport->cursor_shown && |
(vport->cur_col != col || vport->cur_row != row)) |
invert_char(vport, vport->cur_row, vport->cur_col); |
draw_glyph(vport, c, col * COL_WIDTH, row * FONT_SCANLINES, style, |
transparent); |
vport->cur_col = col; |
vport->cur_row = row; |
vport->cur_col++; |
if (vport->cur_col >= vport->cols) { |
vport->cur_col = 0; |
vport->cur_row++; |
if (vport->cur_row >= vport->rows) |
vport->cur_row--; |
} |
cursor_print(vport); |
} |
/** Draw text data to viewport |
* |
* @param vport Viewport id |
* @param data Text data fitting exactly into viewport |
*/ |
static void |
draw_text_data(viewport_t *vport, keyfield_t *data) |
{ |
int i; |
int col,row; |
clear_port(vport); |
for (i = 0; i < vport->cols * vport->rows; i++) { |
if (data[i].character == ' ' && style_same(data[i].style, |
vport->style)) |
continue; |
col = i % vport->cols; |
row = i / vport->cols; |
draw_glyph(vport, data[i].character, col * COL_WIDTH, row * |
FONT_SCANLINES, data[i].style, style_same(data[i].style, |
vport->style)); |
} |
cursor_print(vport); |
} |
/** Return first free pixmap */ |
static int |
find_free_pixmap(void) |
{ |
int i; |
for (i = 0;i < MAX_PIXMAPS;i++) |
if (!pixmaps[i].data) |
return i; |
return -1; |
} |
static void |
putpixel_pixmap(int pm, unsigned int x, unsigned int y, int color) |
{ |
pixmap_t *pmap = &pixmaps[pm]; |
int pos = (y * pmap->width + x) * screen.pixelbytes; |
(*screen.rgb2scr)(&pmap->data[pos],COLOR(color)); |
} |
/** Create a new pixmap and return appropriate ID */ |
static int |
shm2pixmap(unsigned char *shm, size_t size) |
{ |
int pm; |
pixmap_t *pmap; |
pm = find_free_pixmap(); |
if (pm == -1) |
return ELIMIT; |
pmap = &pixmaps[pm]; |
if (ppm_get_data(shm, size, &pmap->width, &pmap->height)) |
return EINVAL; |
pmap->data = malloc(pmap->width * pmap->height * screen.pixelbytes); |
if (!pmap->data) |
return ENOMEM; |
ppm_draw(shm, size, 0, 0, pmap->width, pmap->height, |
(putpixel_cb_t)putpixel_pixmap, (void *)pm); |
return pm; |
} |
/** Handle shared memory communication calls |
* |
* Protocol for drawing pixmaps: |
* - FB_PREPARE_SHM(client shm identification) |
* - IPC_M_AS_AREA_SEND |
* - FB_DRAW_PPM(startx,starty) |
* - FB_DROP_SHM |
* |
* Protocol for text drawing |
* - IPC_M_AS_AREA_SEND |
* - FB_DRAW_TEXT_DATA |
* |
* @param callid Callid of the current call |
* @param call Current call data |
* @param vp Active viewport |
* @return 0 if the call was not handled byt this function, 1 otherwise |
* |
* note: this function is not threads safe, you would have |
* to redefine static variables with __thread |
*/ |
static int |
shm_handle(ipc_callid_t callid, ipc_call_t *call, int vp) |
{ |
static keyfield_t *interbuffer = NULL; |
static size_t intersize = 0; |
static unsigned char *shm = NULL; |
static ipcarg_t shm_id = 0; |
static size_t shm_size; |
int handled = 1; |
int retval = 0; |
viewport_t *vport = &viewports[vp]; |
unsigned int x, y; |
switch (IPC_GET_METHOD(*call)) { |
case IPC_M_SHARE_OUT: |
/* We accept one area for data interchange */ |
if (IPC_GET_ARG1(*call) == shm_id) { |
void *dest = as_get_mappable_page(IPC_GET_ARG2(*call)); |
shm_size = IPC_GET_ARG2(*call); |
if (!ipc_answer_1(callid, EOK, (sysarg_t) dest)) |
shm = dest; |
else |
shm_id = 0; |
if (shm[0] != 'P') |
while (1) |
; |
return 1; |
} else { |
intersize = IPC_GET_ARG2(*call); |
receive_comm_area(callid, call, (void *) &interbuffer); |
} |
return 1; |
case FB_PREPARE_SHM: |
if (shm_id) |
retval = EBUSY; |
else |
shm_id = IPC_GET_ARG1(*call); |
break; |
case FB_DROP_SHM: |
if (shm) { |
as_area_destroy(shm); |
shm = NULL; |
} |
shm_id = 0; |
break; |
case FB_SHM2PIXMAP: |
if (!shm) { |
retval = EINVAL; |
break; |
} |
retval = shm2pixmap(shm, shm_size); |
break; |
case FB_DRAW_PPM: |
if (!shm) { |
retval = EINVAL; |
break; |
} |
x = IPC_GET_ARG1(*call); |
y = IPC_GET_ARG2(*call); |
if (x > vport->width || y > vport->height) { |
retval = EINVAL; |
break; |
} |
ppm_draw(shm, shm_size, IPC_GET_ARG1(*call), |
IPC_GET_ARG2(*call), vport->width - x, vport->height - y, |
(putpixel_cb_t)putpixel, vport); |
break; |
case FB_DRAW_TEXT_DATA: |
if (!interbuffer) { |
retval = EINVAL; |
break; |
} |
if (intersize < vport->cols * vport->rows * |
sizeof(*interbuffer)) { |
retval = EINVAL; |
break; |
} |
draw_text_data(vport, interbuffer); |
break; |
default: |
handled = 0; |
} |
if (handled) |
ipc_answer_0(callid, retval); |
return handled; |
} |
static void |
copy_vp_to_pixmap(viewport_t *vport, pixmap_t *pmap) |
{ |
int y; |
int tmp, srcrowsize; |
int realwidth, realheight, realrowsize; |
int width = vport->width; |
int height = vport->height; |
if (width + vport->x > screen.xres) |
width = screen.xres - vport->x; |
if (height + vport->y > screen.yres) |
height = screen.yres - vport->y; |
realwidth = pmap->width <= width ? pmap->width : width; |
realheight = pmap->height <= height ? pmap->height : height; |
srcrowsize = vport->width * screen.pixelbytes; |
realrowsize = realwidth * screen.pixelbytes; |
for (y = 0; y < realheight; y++) { |
tmp = (vport->y + y) * screen.scanline + |
vport->x * screen.pixelbytes; |
memcpy(pmap->data + srcrowsize * y, screen.fbaddress + tmp, |
realrowsize); |
} |
} |
/** Save viewport to pixmap */ |
static int |
save_vp_to_pixmap(viewport_t *vport) |
{ |
int pm; |
pixmap_t *pmap; |
pm = find_free_pixmap(); |
if (pm == -1) |
return ELIMIT; |
pmap = &pixmaps[pm]; |
pmap->data = malloc(screen.pixelbytes * vport->width * vport->height); |
if (!pmap->data) |
return ENOMEM; |
pmap->width = vport->width; |
pmap->height = vport->height; |
copy_vp_to_pixmap(vport, pmap); |
return pm; |
} |
/** Draw pixmap on screen |
* |
* @param vp Viewport to draw on |
* @param pm Pixmap identifier |
*/ |
static int draw_pixmap(int vp, int pm) |
{ |
pixmap_t *pmap = &pixmaps[pm]; |
viewport_t *vport = &viewports[vp]; |
int y; |
int tmp, srcrowsize; |
int realwidth, realheight, realrowsize; |
int width = vport->width; |
int height = vport->height; |
if (width + vport->x > screen.xres) |
width = screen.xres - vport->x; |
if (height + vport->y > screen.yres) |
height = screen.yres - vport->y; |
if (!pmap->data) |
return EINVAL; |
realwidth = pmap->width <= width ? pmap->width : width; |
realheight = pmap->height <= height ? pmap->height : height; |
srcrowsize = vport->width * screen.pixelbytes; |
realrowsize = realwidth * screen.pixelbytes; |
for (y = 0; y < realheight; y++) { |
tmp = (vport->y + y) * screen.scanline + |
vport->x * screen.pixelbytes; |
memcpy(screen.fbaddress + tmp, pmap->data + y * srcrowsize, |
realrowsize); |
} |
return 0; |
} |
/** Tick animation one step forward */ |
static void |
anims_tick(void) |
{ |
int i; |
static int counts = 0; |
/* Limit redrawing */ |
counts = (counts + 1) % 8; |
if (counts) |
return; |
for (i = 0; i < MAX_ANIMATIONS; i++) { |
if (!animations[i].animlen || !animations[i].initialized || |
!animations[i].enabled) |
continue; |
draw_pixmap(animations[i].vp, |
animations[i].pixmaps[animations[i].pos]); |
animations[i].pos = (animations[i].pos + 1) % |
animations[i].animlen; |
} |
} |
static int pointer_x, pointer_y; |
static int pointer_shown, pointer_enabled; |
static int pointer_vport = -1; |
static int pointer_pixmap = -1; |
static void |
mouse_show(void) |
{ |
int i, j; |
int visibility; |
int color; |
int bytepos; |
if (pointer_shown || !pointer_enabled) |
return; |
/* Save image under the cursor */ |
if (pointer_vport == -1) { |
pointer_vport = viewport_create(pointer_x, pointer_y, |
pointer_width, pointer_height); |
if (pointer_vport < 0) |
return; |
} else { |
viewports[pointer_vport].x = pointer_x; |
viewports[pointer_vport].y = pointer_y; |
} |
if (pointer_pixmap == -1) |
pointer_pixmap = save_vp_to_pixmap(&viewports[pointer_vport]); |
else |
copy_vp_to_pixmap(&viewports[pointer_vport], |
&pixmaps[pointer_pixmap]); |
/* Draw cursor */ |
for (i = 0; i < pointer_height; i++) |
for (j = 0; j < pointer_width; j++) { |
bytepos = i * ((pointer_width - 1) / 8 + 1) + j / 8; |
visibility = pointer_mask_bits[bytepos] & |
(1 << (j % 8)); |
if (visibility) { |
color = pointer_bits[bytepos] & |
(1 << (j % 8)) ? 0 : 0xffffff; |
if (pointer_x + j < screen.xres && pointer_y + |
i < screen.yres) |
putpixel(&viewports[0], pointer_x + j, |
pointer_y + i, color); |
} |
} |
pointer_shown = 1; |
} |
static void |
mouse_hide(void) |
{ |
/* Restore image under the cursor */ |
if (pointer_shown) { |
draw_pixmap(pointer_vport, pointer_pixmap); |
pointer_shown = 0; |
} |
} |
static void |
mouse_move(unsigned int x, unsigned int y) |
{ |
mouse_hide(); |
pointer_x = x; |
pointer_y = y; |
mouse_show(); |
} |
static int |
anim_handle(ipc_callid_t callid, ipc_call_t *call, int vp) |
{ |
int handled = 1; |
int retval = 0; |
int i,nvp; |
int newval; |
switch (IPC_GET_METHOD(*call)) { |
case FB_ANIM_CREATE: |
nvp = IPC_GET_ARG1(*call); |
if (nvp == -1) |
nvp = vp; |
if (nvp >= MAX_VIEWPORTS || nvp < 0 || |
!viewports[nvp].initialized) { |
retval = EINVAL; |
break; |
} |
for (i = 0; i < MAX_ANIMATIONS; i++) { |
if (!animations[i].initialized) |
break; |
} |
if (i == MAX_ANIMATIONS) { |
retval = ELIMIT; |
break; |
} |
animations[i].initialized = 1; |
animations[i].animlen = 0; |
animations[i].pos = 0; |
animations[i].enabled = 0; |
animations[i].vp = nvp; |
retval = i; |
break; |
case FB_ANIM_DROP: |
i = IPC_GET_ARG1(*call); |
if (i >= MAX_ANIMATIONS || i < 0) { |
retval = EINVAL; |
break; |
} |
animations[i].initialized = 0; |
break; |
case FB_ANIM_ADDPIXMAP: |
i = IPC_GET_ARG1(*call); |
if (i >= MAX_ANIMATIONS || i < 0 || |
!animations[i].initialized) { |
retval = EINVAL; |
break; |
} |
if (animations[i].animlen == MAX_ANIM_LEN) { |
retval = ELIMIT; |
break; |
} |
newval = IPC_GET_ARG2(*call); |
if (newval < 0 || newval > MAX_PIXMAPS || |
!pixmaps[newval].data) { |
retval = EINVAL; |
break; |
} |
animations[i].pixmaps[animations[i].animlen++] = newval; |
break; |
case FB_ANIM_CHGVP: |
i = IPC_GET_ARG1(*call); |
if (i >= MAX_ANIMATIONS || i < 0) { |
retval = EINVAL; |
break; |
} |
nvp = IPC_GET_ARG2(*call); |
if (nvp == -1) |
nvp = vp; |
if (nvp >= MAX_VIEWPORTS || nvp < 0 || |
!viewports[nvp].initialized) { |
retval = EINVAL; |
break; |
} |
animations[i].vp = nvp; |
break; |
case FB_ANIM_START: |
case FB_ANIM_STOP: |
i = IPC_GET_ARG1(*call); |
if (i >= MAX_ANIMATIONS || i < 0) { |
retval = EINVAL; |
break; |
} |
newval = (IPC_GET_METHOD(*call) == FB_ANIM_START); |
if (newval ^ animations[i].enabled) { |
animations[i].enabled = newval; |
anims_enabled += newval ? 1 : -1; |
} |
break; |
default: |
handled = 0; |
} |
if (handled) |
ipc_answer_0(callid, retval); |
return handled; |
} |
/** Handler for messages concerning pixmap handling */ |
static int |
pixmap_handle(ipc_callid_t callid, ipc_call_t *call, int vp) |
{ |
int handled = 1; |
int retval = 0; |
int i,nvp; |
switch (IPC_GET_METHOD(*call)) { |
case FB_VP_DRAW_PIXMAP: |
nvp = IPC_GET_ARG1(*call); |
if (nvp == -1) |
nvp = vp; |
if (nvp < 0 || nvp >= MAX_VIEWPORTS || |
!viewports[nvp].initialized) { |
retval = EINVAL; |
break; |
} |
i = IPC_GET_ARG2(*call); |
retval = draw_pixmap(nvp, i); |
break; |
case FB_VP2PIXMAP: |
nvp = IPC_GET_ARG1(*call); |
if (nvp == -1) |
nvp = vp; |
if (nvp < 0 || nvp >= MAX_VIEWPORTS || |
!viewports[nvp].initialized) |
retval = EINVAL; |
else |
retval = save_vp_to_pixmap(&viewports[nvp]); |
break; |
case FB_DROP_PIXMAP: |
i = IPC_GET_ARG1(*call); |
if (i >= MAX_PIXMAPS) { |
retval = EINVAL; |
break; |
} |
if (pixmaps[i].data) { |
free(pixmaps[i].data); |
pixmaps[i].data = NULL; |
} |
break; |
default: |
handled = 0; |
} |
if (handled) |
ipc_answer_0(callid, retval); |
return handled; |
} |
/** Function for handling connections to FB |
* |
*/ |
static void |
fb_client_connection(ipc_callid_t iid, ipc_call_t *icall) |
{ |
ipc_callid_t callid; |
ipc_call_t call; |
int retval; |
int i; |
unsigned int row,col; |
char c; |
int vp = 0; |
viewport_t *vport = &viewports[0]; |
if (client_connected) { |
ipc_answer_0(iid, ELIMIT); |
return; |
} |
client_connected = 1; |
ipc_answer_0(iid, EOK); /* Accept connection */ |
while (1) { |
if (vport->cursor_active || anims_enabled) |
callid = async_get_call_timeout(&call, 250000); |
else |
callid = async_get_call(&call); |
mouse_hide(); |
if (!callid) { |
cursor_blink(vport); |
anims_tick(); |
mouse_show(); |
continue; |
} |
if (shm_handle(callid, &call, vp)) |
continue; |
if (pixmap_handle(callid, &call, vp)) |
continue; |
if (anim_handle(callid, &call, vp)) |
continue; |
switch (IPC_GET_METHOD(call)) { |
case IPC_M_PHONE_HUNGUP: |
client_connected = 0; |
/* cleanup other viewports */ |
for (i = 1; i < MAX_VIEWPORTS; i++) |
vport->initialized = 0; |
return; /* Exit thread */ |
case FB_PUTCHAR: |
case FB_TRANS_PUTCHAR: |
c = IPC_GET_ARG1(call); |
row = IPC_GET_ARG2(call); |
col = IPC_GET_ARG3(call); |
if (row >= vport->rows || col >= vport->cols) { |
retval = EINVAL; |
break; |
} |
ipc_answer_0(callid, EOK); |
draw_char(vport, c, row, col, vport->style, |
IPC_GET_METHOD(call) == FB_TRANS_PUTCHAR); |
continue; /* msg already answered */ |
case FB_CLEAR: |
clear_port(vport); |
cursor_print(vport); |
retval = 0; |
break; |
case FB_CURSOR_GOTO: |
row = IPC_GET_ARG1(call); |
col = IPC_GET_ARG2(call); |
if (row >= vport->rows || col >= vport->cols) { |
retval = EINVAL; |
break; |
} |
retval = 0; |
cursor_hide(vport); |
vport->cur_col = col; |
vport->cur_row = row; |
cursor_print(vport); |
break; |
case FB_CURSOR_VISIBILITY: |
cursor_hide(vport); |
vport->cursor_active = IPC_GET_ARG1(call); |
cursor_print(vport); |
retval = 0; |
break; |
case FB_GET_CSIZE: |
ipc_answer_2(callid, EOK, vport->rows, vport->cols); |
continue; |
case FB_SCROLL: |
i = IPC_GET_ARG1(call); |
if (i > vport->rows || i < (- (int)vport->rows)) { |
retval = EINVAL; |
break; |
} |
cursor_hide(vport); |
scroll_port(vport, i*FONT_SCANLINES); |
cursor_print(vport); |
retval = 0; |
break; |
case FB_VIEWPORT_DB: |
/* Enable double buffering */ |
i = IPC_GET_ARG1(call); |
if (i == -1) |
i = vp; |
if (i < 0 || i >= MAX_VIEWPORTS) { |
retval = EINVAL; |
break; |
} |
if (!viewports[i].initialized ) { |
retval = EADDRNOTAVAIL; |
break; |
} |
viewports[i].dboffset = 0; |
if (IPC_GET_ARG2(call) == 1 && !viewports[i].dbdata) |
viewports[i].dbdata = |
malloc(screen.pixelbytes * |
viewports[i].width * viewports[i].height); |
else if (IPC_GET_ARG2(call) == 0 && |
viewports[i].dbdata) { |
free(viewports[i].dbdata); |
viewports[i].dbdata = NULL; |
} |
retval = 0; |
break; |
case FB_VIEWPORT_SWITCH: |
i = IPC_GET_ARG1(call); |
if (i < 0 || i >= MAX_VIEWPORTS) { |
retval = EINVAL; |
break; |
} |
if (! viewports[i].initialized ) { |
retval = EADDRNOTAVAIL; |
break; |
} |
cursor_hide(vport); |
vp = i; |
vport = &viewports[vp]; |
cursor_print(vport); |
retval = 0; |
break; |
case FB_VIEWPORT_CREATE: |
retval = viewport_create(IPC_GET_ARG1(call) >> 16, |
IPC_GET_ARG1(call) & 0xffff, |
IPC_GET_ARG2(call) >> 16, |
IPC_GET_ARG2(call) & 0xffff); |
break; |
case FB_VIEWPORT_DELETE: |
i = IPC_GET_ARG1(call); |
if (i < 0 || i >= MAX_VIEWPORTS) { |
retval = EINVAL; |
break; |
} |
if (! viewports[i].initialized ) { |
retval = EADDRNOTAVAIL; |
break; |
} |
viewports[i].initialized = 0; |
if (viewports[i].dbdata) { |
free(viewports[i].dbdata); |
viewports[i].dbdata = NULL; |
} |
retval = 0; |
break; |
case FB_SET_STYLE: |
vport->style.fg_color = IPC_GET_ARG1(call); |
vport->style.bg_color = IPC_GET_ARG2(call); |
retval = 0; |
break; |
case FB_GET_RESOLUTION: |
ipc_answer_2(callid, EOK, screen.xres, screen.yres); |
continue; |
case FB_POINTER_MOVE: |
pointer_enabled = 1; |
mouse_move(IPC_GET_ARG1(call), IPC_GET_ARG2(call)); |
retval = 0; |
break; |
default: |
retval = ENOENT; |
} |
ipc_answer_0(callid, retval); |
} |
} |
/** Initialization of framebuffer */ |
int |
fb_init(void) |
{ |
void *fb_ph_addr; |
unsigned int fb_width; |
unsigned int fb_height; |
unsigned int fb_scanline; |
unsigned int fb_visual; |
bool fb_invert_colors; |
void *fb_addr; |
size_t asz; |
async_set_client_connection(fb_client_connection); |
fb_ph_addr = (void *) sysinfo_value("fb.address.physical"); |
fb_width = sysinfo_value("fb.width"); |
fb_height = sysinfo_value("fb.height"); |
fb_scanline = sysinfo_value("fb.scanline"); |
fb_visual = sysinfo_value("fb.visual"); |
fb_invert_colors = sysinfo_value("fb.invert-colors"); |
asz = fb_scanline * fb_height; |
fb_addr = as_get_mappable_page(asz); |
physmem_map(fb_ph_addr, fb_addr, ALIGN_UP(asz, PAGE_SIZE) >> |
PAGE_WIDTH, AS_AREA_READ | AS_AREA_WRITE); |
if (screen_init(fb_addr, fb_width, fb_height, fb_scanline, fb_visual, |
fb_invert_colors)) |
return 0; |
return -1; |
} |
/** |
* @} |
*/ |
/tags/0.3.0/uspace/srv/fb/ega.c |
---|
0,0 → 1,331 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @defgroup egafb EGA framebuffer |
* @brief HelenOS EGA framebuffer. |
* @ingroup fbs |
* @{ |
*/ |
/** @file |
*/ |
#include <stdlib.h> |
#include <unistd.h> |
#include <align.h> |
#include <async.h> |
#include <ipc/ipc.h> |
#include <errno.h> |
#include <stdio.h> |
#include <ddi.h> |
#include <sysinfo.h> |
#include <as.h> |
#include <ipc/fb.h> |
#include <ipc/ipc.h> |
#include <ipc/ns.h> |
#include <ipc/services.h> |
#include <libarch/ddi.h> |
#include "ega.h" |
#include "../console/screenbuffer.h" |
#include "main.h" |
#define MAX_SAVED_SCREENS 256 |
typedef struct saved_screen { |
short *data; |
} saved_screen; |
saved_screen saved_screens[MAX_SAVED_SCREENS]; |
#define EGA_IO_ADDRESS 0x3d4 |
#define EGA_IO_SIZE 2 |
#define NORMAL_COLOR 0x0f |
#define INVERTED_COLOR 0xf0 |
#define EGA_STYLE(fg,bg) ((fg) > (bg) ? NORMAL_COLOR : INVERTED_COLOR) |
/* Allow only 1 connection */ |
static int client_connected = 0; |
static unsigned int scr_width; |
static unsigned int scr_height; |
static char *scr_addr; |
static unsigned int style = NORMAL_COLOR; |
static void clrscr(void) |
{ |
int i; |
for (i = 0; i < scr_width * scr_height; i++) { |
scr_addr[i * 2] = ' '; |
scr_addr[i * 2 + 1] = style; |
} |
} |
static void cursor_goto(unsigned int row, unsigned int col) |
{ |
int ega_cursor; |
ega_cursor = col + scr_width * row; |
outb(EGA_IO_ADDRESS, 0xe); |
outb(EGA_IO_ADDRESS + 1, (ega_cursor >> 8) & 0xff); |
outb(EGA_IO_ADDRESS, 0xf); |
outb(EGA_IO_ADDRESS + 1, ega_cursor & 0xff); |
} |
static void cursor_disable(void) |
{ |
uint8_t stat; |
outb(EGA_IO_ADDRESS, 0xa); |
stat=inb(EGA_IO_ADDRESS + 1); |
outb(EGA_IO_ADDRESS, 0xa); |
outb(EGA_IO_ADDRESS + 1, stat | (1 << 5)); |
} |
static void cursor_enable(void) |
{ |
uint8_t stat; |
outb(EGA_IO_ADDRESS, 0xa); |
stat=inb(EGA_IO_ADDRESS + 1); |
outb(EGA_IO_ADDRESS, 0xa); |
outb(EGA_IO_ADDRESS + 1, stat & (~(1 << 5))); |
} |
static void scroll(int rows) |
{ |
int i; |
if (rows > 0) { |
memcpy(scr_addr, ((char *) scr_addr) + rows * scr_width * 2, |
scr_width * scr_height * 2 - rows * scr_width * 2); |
for (i = 0; i < rows * scr_width; i++) |
(((short *) scr_addr) + scr_width * scr_height - rows * |
scr_width)[i] = ((style << 8) + ' '); |
} else if (rows < 0) { |
memcpy(((char *)scr_addr) - rows * scr_width * 2, scr_addr, |
scr_width * scr_height * 2 + rows * scr_width * 2); |
for (i = 0; i < -rows * scr_width; i++) |
((short *)scr_addr)[i] = ((style << 8 ) + ' '); |
} |
} |
static void printchar(char c, unsigned int row, unsigned int col) |
{ |
scr_addr[(row * scr_width + col) * 2] = c; |
scr_addr[(row * scr_width + col) * 2 + 1] = style; |
cursor_goto(row, col + 1); |
} |
static void draw_text_data(keyfield_t *data) |
{ |
int i; |
for (i = 0; i < scr_width * scr_height; i++) { |
scr_addr[i * 2] = data[i].character; |
scr_addr[i * 2 + 1] = EGA_STYLE(data[i].style.fg_color, |
data[i].style.bg_color); |
} |
} |
static int save_screen(void) |
{ |
int i; |
for (i = 0; (i < MAX_SAVED_SCREENS) && (saved_screens[i].data); i++) |
; |
if (i == MAX_SAVED_SCREENS) |
return EINVAL; |
if (!(saved_screens[i].data = malloc(2 * scr_width * scr_height))) |
return ENOMEM; |
memcpy(saved_screens[i].data, scr_addr, 2 * scr_width * scr_height); |
return i; |
} |
static int print_screen(int i) |
{ |
if (saved_screens[i].data) |
memcpy(scr_addr, saved_screens[i].data, 2 * scr_width * |
scr_height); |
else |
return EINVAL; |
return i; |
} |
static void ega_client_connection(ipc_callid_t iid, ipc_call_t *icall) |
{ |
int retval; |
ipc_callid_t callid; |
ipc_call_t call; |
char c; |
unsigned int row, col; |
int bgcolor,fgcolor; |
keyfield_t *interbuf = NULL; |
size_t intersize = 0; |
int i; |
if (client_connected) { |
ipc_answer_0(iid, ELIMIT); |
return; |
} |
client_connected = 1; |
ipc_answer_0(iid, EOK); /* Accept connection */ |
while (1) { |
callid = async_get_call(&call); |
switch (IPC_GET_METHOD(call)) { |
case IPC_M_PHONE_HUNGUP: |
client_connected = 0; |
ipc_answer_0(callid, EOK); |
return; /* Exit thread */ |
case IPC_M_SHARE_OUT: |
/* We accept one area for data interchange */ |
intersize = IPC_GET_ARG2(call); |
if (intersize >= scr_width * scr_height * |
sizeof(*interbuf)) { |
receive_comm_area(callid, &call, |
(void *) &interbuf); |
continue; |
} |
retval = EINVAL; |
break; |
case FB_DRAW_TEXT_DATA: |
if (!interbuf) { |
retval = EINVAL; |
break; |
} |
draw_text_data(interbuf); |
retval = 0; |
break; |
case FB_GET_CSIZE: |
ipc_answer_2(callid, EOK, scr_height, scr_width); |
continue; |
case FB_CLEAR: |
clrscr(); |
retval = 0; |
break; |
case FB_PUTCHAR: |
c = IPC_GET_ARG1(call); |
row = IPC_GET_ARG2(call); |
col = IPC_GET_ARG3(call); |
if (col >= scr_width || row >= scr_height) { |
retval = EINVAL; |
break; |
} |
printchar(c, row, col); |
retval = 0; |
break; |
case FB_CURSOR_GOTO: |
row = IPC_GET_ARG1(call); |
col = IPC_GET_ARG2(call); |
if (row >= scr_height || col >= scr_width) { |
retval = EINVAL; |
break; |
} |
cursor_goto(row, col); |
retval = 0; |
break; |
case FB_SCROLL: |
i = IPC_GET_ARG1(call); |
if (i > scr_height || i < -((int) scr_height)) { |
retval = EINVAL; |
break; |
} |
scroll(i); |
retval = 0; |
break; |
case FB_CURSOR_VISIBILITY: |
if(IPC_GET_ARG1(call)) |
cursor_enable(); |
else |
cursor_disable(); |
retval = 0; |
break; |
case FB_SET_STYLE: |
fgcolor = IPC_GET_ARG1(call); |
bgcolor = IPC_GET_ARG2(call); |
style = EGA_STYLE(fgcolor, bgcolor); |
retval = 0; |
break; |
case FB_VP_DRAW_PIXMAP: |
i = IPC_GET_ARG2(call); |
retval = print_screen(i); |
break; |
case FB_VP2PIXMAP: |
retval = save_screen(); |
break; |
case FB_DROP_PIXMAP: |
i = IPC_GET_ARG1(call); |
if (i >= MAX_SAVED_SCREENS) { |
retval = EINVAL; |
break; |
} |
if (saved_screens[i].data) { |
free(saved_screens[i].data); |
saved_screens[i].data = NULL; |
} |
retval = 0; |
break; |
default: |
retval = ENOENT; |
} |
ipc_answer_0(callid, retval); |
} |
} |
int ega_init(void) |
{ |
void *ega_ph_addr; |
size_t sz; |
ega_ph_addr = (void *) sysinfo_value("fb.address.physical"); |
scr_width = sysinfo_value("fb.width"); |
scr_height = sysinfo_value("fb.height"); |
iospace_enable(task_get_id(), (void *) EGA_IO_ADDRESS, 2); |
sz = scr_width * scr_height * 2; |
scr_addr = as_get_mappable_page(sz); |
physmem_map(ega_ph_addr, scr_addr, ALIGN_UP(sz, PAGE_SIZE) >> |
PAGE_WIDTH, AS_AREA_READ | AS_AREA_WRITE); |
async_set_client_connection(ega_client_connection); |
return 0; |
} |
/** |
* @} |
*/ |
/tags/0.3.0/uspace/srv/fb/main.c |
---|
0,0 → 1,81 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#include <ipc/ipc.h> |
#include <ipc/services.h> |
#include <sysinfo.h> |
#include <async.h> |
#include <as.h> |
#include <align.h> |
#include <errno.h> |
#include "fb.h" |
#include "sysio.h" |
#include "ega.h" |
#include "main.h" |
void receive_comm_area(ipc_callid_t callid, ipc_call_t *call, void **area) |
{ |
void *dest; |
dest = as_get_mappable_page(IPC_GET_ARG2(*call)); |
if (ipc_answer_1(callid, EOK, (sysarg_t) dest) == 0) { |
if (*area) |
as_area_destroy(*area); |
*area = dest; |
} |
} |
int main(int argc, char *argv[]) |
{ |
ipcarg_t phonead; |
int initialized = 0; |
#ifdef FB_ENABLED |
if (sysinfo_value("fb.kind") == 1) { |
if (fb_init() == 0) |
initialized = 1; |
} |
#endif |
#ifdef EGA_ENABLED |
if (!initialized && sysinfo_value("fb.kind") == 2) { |
if (ega_init() == 0) |
initialized = 1; |
} |
#endif |
if (!initialized) |
sysio_init(); |
if (ipc_connect_to_me(PHONE_NS, SERVICE_VIDEO, 0, 0, &phonead) != 0) |
return -1; |
async_manager(); |
/* Never reached */ |
return 0; |
} |
/tags/0.3.0/uspace/srv/fb/sysio.c |
---|
0,0 → 1,198 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @defgroup sysio SysIO |
* @brief HelenOS framebuffer emulation via kernel. |
* @ingroup fbs |
* @{ |
*/ |
/** @file |
*/ |
#include <async.h> |
#include <ipc/fb.h> |
#include <ipc/ipc.h> |
#include <libc.h> |
#include <errno.h> |
#include <string.h> |
#include <libc.h> |
#include <stdio.h> |
#include "sysio.h" |
#define WIDTH 80 |
#define HEIGHT 25 |
/* Allow only 1 connection */ |
static int client_connected = 0; |
static void sysput(char c) |
{ |
__SYSCALL3(SYS_IO, 1, (sysarg_t)&c, (sysarg_t) 1); |
} |
static void sysputs(char *s) |
{ |
while (*s) { |
sysput(*(s++)); |
} |
// __SYSCALL3(SYS_IO, 1, (sysarg_t)s, strlen(s)); |
} |
/** Send clearscreen sequence to console */ |
static void clrscr(void) |
{ |
sysputs("\033[2J"); |
} |
/** Send ansi sequence to console to change cursor position */ |
static void curs_goto(unsigned int row, unsigned int col) |
{ |
char control[20]; |
if (row > 200 || col > 200) |
return; |
snprintf(control, 20, "\033[%d;%df",row+1, col+1); |
sysputs(control); |
} |
static void set_style(int mode) |
{ |
char control[20]; |
snprintf(control, 20, "\033[%dm", mode); |
sysputs(control); |
} |
static void scroll(int i) |
{ |
if (i > 0) { |
curs_goto(HEIGHT-1, 0); |
while (i--) |
sysputs("\033D"); |
} else if (i < 0) { |
curs_goto(0,0); |
while (i++) |
sysputs("\033M"); |
} |
} |
/** ANSI terminal emulation main thread */ |
static void sysio_client_connection(ipc_callid_t iid, ipc_call_t *icall) |
{ |
int retval; |
ipc_callid_t callid; |
ipc_call_t call; |
char c; |
int lastcol=0; |
int lastrow=0; |
int newcol,newrow; |
int fgcolor,bgcolor; |
int i; |
if (client_connected) { |
ipc_answer_0(iid, ELIMIT); |
return; |
} |
client_connected = 1; |
ipc_answer_0(iid, EOK); /* Accept connection */ |
while (1) { |
callid = async_get_call(&call); |
switch (IPC_GET_METHOD(call)) { |
case IPC_M_PHONE_HUNGUP: |
client_connected = 0; |
ipc_answer_0(callid, EOK); |
return; /* Exit thread */ |
case FB_PUTCHAR: |
c = IPC_GET_ARG1(call); |
newrow = IPC_GET_ARG2(call); |
newcol = IPC_GET_ARG3(call); |
if ((lastcol != newcol) || (lastrow != newrow)) |
curs_goto(newrow, newcol); |
lastcol = newcol + 1; |
lastrow = newrow; |
sysput(c); |
retval = 0; |
break; |
case FB_CURSOR_GOTO: |
newrow = IPC_GET_ARG1(call); |
newcol = IPC_GET_ARG2(call); |
curs_goto(newrow, newcol); |
lastrow = newrow; |
lastcol = newcol; |
retval = 0; |
break; |
case FB_GET_CSIZE: |
ipc_answer_2(callid, EOK, HEIGHT, WIDTH); |
continue; |
case FB_CLEAR: |
clrscr(); |
retval = 0; |
break; |
case FB_SET_STYLE: |
fgcolor = IPC_GET_ARG1(call); |
bgcolor = IPC_GET_ARG2(call); |
if (fgcolor < bgcolor) |
set_style(0); |
else |
set_style(7); |
retval = 0; |
break; |
case FB_SCROLL: |
i = IPC_GET_ARG1(call); |
if ((i > HEIGHT) || (i < -HEIGHT)) { |
retval = EINVAL; |
break; |
} |
scroll(i); |
curs_goto(lastrow, lastcol); |
retval = 0; |
break; |
default: |
retval = ENOENT; |
} |
ipc_answer_0(callid, retval); |
} |
} |
/** ANSI terminal emulation initialization */ |
void sysio_init(void) |
{ |
async_set_client_connection(sysio_client_connection); |
clrscr(); |
curs_goto(0,0); |
/* Set scrolling region to 0-25 lines */ |
sysputs("\033[0;25r"); |
} |
/** |
* @} |
*/ |
/tags/0.3.0/uspace/srv/fb/ppm.h |
---|
0,0 → 1,39 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#ifndef FB_PPM_H_ |
#define FB_PPM_H_ |
#include "fb.h" |
#include <sys/types.h> |
extern int ppm_draw(unsigned char *, size_t, unsigned int, unsigned int, |
unsigned int, unsigned int, putpixel_cb_t, void *); |
extern int ppm_get_data(unsigned char *, size_t, unsigned int *, unsigned int *); |
#endif |
/tags/0.3.0/uspace/srv/fb/ppm.c |
---|
0,0 → 1,130 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#include <sys/types.h> |
#include <errno.h> |
#include "ppm.h" |
static void skip_whitespace(unsigned char **data) |
{ |
retry: |
while (**data == ' ' || **data == '\t' || **data == '\n' || |
**data == '\r') |
(*data)++; |
if (**data == '#') { |
while (1) { |
if (**data == '\n' || **data == '\r') |
break; |
(*data)++; |
} |
goto retry; |
} |
} |
static void read_num(unsigned char **data, unsigned int *num) |
{ |
*num = 0; |
while (**data >= '0' && **data <= '9') { |
*num *= 10; |
*num += **data - '0'; |
(*data)++; |
} |
} |
int ppm_get_data(unsigned char *data, size_t dtsz, unsigned int *width, |
unsigned int *height) |
{ |
/* Read magic */ |
if (data[0] != 'P' || data[1] != '6') |
return EINVAL; |
data+=2; |
skip_whitespace(&data); |
read_num(&data, width); |
skip_whitespace(&data); |
read_num(&data,height); |
return 0; |
} |
/** Draw PPM pixmap |
* |
* @param data Pointer to PPM data |
* @param datasz Maximum data size |
* @param sx Coordinate of upper left corner |
* @param sy Coordinate of upper left corner |
* @param maxwidth Maximum allowed width for picture |
* @param maxheight Maximum allowed height for picture |
* @param putpixel Putpixel function used to print bitmap |
*/ |
int ppm_draw(unsigned char *data, size_t datasz, unsigned int sx, |
unsigned int sy, unsigned int maxwidth, unsigned int maxheight, |
putpixel_cb_t putpixel, void *vport) |
{ |
unsigned int width, height; |
unsigned int maxcolor; |
int i; |
unsigned int color; |
unsigned int coef; |
/* Read magic */ |
if (data[0] != 'P' || data[1] != '6') |
return EINVAL; |
data+=2; |
skip_whitespace(&data); |
read_num(&data, &width); |
skip_whitespace(&data); |
read_num(&data,&height); |
skip_whitespace(&data); |
read_num(&data,&maxcolor); |
data++; |
if (maxcolor == 0 || maxcolor > 255 || width * height > datasz) { |
return EINVAL; |
} |
coef = 255 / maxcolor; |
if (coef * maxcolor > 255) |
coef -= 1; |
for (i = 0; i < width * height; i++) { |
/* Crop picture if we don't fit into region */ |
if (i % width > maxwidth || i / width > maxheight) { |
data += 3; |
continue; |
} |
color = ((data[0] * coef) << 16) + ((data[1] * coef) << 8) + |
data[2] * coef; |
(*putpixel)(vport, sx + (i % width), sy + (i / width), color); |
data += 3; |
} |
return 0; |
} |
/tags/0.3.0/uspace/srv/fb/Makefile |
---|
0,0 → 1,97 |
# |
# Copyright (c) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
## Setup toolchain |
# |
LIBC_PREFIX = ../../lib/libc |
SOFTINT_PREFIX = ../../lib/softint |
include $(LIBC_PREFIX)/Makefile.toolchain |
CFLAGS += -I../libipc/include |
LIBS = $(LIBC_PREFIX)/libc.a |
## Sources |
# |
OUTPUT = fb |
SOURCES = \ |
main.c \ |
sysio.c \ |
ppm.c |
ifneq ($(ARCH), ia64) |
SOURCES += fb.c \ |
font-8x16.c |
CFLAGS += -DFB_ENABLED |
endif |
ifeq ($(ARCH), ia32) |
SOURCES += ega.c |
CFLAGS += -DEGA_ENABLED |
endif |
ifeq ($(ARCH), amd64) |
SOURCES += ega.c |
CFLAGS += -DEGA_ENABLED |
endif |
ifeq ($(ARCH), mips32) |
CFLAGS += -DFB_INVERT_ENDIAN |
endif |
CFLAGS += -D$(ARCH) |
OBJECTS := $(addsuffix .o,$(basename $(SOURCES))) |
.PHONY: all clean depend disasm |
all: $(OUTPUT) disasm |
-include Makefile.depend |
clean: |
-rm -f $(OUTPUT) $(OUTPUT).map $(OUTPUT).disasm Makefile.depend |
depend: |
$(CC) $(DEFS) $(CFLAGS) -M $(SOURCES) > Makefile.depend |
$(OUTPUT): $(OBJECTS) $(LIBS) |
$(LD) -T $(LIBC_PREFIX)/arch/$(ARCH)/_link.ld -e __entry_driver $(OBJECTS) $(LIBS) $(LFLAGS) -o $@ -Map $(OUTPUT).map |
disasm: |
$(OBJDUMP) -d $(OUTPUT) >$(OUTPUT).disasm |
%.o: %.S |
$(CC) $(DEFS) $(AFLAGS) $(CFLAGS) -D__ASM__ -c $< -o $@ |
%.o: %.s |
$(AS) $(AFLAGS) $< -o $@ |
%.o: %.c |
$(CC) $(DEFS) $(CFLAGS) -c $< -o $@ |
/tags/0.3.0/uspace/srv/fb/font-8x16.h |
---|
0,0 → 1,37 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#ifndef FB_FONT_8X16_H_ |
#define FB_FONT_8X16_H_ |
#define FONT_GLIPHS 256 |
#define FONT_SCANLINES 16 |
extern unsigned char fb_font[FONT_GLIPHS * FONT_SCANLINES]; |
#endif |
/tags/0.3.0/uspace/srv/fb/ega.h |
---|
0,0 → 1,46 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup egafb |
* @brief HelenOS EGA framebuffer. |
* @ingroup fbs |
* @{ |
*/ |
/** @file |
*/ |
#ifndef FB_EGA_H_ |
#define FB_EGA_H_ |
extern int ega_init(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/srv/fb/main.h |
---|
0,0 → 1,34 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#ifndef FB_MAIN_H_ |
#define FB_MAIN_H_ |
extern void receive_comm_area(ipc_callid_t, ipc_call_t *, void **); |
#endif |
/tags/0.3.0/uspace/srv/fb/sysio.h |
---|
0,0 → 1,45 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup sysio |
* @brief HelenOS framebuffer emulation via kernel. |
* @ingroup fbs |
* @{ |
*/ |
/** @file |
*/ |
#ifndef FB_SYSIO_H_ |
#define FB_SYSIO_H_ |
extern void sysio_init(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/srv/fb/fb.h |
---|
0,0 → 1,46 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup fb |
* @ingroup fbs |
* @{ |
*/ |
/** @file |
*/ |
#ifndef FB_FB_H_ |
#define FB_FB_H_ |
typedef void (* putpixel_cb_t)(void *, unsigned int, unsigned int, int); |
extern int fb_init(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/srv/fb/font-8x16.c |
---|
0,0 → 1,4641 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#include "font-8x16.h" |
unsigned char fb_font[FONT_GLIPHS * FONT_SCANLINES] = { |
/* 0 0x00 '^@' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 1 0x01 '^A' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0x81, /* 10000001 */ |
0xa5, /* 10100101 */ |
0x81, /* 10000001 */ |
0x81, /* 10000001 */ |
0xbd, /* 10111101 */ |
0x99, /* 10011001 */ |
0x81, /* 10000001 */ |
0x81, /* 10000001 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 2 0x02 '^B' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0xff, /* 11111111 */ |
0xdb, /* 11011011 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xc3, /* 11000011 */ |
0xe7, /* 11100111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 3 0x03 '^C' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x6c, /* 01101100 */ |
0xfe, /* 11111110 */ |
0xfe, /* 11111110 */ |
0xfe, /* 11111110 */ |
0xfe, /* 11111110 */ |
0x7c, /* 01111100 */ |
0x38, /* 00111000 */ |
0x10, /* 00010000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 4 0x04 '^D' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x10, /* 00010000 */ |
0x38, /* 00111000 */ |
0x7c, /* 01111100 */ |
0xfe, /* 11111110 */ |
0x7c, /* 01111100 */ |
0x38, /* 00111000 */ |
0x10, /* 00010000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 5 0x05 '^E' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x3c, /* 00111100 */ |
0xe7, /* 11100111 */ |
0xe7, /* 11100111 */ |
0xe7, /* 11100111 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 6 0x06 '^F' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x7e, /* 01111110 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0x7e, /* 01111110 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 7 0x07 '^G' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x3c, /* 00111100 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 8 0x08 '^H' */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xe7, /* 11100111 */ |
0xc3, /* 11000011 */ |
0xc3, /* 11000011 */ |
0xe7, /* 11100111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
/* 9 0x09 '^I' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x3c, /* 00111100 */ |
0x66, /* 01100110 */ |
0x42, /* 01000010 */ |
0x42, /* 01000010 */ |
0x66, /* 01100110 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 10 0x0a '^J' */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xc3, /* 11000011 */ |
0x99, /* 10011001 */ |
0xbd, /* 10111101 */ |
0xbd, /* 10111101 */ |
0x99, /* 10011001 */ |
0xc3, /* 11000011 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
/* 11 0x0b '^K' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x1e, /* 00011110 */ |
0x0e, /* 00001110 */ |
0x1a, /* 00011010 */ |
0x32, /* 00110010 */ |
0x78, /* 01111000 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x78, /* 01111000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 12 0x0c '^L' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x3c, /* 00111100 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x3c, /* 00111100 */ |
0x18, /* 00011000 */ |
0x7e, /* 01111110 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 13 0x0d '^M' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x3f, /* 00111111 */ |
0x33, /* 00110011 */ |
0x3f, /* 00111111 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x70, /* 01110000 */ |
0xf0, /* 11110000 */ |
0xe0, /* 11100000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 14 0x0e '^N' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7f, /* 01111111 */ |
0x63, /* 01100011 */ |
0x7f, /* 01111111 */ |
0x63, /* 01100011 */ |
0x63, /* 01100011 */ |
0x63, /* 01100011 */ |
0x63, /* 01100011 */ |
0x67, /* 01100111 */ |
0xe7, /* 11100111 */ |
0xe6, /* 11100110 */ |
0xc0, /* 11000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 15 0x0f '^O' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0xdb, /* 11011011 */ |
0x3c, /* 00111100 */ |
0xe7, /* 11100111 */ |
0x3c, /* 00111100 */ |
0xdb, /* 11011011 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 16 0x10 '^P' */ |
0x00, /* 00000000 */ |
0x80, /* 10000000 */ |
0xc0, /* 11000000 */ |
0xe0, /* 11100000 */ |
0xf0, /* 11110000 */ |
0xf8, /* 11111000 */ |
0xfe, /* 11111110 */ |
0xf8, /* 11111000 */ |
0xf0, /* 11110000 */ |
0xe0, /* 11100000 */ |
0xc0, /* 11000000 */ |
0x80, /* 10000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 17 0x11 '^Q' */ |
0x00, /* 00000000 */ |
0x02, /* 00000010 */ |
0x06, /* 00000110 */ |
0x0e, /* 00001110 */ |
0x1e, /* 00011110 */ |
0x3e, /* 00111110 */ |
0xfe, /* 11111110 */ |
0x3e, /* 00111110 */ |
0x1e, /* 00011110 */ |
0x0e, /* 00001110 */ |
0x06, /* 00000110 */ |
0x02, /* 00000010 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 18 0x12 '^R' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x7e, /* 01111110 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x7e, /* 01111110 */ |
0x3c, /* 00111100 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 19 0x13 '^S' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x00, /* 00000000 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 20 0x14 '^T' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7f, /* 01111111 */ |
0xdb, /* 11011011 */ |
0xdb, /* 11011011 */ |
0xdb, /* 11011011 */ |
0x7b, /* 01111011 */ |
0x1b, /* 00011011 */ |
0x1b, /* 00011011 */ |
0x1b, /* 00011011 */ |
0x1b, /* 00011011 */ |
0x1b, /* 00011011 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 21 0x15 '^U' */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0x60, /* 01100000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x6c, /* 01101100 */ |
0x38, /* 00111000 */ |
0x0c, /* 00001100 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 22 0x16 '^V' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0xfe, /* 11111110 */ |
0xfe, /* 11111110 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 23 0x17 '^W' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x7e, /* 01111110 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x7e, /* 01111110 */ |
0x3c, /* 00111100 */ |
0x18, /* 00011000 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 24 0x18 '^X' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x7e, /* 01111110 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 25 0x19 '^Y' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x7e, /* 01111110 */ |
0x3c, /* 00111100 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 26 0x1a '^Z' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x0c, /* 00001100 */ |
0xfe, /* 11111110 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 27 0x1b '^[' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0xfe, /* 11111110 */ |
0x60, /* 01100000 */ |
0x30, /* 00110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 28 0x1c '^\' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 29 0x1d '^]' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x28, /* 00101000 */ |
0x6c, /* 01101100 */ |
0xfe, /* 11111110 */ |
0x6c, /* 01101100 */ |
0x28, /* 00101000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 30 0x1e '^^' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x10, /* 00010000 */ |
0x38, /* 00111000 */ |
0x38, /* 00111000 */ |
0x7c, /* 01111100 */ |
0x7c, /* 01111100 */ |
0xfe, /* 11111110 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 31 0x1f '^_' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0xfe, /* 11111110 */ |
0x7c, /* 01111100 */ |
0x7c, /* 01111100 */ |
0x38, /* 00111000 */ |
0x38, /* 00111000 */ |
0x10, /* 00010000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 32 0x20 ' ' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 33 0x21 '!' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x3c, /* 00111100 */ |
0x3c, /* 00111100 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 34 0x22 '"' */ |
0x00, /* 00000000 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x24, /* 00100100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 35 0x23 '#' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0xfe, /* 11111110 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0xfe, /* 11111110 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 36 0x24 '$' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc2, /* 11000010 */ |
0xc0, /* 11000000 */ |
0x7c, /* 01111100 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x86, /* 10000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 37 0x25 '%' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc2, /* 11000010 */ |
0xc6, /* 11000110 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0xc6, /* 11000110 */ |
0x86, /* 10000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 38 0x26 '&' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x38, /* 00111000 */ |
0x76, /* 01110110 */ |
0xdc, /* 11011100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 39 0x27 ''' */ |
0x00, /* 00000000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 40 0x28 '(' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x0c, /* 00001100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 41 0x29 ')' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 42 0x2a '*' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x66, /* 01100110 */ |
0x3c, /* 00111100 */ |
0xff, /* 11111111 */ |
0x3c, /* 00111100 */ |
0x66, /* 01100110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 43 0x2b '+' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x7e, /* 01111110 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 44 0x2c ',' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 45 0x2d '-' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 46 0x2e '.' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 47 0x2f '/' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x02, /* 00000010 */ |
0x06, /* 00000110 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0xc0, /* 11000000 */ |
0x80, /* 10000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 48 0x30 '0' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xd6, /* 11010110 */ |
0xd6, /* 11010110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x6c, /* 01101100 */ |
0x38, /* 00111000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 49 0x31 '1' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x38, /* 00111000 */ |
0x78, /* 01111000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 50 0x32 '2' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0x06, /* 00000110 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0xc0, /* 11000000 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 51 0x33 '3' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x3c, /* 00111100 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 52 0x34 '4' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x0c, /* 00001100 */ |
0x1c, /* 00011100 */ |
0x3c, /* 00111100 */ |
0x6c, /* 01101100 */ |
0xcc, /* 11001100 */ |
0xfe, /* 11111110 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x1e, /* 00011110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 53 0x35 '5' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xfc, /* 11111100 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 54 0x36 '6' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x60, /* 01100000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xfc, /* 11111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 55 0x37 '7' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0xc6, /* 11000110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 56 0x38 '8' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 57 0x39 '9' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7e, /* 01111110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x0c, /* 00001100 */ |
0x78, /* 01111000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 58 0x3a ':' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 59 0x3b ';' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 60 0x3c '<' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x06, /* 00000110 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x0c, /* 00001100 */ |
0x06, /* 00000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 61 0x3d '=' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 62 0x3e '>' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x60, /* 01100000 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x0c, /* 00001100 */ |
0x06, /* 00000110 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 63 0x3f '?' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 64 0x40 '@' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xde, /* 11011110 */ |
0xde, /* 11011110 */ |
0xde, /* 11011110 */ |
0xdc, /* 11011100 */ |
0xc0, /* 11000000 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 65 0x41 'A' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x10, /* 00010000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 66 0x42 'B' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfc, /* 11111100 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x7c, /* 01111100 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0xfc, /* 11111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 67 0x43 'C' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x3c, /* 00111100 */ |
0x66, /* 01100110 */ |
0xc2, /* 11000010 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc2, /* 11000010 */ |
0x66, /* 01100110 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 68 0x44 'D' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xf8, /* 11111000 */ |
0x6c, /* 01101100 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x6c, /* 01101100 */ |
0xf8, /* 11111000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 69 0x45 'E' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0x66, /* 01100110 */ |
0x62, /* 01100010 */ |
0x68, /* 01101000 */ |
0x78, /* 01111000 */ |
0x68, /* 01101000 */ |
0x60, /* 01100000 */ |
0x62, /* 01100010 */ |
0x66, /* 01100110 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 70 0x46 'F' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0x66, /* 01100110 */ |
0x62, /* 01100010 */ |
0x68, /* 01101000 */ |
0x78, /* 01111000 */ |
0x68, /* 01101000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0xf0, /* 11110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 71 0x47 'G' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x3c, /* 00111100 */ |
0x66, /* 01100110 */ |
0xc2, /* 11000010 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xde, /* 11011110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x66, /* 01100110 */ |
0x3a, /* 00111010 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 72 0x48 'H' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 73 0x49 'I' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x3c, /* 00111100 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 74 0x4a 'J' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x1e, /* 00011110 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x78, /* 01111000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 75 0x4b 'K' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xe6, /* 11100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x6c, /* 01101100 */ |
0x78, /* 01111000 */ |
0x78, /* 01111000 */ |
0x6c, /* 01101100 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0xe6, /* 11100110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 76 0x4c 'L' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xf0, /* 11110000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x62, /* 01100010 */ |
0x66, /* 01100110 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 77 0x4d 'M' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0xee, /* 11101110 */ |
0xfe, /* 11111110 */ |
0xfe, /* 11111110 */ |
0xd6, /* 11010110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 78 0x4e 'N' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0xe6, /* 11100110 */ |
0xf6, /* 11110110 */ |
0xfe, /* 11111110 */ |
0xde, /* 11011110 */ |
0xce, /* 11001110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 79 0x4f 'O' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 80 0x50 'P' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfc, /* 11111100 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x7c, /* 01111100 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0xf0, /* 11110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 81 0x51 'Q' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xd6, /* 11010110 */ |
0xde, /* 11011110 */ |
0x7c, /* 01111100 */ |
0x0c, /* 00001100 */ |
0x0e, /* 00001110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 82 0x52 'R' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfc, /* 11111100 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x7c, /* 01111100 */ |
0x6c, /* 01101100 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0xe6, /* 11100110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 83 0x53 'S' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x60, /* 01100000 */ |
0x38, /* 00111000 */ |
0x0c, /* 00001100 */ |
0x06, /* 00000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 84 0x54 'T' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0x7e, /* 01111110 */ |
0x5a, /* 01011010 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 85 0x55 'U' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 86 0x56 'V' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x6c, /* 01101100 */ |
0x38, /* 00111000 */ |
0x10, /* 00010000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 87 0x57 'W' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xd6, /* 11010110 */ |
0xd6, /* 11010110 */ |
0xd6, /* 11010110 */ |
0xfe, /* 11111110 */ |
0xee, /* 11101110 */ |
0x6c, /* 01101100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 88 0x58 'X' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x6c, /* 01101100 */ |
0x7c, /* 01111100 */ |
0x38, /* 00111000 */ |
0x38, /* 00111000 */ |
0x7c, /* 01111100 */ |
0x6c, /* 01101100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 89 0x59 'Y' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x3c, /* 00111100 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 90 0x5a 'Z' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0xc6, /* 11000110 */ |
0x86, /* 10000110 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0xc2, /* 11000010 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 91 0x5b '[' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x3c, /* 00111100 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 92 0x5c '\' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x80, /* 10000000 */ |
0xc0, /* 11000000 */ |
0xe0, /* 11100000 */ |
0x70, /* 01110000 */ |
0x38, /* 00111000 */ |
0x1c, /* 00011100 */ |
0x0e, /* 00001110 */ |
0x06, /* 00000110 */ |
0x02, /* 00000010 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 93 0x5d ']' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x3c, /* 00111100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 94 0x5e '^' */ |
0x10, /* 00010000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 95 0x5f '_' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xff, /* 11111111 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 96 0x60 '`' */ |
0x00, /* 00000000 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x0c, /* 00001100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 97 0x61 'a' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x78, /* 01111000 */ |
0x0c, /* 00001100 */ |
0x7c, /* 01111100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 98 0x62 'b' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xe0, /* 11100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x78, /* 01111000 */ |
0x6c, /* 01101100 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 99 0x63 'c' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 100 0x64 'd' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x1c, /* 00011100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x3c, /* 00111100 */ |
0x6c, /* 01101100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 101 0x65 'e' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 102 0x66 'f' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x1c, /* 00011100 */ |
0x36, /* 00110110 */ |
0x32, /* 00110010 */ |
0x30, /* 00110000 */ |
0x78, /* 01111000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x78, /* 01111000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 103 0x67 'g' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x76, /* 01110110 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x7c, /* 01111100 */ |
0x0c, /* 00001100 */ |
0xcc, /* 11001100 */ |
0x78, /* 01111000 */ |
0x00, /* 00000000 */ |
/* 104 0x68 'h' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xe0, /* 11100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x6c, /* 01101100 */ |
0x76, /* 01110110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0xe6, /* 11100110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 105 0x69 'i' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 106 0x6a 'j' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x00, /* 00000000 */ |
0x0e, /* 00001110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
/* 107 0x6b 'k' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xe0, /* 11100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x66, /* 01100110 */ |
0x6c, /* 01101100 */ |
0x78, /* 01111000 */ |
0x78, /* 01111000 */ |
0x6c, /* 01101100 */ |
0x66, /* 01100110 */ |
0xe6, /* 11100110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 108 0x6c 'l' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 109 0x6d 'm' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xec, /* 11101100 */ |
0xfe, /* 11111110 */ |
0xd6, /* 11010110 */ |
0xd6, /* 11010110 */ |
0xd6, /* 11010110 */ |
0xd6, /* 11010110 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 110 0x6e 'n' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xdc, /* 11011100 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 111 0x6f 'o' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 112 0x70 'p' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xdc, /* 11011100 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x7c, /* 01111100 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0xf0, /* 11110000 */ |
0x00, /* 00000000 */ |
/* 113 0x71 'q' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x76, /* 01110110 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x7c, /* 01111100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x1e, /* 00011110 */ |
0x00, /* 00000000 */ |
/* 114 0x72 'r' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xdc, /* 11011100 */ |
0x76, /* 01110110 */ |
0x66, /* 01100110 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0xf0, /* 11110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 115 0x73 's' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0x60, /* 01100000 */ |
0x38, /* 00111000 */ |
0x0c, /* 00001100 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 116 0x74 't' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x10, /* 00010000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0xfc, /* 11111100 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x36, /* 00110110 */ |
0x1c, /* 00011100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 117 0x75 'u' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 118 0x76 'v' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x6c, /* 01101100 */ |
0x38, /* 00111000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 119 0x77 'w' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xd6, /* 11010110 */ |
0xd6, /* 11010110 */ |
0xd6, /* 11010110 */ |
0xfe, /* 11111110 */ |
0x6c, /* 01101100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 120 0x78 'x' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0x6c, /* 01101100 */ |
0x38, /* 00111000 */ |
0x38, /* 00111000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 121 0x79 'y' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7e, /* 01111110 */ |
0x06, /* 00000110 */ |
0x0c, /* 00001100 */ |
0xf8, /* 11111000 */ |
0x00, /* 00000000 */ |
/* 122 0x7a 'z' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0xcc, /* 11001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 123 0x7b '{' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x0e, /* 00001110 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x70, /* 01110000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x0e, /* 00001110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 124 0x7c '|' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 125 0x7d '}' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x70, /* 01110000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x0e, /* 00001110 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x70, /* 01110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 126 0x7e '~' */ |
0x00, /* 00000000 */ |
0x76, /* 01110110 */ |
0xdc, /* 11011100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 127 0x7f '' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x10, /* 00010000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 128 0x80 '€' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x3c, /* 00111100 */ |
0x66, /* 01100110 */ |
0xc2, /* 11000010 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc2, /* 11000010 */ |
0x66, /* 01100110 */ |
0x3c, /* 00111100 */ |
0x18, /* 00011000 */ |
0x70, /* 01110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 129 0x81 '' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xcc, /* 11001100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 130 0x82 '‚' */ |
0x00, /* 00000000 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 131 0x83 'ƒ' */ |
0x00, /* 00000000 */ |
0x10, /* 00010000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0x00, /* 00000000 */ |
0x78, /* 01111000 */ |
0x0c, /* 00001100 */ |
0x7c, /* 01111100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 132 0x84 '„' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xcc, /* 11001100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x78, /* 01111000 */ |
0x0c, /* 00001100 */ |
0x7c, /* 01111100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 133 0x85 '…' */ |
0x00, /* 00000000 */ |
0x60, /* 01100000 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x78, /* 01111000 */ |
0x0c, /* 00001100 */ |
0x7c, /* 01111100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 134 0x86 '†' */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0x38, /* 00111000 */ |
0x00, /* 00000000 */ |
0x78, /* 01111000 */ |
0x0c, /* 00001100 */ |
0x7c, /* 01111100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 135 0x87 '‡' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x18, /* 00011000 */ |
0x70, /* 01110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 136 0x88 'ˆ' */ |
0x00, /* 00000000 */ |
0x10, /* 00010000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 137 0x89 '‰' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 138 0x8a 'Š' */ |
0x00, /* 00000000 */ |
0x60, /* 01100000 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 139 0x8b '‹' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x66, /* 01100110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 140 0x8c 'Œ' */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x66, /* 01100110 */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 141 0x8d '' */ |
0x00, /* 00000000 */ |
0x60, /* 01100000 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 142 0x8e 'Ž' */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x10, /* 00010000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 143 0x8f '' */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0x38, /* 00111000 */ |
0x10, /* 00010000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 144 0x90 '' */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0x66, /* 01100110 */ |
0x62, /* 01100010 */ |
0x68, /* 01101000 */ |
0x78, /* 01111000 */ |
0x68, /* 01101000 */ |
0x62, /* 01100010 */ |
0x66, /* 01100110 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 145 0x91 '‘' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xec, /* 11101100 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x7e, /* 01111110 */ |
0xd8, /* 11011000 */ |
0xd8, /* 11011000 */ |
0x6e, /* 01101110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 146 0x92 '’' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x3e, /* 00111110 */ |
0x6c, /* 01101100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xfe, /* 11111110 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xce, /* 11001110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 147 0x93 '“' */ |
0x00, /* 00000000 */ |
0x10, /* 00010000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 148 0x94 '”' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 149 0x95 '•' */ |
0x00, /* 00000000 */ |
0x60, /* 01100000 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 150 0x96 '–' */ |
0x00, /* 00000000 */ |
0x30, /* 00110000 */ |
0x78, /* 01111000 */ |
0xcc, /* 11001100 */ |
0x00, /* 00000000 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 151 0x97 '—' */ |
0x00, /* 00000000 */ |
0x60, /* 01100000 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 152 0x98 '˜' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7e, /* 01111110 */ |
0x06, /* 00000110 */ |
0x0c, /* 00001100 */ |
0x78, /* 01111000 */ |
0x00, /* 00000000 */ |
/* 153 0x99 '™' */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 154 0x9a 'š' */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 155 0x9b '›' */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 156 0x9c 'œ' */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0x64, /* 01100100 */ |
0x60, /* 01100000 */ |
0xf0, /* 11110000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0xe6, /* 11100110 */ |
0xfc, /* 11111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 157 0x9d '' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x3c, /* 00111100 */ |
0x18, /* 00011000 */ |
0x7e, /* 01111110 */ |
0x18, /* 00011000 */ |
0x7e, /* 01111110 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 158 0x9e 'ž' */ |
0x00, /* 00000000 */ |
0xf8, /* 11111000 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xf8, /* 11111000 */ |
0xc4, /* 11000100 */ |
0xcc, /* 11001100 */ |
0xde, /* 11011110 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 159 0x9f 'Ÿ' */ |
0x00, /* 00000000 */ |
0x0e, /* 00001110 */ |
0x1b, /* 00011011 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x7e, /* 01111110 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0xd8, /* 11011000 */ |
0x70, /* 01110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 160 0xa0 ' ' */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0x00, /* 00000000 */ |
0x78, /* 01111000 */ |
0x0c, /* 00001100 */ |
0x7c, /* 01111100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 161 0xa1 '¡' */ |
0x00, /* 00000000 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 162 0xa2 '¢' */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 163 0xa3 '£' */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0x00, /* 00000000 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 164 0xa4 '¤' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x76, /* 01110110 */ |
0xdc, /* 11011100 */ |
0x00, /* 00000000 */ |
0xdc, /* 11011100 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 165 0xa5 '¥' */ |
0x76, /* 01110110 */ |
0xdc, /* 11011100 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0xe6, /* 11100110 */ |
0xf6, /* 11110110 */ |
0xfe, /* 11111110 */ |
0xde, /* 11011110 */ |
0xce, /* 11001110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 166 0xa6 '¦' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x3c, /* 00111100 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x3e, /* 00111110 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 167 0xa7 '§' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x38, /* 00111000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 168 0xa8 '¨' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x00, /* 00000000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0xc0, /* 11000000 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 169 0xa9 '©' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 170 0xaa 'ª' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 171 0xab '«' */ |
0x00, /* 00000000 */ |
0x60, /* 01100000 */ |
0xe0, /* 11100000 */ |
0x62, /* 01100010 */ |
0x66, /* 01100110 */ |
0x6c, /* 01101100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0xdc, /* 11011100 */ |
0x86, /* 10000110 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x3e, /* 00111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 172 0xac '¬' */ |
0x00, /* 00000000 */ |
0x60, /* 01100000 */ |
0xe0, /* 11100000 */ |
0x62, /* 01100010 */ |
0x66, /* 01100110 */ |
0x6c, /* 01101100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x66, /* 01100110 */ |
0xce, /* 11001110 */ |
0x9a, /* 10011010 */ |
0x3f, /* 00111111 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 173 0xad '' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x3c, /* 00111100 */ |
0x3c, /* 00111100 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 174 0xae '®' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x36, /* 00110110 */ |
0x6c, /* 01101100 */ |
0xd8, /* 11011000 */ |
0x6c, /* 01101100 */ |
0x36, /* 00110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 175 0xaf '¯' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xd8, /* 11011000 */ |
0x6c, /* 01101100 */ |
0x36, /* 00110110 */ |
0x6c, /* 01101100 */ |
0xd8, /* 11011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 176 0xb0 '°' */ |
0x11, /* 00010001 */ |
0x44, /* 01000100 */ |
0x11, /* 00010001 */ |
0x44, /* 01000100 */ |
0x11, /* 00010001 */ |
0x44, /* 01000100 */ |
0x11, /* 00010001 */ |
0x44, /* 01000100 */ |
0x11, /* 00010001 */ |
0x44, /* 01000100 */ |
0x11, /* 00010001 */ |
0x44, /* 01000100 */ |
0x11, /* 00010001 */ |
0x44, /* 01000100 */ |
0x11, /* 00010001 */ |
0x44, /* 01000100 */ |
/* 177 0xb1 '±' */ |
0x55, /* 01010101 */ |
0xaa, /* 10101010 */ |
0x55, /* 01010101 */ |
0xaa, /* 10101010 */ |
0x55, /* 01010101 */ |
0xaa, /* 10101010 */ |
0x55, /* 01010101 */ |
0xaa, /* 10101010 */ |
0x55, /* 01010101 */ |
0xaa, /* 10101010 */ |
0x55, /* 01010101 */ |
0xaa, /* 10101010 */ |
0x55, /* 01010101 */ |
0xaa, /* 10101010 */ |
0x55, /* 01010101 */ |
0xaa, /* 10101010 */ |
/* 178 0xb2 '²' */ |
0xdd, /* 11011101 */ |
0x77, /* 01110111 */ |
0xdd, /* 11011101 */ |
0x77, /* 01110111 */ |
0xdd, /* 11011101 */ |
0x77, /* 01110111 */ |
0xdd, /* 11011101 */ |
0x77, /* 01110111 */ |
0xdd, /* 11011101 */ |
0x77, /* 01110111 */ |
0xdd, /* 11011101 */ |
0x77, /* 01110111 */ |
0xdd, /* 11011101 */ |
0x77, /* 01110111 */ |
0xdd, /* 11011101 */ |
0x77, /* 01110111 */ |
/* 179 0xb3 '³' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 180 0xb4 '´' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0xf8, /* 11111000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 181 0xb5 'µ' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0xf8, /* 11111000 */ |
0x18, /* 00011000 */ |
0xf8, /* 11111000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 182 0xb6 '¶' */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0xf6, /* 11110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
/* 183 0xb7 '·' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
/* 184 0xb8 '¸' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xf8, /* 11111000 */ |
0x18, /* 00011000 */ |
0xf8, /* 11111000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 185 0xb9 '¹' */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0xf6, /* 11110110 */ |
0x06, /* 00000110 */ |
0xf6, /* 11110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
/* 186 0xba 'º' */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
/* 187 0xbb '»' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0x06, /* 00000110 */ |
0xf6, /* 11110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
/* 188 0xbc '¼' */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0xf6, /* 11110110 */ |
0x06, /* 00000110 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 189 0xbd '½' */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 190 0xbe '¾' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0xf8, /* 11111000 */ |
0x18, /* 00011000 */ |
0xf8, /* 11111000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 191 0xbf '¿' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xf8, /* 11111000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 192 0xc0 'À' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x1f, /* 00011111 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 193 0xc1 'Á' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0xff, /* 11111111 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 194 0xc2 'Â' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xff, /* 11111111 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 195 0xc3 'Ã' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x1f, /* 00011111 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 196 0xc4 'Ä' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xff, /* 11111111 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 197 0xc5 'Å' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0xff, /* 11111111 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 198 0xc6 'Æ' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x1f, /* 00011111 */ |
0x18, /* 00011000 */ |
0x1f, /* 00011111 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 199 0xc7 'Ç' */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x37, /* 00110111 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
/* 200 0xc8 'È' */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x37, /* 00110111 */ |
0x30, /* 00110000 */ |
0x3f, /* 00111111 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 201 0xc9 'É' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x3f, /* 00111111 */ |
0x30, /* 00110000 */ |
0x37, /* 00110111 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
/* 202 0xca 'Ê' */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0xf7, /* 11110111 */ |
0x00, /* 00000000 */ |
0xff, /* 11111111 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 203 0xcb 'Ë' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xff, /* 11111111 */ |
0x00, /* 00000000 */ |
0xf7, /* 11110111 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
/* 204 0xcc 'Ì' */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x37, /* 00110111 */ |
0x30, /* 00110000 */ |
0x37, /* 00110111 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
/* 205 0xcd 'Í' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xff, /* 11111111 */ |
0x00, /* 00000000 */ |
0xff, /* 11111111 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 206 0xce 'Î' */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0xf7, /* 11110111 */ |
0x00, /* 00000000 */ |
0xf7, /* 11110111 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
/* 207 0xcf 'Ï' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0xff, /* 11111111 */ |
0x00, /* 00000000 */ |
0xff, /* 11111111 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 208 0xd0 'Ð' */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0xff, /* 11111111 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 209 0xd1 'Ñ' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xff, /* 11111111 */ |
0x00, /* 00000000 */ |
0xff, /* 11111111 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 210 0xd2 'Ò' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xff, /* 11111111 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
/* 211 0xd3 'Ó' */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x3f, /* 00111111 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 212 0xd4 'Ô' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x1f, /* 00011111 */ |
0x18, /* 00011000 */ |
0x1f, /* 00011111 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 213 0xd5 'Õ' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x1f, /* 00011111 */ |
0x18, /* 00011000 */ |
0x1f, /* 00011111 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 214 0xd6 'Ö' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x3f, /* 00111111 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
/* 215 0xd7 '×' */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0xff, /* 11111111 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
/* 216 0xd8 'Ø' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0xff, /* 11111111 */ |
0x18, /* 00011000 */ |
0xff, /* 11111111 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 217 0xd9 'Ù' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0xf8, /* 11111000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 218 0xda 'Ú' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x1f, /* 00011111 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 219 0xdb 'Û' */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
/* 220 0xdc 'Ü' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
/* 221 0xdd 'Ý' */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
/* 222 0xde 'Þ' */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
/* 223 0xdf 'ß' */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 224 0xe0 'à' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x76, /* 01110110 */ |
0xdc, /* 11011100 */ |
0xd8, /* 11011000 */ |
0xd8, /* 11011000 */ |
0xd8, /* 11011000 */ |
0xdc, /* 11011100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 225 0xe1 'á' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x78, /* 01111000 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xd8, /* 11011000 */ |
0xcc, /* 11001100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xcc, /* 11001100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 226 0xe2 'â' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 227 0xe3 'ã' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 228 0xe4 'ä' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0xc6, /* 11000110 */ |
0x60, /* 01100000 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 229 0xe5 'å' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0xd8, /* 11011000 */ |
0xd8, /* 11011000 */ |
0xd8, /* 11011000 */ |
0xd8, /* 11011000 */ |
0xd8, /* 11011000 */ |
0x70, /* 01110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 230 0xe6 'æ' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x7c, /* 01111100 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0xc0, /* 11000000 */ |
0x00, /* 00000000 */ |
/* 231 0xe7 'ç' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x76, /* 01110110 */ |
0xdc, /* 11011100 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 232 0xe8 'è' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x3c, /* 00111100 */ |
0x18, /* 00011000 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 233 0xe9 'é' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x6c, /* 01101100 */ |
0x38, /* 00111000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 234 0xea 'ê' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0xee, /* 11101110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 235 0xeb 'ë' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x1e, /* 00011110 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x0c, /* 00001100 */ |
0x3e, /* 00111110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 236 0xec 'ì' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0xdb, /* 11011011 */ |
0xdb, /* 11011011 */ |
0xdb, /* 11011011 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 237 0xed 'í' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x03, /* 00000011 */ |
0x06, /* 00000110 */ |
0x7e, /* 01111110 */ |
0xdb, /* 11011011 */ |
0xdb, /* 11011011 */ |
0xf3, /* 11110011 */ |
0x7e, /* 01111110 */ |
0x60, /* 01100000 */ |
0xc0, /* 11000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 238 0xee 'î' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x1c, /* 00011100 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x7c, /* 01111100 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x30, /* 00110000 */ |
0x1c, /* 00011100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 239 0xef 'ï' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 240 0xf0 'ð' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 241 0xf1 'ñ' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x7e, /* 01111110 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 242 0xf2 'ò' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x0c, /* 00001100 */ |
0x06, /* 00000110 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 243 0xf3 'ó' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x0c, /* 00001100 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 244 0xf4 'ô' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x0e, /* 00001110 */ |
0x1b, /* 00011011 */ |
0x1b, /* 00011011 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 245 0xf5 'õ' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0xd8, /* 11011000 */ |
0xd8, /* 11011000 */ |
0xd8, /* 11011000 */ |
0x70, /* 01110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 246 0xf6 'ö' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 247 0xf7 '÷' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x76, /* 01110110 */ |
0xdc, /* 11011100 */ |
0x00, /* 00000000 */ |
0x76, /* 01110110 */ |
0xdc, /* 11011100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 248 0xf8 'ø' */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x38, /* 00111000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 249 0xf9 'ù' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 250 0xfa 'ú' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 251 0xfb 'û' */ |
0x00, /* 00000000 */ |
0x0f, /* 00001111 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0xec, /* 11101100 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x3c, /* 00111100 */ |
0x1c, /* 00011100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 252 0xfc 'ü' */ |
0x00, /* 00000000 */ |
0x6c, /* 01101100 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 253 0xfd 'ý' */ |
0x00, /* 00000000 */ |
0x3c, /* 00111100 */ |
0x66, /* 01100110 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x32, /* 00110010 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 254 0xfe 'þ' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0x7e, /* 01111110 */ |
0x7e, /* 01111110 */ |
0x7e, /* 01111110 */ |
0x7e, /* 01111110 */ |
0x7e, /* 01111110 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 255 0xff 'ÿ' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
}; |
/tags/0.3.0/uspace/srv/fb/pointer_mask.xbm |
---|
0,0 → 1,6 |
#define pointer_mask_width 11 |
#define pointer_mask_height 18 |
static unsigned char pointer_mask_bits[] = { |
0x01, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x1f, 0x00, 0x3f, 0x00, |
0x7f, 0x00, 0xff, 0x00, 0xff, 0x01, 0xff, 0x03, 0xff, 0x07, 0xff, 0x03, |
0xff, 0x00, 0xff, 0x00, 0xf7, 0x01, 0xe3, 0x01, 0xe1, 0x01, 0xc0, 0x00 }; |
/tags/0.3.0/uspace/srv/fb/pointer.xbm |
---|
0,0 → 1,6 |
#define pointer_width 11 |
#define pointer_height 18 |
static unsigned char pointer_bits[] = { |
0x01, 0x00, 0x03, 0x00, 0x05, 0x00, 0x09, 0x00, 0x11, 0x00, 0x21, 0x00, |
0x41, 0x00, 0x81, 0x00, 0x01, 0x01, 0x01, 0x02, 0x01, 0x04, 0x01, 0x03, |
0x81, 0x00, 0x89, 0x00, 0x15, 0x01, 0x23, 0x01, 0x21, 0x01, 0xc0, 0x00 }; |
/tags/0.3.0/uspace/srv/kbd/generic/kbd.c |
---|
0,0 → 1,148 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** |
* @addtogroup kbdgen generic |
* @brief HelenOS generic uspace keyboard handler. |
* @ingroup kbd |
* @{ |
*/ |
/** @file |
*/ |
#include <ipc/ipc.h> |
#include <ipc/services.h> |
#include <stdio.h> |
#include <unistd.h> |
#include <stdlib.h> |
#include <stdio.h> |
#include <ipc/ns.h> |
#include <errno.h> |
#include <arch/kbd.h> |
#include <kbd.h> |
#include <libadt/fifo.h> |
#include <key_buffer.h> |
#include <async.h> |
#include <keys.h> |
#define NAME "KBD" |
int cons_connected = 0; |
int phone2cons = -1; |
keybuffer_t keybuffer; |
static void irq_handler(ipc_callid_t iid, ipc_call_t *call) |
{ |
int chr; |
#ifdef MOUSE_ENABLED |
if (mouse_arch_process(phone2cons, call)) |
return; |
#endif |
kbd_arch_process(&keybuffer, call); |
if (cons_connected && phone2cons != -1) { |
/* |
* recode to ASCII - one interrupt can produce more than one |
* code so result is stored in fifo |
*/ |
while (!keybuffer_empty(&keybuffer)) { |
if (!keybuffer_pop(&keybuffer, (int *)&chr)) |
break; |
async_msg_1(phone2cons, KBD_PUSHCHAR, chr); |
} |
} |
} |
static void console_connection(ipc_callid_t iid, ipc_call_t *icall) |
{ |
ipc_callid_t callid; |
ipc_call_t call; |
int retval; |
if (cons_connected) { |
ipc_answer_0(iid, ELIMIT); |
return; |
} |
cons_connected = 1; |
ipc_answer_0(iid, EOK); |
while (1) { |
callid = async_get_call(&call); |
switch (IPC_GET_METHOD(call)) { |
case IPC_M_PHONE_HUNGUP: |
cons_connected = 0; |
ipc_hangup(phone2cons); |
phone2cons = -1; |
ipc_answer_0(callid, EOK); |
return; |
case IPC_M_CONNECT_TO_ME: |
if (phone2cons != -1) { |
retval = ELIMIT; |
break; |
} |
phone2cons = IPC_GET_ARG5(call); |
retval = 0; |
break; |
default: |
retval = EINVAL; |
} |
ipc_answer_0(callid, retval); |
} |
} |
int main(int argc, char **argv) |
{ |
ipcarg_t phonead; |
/* Initialize arch dependent parts */ |
if (kbd_arch_init()) |
return -1; |
/* Initialize key buffer */ |
keybuffer_init(&keybuffer); |
async_set_client_connection(console_connection); |
async_set_interrupt_received(irq_handler); |
/* Register service at nameserver */ |
if (ipc_connect_to_me(PHONE_NS, SERVICE_KEYBOARD, 0, 0, &phonead) != 0) |
return -1; |
async_manager(); |
/* Never reached */ |
return 0; |
} |
/** |
* @} |
*/ |
/tags/0.3.0/uspace/srv/kbd/generic/key_buffer.c |
---|
0,0 → 1,113 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup kbdgen |
* @brief HelenOS generic uspace keyboard handler. |
* @ingroup kbd |
* @{ |
*/ |
/** @file |
*/ |
#include <key_buffer.h> |
#include <futex.h> |
atomic_t keybuffer_futex = FUTEX_INITIALIZER; |
/** Clear key buffer. |
*/ |
void keybuffer_free(keybuffer_t *keybuffer) |
{ |
futex_down(&keybuffer_futex); |
keybuffer->head = 0; |
keybuffer->tail = 0; |
keybuffer->items = 0; |
futex_up(&keybuffer_futex); |
} |
/** Key buffer initialization. |
* |
*/ |
void keybuffer_init(keybuffer_t *keybuffer) |
{ |
keybuffer_free(keybuffer); |
} |
/** Get free space in buffer. |
* This function is useful for processing some scancodes that are translated |
* to more than one character. |
* @return empty buffer space |
*/ |
int keybuffer_available(keybuffer_t *keybuffer) |
{ |
return KEYBUFFER_SIZE - keybuffer->items; |
} |
/** |
* @return nonzero, if buffer is not empty. |
*/ |
int keybuffer_empty(keybuffer_t *keybuffer) |
{ |
return (keybuffer->items == 0); |
} |
/** Push key to key buffer. |
* If buffer is full, character is ignored. |
* @param key code of stored key |
*/ |
void keybuffer_push(keybuffer_t *keybuffer, int key) |
{ |
futex_down(&keybuffer_futex); |
if (keybuffer->items < KEYBUFFER_SIZE) { |
keybuffer->fifo[keybuffer->tail] = key; |
keybuffer->tail = (keybuffer->tail + 1) % KEYBUFFER_SIZE; |
keybuffer->items++; |
} |
futex_up(&keybuffer_futex); |
} |
/** Pop character from buffer. |
* @param c pointer to space where to store character from buffer. |
* @return zero on empty buffer, nonzero else |
*/ |
int keybuffer_pop(keybuffer_t *keybuffer, int *c) |
{ |
futex_down(&keybuffer_futex); |
if (keybuffer->items > 0) { |
keybuffer->items--; |
*c = (keybuffer->fifo[keybuffer->head]) ; |
keybuffer->head = (keybuffer->head + 1) % KEYBUFFER_SIZE; |
futex_up(&keybuffer_futex); |
return 1; |
} |
futex_up(&keybuffer_futex); |
return 0; |
} |
/** |
* @} |
*/ |
/tags/0.3.0/uspace/srv/kbd/arch/ia32/src/mouse.c |
---|
0,0 → 1,117 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#include <ipc/ipc.h> |
#include <async.h> |
#include <kbd.h> |
#include <keys.h> |
#define i8042_MOUSE_DATA 0x20 |
#define BUFSIZE 3 |
typedef struct { |
union { |
unsigned char data[BUFSIZE]; |
struct { |
unsigned leftbtn : 1; |
unsigned rightbtn : 1; |
unsigned middlebtn : 1; |
unsigned isone : 1; /* Always one */ |
unsigned xsign : 1; |
unsigned ysign : 1; |
unsigned xovfl : 1; |
unsigned yovfl : 1; |
unsigned char x; |
unsigned char y; |
} val; |
}u; |
}ps2packet_t; |
static ps2packet_t buf; |
static int bufpos = 0; |
static int leftbtn = 0; |
static int rightbtn = 0; |
static int middlebtn = 0; |
/** Convert 9-bit 2-complement signed number to integer */ |
static int bit9toint(int sign, unsigned char data) |
{ |
int tmp; |
if (!sign) |
return data; |
tmp = ((unsigned char)~data) + 1; |
return -tmp; |
} |
/** Process mouse data |
* |
* @return True if mouse command was recognized and processed |
*/ |
int mouse_arch_process(int phoneid, ipc_call_t *call) |
{ |
int status = IPC_GET_ARG1(*call); |
int data = IPC_GET_ARG2(*call); |
int x,y; |
if (!(status & i8042_MOUSE_DATA)) |
return 0; |
/* Check that we have not lost synchronization */ |
if (bufpos == 0 && !(data & 0x8)) |
return 1; /* Synchro lost, ignore byte */ |
buf.u.data[bufpos++] = data; |
if (bufpos == BUFSIZE) { |
bufpos = 0; |
if (phoneid != -1) { |
if (buf.u.val.leftbtn ^ leftbtn) { |
leftbtn = buf.u.val.leftbtn; |
async_msg_1(phoneid, KBD_MS_LEFT, leftbtn); |
} |
if (buf.u.val.rightbtn & rightbtn) { |
rightbtn = buf.u.val.middlebtn; |
async_msg_1(phoneid, KBD_MS_RIGHT, rightbtn); |
} |
if (buf.u.val.rightbtn & rightbtn) { |
middlebtn = buf.u.val.middlebtn; |
async_msg_1(phoneid, KBD_MS_MIDDLE, middlebtn); |
} |
x = bit9toint(buf.u.val.xsign, buf.u.val.x); |
y = bit9toint(buf.u.val.ysign, buf.u.val.y); |
if (x || y) |
async_msg_2(phoneid, KBD_MS_MOVE, (ipcarg_t)x, |
(ipcarg_t)(-y)); |
} |
} |
return 1; |
} |
/tags/0.3.0/uspace/srv/kbd/arch/ia32/src/kbd.c |
---|
0,0 → 1,166 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup kbdia32 ia32 |
* @brief HelenOS ia32 / amd64 arch dependent parts of uspace keyboard handler. |
* @ingroup kbd |
* @{ |
*/ |
/** @file |
* @ingroup kbdamd64 |
*/ |
#include <arch/kbd.h> |
#include <ipc/ipc.h> |
#include <unistd.h> |
#include <kbd.h> |
#include <keys.h> |
#include <genarch/kbd.h> |
#include <sysinfo.h> |
/* Interesting bits for status register */ |
#define i8042_OUTPUT_FULL 0x1 |
#define i8042_INPUT_FULL 0x2 |
#define i8042_MOUSE_DATA 0x20 |
/* Command constants */ |
#define i8042_CMD_KBD 0x60 |
#define i8042_CMD_MOUSE 0xd4 |
/* Keyboard cmd byte */ |
#define i8042_KBD_IE 0x1 |
#define i8042_MOUSE_IE 0x2 |
#define i8042_KBD_DISABLE 0x10 |
#define i8042_MOUSE_DISABLE 0x20 |
#define i8042_KBD_TRANSLATE 0x40 |
/* Mouse constants */ |
#define MOUSE_OUT_INIT 0xf4 |
#define MOUSE_ACK 0xfa |
#define KEY_RELEASE 0x80 |
static volatile int keyflags; /**< Tracking of multiple keypresses. */ |
static volatile int lockflags; /**< Tracking of multiple keys lockings. */ |
irq_cmd_t i8042_cmds[2] = { |
{ CMD_PORT_READ_1, (void *) 0x64, 0, 1 }, |
{ CMD_PORT_READ_1, (void *) 0x60, 0, 2 } |
}; |
irq_code_t i8042_kbd = { |
2, |
i8042_cmds |
}; |
static void wait_ready(void) { |
while (i8042_status_read() & i8042_INPUT_FULL) |
; |
} |
/** Register uspace irq handler |
* @return |
*/ |
int kbd_arch_init(void) |
{ |
int i; |
int mouseenabled = 0; |
iospace_enable(task_get_id(), (void *) i8042_DATA, 5); |
/* Disable kbd, enable mouse */ |
i8042_command_write(i8042_CMD_KBD); |
wait_ready(); |
i8042_command_write(i8042_CMD_KBD); |
wait_ready(); |
i8042_data_write(i8042_KBD_DISABLE); |
wait_ready(); |
/* Flush all current IO */ |
while (i8042_status_read() & i8042_OUTPUT_FULL) |
i8042_data_read(); |
/* Initialize mouse */ |
i8042_command_write(i8042_CMD_MOUSE); |
wait_ready(); |
i8042_data_write(MOUSE_OUT_INIT); |
wait_ready(); |
int mouseanswer = 0; |
for (i=0;i < 1000; i++) { |
int status = i8042_status_read(); |
if (status & i8042_OUTPUT_FULL) { |
int data = i8042_data_read(); |
if (status & i8042_MOUSE_DATA) { |
mouseanswer = data; |
break; |
} |
} |
usleep(1000); |
} |
if (mouseanswer == MOUSE_ACK) { |
/* enable mouse */ |
mouseenabled = 1; |
ipc_register_irq(sysinfo_value("mouse.inr"), sysinfo_value("mouse.devno"), 0, &i8042_kbd); |
} |
/* Enable kbd */ |
ipc_register_irq(sysinfo_value("kbd.inr"), sysinfo_value("kbd.devno"), 0, &i8042_kbd); |
int newcontrol = i8042_KBD_IE | i8042_KBD_TRANSLATE; |
if (mouseenabled) |
newcontrol |= i8042_MOUSE_IE; |
i8042_command_write(i8042_CMD_KBD); |
wait_ready(); |
i8042_data_write(newcontrol); |
wait_ready(); |
return 0; |
} |
/** Process keyboard & mouse events */ |
int kbd_arch_process(keybuffer_t *keybuffer, ipc_call_t *call) |
{ |
int status = IPC_GET_ARG1(*call); |
if ((status & i8042_MOUSE_DATA)) |
return 0; |
int scan_code = IPC_GET_ARG2(*call); |
if (scan_code & KEY_RELEASE) |
key_released(keybuffer, scan_code ^ KEY_RELEASE); |
else |
key_pressed(keybuffer, scan_code); |
return 1; |
} |
/** |
* @} |
*/ |
/tags/0.3.0/uspace/srv/kbd/arch/ia32/src/scanc.c |
---|
0,0 → 1,202 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup kbdia32 |
* @brief Scancodes for PC keyboards. |
* @{ |
*/ |
/** @file |
* @ingroup kbdamd64 |
*/ |
#include <genarch/scanc.h> |
/** Primary meaning of scancodes. */ |
int sc_primary_map[] = { |
SPECIAL, /* 0x00 */ |
SPECIAL, /* 0x01 - Esc */ |
'1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', |
'\b', /* 0x0e - Backspace */ |
'\t', 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', '\n', |
SPECIAL, /* 0x1d - LCtrl */ |
'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', '\'', |
'`', |
SPECIAL, /* 0x2a - LShift */ |
'\\', |
'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', |
SPECIAL, /* 0x36 - RShift */ |
'*', |
SPECIAL, /* 0x38 - LAlt */ |
' ', |
SPECIAL, /* 0x3a - CapsLock */ |
(FUNCTION_KEYS | 1), /* 0x3b - F1 */ |
(FUNCTION_KEYS | 2), /* 0x3c - F2 */ |
(FUNCTION_KEYS | 3), /* 0x3d - F3 */ |
(FUNCTION_KEYS | 4), /* 0x3e - F4 */ |
(FUNCTION_KEYS | 5), /* 0x3f - F5 */ |
(FUNCTION_KEYS | 6), /* 0x40 - F6 */ |
(FUNCTION_KEYS | 7), /* 0x41 - F7 */ |
(FUNCTION_KEYS | 8), /* 0x42 - F8 */ |
(FUNCTION_KEYS | 9), /* 0x43 - F9 */ |
(FUNCTION_KEYS | 10), /* 0x44 - F10 */ |
SPECIAL, /* 0x45 - NumLock */ |
SPECIAL, /* 0x46 - ScrollLock */ |
'7', '8', '9', '-', |
'4', '5', '6', '+', |
'1', '2', '3', |
'0', '.', |
SPECIAL, /* 0x54 - Alt-SysRq */ |
SPECIAL, /* 0x55 - F11/F12/PF1/FN */ |
SPECIAL, /* 0x56 - unlabelled key next to LAlt */ |
(FUNCTION_KEYS | 11), /* 0x57 - F11 */ |
(FUNCTION_KEYS | 12), /* 0x58 - F12 */ |
SPECIAL, /* 0x59 */ |
SPECIAL, /* 0x5a */ |
SPECIAL, /* 0x5b */ |
SPECIAL, /* 0x5c */ |
SPECIAL, /* 0x5d */ |
SPECIAL, /* 0x5e */ |
SPECIAL, /* 0x5f */ |
SPECIAL, /* 0x60 */ |
SPECIAL, /* 0x61 */ |
SPECIAL, /* 0x62 */ |
SPECIAL, /* 0x63 */ |
SPECIAL, /* 0x64 */ |
SPECIAL, /* 0x65 */ |
SPECIAL, /* 0x66 */ |
SPECIAL, /* 0x67 */ |
SPECIAL, /* 0x68 */ |
SPECIAL, /* 0x69 */ |
SPECIAL, /* 0x6a */ |
SPECIAL, /* 0x6b */ |
SPECIAL, /* 0x6c */ |
SPECIAL, /* 0x6d */ |
SPECIAL, /* 0x6e */ |
SPECIAL, /* 0x6f */ |
SPECIAL, /* 0x70 */ |
SPECIAL, /* 0x71 */ |
SPECIAL, /* 0x72 */ |
SPECIAL, /* 0x73 */ |
SPECIAL, /* 0x74 */ |
SPECIAL, /* 0x75 */ |
SPECIAL, /* 0x76 */ |
SPECIAL, /* 0x77 */ |
SPECIAL, /* 0x78 */ |
SPECIAL, /* 0x79 */ |
SPECIAL, /* 0x7a */ |
SPECIAL, /* 0x7b */ |
SPECIAL, /* 0x7c */ |
SPECIAL, /* 0x7d */ |
SPECIAL, /* 0x7e */ |
SPECIAL, /* 0x7f */ |
}; |
/** Secondary meaning of scancodes. */ |
int sc_secondary_map[] = { |
SPECIAL, /* 0x00 */ |
0x1b, /* 0x01 - Esc */ |
'!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', |
SPECIAL, /* 0x0e - Backspace */ |
'\t', 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '{', '}', '\n', |
SPECIAL, /* 0x1d - LCtrl */ |
'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', '"', |
'~', |
SPECIAL, /* 0x2a - LShift */ |
'|', |
'Z', 'X', 'C', 'V', 'B', 'N', 'M', '<', '>', '?', |
SPECIAL, /* 0x36 - RShift */ |
'*', |
SPECIAL, /* 0x38 - LAlt */ |
' ', |
SPECIAL, /* 0x3a - CapsLock */ |
SPECIAL, /* 0x3b - F1 */ |
SPECIAL, /* 0x3c - F2 */ |
SPECIAL, /* 0x3d - F3 */ |
SPECIAL, /* 0x3e - F4 */ |
SPECIAL, /* 0x3f - F5 */ |
SPECIAL, /* 0x40 - F6 */ |
SPECIAL, /* 0x41 - F7 */ |
SPECIAL, /* 0x42 - F8 */ |
SPECIAL, /* 0x43 - F9 */ |
SPECIAL, /* 0x44 - F10 */ |
SPECIAL, /* 0x45 - NumLock */ |
SPECIAL, /* 0x46 - ScrollLock */ |
'7', '8', '9', '-', |
'4', '5', '6', '+', |
'1', '2', '3', |
'0', '.', |
SPECIAL, /* 0x54 - Alt-SysRq */ |
SPECIAL, /* 0x55 - F11/F12/PF1/FN */ |
SPECIAL, /* 0x56 - unlabelled key next to LAlt */ |
SPECIAL, /* 0x57 - F11 */ |
SPECIAL, /* 0x58 - F12 */ |
SPECIAL, /* 0x59 */ |
SPECIAL, /* 0x5a */ |
SPECIAL, /* 0x5b */ |
SPECIAL, /* 0x5c */ |
SPECIAL, /* 0x5d */ |
SPECIAL, /* 0x5e */ |
SPECIAL, /* 0x5f */ |
SPECIAL, /* 0x60 */ |
SPECIAL, /* 0x61 */ |
SPECIAL, /* 0x62 */ |
SPECIAL, /* 0x63 */ |
SPECIAL, /* 0x64 */ |
SPECIAL, /* 0x65 */ |
SPECIAL, /* 0x66 */ |
SPECIAL, /* 0x67 */ |
SPECIAL, /* 0x68 */ |
SPECIAL, /* 0x69 */ |
SPECIAL, /* 0x6a */ |
SPECIAL, /* 0x6b */ |
SPECIAL, /* 0x6c */ |
SPECIAL, /* 0x6d */ |
SPECIAL, /* 0x6e */ |
SPECIAL, /* 0x6f */ |
SPECIAL, /* 0x70 */ |
SPECIAL, /* 0x71 */ |
SPECIAL, /* 0x72 */ |
SPECIAL, /* 0x73 */ |
SPECIAL, /* 0x74 */ |
SPECIAL, /* 0x75 */ |
SPECIAL, /* 0x76 */ |
SPECIAL, /* 0x77 */ |
SPECIAL, /* 0x78 */ |
SPECIAL, /* 0x79 */ |
SPECIAL, /* 0x7a */ |
SPECIAL, /* 0x7b */ |
SPECIAL, /* 0x7c */ |
SPECIAL, /* 0x7d */ |
SPECIAL, /* 0x7e */ |
SPECIAL, /* 0x7f */ |
}; |
/** |
* @} |
*/ |
/tags/0.3.0/uspace/srv/kbd/arch/ia32/include/kbd.h |
---|
0,0 → 1,76 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup kbdamd64 amd64 |
* @brief HelenOS ia32 / amd64 arch dependent parts of uspace keyboard and mouse handler. |
* @ingroup kbd |
* @{ |
*/ |
/** @file |
* @ingroup kbdia32 |
*/ |
#ifndef KBD_ia32_KBD_H_ |
#define KBD_ia32_KBD_H_ |
#include <ddi.h> |
#include <libarch/ddi.h> |
#define i8042_DATA 0x60 |
#define i8042_STATUS 0X64 |
typedef unsigned char u8; |
typedef short u16; |
static inline void i8042_data_write(u8 data) |
{ |
outb(i8042_DATA, data); |
} |
static inline u8 i8042_data_read(void) |
{ |
return inb(i8042_DATA); |
} |
static inline u8 i8042_status_read(void) |
{ |
return inb(i8042_STATUS); |
} |
static inline void i8042_command_write(u8 command) |
{ |
outb(i8042_STATUS, command); |
} |
#endif |
/** |
* @} |
*/ |
/tags/0.3.0/uspace/srv/kbd/arch/ia32/include/scanc.h |
---|
0,0 → 1,59 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup kbdia32 |
* @{ |
*/ |
/** @file |
* @ingroup kbdamd64 |
*/ |
#ifndef KBD_ia32_SCANC_H_ |
#define KBD_ia32_SCANC_H_ |
/** Scancodes. */ |
#define SC_ESC 0x01 |
#define SC_BACKSPACE 0x0e |
#define SC_LSHIFT 0x2a |
#define SC_RSHIFT 0x36 |
#define SC_CAPSLOCK 0x3a |
#define SC_SPEC_ESCAPE 0xe0 |
#define SC_LEFTARR 0x4b |
#define SC_RIGHTARR 0x4d |
#define SC_UPARR 0x48 |
#define SC_DOWNARR 0x50 |
#define SC_DELETE 0x53 |
#define SC_HOME 0x47 |
#define SC_END 0x4f |
#endif |
/** |
* @} |
*/ |
/tags/0.3.0/uspace/srv/kbd/arch/sparc64/src/kbd.c |
---|
0,0 → 1,117 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup kbdsparc64 sparc64 |
* @brief HelenOS sparc64 arch dependent parts of uspace keyboard handler. |
* @ingroup kbd |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/kbd.h> |
#include <ipc/ipc.h> |
#include <sysinfo.h> |
#include <kbd.h> |
#include <keys.h> |
#include <stdio.h> |
#include <sys/types.h> |
#include <genarch/kbd.h> |
#define KBD_KEY_RELEASE 0x80 |
#define KBD_ALL_KEYS_UP 0x7f |
/** Top-half pseudocode for z8530. */ |
irq_cmd_t z8530_cmds[] = { |
{ |
CMD_MEM_READ_1, |
0, /**< Address. Will be patched in run-time. */ |
0, /**< Value. Not used. */ |
1 /**< Arg 1 will contain the result. */ |
} |
}; |
irq_code_t z8530_kbd = { |
1, |
z8530_cmds |
}; |
/** Top-half pseudocode for ns16550. */ |
irq_cmd_t ns16550_cmds[] = { |
{ |
CMD_MEM_READ_1, |
0, /**< Address. Will be patched in run-time. */ |
0, /**< Value. Not used. */ |
1 /**< Arg 1 will contain the result. */ |
} |
}; |
irq_code_t ns16550_kbd = { |
1, |
ns16550_cmds |
}; |
#define KBD_Z8530 1 |
#define KBD_NS16550 2 |
int kbd_arch_init(void) |
{ |
int type = sysinfo_value("kbd.type"); |
switch (type) { |
case KBD_Z8530: |
z8530_cmds[0].addr = (void *) sysinfo_value("kbd.address.virtual") + 6; |
ipc_register_irq(sysinfo_value("kbd.inr"), sysinfo_value("kbd.devno"), 0, &z8530_kbd); |
break; |
case KBD_NS16550: |
ns16550_cmds[0].addr = (void *) sysinfo_value("kbd.address.virtual"); |
ipc_register_irq(sysinfo_value("kbd.inr"), sysinfo_value("kbd.devno"), 0, &ns16550_kbd); |
break; |
default: |
break; |
} |
return 0; |
} |
/** Process keyboard events */ |
int kbd_arch_process(keybuffer_t *keybuffer, ipc_call_t *call) |
{ |
int scan_code = IPC_GET_ARG1(*call); |
if (scan_code == KBD_ALL_KEYS_UP) |
return 1; |
if (scan_code & KBD_KEY_RELEASE) |
key_released(keybuffer, scan_code ^ KBD_KEY_RELEASE); |
else |
key_pressed(keybuffer, scan_code); |
return 1; |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/srv/kbd/arch/sparc64/src/scanc.c |
---|
0,0 → 1,304 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genarch |
* @{ |
*/ |
/** |
* @file |
* @brief Scan codes for Sun keyboards. |
*/ |
#include <genarch/scanc.h> |
/** Primary meaning of scancodes. */ |
int sc_primary_map[] = { |
[0x00] = SPECIAL, |
[0x01] = SPECIAL, |
[0x02] = SPECIAL, |
[0x03] = SPECIAL, |
[0x04] = SPECIAL, |
[0x05] = FUNCTION_KEYS + 1, /* F1 */ |
[0x06] = FUNCTION_KEYS + 2, /* F2 */ |
[0x07] = FUNCTION_KEYS + 10, /* F10 */ |
[0x08] = FUNCTION_KEYS + 3, /* F3 */ |
[0x09] = FUNCTION_KEYS + 11, /* F11 */ |
[0x0a] = FUNCTION_KEYS + 4, /* F4 */ |
[0x0b] = FUNCTION_KEYS + 12, /* F12 */ |
[0x0c] = FUNCTION_KEYS + 5, /* F5 */ |
[0x0d] = SPECIAL, /* RAlt */ |
[0x0e] = FUNCTION_KEYS + 6, /* F6 */ |
[0x0f] = SPECIAL, |
[0x10] = FUNCTION_KEYS + 7, /* F7 */ |
[0x11] = FUNCTION_KEYS + 8, /* F8 */ |
[0x12] = FUNCTION_KEYS + 9, /* F9 */ |
[0x13] = SPECIAL, /* LAlt */ |
[0x14] = SPECIAL, /* Up Arrow */ |
[0x15] = SPECIAL, /* Pause */ |
[0x16] = SPECIAL, |
[0x17] = SPECIAL, /* Scroll Lock */ |
[0x18] = SPECIAL, /* Left Arrow */ |
[0x19] = SPECIAL, |
[0x1a] = SPECIAL, |
[0x1b] = SPECIAL, /* Down Arrow */ |
[0x1c] = SPECIAL, /* Right Arrow */ |
[0x1d] = SPECIAL, /* Esc */ |
[0x1e] = '1', |
[0x1f] = '2', |
[0x20] = '3', |
[0x21] = '4', |
[0x22] = '5', |
[0x23] = '6', |
[0x24] = '7', |
[0x25] = '8', |
[0x26] = '9', |
[0x27] = '0', |
[0x28] = '-', |
[0x29] = '=', |
[0x2a] = '`', |
[0x2b] = '\b', /* Backspace */ |
[0x2c] = SPECIAL, /* Insert */ |
[0x2d] = SPECIAL, |
[0x2e] = '/', /* numeric keypad */ |
[0x2f] = '*', /* numeric keypad */ |
[0x30] = SPECIAL, |
[0x31] = SPECIAL, |
[0x32] = '.', /* numeric keypad */ |
[0x33] = SPECIAL, |
[0x34] = SPECIAL, /* Home */ |
[0x35] = '\t', /* Tab */ |
[0x36] = 'q', |
[0x37] = 'w', |
[0x38] = 'e', |
[0x39] = 'r', |
[0x3a] = 't', |
[0x3b] = 'y', |
[0x3c] = 'u', |
[0x3d] = 'i', |
[0x3e] = 'o', |
[0x3f] = 'p', |
[0x40] = '[', |
[0x41] = ']', |
[0x42] = SPECIAL, /* Del */ |
[0x43] = SPECIAL, |
[0x44] = '7', /* numeric keypad */ |
[0x45] = '8', /* numeric keypad */ |
[0x46] = '9', /* numeric keypad */ |
[0x47] = '-', /* numeric keypad */ |
[0x48] = SPECIAL, |
[0x49] = SPECIAL, |
[0x4a] = SPECIAL, /* End */ |
[0x4b] = SPECIAL, |
[0x4c] = SPECIAL, /* Control */ |
[0x4d] = 'a', |
[0x4e] = 's', |
[0x4f] = 'd', |
[0x50] = 'f', |
[0x51] = 'g', |
[0x52] = 'h', |
[0x53] = 'j', |
[0x54] = 'k', |
[0x55] = 'l', |
[0x56] = ';', |
[0x57] = '\'', |
[0x58] = '\\', |
[0x59] = '\n', /* Enter */ |
[0x5a] = '\n', /* Enter on numeric keypad */ |
[0x5b] = '4', /* numeric keypad */ |
[0x5c] = '5', /* numeric keypad */ |
[0x5d] = '6', /* numeric keypad */ |
[0x5e] = '0', /* numeric keypad */ |
[0x5f] = SPECIAL, |
[0x60] = SPECIAL, /* Page Up */ |
[0x61] = SPECIAL, |
[0x62] = SPECIAL, /* Num Lock */ |
[0x63] = SPECIAL, /* LShift */ |
[0x64] = 'z', |
[0x65] = 'x', |
[0x66] = 'c', |
[0x67] = 'v', |
[0x68] = 'b', |
[0x69] = 'n', |
[0x6a] = 'm', |
[0x6b] = ',', |
[0x6c] = '.', |
[0x6d] = '/', |
[0x6e] = SPECIAL, /* RShift */ |
[0x6f] = SPECIAL, |
[0x70] = '1', /* numeric keypad */ |
[0x71] = '2', /* numeric keypad */ |
[0x72] = '3', /* numeric keypad */ |
[0x73] = SPECIAL, |
[0x74] = SPECIAL, |
[0x75] = SPECIAL, |
[0x76] = SPECIAL, |
[0x77] = SPECIAL, /* Caps Lock */ |
[0x78] = SPECIAL, |
[0x79] = ' ', |
[0x7a] = SPECIAL, |
[0x7b] = SPECIAL, /* Page Down */ |
[0x7c] = SPECIAL, |
[0x7d] = '+', /* numeric key pad */ |
[0x7e] = SPECIAL, |
[0x7f] = SPECIAL |
}; |
/** Secondary meaning of scancodes. */ |
int sc_secondary_map[] = { |
[0x00] = SPECIAL, |
[0x01] = SPECIAL, |
[0x02] = SPECIAL, |
[0x03] = SPECIAL, |
[0x04] = SPECIAL, |
[0x05] = SPECIAL, /* F1 */ |
[0x06] = SPECIAL, /* F2 */ |
[0x07] = SPECIAL, /* F10 */ |
[0x08] = SPECIAL, /* F3 */ |
[0x09] = SPECIAL, /* F11 */ |
[0x0a] = SPECIAL, /* F4 */ |
[0x0b] = SPECIAL, /* F12 */ |
[0x0c] = SPECIAL, /* F5 */ |
[0x0d] = SPECIAL, /* RAlt */ |
[0x0e] = SPECIAL, /* F6 */ |
[0x0f] = SPECIAL, |
[0x10] = SPECIAL, /* F7 */ |
[0x11] = SPECIAL, /* F8 */ |
[0x12] = SPECIAL, /* F9 */ |
[0x13] = SPECIAL, /* LAlt */ |
[0x14] = SPECIAL, /* Up Arrow */ |
[0x15] = SPECIAL, /* Pause */ |
[0x16] = SPECIAL, |
[0x17] = SPECIAL, /* Scroll Lock */ |
[0x18] = SPECIAL, /* Left Arrow */ |
[0x19] = SPECIAL, |
[0x1a] = SPECIAL, |
[0x1b] = SPECIAL, /* Down Arrow */ |
[0x1c] = SPECIAL, /* Right Arrow */ |
[0x1d] = SPECIAL, /* Esc */ |
[0x1e] = '!', |
[0x1f] = '@', |
[0x20] = '#', |
[0x21] = '$', |
[0x22] = '%', |
[0x23] = '^', |
[0x24] = '&', |
[0x25] = '*', |
[0x26] = '(', |
[0x27] = ')', |
[0x28] = '_', |
[0x29] = '+', |
[0x2a] = '~', |
[0x2b] = SPECIAL, /* Backspace */ |
[0x2c] = SPECIAL, /* Insert */ |
[0x2d] = SPECIAL, |
[0x2e] = '/', /* numeric keypad */ |
[0x2f] = '*', /* numeric keypad */ |
[0x30] = SPECIAL, |
[0x31] = SPECIAL, |
[0x32] = '.', /* numeric keypad */ |
[0x33] = SPECIAL, |
[0x34] = SPECIAL, /* Home */ |
[0x35] = SPECIAL, /* Tab */ |
[0x36] = 'Q', |
[0x37] = 'W', |
[0x38] = 'E', |
[0x39] = 'R', |
[0x3a] = 'T', |
[0x3b] = 'Y', |
[0x3c] = 'U', |
[0x3d] = 'I', |
[0x3e] = 'O', |
[0x3f] = 'P', |
[0x40] = '{', |
[0x41] = '}', |
[0x42] = SPECIAL, /* Del */ |
[0x43] = SPECIAL, |
[0x44] = '7', /* numeric keypad */ |
[0x45] = '8', /* numeric keypad */ |
[0x46] = '9', /* numeric keypad */ |
[0x47] = '-', /* numeric keypad */ |
[0x48] = SPECIAL, |
[0x49] = SPECIAL, |
[0x4a] = SPECIAL, /* End */ |
[0x4b] = SPECIAL, |
[0x4c] = SPECIAL, /* Control */ |
[0x4d] = 'A', |
[0x4e] = 'S', |
[0x4f] = 'D', |
[0x50] = 'F', |
[0x51] = 'G', |
[0x52] = 'H', |
[0x53] = 'J', |
[0x54] = 'K', |
[0x55] = 'L', |
[0x56] = ':', |
[0x57] = '"', |
[0x58] = '|', |
[0x59] = SPECIAL, /* Enter */ |
[0x5a] = SPECIAL, /* Enter on numeric keypad */ |
[0x5b] = '4', /* numeric keypad */ |
[0x5c] = '5', /* numeric keypad */ |
[0x5d] = '6', /* numeric keypad */ |
[0x5e] = '0', /* numeric keypad */ |
[0x5f] = SPECIAL, |
[0x60] = SPECIAL, /* Page Up */ |
[0x61] = SPECIAL, |
[0x62] = SPECIAL, /* Num Lock */ |
[0x63] = SPECIAL, /* LShift */ |
[0x64] = 'Z', |
[0x65] = 'X', |
[0x66] = 'C', |
[0x67] = 'V', |
[0x68] = 'B', |
[0x69] = 'N', |
[0x6a] = 'M', |
[0x6b] = '<', |
[0x6c] = '>', |
[0x6d] = '?', |
[0x6e] = SPECIAL, /* RShift */ |
[0x6f] = SPECIAL, |
[0x70] = '1', /* numeric keypad */ |
[0x71] = '2', /* numeric keypad */ |
[0x72] = '3', /* numeric keypad */ |
[0x73] = SPECIAL, |
[0x74] = SPECIAL, |
[0x75] = SPECIAL, |
[0x76] = SPECIAL, |
[0x77] = SPECIAL, /* Caps Lock */ |
[0x78] = SPECIAL, |
[0x79] = ' ', |
[0x7a] = SPECIAL, |
[0x7b] = SPECIAL, /* Page Down */ |
[0x7c] = SPECIAL, |
[0x7d] = '+', /* numeric key pad */ |
[0x7e] = SPECIAL, |
[0x7f] = SPECIAL |
}; |
/** @} |
*/ |
/tags/0.3.0/uspace/srv/kbd/arch/sparc64/include/kbd.h |
---|
0,0 → 1,43 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup kbdsparc64 sparc64 |
* @brief HelenOS sparc64 arch dependent parts of uspace keyboard handler. |
* @ingroup kbd |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KBD_sparc64_KBD_H_ |
#define KBD_sparc64_KBD_H_ |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/srv/kbd/arch/sparc64/include/scanc.h |
---|
0,0 → 1,57 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup genarch |
* @{ |
*/ |
/** |
* @file |
* @brief Scan codes for sun keyboards. |
*/ |
#ifndef KBD_SCANC_SUN_H_ |
#define KBD_SCANC_SUN_H_ |
#define SC_ESC 0x1d |
#define SC_BACKSPACE 0x2b |
#define SC_LSHIFT 0x63 |
#define SC_RSHIFT 0x6e |
#define SC_CAPSLOCK 0x77 |
#define SC_SPEC_ESCAPE 0xe0 /* ??? */ |
#define SC_LEFTARR 0x18 |
#define SC_RIGHTARR 0x1c |
#define SC_UPARR 0x14 |
#define SC_DOWNARR 0x1b |
#define SC_DELETE 0x42 |
#define SC_HOME 0x34 |
#define SC_END 0x4a |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/srv/kbd/arch/arm32/include/kbd.h |
---|
0,0 → 1,42 |
/* |
* Copyright (c) 2007 Michal Kebrt |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup kbdarm32 |
* @{ |
*/ |
/** @file |
* @brief Empty. |
*/ |
#ifndef KBD_arm32_KBD_H_ |
#define KBD_arm32_KBD_H_ |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/srv/kbd/arch/arm32/src/kbd.c |
---|
0,0 → 1,40 |
/* |
* Copyright (c) 2007 Michal Kebrt |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup kbdarm32 arm32 |
* @brief HelenOS arm32 arch dependent parts of uspace keyboard handler. |
* @ingroup kbd |
* @{ |
*/ |
/** @file |
* @brief Empty, required by generic Makefile. |
*/ |
/** @} |
*/ |
/tags/0.3.0/uspace/srv/kbd/arch/arm32/src/kbd_gxemul.c |
---|
0,0 → 1,424 |
/* |
* Copyright (c) 2007 Michal Kebrt |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup kbdarm32gxemul GXemul |
* @brief HelenOS arm32 GXEmul uspace keyboard handler. |
* @ingroup kbdarm32 |
* @{ |
*/ |
/** @file |
* @brief GXemul uspace keyboard handler. |
*/ |
#include <ipc/ipc.h> |
#include <sysinfo.h> |
#include <kbd.h> |
#include <keys.h> |
#include <bool.h> |
/* GXemul key codes in no-framebuffer mode. */ |
#define GXEMUL_KEY_F1 0x504f1bL |
#define GXEMUL_KEY_F2 0x514f1bL |
#define GXEMUL_KEY_F3 0x524f1bL |
#define GXEMUL_KEY_F4 0x534f1bL |
#define GXEMUL_KEY_F5 0x35315b1bL |
#define GXEMUL_KEY_F6 0x37315b1bL |
#define GXEMUL_KEY_F7 0x38315b1bL |
#define GXEMUL_KEY_F8 0x39315b1bL |
#define GXEMUL_KEY_F9 0x30325b1bL |
#define GXEMUL_KEY_F10 0x31325b1bL |
#define GXEMUL_KEY_F11 0x33325d1bL |
#define GXEMUL_KEY_F12 0x34325b1bL |
/** Start code of F5-F12 keys. */ |
#define GXEMUL_KEY_F5_F12_START_CODE 0x7e |
/* GXemul key codes in framebuffer mode. */ |
#define GXEMUL_FB_KEY_F1 0x504f5b1bL |
#define GXEMUL_FB_KEY_F2 0x514f5b1bL |
#define GXEMUL_FB_KEY_F3 0x524f5b1bL |
#define GXEMUL_FB_KEY_F4 0x534f5b1bL |
#define GXEMUL_FB_KEY_F5 0x35315b1bL |
#define GXEMUL_FB_KEY_F6 0x37315b1bL |
#define GXEMUL_FB_KEY_F7 0x38315b1bL |
#define GXEMUL_FB_KEY_F8 0x39315b1bL |
#define GXEMUL_FB_KEY_F9 0x38325b1bL |
#define GXEMUL_FB_KEY_F10 0x39325b1bL |
#define GXEMUL_FB_KEY_F11 0x33325b1bL |
#define GXEMUL_FB_KEY_F12 0x34325b1bL |
/** Function keys start code (F1=0x101) */ |
#define FUNCTION_KEYS 0x100 |
static irq_cmd_t gxemul_cmds[] = { |
{ |
CMD_MEM_READ_1, |
(void *) 0, |
0, |
2 |
} |
}; |
static irq_code_t gxemul_kbd = { |
1, |
gxemul_cmds |
}; |
/** Framebuffer switched on. */ |
static bool fb; |
/* |
// Please preserve this code (it can be used to determine scancodes) |
int to_hex(int v) |
{ |
return "0123456789ABCDEF"[v]; |
} |
*/ |
/** Process data sent when a key is pressed (in no-framebuffer mode). |
* |
* @param keybuffer Buffer of pressed key. |
* @param scan_code Scan code. |
* |
* @return Always 1. |
*/ |
static int gxemul_kbd_process_no_fb(keybuffer_t *keybuffer, int scan_code) |
{ |
// holds at most 4 latest scan codes |
static unsigned long buf = 0; |
// number of scan codes in #buf |
static int count = 0; |
/* |
// Preserve for detecting scan codes. |
keybuffer_push(keybuffer, to_hex((scan_code>>4)&0xf)); |
keybuffer_push(keybuffer, to_hex(scan_code&0xf)); |
keybuffer_push(keybuffer, 'X'); |
keybuffer_push(keybuffer, 'Y'); |
return 1; |
*/ |
if (scan_code == '\r') { |
scan_code = '\n'; |
} |
if (scan_code == GXEMUL_KEY_F5_F12_START_CODE) { |
switch (buf) { |
case GXEMUL_KEY_F5: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 5); |
buf = count = 0; |
return 1; |
case GXEMUL_KEY_F6: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 6); |
buf = count = 0; |
return 1; |
case GXEMUL_KEY_F7: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 7); |
buf = count = 0; |
return 1; |
case GXEMUL_KEY_F8: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 8); |
buf = count = 0; |
return 1; |
case GXEMUL_KEY_F9: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 9); |
buf = count = 0; |
return 1; |
case GXEMUL_KEY_F10: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 10); |
buf = count = 0; |
return 1; |
case GXEMUL_KEY_F11: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 11); |
buf = count = 0; |
return 1; |
case GXEMUL_KEY_F12: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 12); |
buf = count = 0; |
return 1; |
default: |
keybuffer_push(keybuffer, buf & 0xff); |
keybuffer_push(keybuffer, (buf >> 8) & 0xff); |
keybuffer_push(keybuffer, (buf >> 16) & 0xff); |
keybuffer_push(keybuffer, (buf >> 24) & 0xff); |
keybuffer_push(keybuffer, scan_code); |
buf = count = 0; |
return 1; |
} |
} |
// add to buffer |
buf |= ((unsigned long) scan_code) << (8 * (count++)); |
if ((buf & 0xff) != (GXEMUL_KEY_F1 & 0xff)) { |
keybuffer_push(keybuffer, buf); |
buf = count = 0; |
return 1; |
} |
if (count <= 1) { |
return 1; |
} |
if ((buf & 0xffff) != (GXEMUL_KEY_F1 & 0xffff) |
&& (buf & 0xffff) != (GXEMUL_KEY_F5 & 0xffff) ) { |
keybuffer_push(keybuffer, buf & 0xff); |
keybuffer_push(keybuffer, (buf >> 8) &0xff); |
buf = count = 0; |
return 1; |
} |
if (count <= 2) { |
return 1; |
} |
switch (buf) { |
case GXEMUL_KEY_F1: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 1); |
buf = count = 0; |
return 1; |
case GXEMUL_KEY_F2: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 2); |
buf = count = 0; |
return 1; |
case GXEMUL_KEY_F3: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 3); |
buf = count = 0; |
return 1; |
case GXEMUL_KEY_F4: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 4); |
buf = count = 0; |
return 1; |
} |
if ((buf & 0xffffff) != (GXEMUL_KEY_F5 & 0xffffff) |
&& (buf & 0xffffff) != (GXEMUL_KEY_F9 & 0xffffff)) { |
keybuffer_push(keybuffer, buf & 0xff); |
keybuffer_push(keybuffer, (buf >> 8) & 0xff); |
keybuffer_push(keybuffer, (buf >> 16) & 0xff); |
buf = count = 0; |
return 1; |
} |
if (count <= 3) { |
return 1; |
} |
switch (buf) { |
case GXEMUL_KEY_F5: |
case GXEMUL_KEY_F6: |
case GXEMUL_KEY_F7: |
case GXEMUL_KEY_F8: |
case GXEMUL_KEY_F9: |
case GXEMUL_KEY_F10: |
case GXEMUL_KEY_F11: |
case GXEMUL_KEY_F12: |
return 1; |
default: |
keybuffer_push(keybuffer, buf & 0xff); |
keybuffer_push(keybuffer, (buf >> 8) & 0xff); |
keybuffer_push(keybuffer, (buf >> 16) & 0xff); |
keybuffer_push(keybuffer, (buf >> 24) & 0xff); |
buf = count = 0; |
return 1; |
} |
return 1; |
} |
/** Process data sent when a key is pressed (in framebuffer mode). |
* |
* @param keybuffer Buffer of pressed keys. |
* @param scan_code Scan code. |
* |
* @return Always 1. |
*/ |
static int gxemul_kbd_process_fb(keybuffer_t *keybuffer, int scan_code) |
{ |
// holds at most 4 latest scan codes |
static unsigned long buf = 0; |
// number of scan codes in #buf |
static int count = 0; |
/* |
// Please preserve this code (it can be used to determine scancodes) |
keybuffer_push(keybuffer, to_hex((scan_code>>4)&0xf)); |
keybuffer_push(keybuffer, to_hex(scan_code&0xf)); |
keybuffer_push(keybuffer, ' '); |
keybuffer_push(keybuffer, ' '); |
return 1; |
*/ |
if (scan_code == '\r') { |
scan_code = '\n'; |
} |
// add to buffer |
buf |= ((unsigned long) scan_code) << (8*(count++)); |
if ((buf & 0xff) != (GXEMUL_FB_KEY_F1 & 0xff)) { |
keybuffer_push(keybuffer, buf); |
buf = count = 0; |
return 1; |
} |
if (count <= 1) { |
return 1; |
} |
if ((buf & 0xffff) != (GXEMUL_FB_KEY_F1 & 0xffff)) { |
keybuffer_push(keybuffer, buf & 0xff); |
keybuffer_push(keybuffer, (buf >> 8) &0xff); |
buf = count = 0; |
return 1; |
} |
if (count <= 2) { |
return 1; |
} |
if ((buf & 0xffffff) != (GXEMUL_FB_KEY_F1 & 0xffffff) |
&& (buf & 0xffffff) != (GXEMUL_FB_KEY_F5 & 0xffffff) |
&& (buf & 0xffffff) != (GXEMUL_FB_KEY_F9 & 0xffffff)) { |
keybuffer_push(keybuffer, buf & 0xff); |
keybuffer_push(keybuffer, (buf >> 8) & 0xff); |
keybuffer_push(keybuffer, (buf >> 16) & 0xff); |
buf = count = 0; |
return 1; |
} |
if (count <= 3) { |
return 1; |
} |
switch (buf) { |
case GXEMUL_FB_KEY_F1: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 1 ); |
buf = count = 0; |
return 1; |
case GXEMUL_FB_KEY_F2: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 2 ); |
buf = count = 0; |
return 1; |
case GXEMUL_FB_KEY_F3: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 3 ); |
buf = count = 0; |
return 1; |
case GXEMUL_FB_KEY_F4: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 4 ); |
buf = count = 0; |
return 1; |
case GXEMUL_FB_KEY_F5: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 5 ); |
buf = count = 0; |
return 1; |
case GXEMUL_FB_KEY_F6: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 6 ); |
buf = count = 0; |
return 1; |
case GXEMUL_FB_KEY_F7: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 7 ); |
buf = count = 0; |
return 1; |
case GXEMUL_FB_KEY_F8: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 8 ); |
buf = count = 0; |
return 1; |
case GXEMUL_FB_KEY_F9: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 9 ); |
buf = count = 0; |
return 1; |
case GXEMUL_FB_KEY_F10: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 10 ); |
buf = count = 0; |
return 1; |
case GXEMUL_FB_KEY_F11: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 11 ); |
buf = count = 0; |
return 1; |
case GXEMUL_FB_KEY_F12: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 12 ); |
buf = count = 0; |
return 1; |
default: |
keybuffer_push(keybuffer, buf & 0xff ); |
keybuffer_push(keybuffer, (buf >> 8) & 0xff); |
keybuffer_push(keybuffer, (buf >> 16) & 0xff); |
keybuffer_push(keybuffer, (buf >> 24) & 0xff); |
buf = count = 0; |
return 1; |
} |
return 1; |
} |
/** Initializes keyboard handler. */ |
int kbd_arch_init(void) |
{ |
fb = (sysinfo_value("fb.kind") == 1); |
gxemul_cmds[0].addr = (void *) sysinfo_value("kbd.address.virtual"); |
ipc_register_irq(sysinfo_value("kbd.inr"), sysinfo_value("kbd.devno"), 0, &gxemul_kbd); |
return 0; |
} |
/** Process data sent when a key is pressed. |
* |
* @param keybuffer Buffer of pressed keys. |
* @param call IPC call. |
* |
* @return Always 1. |
*/ |
int kbd_arch_process(keybuffer_t *keybuffer, ipc_call_t *call) |
{ |
int scan_code = IPC_GET_ARG2(*call); |
if (fb) { |
return gxemul_kbd_process_fb(keybuffer, scan_code); |
} else { |
return gxemul_kbd_process_no_fb(keybuffer, scan_code); |
} |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/srv/kbd/arch/ia64/include/kbd.h |
---|
0,0 → 1,44 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup kbdia64 ia64 |
* @brief HelenOS ia64 arch dependent parts of uspace keyboard handler. |
* @ingroup kbd |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KBD_ia64_KBD_H_ |
#define KBD_ia64_KBD_H_ |
#endif |
/** |
* @} |
*/ |
/tags/0.3.0/uspace/srv/kbd/arch/ia64/src/kbd.c |
---|
0,0 → 1,164 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup kbdia64 ia64 |
* @brief HelenOS ia64 arch dependent parts of uspace keyboard handler. |
* @ingroup kbd |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/kbd.h> |
#include <ipc/ipc.h> |
#include <sysinfo.h> |
#include <kbd.h> |
#include <keys.h> |
#define KEY_F1 0x504f1b |
#define KEY_F2 0x514f1b |
#define KEY_F3 0x524f1b |
#define KEY_F4 0x534f1b |
#define KEY_F5 0x7e35315b1b |
#define KEY_F6 0x7e37315b1b |
#define KEY_F7 0x7e38315b1b |
#define KEY_F8 0x7e39315b1b |
#define KEY_F9 0x7e30325b1b |
#define KEY_F10 0x7e31325b1b |
#define KEY_F11 0x7e33325b1b |
#define KEY_F12 0x7e34325b1b |
#define FUNCTION_KEYS 0x100 |
irq_cmd_t ski_cmds[1] = { |
{ CMD_IA64_GETCHAR, 0, 0, 2 } |
}; |
irq_code_t ski_kbd = { |
1, |
ski_cmds |
}; |
int kbd_arch_init(void) |
{ |
if (sysinfo_value("kbd")) { |
ipc_register_irq(sysinfo_value("kbd.inr"), sysinfo_value("kbd.devno"), 0, &ski_kbd); |
return 0; |
} |
return 1; |
} |
/* |
* Please preserve this code (it can be used to determine scancodes) |
* |
int to_hex(int v) |
{ |
return "0123456789ABCDEF"[v]; |
} |
*/ |
int kbd_arch_process(keybuffer_t *keybuffer, ipc_call_t *call) |
{ |
static unsigned long long buf = 0; |
static int count = 0; |
static int esc_count = 0; |
int scan_code = IPC_GET_ARG2(*call); |
/* |
* Please preserve this code (it can be used to determine scancodes) |
*/ |
//keybuffer_push(keybuffer, to_hex((scan_code>>4)&0xf)); |
//keybuffer_push(keybuffer, to_hex(scan_code&0xf)); |
//keybuffer_push(keybuffer, ' '); |
//keybuffer_push(keybuffer, ' '); |
//*/ |
if (scan_code) { |
buf |= (unsigned long long) scan_code<<(8*(count++)); |
} else { |
if (buf == 0x1b) { |
esc_count++; |
if (esc_count == 3) { |
__SYSCALL0(SYS_DEBUG_ENABLE_CONSOLE); |
} |
} else { |
esc_count = 0; |
} |
if (!(buf & 0xff00)) { |
keybuffer_push(keybuffer, buf); |
} else { |
switch (buf) { |
case KEY_F1: |
keybuffer_push(keybuffer, FUNCTION_KEYS | 1); |
break; |
case KEY_F2: |
keybuffer_push(keybuffer, FUNCTION_KEYS | 2); |
break; |
case KEY_F3: |
keybuffer_push(keybuffer, FUNCTION_KEYS | 3); |
break; |
case KEY_F4: |
keybuffer_push(keybuffer, FUNCTION_KEYS | 4); |
break; |
case KEY_F5: |
keybuffer_push(keybuffer, FUNCTION_KEYS | 5); |
break; |
case KEY_F6: |
keybuffer_push(keybuffer, FUNCTION_KEYS | 6); |
break; |
case KEY_F7: |
keybuffer_push(keybuffer, FUNCTION_KEYS | 7); |
break; |
case KEY_F8: |
keybuffer_push(keybuffer, FUNCTION_KEYS | 8); |
break; |
case KEY_F9: |
keybuffer_push(keybuffer, FUNCTION_KEYS | 9); |
break; |
case KEY_F10: |
keybuffer_push(keybuffer, FUNCTION_KEYS | 10); |
break; |
case KEY_F11: |
keybuffer_push(keybuffer, FUNCTION_KEYS | 11); |
break; |
case KEY_F12: |
keybuffer_push(keybuffer, FUNCTION_KEYS | 12); |
break; |
} |
} |
buf = count = 0; |
} |
return 1; |
} |
/** |
* @} |
*/ |
/tags/0.3.0/uspace/srv/kbd/arch/ppc32/include/kbd.h |
---|
0,0 → 1,44 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup kbdppc32 ppc32 |
* @brief HelenOS ppc32 arch dependent parts of uspace keyboard handler. |
* @ingroup kbd |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KBD_ppc32_KBD_H_ |
#define KBD_ppc32_KBD_H_ |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/srv/kbd/arch/ppc32/src/kbd.c |
---|
0,0 → 1,209 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup kbdppc32 ppc32 |
* @brief HelenOS ppc32 arch dependent parts of uspace keyboard handler. |
* @ingroup kbd |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/kbd.h> |
#include <ipc/ipc.h> |
#include <sysinfo.h> |
#include <kbd.h> |
#include <keys.h> |
irq_cmd_t cuda_cmds[1] = { |
{ CMD_PPC32_GETCHAR, 0, 0, 2 } |
}; |
irq_code_t cuda_kbd = { |
1, |
cuda_cmds |
}; |
#define SPECIAL 255 |
#define FUNCTION_KEYS 0x100 |
static int lchars[0x80] = { |
'a', |
's', |
'd', |
'f', |
'h', |
'g', |
'z', |
'x', |
'c', |
'v', |
SPECIAL, |
'b', |
'q', |
'w', |
'e', |
'r', |
'y', |
't', |
'1', |
'2', |
'3', |
'4', |
'6', |
'5', |
'=', |
'9', |
'7', |
'-', |
'8', |
'0', |
']', |
'o', |
'u', |
'[', |
'i', |
'p', |
'\n', /* Enter */ |
'l', |
'j', |
'\'', |
'k', |
';', |
'\\', |
',', |
'/', |
'n', |
'm', |
'.', |
'\t', /* Tab */ |
' ', |
'`', |
'\b', /* Backspace */ |
SPECIAL, |
SPECIAL, /* Escape */ |
SPECIAL, /* Ctrl */ |
SPECIAL, /* Alt */ |
SPECIAL, /* Shift */ |
SPECIAL, /* Caps-Lock */ |
SPECIAL, /* RAlt */ |
SPECIAL, /* Left */ |
SPECIAL, /* Right */ |
SPECIAL, /* Down */ |
SPECIAL, /* Up */ |
SPECIAL, |
SPECIAL, |
'.', /* Keypad . */ |
SPECIAL, |
'*', /* Keypad * */ |
SPECIAL, |
'+', /* Keypad + */ |
SPECIAL, |
SPECIAL, /* NumLock */ |
SPECIAL, |
SPECIAL, |
SPECIAL, |
'/', /* Keypad / */ |
'\n', /* Keypad Enter */ |
SPECIAL, |
'-', /* Keypad - */ |
SPECIAL, |
SPECIAL, |
SPECIAL, |
'0', /* Keypad 0 */ |
'1', /* Keypad 1 */ |
'2', /* Keypad 2 */ |
'3', /* Keypad 3 */ |
'4', /* Keypad 4 */ |
'5', /* Keypad 5 */ |
'6', /* Keypad 6 */ |
'7', /* Keypad 7 */ |
SPECIAL, |
'8', /* Keypad 8 */ |
'9', /* Keypad 9 */ |
SPECIAL, |
SPECIAL, |
SPECIAL, |
(FUNCTION_KEYS | 5), /* F5 */ |
(FUNCTION_KEYS | 6), /* F6 */ |
(FUNCTION_KEYS | 7), /* F7 */ |
(FUNCTION_KEYS | 3), /* F3 */ |
(FUNCTION_KEYS | 8), /* F8 */ |
(FUNCTION_KEYS | 9), /* F9 */ |
SPECIAL, |
(FUNCTION_KEYS | 11), /* F11 */ |
SPECIAL, |
(FUNCTION_KEYS | 13), /* F13 */ |
SPECIAL, |
SPECIAL, /* ScrollLock */ |
SPECIAL, |
(FUNCTION_KEYS | 10), /* F10 */ |
SPECIAL, |
(FUNCTION_KEYS | 12), /* F12 */ |
SPECIAL, |
SPECIAL, /* Pause */ |
SPECIAL, /* Insert */ |
SPECIAL, /* Home */ |
SPECIAL, /* PageUp */ |
SPECIAL, /* Delete */ |
(FUNCTION_KEYS | 4), /* F4 */ |
SPECIAL, /* End */ |
(FUNCTION_KEYS | 2), /* F2 */ |
SPECIAL, /* PageDown */ |
(FUNCTION_KEYS | 1) /* F1 */ |
}; |
int kbd_arch_init(void) |
{ |
return ipc_register_irq(sysinfo_value("kbd.inr"), sysinfo_value("kbd.devno"), 0, &cuda_kbd); |
} |
int kbd_arch_process(keybuffer_t *keybuffer, ipc_call_t *call) |
{ |
int param = IPC_GET_ARG2(*call); |
if (param != -1) { |
uint8_t scancode = (uint8_t) param; |
if ((scancode & 0x80) != 0x80) { |
int key = lchars[scancode & 0x7f]; |
if (key != SPECIAL) |
keybuffer_push(keybuffer, key); |
} |
} |
return 1; |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/srv/kbd/arch/ppc64/include/kbd.h |
---|
0,0 → 1,43 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup kbdppc64 ppc64 |
* @brief HelenOS ppc64 arch dependent parts of uspace keyboard handler. |
* @ingroup kbd |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KBD_ppc64_KBD_H_ |
#define KBD_ppc64_KBD_H_ |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/srv/kbd/arch/ppc64/src/kbd.c |
---|
0,0 → 1,56 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup kbdppc64 ppc64 |
* @brief HelenOS ppc64 arch dependent parts of uspace keyboard handler. |
* @ingroup kbd |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/kbd.h> |
#include <ipc/ipc.h> |
#include <sysinfo.h> |
#include <kbd.h> |
#include <keys.h> |
int kbd_arch_init(void) |
{ |
return 0; |
} |
int kbd_arch_process(keybuffer_t *keybuffer, ipc_call_t *call) |
{ |
return 1; |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/srv/kbd/arch/mips32/include/kbd.h |
---|
0,0 → 1,44 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup kbdmips32 mips32 |
* @brief HelenOS mips32 arch dependent parts of uspace keyboard handler. |
* @ingroup kbd |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KBD_mips32_KBD_H_ |
#define KBD_mips32_KBD_H_ |
#endif |
/** |
* @} |
*/ |
/tags/0.3.0/uspace/srv/kbd/arch/mips32/src/kbd.c |
---|
0,0 → 1,377 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup kbdmips32 mips32 |
* @brief HelenOS mips32 arch dependent parts of uspace keyboard handler. |
* @ingroup kbd |
* @{ |
*/ |
/** @file |
*/ |
#include <arch/kbd.h> |
#include <ipc/ipc.h> |
#include <sysinfo.h> |
#include <kbd.h> |
#include <keys.h> |
#define MSIM_KEY_F1 0x504f1bL |
#define MSIM_KEY_F2 0x514f1bL |
#define MSIM_KEY_F3 0x524f1bL |
#define MSIM_KEY_F4 0x534f1bL |
#define MSIM_KEY_F5 0x35315b1bL |
#define MSIM_KEY_F6 0x37315b1bL |
#define MSIM_KEY_F7 0x38315b1bL |
#define MSIM_KEY_F8 0x39315b1bL |
#define MSIM_KEY_F9 0x30325b1bL |
#define MSIM_KEY_F10 0x31325b1bL |
#define MSIM_KEY_F11 0x33325b1bL |
#define MSIM_KEY_F12 0x34325b1bL |
#define GXEMUL_KEY_F1 0x504f5b1bL |
#define GXEMUL_KEY_F2 0x514f5b1bL |
#define GXEMUL_KEY_F3 0x524f5b1bL |
#define GXEMUL_KEY_F4 0x534f5b1bL |
#define GXEMUL_KEY_F5 0x35315b1bL |
#define GXEMUL_KEY_F6 0x37315b1bL |
#define GXEMUL_KEY_F7 0x38315b1bL |
#define GXEMUL_KEY_F8 0x39315b1bL |
#define GXEMUL_KEY_F9 0x38325b1bL |
#define GXEMUL_KEY_F10 0x39325b1bL |
#define GXEMUL_KEY_F11 0x33325b1bL |
#define GXEMUL_KEY_F12 0x34325b1bL |
#define FUNCTION_KEYS 0x100 |
irq_cmd_t msim_cmds[1] = { |
{ CMD_MEM_READ_1, (void *) 0, 0, 2 } |
}; |
irq_code_t msim_kbd = { |
1, |
msim_cmds |
}; |
static int msim,gxemul; |
static int fb_fb; |
int kbd_arch_init(void) |
{ |
fb_fb = (sysinfo_value("fb.kind") == 1); |
msim_cmds[0].addr = sysinfo_value("kbd.address.virtual"); |
ipc_register_irq(sysinfo_value("kbd.inr"), sysinfo_value("kbd.devno"), 0, &msim_kbd); |
return 0; |
} |
/* |
//* |
//* Please preserve this code (it can be used to determine scancodes) |
//* |
int to_hex(int v) |
{ |
return "0123456789ABCDEF"[v]; |
} |
*/ |
static int kbd_arch_process_no_fb(keybuffer_t *keybuffer, int scan_code) |
{ |
static unsigned long buf = 0; |
static int count = 0; |
/* Please preserve this code (it can be used to determine scancodes) |
keybuffer_push(keybuffer, to_hex((scan_code>>4)&0xf)); |
keybuffer_push(keybuffer, to_hex(scan_code&0xf)); |
keybuffer_push(keybuffer, ' '); |
keybuffer_push(keybuffer, ' '); |
return 1; |
*/ |
if(scan_code == 0x7e) { |
switch (buf) { |
case MSIM_KEY_F5: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 5); |
buf = count = 0; |
return 1; |
case MSIM_KEY_F6: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 6); |
buf = count = 0; |
return 1; |
case MSIM_KEY_F7: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 7); |
buf = count = 0; |
return 1; |
case MSIM_KEY_F8: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 8); |
buf = count = 0; |
return 1; |
case MSIM_KEY_F9: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 9); |
buf = count = 0; |
return 1; |
case MSIM_KEY_F10: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 10); |
buf = count = 0; |
return 1; |
case MSIM_KEY_F11: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 11); |
buf = count = 0; |
return 1; |
case MSIM_KEY_F12: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 12); |
buf = count = 0; |
return 1; |
default: |
keybuffer_push(keybuffer, buf & 0xff); |
keybuffer_push(keybuffer, (buf >> 8) &0xff); |
keybuffer_push(keybuffer, (buf >> 16) &0xff); |
keybuffer_push(keybuffer, (buf >> 24) &0xff); |
keybuffer_push(keybuffer, scan_code); |
buf = count = 0; |
return 1; |
} |
} |
buf |= ((unsigned long) scan_code)<<(8*(count++)); |
if((buf & 0xff) != (MSIM_KEY_F1 & 0xff)) { |
keybuffer_push(keybuffer, buf); |
buf = count = 0; |
return 1; |
} |
if (count <= 1) |
return 1; |
if ((buf & 0xffff) != (MSIM_KEY_F1 & 0xffff) |
&& (buf & 0xffff) != (MSIM_KEY_F5 & 0xffff) ) { |
keybuffer_push(keybuffer, buf & 0xff); |
keybuffer_push(keybuffer, (buf >> 8) &0xff); |
buf = count = 0; |
return 1; |
} |
if (count <= 2) |
return 1; |
switch (buf) { |
case MSIM_KEY_F1: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 1); |
buf = count = 0; |
return 1; |
case MSIM_KEY_F2: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 2); |
buf = count = 0; |
return 1; |
case MSIM_KEY_F3: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 3); |
buf = count = 0; |
return 1; |
case MSIM_KEY_F4: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 4); |
buf = count = 0; |
return 1; |
} |
if((buf & 0xffffff) != (MSIM_KEY_F5 & 0xffffff) |
&& (buf & 0xffffff) != (MSIM_KEY_F9 & 0xffffff)) { |
keybuffer_push(keybuffer, buf & 0xff); |
keybuffer_push(keybuffer, (buf >> 8) & 0xff); |
keybuffer_push(keybuffer, (buf >> 16) & 0xff); |
buf=count=0; |
return 1; |
} |
if (count <= 3) |
return 1; |
switch (buf) { |
case MSIM_KEY_F5: |
case MSIM_KEY_F6: |
case MSIM_KEY_F7: |
case MSIM_KEY_F8: |
case MSIM_KEY_F9: |
case MSIM_KEY_F10: |
case MSIM_KEY_F11: |
case MSIM_KEY_F12: |
return 1; |
default: |
keybuffer_push(keybuffer, buf & 0xff); |
keybuffer_push(keybuffer, (buf >> 8) &0xff); |
keybuffer_push(keybuffer, (buf >> 16) &0xff); |
keybuffer_push(keybuffer, (buf >> 24) &0xff); |
buf = count = 0; |
return 1; |
} |
return 1; |
} |
static int kbd_arch_process_fb(keybuffer_t *keybuffer, int scan_code) |
{ |
static unsigned long buf = 0; |
static int count = 0; |
/* Please preserve this code (it can be used to determine scancodes) |
keybuffer_push(keybuffer, to_hex((scan_code>>4)&0xf)); |
keybuffer_push(keybuffer, to_hex(scan_code&0xf)); |
keybuffer_push(keybuffer, ' '); |
keybuffer_push(keybuffer, ' '); |
return 1; |
*/ |
if (scan_code == '\r') |
scan_code = '\n'; |
buf |= ((unsigned long) scan_code)<<(8*(count++)); |
if ((buf & 0xff) != (GXEMUL_KEY_F1 & 0xff)) { |
keybuffer_push(keybuffer, buf); |
buf = count = 0; |
return 1; |
} |
if (count <= 1) |
return 1; |
if ((buf & 0xffff) != (GXEMUL_KEY_F1 & 0xffff)) { |
keybuffer_push(keybuffer, buf & 0xff); |
keybuffer_push(keybuffer, (buf >> 8) &0xff); |
buf = count = 0; |
return 1; |
} |
if (count <= 2) |
return 1; |
if ((buf & 0xffffff) != (GXEMUL_KEY_F1 & 0xffffff) |
&& (buf & 0xffffff) != (GXEMUL_KEY_F5 & 0xffffff) |
&& (buf & 0xffffff) != (GXEMUL_KEY_F9 & 0xffffff)) { |
keybuffer_push(keybuffer, buf & 0xff); |
keybuffer_push(keybuffer, (buf >> 8) & 0xff); |
keybuffer_push(keybuffer, (buf >> 16) & 0xff); |
buf = count = 0; |
return 1; |
} |
if ( count <= 3 ) |
return 1; |
switch (buf) { |
case GXEMUL_KEY_F1: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 1 ); |
buf=count=0; |
return 1; |
case GXEMUL_KEY_F2: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 2 ); |
buf=count=0; |
return 1; |
case GXEMUL_KEY_F3: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 3 ); |
buf=count=0; |
return 1; |
case GXEMUL_KEY_F4: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 4 ); |
buf=count=0; |
return 1; |
case GXEMUL_KEY_F5: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 5 ); |
buf=count=0; |
return 1; |
case GXEMUL_KEY_F6: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 6 ); |
buf=count=0; |
return 1; |
case GXEMUL_KEY_F7: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 7 ); |
buf=count=0; |
return 1; |
case GXEMUL_KEY_F8: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 8 ); |
buf=count=0; |
return 1; |
case GXEMUL_KEY_F9: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 9 ); |
buf=count=0; |
return 1; |
case GXEMUL_KEY_F10: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 10 ); |
buf=count=0; |
return 1; |
case GXEMUL_KEY_F11: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 11 ); |
buf=count=0; |
return 1; |
case GXEMUL_KEY_F12: |
keybuffer_push(keybuffer,FUNCTION_KEYS | 12 ); |
buf=count=0; |
return 1; |
default: |
keybuffer_push(keybuffer, buf & 0xff ); |
keybuffer_push(keybuffer, (buf >> 8) &0xff ); |
keybuffer_push(keybuffer, (buf >> 16) &0xff ); |
keybuffer_push(keybuffer, (buf >> 24) &0xff ); |
buf=count=0; |
return 1; |
} |
return 1; |
} |
int kbd_arch_process(keybuffer_t *keybuffer, ipc_call_t *call) |
{ |
int scan_code = IPC_GET_ARG2(*call); |
static int esc_count=0; |
if (scan_code == 0x1b) { |
esc_count++; |
if (esc_count == 3) |
__SYSCALL0(SYS_DEBUG_ENABLE_CONSOLE); |
} else { |
esc_count=0; |
} |
if (fb_fb) |
return kbd_arch_process_fb(keybuffer, scan_code); |
return kbd_arch_process_no_fb(keybuffer, scan_code); |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/srv/kbd/arch/amd64 |
---|
0,0 → 1,0 |
link ia32 |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/uspace/srv/kbd/arch/mips32eb |
---|
0,0 → 1,0 |
link mips32 |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/uspace/srv/kbd/include/key_buffer.h |
---|
0,0 → 1,64 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup kbdgen |
* @brief HelenOS generic uspace keyboard handler. |
* @ingroup kbd |
* @{ |
*/ |
/** @file |
*/ |
#ifndef __KEY_BUFFER_H__ |
#define __KEY_BUFFER_H__ |
#include <sys/types.h> |
/** Size of buffer for pressed keys */ |
#define KEYBUFFER_SIZE 128 |
typedef struct { |
int fifo[KEYBUFFER_SIZE]; |
unsigned long head; |
unsigned long tail; |
unsigned long items; |
} keybuffer_t; |
void keybuffer_free(keybuffer_t *keybuffer); |
void keybuffer_init(keybuffer_t *keybuffer); |
int keybuffer_available(keybuffer_t *keybuffer); |
int keybuffer_empty(keybuffer_t *keybuffer); |
void keybuffer_push(keybuffer_t *keybuffer, int key); |
int keybuffer_pop(keybuffer_t *keybuffer, int *c); |
#endif |
/** |
* @} |
*/ |
/tags/0.3.0/uspace/srv/kbd/include/keys.h |
---|
0,0 → 1,62 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** |
* @addtogroup kbdgen |
* @{ |
*/ |
/** |
* @file |
*/ |
#ifndef _KBD_KEYS_H_ |
#define _KBD_KEYS_H_ |
#define KBD_PUSHCHAR 1024 |
#define KBD_MS_LEFT 1025 |
#define KBD_MS_RIGHT 1026 |
#define KBD_MS_MIDDLE 1027 |
#define KBD_MS_MOVE 1028 |
#define KBD_KEY_F1 0x3b |
#define KBD_KEY_F2 0x3c |
#define KBD_KEY_F3 0x3d |
#define KBD_KEY_F4 0x3e |
#define KBD_KEY_F5 0x3f |
#define KBD_KEY_F6 0x40 |
#define KBD_KEY_F7 0x41 |
#define KBD_KEY_F8 0x42 |
#define KBD_KEY_F9 0x43 |
#define KBD_KEY_F10 0x44 |
#define KBD_KEY_F11 0x45 |
#define KBD_KEY_F12 0x46 |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/srv/kbd/include/kbd.h |
---|
0,0 → 1,51 |
/* |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup kbdgen generic |
* @brief HelenOS generic uspace keyboard handler. |
* @ingroup kbd |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KBD_KBD_H_ |
#define KBD_KBD_H_ |
#include <key_buffer.h> |
extern int kbd_arch_init(void); |
extern int kbd_arch_process(keybuffer_t *keybuffer, ipc_call_t *call); |
extern int mouse_arch_process(int phoneid, ipc_call_t *call); |
#endif |
/** |
* @} |
*/ |
/tags/0.3.0/uspace/srv/kbd/Makefile |
---|
0,0 → 1,115 |
# |
# Copyright (c) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
## Setup toolchain |
# |
LIBC_PREFIX = ../../lib/libc |
SOFTINT_PREFIX = ../../lib/softint |
include $(LIBC_PREFIX)/Makefile.toolchain |
include ../../../Makefile.config |
CFLAGS += -Iinclude -I../libadt/include |
LIBS = $(LIBC_PREFIX)/libc.a |
## Sources |
# |
OUTPUT = kbd |
GENERIC_SOURCES = \ |
generic/kbd.c \ |
generic/key_buffer.c |
ARCH_SOURCES = \ |
arch/$(ARCH)/src/kbd.c |
ifeq ($(ARCH), ia32) |
ARCH_SOURCES += \ |
arch/$(ARCH)/src/mouse.c \ |
arch/$(ARCH)/src/scanc.c |
GENARCH_SOURCES = \ |
genarch/src/kbd.c |
CFLAGS += -DMOUSE_ENABLED |
endif |
ifeq ($(ARCH), amd64) |
ARCH_SOURCES += \ |
arch/$(ARCH)/src/mouse.c \ |
arch/$(ARCH)/src/scanc.c |
GENARCH_SOURCES = \ |
genarch/src/kbd.c |
CFLAGS += -DMOUSE_ENABLED |
endif |
ifeq ($(ARCH), sparc64) |
ARCH_SOURCES += \ |
arch/$(ARCH)/src/scanc.c |
GENARCH_SOURCES = \ |
genarch/src/kbd.c |
endif |
ifeq ($(ARCH), arm32) |
ifeq ($(MACHINE), gxemul_testarm) |
ARCH_SOURCES += \ |
arch/$(ARCH)/src/kbd_gxemul.c |
endif |
endif |
GENERIC_OBJECTS := $(addsuffix .o,$(basename $(GENERIC_SOURCES))) |
ARCH_OBJECTS := $(addsuffix .o,$(basename $(ARCH_SOURCES))) |
GENARCH_OBJECTS := $(addsuffix .o,$(basename $(GENARCH_SOURCES))) |
.PHONY: all clean depend disasm links |
all: links $(OUTPUT) disasm |
-include Makefile.depend |
links: |
ln -sfn ../arch/$(ARCH)/include include/arch |
ln -sfn ../genarch/include include/genarch |
clean: |
-rm -f $(OUTPUT) $(OUTPUT).map $(OUTPUT).disasm Makefile.depend include/arch include/genarch |
depend: |
$(CC) $(DEFS) $(CFLAGS) -M $(SOURCES) > Makefile.depend |
$(OUTPUT): $(ARCH_OBJECTS) $(GENERIC_OBJECTS) $(GENARCH_OBJECTS) $(LIBS) |
$(LD) -T $(LIBC_PREFIX)/arch/$(ARCH)/_link.ld -e __entry_driver $(GENERIC_OBJECTS) $(ARCH_OBJECTS) $(GENARCH_OBJECTS) $(LIBS) $(LFLAGS) -o $@ -Map $(OUTPUT).map |
disasm: |
$(OBJDUMP) -d $(OUTPUT) >$(OUTPUT).disasm |
%.o: %.S |
$(CC) $(DEFS) $(AFLAGS) $(CFLAGS) -D__ASM__ -c $< -o $@ |
%.o: %.s |
$(AS) $(AFLAGS) $< -o $@ |
%.o: %.c |
$(CC) $(DEFS) $(CFLAGS) -c $< -o $@ |
/tags/0.3.0/uspace/srv/kbd/genarch/include/kbd.h |
---|
0,0 → 1,47 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup kbd |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KBD_genarch_KBD_H_ |
#define KBD_genarch_KBD_H_ |
#include <key_buffer.h> |
extern void key_released(keybuffer_t *keybuffer, unsigned char key); |
extern void key_pressed(keybuffer_t *keybuffer, unsigned char key); |
#endif |
/** |
* @} |
*/ |
/tags/0.3.0/uspace/srv/kbd/genarch/include/scanc.h |
---|
0,0 → 1,50 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup kbd |
* @{ |
*/ |
/** @file |
*/ |
#ifndef KBD_SCANC_H_ |
#define KBD_SCANC_H_ |
#define FUNCTION_KEYS 0x100 |
#define SPECIAL 255 |
extern int sc_primary_map[]; |
extern int sc_secondary_map[]; |
#endif |
/** |
* @} |
*/ |
/tags/0.3.0/uspace/srv/kbd/genarch/src/kbd.c |
---|
0,0 → 1,113 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* Copyright (c) 2006 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup kbd |
* @brief Handling of keyboard IRQ notifications for several architectures. |
* @ingroup kbd |
* @{ |
*/ |
/** @file |
*/ |
#include <key_buffer.h> |
#include <arch/scanc.h> |
#include <genarch/scanc.h> |
#include <genarch/kbd.h> |
#include <libc.h> |
#define PRESSED_SHIFT (1<<0) |
#define PRESSED_CAPSLOCK (1<<1) |
#define LOCKED_CAPSLOCK (1<<0) |
static volatile int keyflags; /**< Tracking of multiple keypresses. */ |
static volatile int lockflags; /**< Tracking of multiple keys lockings. */ |
void key_released(keybuffer_t *keybuffer, unsigned char key) |
{ |
switch (key) { |
case SC_LSHIFT: |
case SC_RSHIFT: |
keyflags &= ~PRESSED_SHIFT; |
break; |
case SC_CAPSLOCK: |
keyflags &= ~PRESSED_CAPSLOCK; |
if (lockflags & LOCKED_CAPSLOCK) |
lockflags &= ~LOCKED_CAPSLOCK; |
else |
lockflags |= LOCKED_CAPSLOCK; |
break; |
default: |
break; |
} |
} |
void key_pressed(keybuffer_t *keybuffer, unsigned char key) |
{ |
int *map = sc_primary_map; |
int ascii = sc_primary_map[key]; |
int shift, capslock; |
int letter = 0; |
static int esc_count = 0; |
if (key == SC_ESC) { |
esc_count++; |
if (esc_count == 3) |
__SYSCALL0(SYS_DEBUG_ENABLE_CONSOLE); |
} else { |
esc_count = 0; |
} |
switch (key) { |
case SC_LSHIFT: |
case SC_RSHIFT: |
keyflags |= PRESSED_SHIFT; |
break; |
case SC_CAPSLOCK: |
keyflags |= PRESSED_CAPSLOCK; |
break; |
case SC_SPEC_ESCAPE: |
break; |
default: |
letter = ((ascii >= 'a') && (ascii <= 'z')); |
capslock = (keyflags & PRESSED_CAPSLOCK) || (lockflags & LOCKED_CAPSLOCK); |
shift = keyflags & PRESSED_SHIFT; |
if (letter && capslock) |
shift = !shift; |
if (shift) |
map = sc_secondary_map; |
if (map[key] != SPECIAL) |
keybuffer_push(keybuffer, map[key]); |
break; |
} |
} |
/** |
* @} |
*/ |
/tags/0.3.0/uspace/srv/pci/pci.c |
---|
0,0 → 1,88 |
/* |
* HelenOS PCI driver. |
* |
* (Based on public domain libpci example.c written by Martin Mares.) |
* Copyright (c) 2006 Jakub Jermar |
* |
* Can be freely distributed and used under the terms of the GNU GPL. |
*/ |
/** |
* @addtogroup pci |
* @{ |
*/ |
#include <stdio.h> |
#include <ddi.h> |
#include <task.h> |
#include <stdlib.h> |
#include <ipc/ipc.h> |
#include <ipc/services.h> |
#include <errno.h> |
#include "libpci/pci.h" |
#define PCI_CONF1 0xcf8 |
#define PCI_CONF1_SIZE 8 |
#define NAME "PCI" |
static struct pci_access *pacc; |
int main(int argc, char *argv[]) |
{ |
struct pci_dev *dev; |
unsigned int c; |
char buf[80]; |
ipcarg_t ns_in_phone_hash; |
printf("%s: HelenOS PCI driver\n", NAME); |
/* |
* Gain control over PCI configuration ports. |
*/ |
iospace_enable(task_get_id(), (void *) PCI_CONF1, PCI_CONF1_SIZE); |
pacc = pci_alloc(); /* Get the pci_access structure */ |
pci_init(pacc); /* Initialize the PCI library */ |
pci_scan_bus(pacc); /* We want to get the list of devices */ |
for(dev=pacc->devices; dev; dev=dev->next) { /* Iterate over all devices */ |
pci_fill_info(dev, PCI_FILL_IDENT | PCI_FILL_BASES | PCI_FILL_IRQ); |
c = pci_read_word(dev, PCI_CLASS_DEVICE); /* Read config register directly */ |
printf("%02x:%02x.%d vendor=%04x device=%04x class=%04x irq=%d base0=%lx\n", |
dev->bus, dev->dev, dev->func, dev->vendor_id, dev->device_id, |
c, dev->irq, dev->base_addr[0]); |
printf("\t%s\n", pci_lookup_name(pacc, buf, sizeof(buf), PCI_LOOKUP_VENDOR | PCI_LOOKUP_DEVICE, |
dev->vendor_id, dev->device_id)); |
} |
printf("%s: registering at naming service.\n", NAME); |
if (ipc_connect_to_me(PHONE_NS, SERVICE_PCI, 0, 0, &ns_in_phone_hash) != 0) { |
printf("Failed to register %s at naming service.\n", NAME); |
return -1; |
} |
printf("%s: accepting connections\n", NAME); |
while (1) { |
ipc_call_t call; |
ipc_callid_t callid; |
ipcarg_t retval = ENOTSUP; |
callid = ipc_wait_for_call(&call); |
switch(IPC_GET_METHOD(call)) { |
case IPC_M_CONNECT_ME_TO: |
retval = EOK; |
break; |
} |
ipc_answer_0(callid, retval); |
printf("%s: received call from %lX\n", NAME, |
call.in_phone_hash); |
} |
pci_cleanup(pacc); |
return 0; |
} |
/** |
* @} |
*/ |
/tags/0.3.0/uspace/srv/pci/libpci/types.h |
---|
0,0 → 1,49 |
/* |
* The PCI Library -- Types and Format Strings |
* |
* Copyright (c) 1997--2005 Martin Mares <mj@ucw.cz> |
* |
* May 8, 2006 - Modified and ported to HelenOS by Jakub Jermar. |
* |
* Can be freely distributed and used under the terms of the GNU GPL. |
*/ |
#include <sys/types.h> |
#ifndef PCI_HAVE_Uxx_TYPES |
typedef uint8_t u8; |
typedef uint16_t u16; |
typedef uint32_t u32; |
#ifdef PCI_HAVE_64BIT_ADDRESS |
#include <limits.h> |
#if ULONG_MAX > 0xffffffff |
typedef unsigned long u64; |
#define PCI_U64_FMT "l" |
#else |
typedef unsigned long long u64; |
#define PCI_U64_FMT "ll" |
#endif |
#endif |
#endif /* PCI_HAVE_Uxx_TYPES */ |
#ifdef PCI_HAVE_64BIT_ADDRESS |
typedef u64 pciaddr_t; |
#define PCIADDR_T_FMT "%08" PCI_U64_FMT "x" |
#define PCIADDR_PORT_FMT "%04" PCI_U64_FMT "x" |
#else |
typedef u32 pciaddr_t; |
#define PCIADDR_T_FMT "%08x" |
#define PCIADDR_PORT_FMT "%04x" |
#endif |
#ifdef PCI_ARCH_SPARC64 |
/* On sparc64 Linux the kernel reports remapped port addresses and IRQ numbers */ |
#undef PCIADDR_PORT_FMT |
#define PCIADDR_PORT_FMT PCIADDR_T_FMT |
#define PCIIRQ_FMT "%08x" |
#else |
#define PCIIRQ_FMT "%d" |
#endif |
/tags/0.3.0/uspace/srv/pci/libpci/Makefile |
---|
0,0 → 1,29 |
# Makefile for The PCI Library |
# (c) 1999 Martin Mares <mj@ucw.cz> |
# Modified and ported to HelenOS by Jakub Jermar |
LIBC_PREFIX=$(shell cd ../../../lib/libc; pwd) |
include $(LIBC_PREFIX)/Makefile.toolchain |
LIBS = $(LIBC_PREFIX)/libc.a |
CFLAGS += -I$(LIBC_PREFIX)/include -trigraphs |
OBJS=access.o generic.o names.o |
INCL=internal.h pci.h header.h sysdep.h types.h pci_ids.h |
PCILIB=libpci.a |
OBJS += i386-ports.o |
all: $(PCILIB) |
$(PCILIB): $(OBJS) |
$(AR) rc $@ $(OBJS) |
%.o: %.c $(INCL) |
$(CC) $(CFLAGS) -c $< -o $@ |
clean: |
-rm *.o libpci.a |
/tags/0.3.0/uspace/srv/pci/libpci/pci.h |
---|
0,0 → 1,146 |
/* |
* The PCI Library |
* |
* Copyright (c) 1997--2005 Martin Mares <mj@ucw.cz> |
* |
* May 8, 2006 - Modified and ported to HelenOS by Jakub Jermar. |
* |
* Can be freely distributed and used under the terms of the GNU GPL. |
*/ |
#ifndef _PCI_LIB_H |
#define _PCI_LIB_H |
#include "header.h" |
#include "types.h" |
#define PCI_LIB_VERSION 0x020200 |
/* |
* PCI Access Structure |
*/ |
struct pci_methods; |
enum pci_access_type { |
/* Known access methods, remember to update access.c as well */ |
PCI_ACCESS_I386_TYPE1, /* i386 ports, type 1 (params: none) */ |
PCI_ACCESS_I386_TYPE2, /* i386 ports, type 2 (params: none) */ |
PCI_ACCESS_MAX |
}; |
struct pci_access { |
/* Options you can change: */ |
unsigned int method; /* Access method */ |
char *method_params[PCI_ACCESS_MAX]; /* Parameters for the methods */ |
int writeable; /* Open in read/write mode */ |
int buscentric; /* Bus-centric view of the world */ |
int numeric_ids; /* Don't resolve device IDs to names */ |
int debugging; /* Turn on debugging messages */ |
/* Functions you can override: */ |
void (*error) (char *msg, ...); /* Write error message and quit */ |
void (*warning) (char *msg, ...); /* Write a warning message */ |
void (*debug) (char *msg, ...); /* Write a debugging message */ |
struct pci_dev *devices; /* Devices found on this bus */ |
/* Fields used internally: */ |
struct pci_methods *methods; |
struct id_entry **id_hash; /* names.c */ |
struct id_bucket *current_id_bucket; |
}; |
/* Initialize PCI access */ |
struct pci_access *pci_alloc(void); |
void pci_init(struct pci_access *); |
void pci_cleanup(struct pci_access *); |
/* Scanning of devices */ |
void pci_scan_bus(struct pci_access *acc); |
struct pci_dev *pci_get_dev(struct pci_access *acc, int domain, int bus, int dev, int func); /* Raw access to specified device */ |
void pci_free_dev(struct pci_dev *); |
/* |
* Devices |
*/ |
struct pci_dev { |
struct pci_dev *next; /* Next device in the chain */ |
u16 domain; /* PCI domain (host bridge) */ |
u8 bus, dev, func; /* Bus inside domain, device and function */ |
/* These fields are set by pci_fill_info() */ |
int known_fields; /* Set of info fields already known */ |
u16 vendor_id, device_id; /* Identity of the device */ |
int irq; /* IRQ number */ |
pciaddr_t base_addr[6]; /* Base addresses */ |
pciaddr_t size[6]; /* Region sizes */ |
pciaddr_t rom_base_addr; /* Expansion ROM base address */ |
pciaddr_t rom_size; /* Expansion ROM size */ |
/* Fields used internally: */ |
struct pci_access *access; |
struct pci_methods *methods; |
u8 *cache; /* Cached config registers */ |
int cache_len; |
int hdrtype; /* Cached low 7 bits of header type, -1 if unknown */ |
void *aux; /* Auxillary data */ |
}; |
#define PCI_ADDR_IO_MASK (~(pciaddr_t) 0x3) |
#define PCI_ADDR_MEM_MASK (~(pciaddr_t) 0xf) |
u8 pci_read_byte(struct pci_dev *, int pos); /* Access to configuration space */ |
u16 pci_read_word(struct pci_dev *, int pos); |
u32 pci_read_long(struct pci_dev *, int pos); |
int pci_read_block(struct pci_dev *, int pos, u8 * buf, int len); |
int pci_write_byte(struct pci_dev *, int pos, u8 data); |
int pci_write_word(struct pci_dev *, int pos, u16 data); |
int pci_write_long(struct pci_dev *, int pos, u32 data); |
int pci_write_block(struct pci_dev *, int pos, u8 * buf, int len); |
int pci_fill_info(struct pci_dev *, int flags); /* Fill in device information */ |
#define PCI_FILL_IDENT 1 |
#define PCI_FILL_IRQ 2 |
#define PCI_FILL_BASES 4 |
#define PCI_FILL_ROM_BASE 8 |
#define PCI_FILL_SIZES 16 |
#define PCI_FILL_RESCAN 0x10000 |
void pci_setup_cache(struct pci_dev *, u8 * cache, int len); |
/* |
* Conversion of PCI ID's to names (according to the pci.ids file) |
* |
* Call pci_lookup_name() to identify different types of ID's: |
* |
* VENDOR (vendorID) -> vendor |
* DEVICE (vendorID, deviceID) -> device |
* VENDOR | DEVICE (vendorID, deviceID) -> combined vendor and device |
* SUBSYSTEM | VENDOR (subvendorID) -> subsystem vendor |
* SUBSYSTEM | DEVICE (vendorID, deviceID, subvendorID, subdevID) -> subsystem device |
* SUBSYSTEM | VENDOR | DEVICE (vendorID, deviceID, subvendorID, subdevID) -> combined subsystem v+d |
* SUBSYSTEM | ... (-1, -1, subvendorID, subdevID) -> generic subsystem |
* CLASS (classID) -> class |
* PROGIF (classID, progif) -> programming interface |
*/ |
char *pci_lookup_name(struct pci_access *a, char *buf, int size, int flags, |
...); |
int pci_load_name_list(struct pci_access *a); /* Called automatically by pci_lookup_*() when needed; returns success */ |
void pci_free_name_list(struct pci_access *a); /* Called automatically by pci_cleanup() */ |
enum pci_lookup_mode { |
PCI_LOOKUP_VENDOR = 1, /* Vendor name (args: vendorID) */ |
PCI_LOOKUP_DEVICE = 2, /* Device name (args: vendorID, deviceID) */ |
PCI_LOOKUP_CLASS = 4, /* Device class (args: classID) */ |
PCI_LOOKUP_SUBSYSTEM = 8, |
PCI_LOOKUP_PROGIF = 16, /* Programming interface (args: classID, prog_if) */ |
PCI_LOOKUP_NUMERIC = 0x10000, /* Want only formatted numbers; default if access->numeric_ids is set */ |
PCI_LOOKUP_NO_NUMBERS = 0x20000 /* Return NULL if not found in the database; default is to print numerically */ |
}; |
#endif |
/tags/0.3.0/uspace/srv/pci/libpci/VERSION |
---|
0,0 → 1,2 |
This libpci has been ported from pciutils-2.2.3 |
on May 8, 2006 by Jakub Jermar. |
/tags/0.3.0/uspace/srv/pci/libpci/i386-ports.c |
---|
0,0 → 1,274 |
/* |
* The PCI Library -- Direct Configuration access via i386 Ports |
* |
* Copyright (c) 1997--2004 Martin Mares <mj@ucw.cz> |
* |
* May 8, 2006 - Modified and ported to HelenOS by Jakub Jermar. |
* |
* Can be freely distributed and used under the terms of the GNU GPL. |
*/ |
#include <unistd.h> |
#include "internal.h" |
static inline void outb(u8 b, u16 port) |
{ |
asm volatile ("outb %0, %1\n" :: "a" (b), "d" (port)); |
} |
static inline void outw(u16 w, u16 port) |
{ |
asm volatile ("outw %0, %1\n" :: "a" (w), "d" (port)); |
} |
static inline void outl(u32 l, u16 port) |
{ |
asm volatile ("outl %0, %1\n" :: "a" (l), "d" (port)); |
} |
static inline u8 inb(u16 port) |
{ |
u8 val; |
asm volatile ("inb %1, %0 \n" : "=a" (val) : "d"(port)); |
return val; |
} |
static inline u16 inw(u16 port) |
{ |
u16 val; |
asm volatile ("inw %1, %0 \n" : "=a" (val) : "d"(port)); |
return val; |
} |
static inline u32 inl(u16 port) |
{ |
u32 val; |
asm volatile ("inl %1, %0 \n" : "=a" (val) : "d"(port)); |
return val; |
} |
static void conf12_init(struct pci_access *a) |
{ |
} |
static void conf12_cleanup(struct pci_access *a UNUSED) |
{ |
} |
/* |
* Before we decide to use direct hardware access mechanisms, we try to do some |
* trivial checks to ensure it at least _seems_ to be working -- we just test |
* whether bus 00 contains a host bridge (this is similar to checking |
* techniques used in XFree86, but ours should be more reliable since we |
* attempt to make use of direct access hints provided by the PCI BIOS). |
* |
* This should be close to trivial, but it isn't, because there are buggy |
* chipsets (yes, you guessed it, by Intel and Compaq) that have no class ID. |
*/ |
static int intel_sanity_check(struct pci_access *a, struct pci_methods *m) |
{ |
struct pci_dev d; |
a->debug("...sanity check"); |
d.bus = 0; |
d.func = 0; |
for (d.dev = 0; d.dev < 32; d.dev++) { |
u16 class, vendor; |
if (m->read(&d, PCI_CLASS_DEVICE, (byte *) & class, |
sizeof(class)) |
&& (class == cpu_to_le16(PCI_CLASS_BRIDGE_HOST) |
|| class == cpu_to_le16(PCI_CLASS_DISPLAY_VGA)) |
|| m->read(&d, PCI_VENDOR_ID, (byte *) & vendor, |
sizeof(vendor)) |
&& (vendor == cpu_to_le16(PCI_VENDOR_ID_INTEL) |
|| vendor == cpu_to_le16(PCI_VENDOR_ID_COMPAQ))) { |
a->debug("...outside the Asylum at 0/%02x/0", |
d.dev); |
return 1; |
} |
} |
a->debug("...insane"); |
return 0; |
} |
/* |
* Configuration type 1 |
*/ |
#define CONFIG_CMD(bus, device_fn, where) (0x80000000 | (bus << 16) | (device_fn << 8) | (where & ~3)) |
static int conf1_detect(struct pci_access *a) |
{ |
unsigned int tmp; |
int res = 0; |
outb(0x01, 0xCFB); |
tmp = inl(0xCF8); |
outl(0x80000000, 0xCF8); |
if (inl(0xCF8) == 0x80000000) |
res = 1; |
outl(tmp, 0xCF8); |
if (res) |
res = intel_sanity_check(a, &pm_intel_conf1); |
return res; |
} |
static int conf1_read(struct pci_dev *d, int pos, byte * buf, int len) |
{ |
int addr = 0xcfc + (pos & 3); |
if (pos >= 256) |
return 0; |
outl(0x80000000 | ((d->bus & 0xff) << 16) | |
(PCI_DEVFN(d->dev, d->func) << 8) | (pos & ~3), 0xcf8); |
switch (len) { |
case 1: |
buf[0] = inb(addr); |
break; |
case 2: |
((u16 *) buf)[0] = cpu_to_le16(inw(addr)); |
break; |
case 4: |
((u32 *) buf)[0] = cpu_to_le32(inl(addr)); |
break; |
default: |
return pci_generic_block_read(d, pos, buf, len); |
} |
return 1; |
} |
static int conf1_write(struct pci_dev *d, int pos, byte * buf, int len) |
{ |
int addr = 0xcfc + (pos & 3); |
if (pos >= 256) |
return 0; |
outl(0x80000000 | ((d->bus & 0xff) << 16) | |
(PCI_DEVFN(d->dev, d->func) << 8) | (pos & ~3), 0xcf8); |
switch (len) { |
case 1: |
outb(buf[0], addr); |
break; |
case 2: |
outw(le16_to_cpu(((u16 *) buf)[0]), addr); |
break; |
case 4: |
outl(le32_to_cpu(((u32 *) buf)[0]), addr); |
break; |
default: |
return pci_generic_block_write(d, pos, buf, len); |
} |
return 1; |
} |
/* |
* Configuration type 2. Obsolete and brain-damaged, but existing. |
*/ |
static int conf2_detect(struct pci_access *a) |
{ |
/* This is ugly and tends to produce false positives. Beware. */ |
outb(0x00, 0xCFB); |
outb(0x00, 0xCF8); |
outb(0x00, 0xCFA); |
if (inb(0xCF8) == 0x00 && inb(0xCFA) == 0x00) |
return intel_sanity_check(a, &pm_intel_conf2); |
else |
return 0; |
} |
static int conf2_read(struct pci_dev *d, int pos, byte * buf, int len) |
{ |
int addr = 0xc000 | (d->dev << 8) | pos; |
if (pos >= 256) |
return 0; |
if (d->dev >= 16) |
/* conf2 supports only 16 devices per bus */ |
return 0; |
outb((d->func << 1) | 0xf0, 0xcf8); |
outb(d->bus, 0xcfa); |
switch (len) { |
case 1: |
buf[0] = inb(addr); |
break; |
case 2: |
((u16 *) buf)[0] = cpu_to_le16(inw(addr)); |
break; |
case 4: |
((u32 *) buf)[0] = cpu_to_le32(inl(addr)); |
break; |
default: |
outb(0, 0xcf8); |
return pci_generic_block_read(d, pos, buf, len); |
} |
outb(0, 0xcf8); |
return 1; |
} |
static int conf2_write(struct pci_dev *d, int pos, byte * buf, int len) |
{ |
int addr = 0xc000 | (d->dev << 8) | pos; |
if (pos >= 256) |
return 0; |
if (d->dev >= 16) |
d->access->error("conf2_write: only first 16 devices exist."); |
outb((d->func << 1) | 0xf0, 0xcf8); |
outb(d->bus, 0xcfa); |
switch (len) { |
case 1: |
outb(buf[0], addr); |
break; |
case 2: |
outw(le16_to_cpu(*(u16 *) buf), addr); |
break; |
case 4: |
outl(le32_to_cpu(*(u32 *) buf), addr); |
break; |
default: |
outb(0, 0xcf8); |
return pci_generic_block_write(d, pos, buf, len); |
} |
outb(0, 0xcf8); |
return 1; |
} |
struct pci_methods pm_intel_conf1 = { |
"Intel-conf1", |
NULL, /* config */ |
conf1_detect, |
conf12_init, |
conf12_cleanup, |
pci_generic_scan, |
pci_generic_fill_info, |
conf1_read, |
conf1_write, |
NULL, /* init_dev */ |
NULL /* cleanup_dev */ |
}; |
struct pci_methods pm_intel_conf2 = { |
"Intel-conf2", |
NULL, /* config */ |
conf2_detect, |
conf12_init, |
conf12_cleanup, |
pci_generic_scan, |
pci_generic_fill_info, |
conf2_read, |
conf2_write, |
NULL, /* init_dev */ |
NULL /* cleanup_dev */ |
}; |
/tags/0.3.0/uspace/srv/pci/libpci/access.c |
---|
0,0 → 1,270 |
/* |
* The PCI Library -- User Access |
* |
* Copyright (c) 1997--2003 Martin Mares <mj@ucw.cz> |
* |
* May 8, 2006 - Modified and ported to HelenOS by Jakub Jermar. |
* |
* Can be freely distributed and used under the terms of the GNU GPL. |
*/ |
#include <stdio.h> |
#include <stdlib.h> |
#include <stdarg.h> |
#include <string.h> |
#include "internal.h" |
static struct pci_methods *pci_methods[PCI_ACCESS_MAX] = { |
&pm_intel_conf1, |
&pm_intel_conf2, |
}; |
struct pci_access *pci_alloc(void) |
{ |
struct pci_access *a = malloc(sizeof(struct pci_access)); |
int i; |
if (!a) |
return NULL; |
bzero(a, sizeof(*a)); |
for (i = 0; i < PCI_ACCESS_MAX; i++) |
if (pci_methods[i] && pci_methods[i]->config) |
pci_methods[i]->config(a); |
return a; |
} |
void *pci_malloc(struct pci_access *a, int size) |
{ |
void *x = malloc(size); |
if (!x) |
a->error("Out of memory (allocation of %d bytes failed)", size); |
return x; |
} |
void pci_mfree(void *x) |
{ |
if (x) |
free(x); |
} |
static void pci_generic_error(char *msg, ...) |
{ |
va_list args; |
va_start(args, msg); |
puts("pcilib: "); |
vprintf(msg, args); |
putchar('\n'); |
exit(1); |
} |
static void pci_generic_warn(char *msg, ...) |
{ |
va_list args; |
va_start(args, msg); |
puts("pcilib: "); |
vprintf(msg, args); |
putchar('\n'); |
} |
static void pci_generic_debug(char *msg, ...) |
{ |
va_list args; |
va_start(args, msg); |
vprintf(msg, args); |
va_end(args); |
} |
static void pci_null_debug(char *msg UNUSED, ...) |
{ |
} |
void pci_init(struct pci_access *a) |
{ |
if (!a->error) |
a->error = pci_generic_error; |
if (!a->warning) |
a->warning = pci_generic_warn; |
if (!a->debug) |
a->debug = pci_generic_debug; |
if (!a->debugging) |
a->debug = pci_null_debug; |
if (a->method) { |
if (a->method >= PCI_ACCESS_MAX || !pci_methods[a->method]) |
a->error("This access method is not supported."); |
a->methods = pci_methods[a->method]; |
} else { |
unsigned int i; |
for (i = 0; i < PCI_ACCESS_MAX; i++) |
if (pci_methods[i]) { |
a->debug("Trying method %d...", i); |
if (pci_methods[i]->detect(a)) { |
a->debug("...OK\n"); |
a->methods = pci_methods[i]; |
a->method = i; |
break; |
} |
a->debug("...No.\n"); |
} |
if (!a->methods) |
a->error("Cannot find any working access method."); |
} |
a->debug("Decided to use %s\n", a->methods->name); |
a->methods->init(a); |
} |
void pci_cleanup(struct pci_access *a) |
{ |
struct pci_dev *d, *e; |
for (d = a->devices; d; d = e) { |
e = d->next; |
pci_free_dev(d); |
} |
if (a->methods) |
a->methods->cleanup(a); |
pci_free_name_list(a); |
pci_mfree(a); |
} |
void pci_scan_bus(struct pci_access *a) |
{ |
a->methods->scan(a); |
} |
struct pci_dev *pci_alloc_dev(struct pci_access *a) |
{ |
struct pci_dev *d = pci_malloc(a, sizeof(struct pci_dev)); |
bzero(d, sizeof(*d)); |
d->access = a; |
d->methods = a->methods; |
d->hdrtype = -1; |
if (d->methods->init_dev) |
d->methods->init_dev(d); |
return d; |
} |
int pci_link_dev(struct pci_access *a, struct pci_dev *d) |
{ |
d->next = a->devices; |
a->devices = d; |
return 1; |
} |
struct pci_dev *pci_get_dev(struct pci_access *a, int domain, int bus, |
int dev, int func) |
{ |
struct pci_dev *d = pci_alloc_dev(a); |
d->domain = domain; |
d->bus = bus; |
d->dev = dev; |
d->func = func; |
return d; |
} |
void pci_free_dev(struct pci_dev *d) |
{ |
if (d->methods->cleanup_dev) |
d->methods->cleanup_dev(d); |
pci_mfree(d); |
} |
static inline void |
pci_read_data(struct pci_dev *d, void *buf, int pos, int len) |
{ |
if (pos & (len - 1)) |
d->access->error("Unaligned read: pos=%02x, len=%d", pos, |
len); |
if (pos + len <= d->cache_len) |
memcpy(buf, d->cache + pos, len); |
else if (!d->methods->read(d, pos, buf, len)) |
memset(buf, 0xff, len); |
} |
byte pci_read_byte(struct pci_dev *d, int pos) |
{ |
byte buf; |
pci_read_data(d, &buf, pos, 1); |
return buf; |
} |
word pci_read_word(struct pci_dev * d, int pos) |
{ |
word buf; |
pci_read_data(d, &buf, pos, 2); |
return le16_to_cpu(buf); |
} |
u32 pci_read_long(struct pci_dev * d, int pos) |
{ |
u32 buf; |
pci_read_data(d, &buf, pos, 4); |
return le32_to_cpu(buf); |
} |
int pci_read_block(struct pci_dev *d, int pos, byte * buf, int len) |
{ |
return d->methods->read(d, pos, buf, len); |
} |
static inline int |
pci_write_data(struct pci_dev *d, void *buf, int pos, int len) |
{ |
if (pos & (len - 1)) |
d->access->error("Unaligned write: pos=%02x,len=%d", pos, len); |
if (pos + len <= d->cache_len) |
memcpy(d->cache + pos, buf, len); |
return d->methods->write(d, pos, buf, len); |
} |
int pci_write_byte(struct pci_dev *d, int pos, byte data) |
{ |
return pci_write_data(d, &data, pos, 1); |
} |
int pci_write_word(struct pci_dev *d, int pos, word data) |
{ |
word buf = cpu_to_le16(data); |
return pci_write_data(d, &buf, pos, 2); |
} |
int pci_write_long(struct pci_dev *d, int pos, u32 data) |
{ |
u32 buf = cpu_to_le32(data); |
return pci_write_data(d, &buf, pos, 4); |
} |
int pci_write_block(struct pci_dev *d, int pos, byte * buf, int len) |
{ |
if (pos < d->cache_len) { |
int l = (pos + len >= d->cache_len) ? (d->cache_len - pos) : len; |
memcpy(d->cache + pos, buf, l); |
} |
return d->methods->write(d, pos, buf, len); |
} |
int pci_fill_info(struct pci_dev *d, int flags) |
{ |
if (flags & PCI_FILL_RESCAN) { |
flags &= ~PCI_FILL_RESCAN; |
d->known_fields = 0; |
} |
if (flags & ~d->known_fields) |
d->known_fields |= d->methods->fill_info(d, flags & ~d->known_fields); |
return d->known_fields; |
} |
void pci_setup_cache(struct pci_dev *d, byte * cache, int len) |
{ |
d->cache = cache; |
d->cache_len = len; |
} |
/tags/0.3.0/uspace/srv/pci/libpci/internal.h |
---|
0,0 → 1,43 |
/* |
* The PCI Library -- Internal Stuff |
* |
* Copyright (c) 1997--2004 Martin Mares <mj@ucw.cz> |
* |
* May 8, 2006 - Modified and ported to HelenOS by Jakub Jermar. |
* |
* Can be freely distributed and used under the terms of the GNU GPL. |
*/ |
#include "pci.h" |
#include "sysdep.h" |
struct pci_methods { |
char *name; |
void (*config) (struct pci_access *); |
int (*detect) (struct pci_access *); |
void (*init) (struct pci_access *); |
void (*cleanup) (struct pci_access *); |
void (*scan) (struct pci_access *); |
int (*fill_info) (struct pci_dev *, int flags); |
int (*read) (struct pci_dev *, int pos, byte * buf, int len); |
int (*write) (struct pci_dev *, int pos, byte * buf, int len); |
void (*init_dev) (struct pci_dev *); |
void (*cleanup_dev) (struct pci_dev *); |
}; |
void pci_generic_scan_bus(struct pci_access *, byte * busmap, int bus); |
void pci_generic_scan(struct pci_access *); |
int pci_generic_fill_info(struct pci_dev *, int flags); |
int pci_generic_block_read(struct pci_dev *, int pos, byte * buf, int len); |
int pci_generic_block_write(struct pci_dev *, int pos, byte * buf, |
int len); |
void *pci_malloc(struct pci_access *, int); |
void pci_mfree(void *); |
struct pci_dev *pci_alloc_dev(struct pci_access *); |
int pci_link_dev(struct pci_access *, struct pci_dev *); |
extern struct pci_methods pm_intel_conf1, pm_intel_conf2, pm_linux_proc, |
pm_fbsd_device, pm_aix_device, pm_nbsd_libpci, pm_obsd_device, |
pm_dump, pm_linux_sysfs; |
/tags/0.3.0/uspace/srv/pci/libpci/names.c |
---|
0,0 → 1,456 |
/* |
* The PCI Library -- ID to Name Translation |
* |
* Copyright (c) 1997--2005 Martin Mares <mj@ucw.cz> |
* |
* May 8, 2006 - Modified and ported to HelenOS by Jakub Jermar. |
* |
* Can be freely distributed and used under the terms of the GNU GPL. |
*/ |
#include <stdio.h> |
#include <stdlib.h> |
#include <stdarg.h> |
#include <string.h> |
#include <errno.h> |
#include "internal.h" |
#include "pci_ids.h" |
struct id_entry { |
struct id_entry *next; |
u32 id12, id34; |
byte cat; |
byte name[1]; |
}; |
enum id_entry_type { |
ID_UNKNOWN, |
ID_VENDOR, |
ID_DEVICE, |
ID_SUBSYSTEM, |
ID_GEN_SUBSYSTEM, |
ID_CLASS, |
ID_SUBCLASS, |
ID_PROGIF |
}; |
struct id_bucket { |
struct id_bucket *next; |
unsigned int full; |
}; |
#define MAX_LINE 1024 |
#define BUCKET_SIZE 8192 |
#define HASH_SIZE 4099 |
#ifdef __GNUC__ |
#define BUCKET_ALIGNMENT __alignof__(struct id_bucket) |
#else |
union id_align { |
struct id_bucket *next; |
unsigned int full; |
}; |
#define BUCKET_ALIGNMENT sizeof(union id_align) |
#endif |
#define BUCKET_ALIGN(n) ((n)+BUCKET_ALIGNMENT-(n)%BUCKET_ALIGNMENT) |
static void *id_alloc(struct pci_access *a, unsigned int size) |
{ |
struct id_bucket *buck = a->current_id_bucket; |
unsigned int pos; |
if (!buck || buck->full + size > BUCKET_SIZE) { |
buck = pci_malloc(a, BUCKET_SIZE); |
buck->next = a->current_id_bucket; |
a->current_id_bucket = buck; |
buck->full = BUCKET_ALIGN(sizeof(struct id_bucket)); |
} |
pos = buck->full; |
buck->full = BUCKET_ALIGN(buck->full + size); |
return (byte *) buck + pos; |
} |
static inline u32 id_pair(unsigned int x, unsigned int y) |
{ |
return ((x << 16) | y); |
} |
static inline unsigned int id_hash(int cat, u32 id12, u32 id34) |
{ |
unsigned int h; |
h = id12 ^ (id34 << 3) ^ (cat << 5); |
return h % HASH_SIZE; |
} |
static struct id_entry *id_lookup(struct pci_access *a, int cat, int id1, |
int id2, int id3, int id4) |
{ |
struct id_entry *n; |
u32 id12 = id_pair(id1, id2); |
u32 id34 = id_pair(id3, id4); |
n = a->id_hash[id_hash(cat, id12, id34)]; |
while (n && (n->id12 != id12 || n->id34 != id34 || n->cat != cat)) |
n = n->next; |
return n; |
} |
static int id_insert(struct pci_access *a, int cat, int id1, int id2, |
int id3, int id4, byte * text) |
{ |
u32 id12 = id_pair(id1, id2); |
u32 id34 = id_pair(id3, id4); |
unsigned int h = id_hash(cat, id12, id34); |
struct id_entry *n = a->id_hash[h]; |
int len = strlen((char *) text); |
while (n && (n->id12 != id12 || n->id34 != id34 || n->cat != cat)) |
n = n->next; |
if (n) |
return 1; |
n = id_alloc(a, sizeof(struct id_entry) + len); |
n->id12 = id12; |
n->id34 = id34; |
n->cat = cat; |
memcpy(n->name, text, len + 1); |
n->next = a->id_hash[h]; |
a->id_hash[h] = n; |
return 0; |
} |
static int id_hex(byte * p, int cnt) |
{ |
int x = 0; |
while (cnt--) { |
x <<= 4; |
if (*p >= '0' && *p <= '9') |
x += (*p - '0'); |
else if (*p >= 'a' && *p <= 'f') |
x += (*p - 'a' + 10); |
else if (*p >= 'A' && *p <= 'F') |
x += (*p - 'A' + 10); |
else |
return -1; |
p++; |
} |
return x; |
} |
static inline int id_white_p(int c) |
{ |
return (c == ' ') || (c == '\t'); |
} |
static const char *id_parse_list(struct pci_access *a, int *lino) |
{ |
byte *line; |
byte *p; |
int id1 = 0, id2 = 0, id3 = 0, id4 = 0; |
int cat = -1; |
int nest; |
static const char parse_error[] = "Parse error"; |
int i; |
*lino = 0; |
for (i = 0; i < sizeof(pci_ids) / sizeof(char *); i++) { |
line = (byte *) pci_ids[i]; |
(*lino)++; |
p = line; |
while (*p) |
p++; |
if (p > line && (p[-1] == ' ' || p[-1] == '\t')) |
*--p = 0; |
p = line; |
while (id_white_p(*p)) |
p++; |
if (!*p || *p == '#') |
continue; |
p = line; |
while (*p == '\t') |
p++; |
nest = p - line; |
if (!nest) { /* Top-level entries */ |
if (p[0] == 'C' && p[1] == ' ') { /* Class block */ |
if ((id1 = id_hex(p + 2, 2)) < 0 || !id_white_p(p[4])) |
return parse_error; |
cat = ID_CLASS; |
p += 5; |
} else if (p[0] == 'S' && p[1] == ' ') { /* Generic subsystem block */ |
if ((id1 = id_hex(p + 2, 4)) < 0 || p[6]) |
return parse_error; |
if (!id_lookup(a, ID_VENDOR, id1, 0, 0, 0)) |
return "Vendor does not exist"; |
cat = ID_GEN_SUBSYSTEM; |
continue; |
} else if (p[0] >= 'A' && p[0] <= 'Z' && p[1] == ' ') { /* Unrecognized block (RFU) */ |
cat = ID_UNKNOWN; |
continue; |
} else { /* Vendor ID */ |
if ((id1 = id_hex(p, 4)) < 0 || !id_white_p(p[4])) |
return parse_error; |
cat = ID_VENDOR; |
p += 5; |
} |
id2 = id3 = id4 = 0; |
} else if (cat == ID_UNKNOWN) /* Nested entries in RFU blocks are skipped */ |
continue; |
else if (nest == 1) /* Nesting level 1 */ |
switch (cat) { |
case ID_VENDOR: |
case ID_DEVICE: |
case ID_SUBSYSTEM: |
if ((id2 = id_hex(p, 4)) < 0 || !id_white_p(p[4])) |
return parse_error; |
p += 5; |
cat = ID_DEVICE; |
id3 = id4 = 0; |
break; |
case ID_GEN_SUBSYSTEM: |
if ((id2 = id_hex(p, 4)) < 0 || !id_white_p(p[4])) |
return parse_error; |
p += 5; |
id3 = id4 = 0; |
break; |
case ID_CLASS: |
case ID_SUBCLASS: |
case ID_PROGIF: |
if ((id2 = id_hex(p, 2)) < 0 || !id_white_p(p[2])) |
return parse_error; |
p += 3; |
cat = ID_SUBCLASS; |
id3 = id4 = 0; |
break; |
default: |
return parse_error; |
} else if (nest == 2) /* Nesting level 2 */ |
switch (cat) { |
case ID_DEVICE: |
case ID_SUBSYSTEM: |
if ((id3 = id_hex(p, 4)) < 0 || !id_white_p(p[4]) |
|| (id4 = id_hex(p + 5, 4)) < 0 || !id_white_p(p[9])) |
return parse_error; |
p += 10; |
cat = ID_SUBSYSTEM; |
break; |
case ID_CLASS: |
case ID_SUBCLASS: |
case ID_PROGIF: |
if ((id3 = id_hex(p, 2)) < 0 || !id_white_p(p[2])) |
return parse_error; |
p += 3; |
cat = ID_PROGIF; |
id4 = 0; |
break; |
default: |
return parse_error; |
} else /* Nesting level 3 or more */ |
return parse_error; |
while (id_white_p(*p)) |
p++; |
if (!*p) |
return parse_error; |
if (id_insert(a, cat, id1, id2, id3, id4, p)) |
return "Duplicate entry"; |
} |
return NULL; |
} |
int pci_load_name_list(struct pci_access *a) |
{ |
int lino; |
const char *err; |
pci_free_name_list(a); |
a->id_hash = pci_malloc(a, sizeof(struct id_entry *) * HASH_SIZE); |
bzero(a->id_hash, sizeof(struct id_entry *) * HASH_SIZE); |
err = id_parse_list(a, &lino); |
if (err) |
a->error("%s at %s, element %d\n", err, "pci_ids.h", lino); |
return 1; |
} |
void pci_free_name_list(struct pci_access *a) |
{ |
pci_mfree(a->id_hash); |
a->id_hash = NULL; |
while (a->current_id_bucket) { |
struct id_bucket *buck = a->current_id_bucket; |
a->current_id_bucket = buck->next; |
pci_mfree(buck); |
} |
} |
static struct id_entry *id_lookup_subsys(struct pci_access *a, int iv, |
int id, int isv, int isd) |
{ |
struct id_entry *d = NULL; |
if (iv > 0 && id > 0) /* Per-device lookup */ |
d = id_lookup(a, ID_SUBSYSTEM, iv, id, isv, isd); |
if (!d) /* Generic lookup */ |
d = id_lookup(a, ID_GEN_SUBSYSTEM, isv, isd, 0, 0); |
if (!d && iv == isv && id == isd) /* Check for subsystem == device */ |
d = id_lookup(a, ID_DEVICE, iv, id, 0, 0); |
return d; |
} |
char *pci_lookup_name(struct pci_access *a, char *buf, int size, int flags, |
...) |
{ |
va_list args; |
int num, res, synth; |
struct id_entry *v, *d, *cls, *pif; |
int iv, id, isv, isd, icls, ipif; |
va_start(args, flags); |
num = 0; |
if ((flags & PCI_LOOKUP_NUMERIC) || a->numeric_ids) { |
flags &= ~PCI_LOOKUP_NUMERIC; |
num = 1; |
} else if (!a->id_hash) { |
if (!pci_load_name_list(a)) |
num = a->numeric_ids = 1; |
} |
if (flags & PCI_LOOKUP_NO_NUMBERS) { |
flags &= ~PCI_LOOKUP_NO_NUMBERS; |
synth = 0; |
if (num) |
return NULL; |
} else |
synth = 1; |
switch (flags) { |
case PCI_LOOKUP_VENDOR: |
iv = va_arg(args, int); |
if (num) |
res = snprintf(buf, size, "%04x", iv); |
else if (v = id_lookup(a, ID_VENDOR, iv, 0, 0, 0)) |
return (char *) v->name; |
else |
res = snprintf(buf, size, "Unknown vendor %04x", iv); |
break; |
case PCI_LOOKUP_DEVICE: |
iv = va_arg(args, int); |
id = va_arg(args, int); |
if (num) |
res = snprintf(buf, size, "%04x", id); |
else if (d = id_lookup(a, ID_DEVICE, iv, id, 0, 0)) |
return (char *) d->name; |
else if (synth) |
res = snprintf(buf, size, "Unknown device %04x", id); |
else |
return NULL; |
break; |
case PCI_LOOKUP_VENDOR | PCI_LOOKUP_DEVICE: |
iv = va_arg(args, int); |
id = va_arg(args, int); |
if (num) |
res = snprintf(buf, size, "%04x:%04x", iv, id); |
else { |
v = id_lookup(a, ID_VENDOR, iv, 0, 0, 0); |
d = id_lookup(a, ID_DEVICE, iv, id, 0, 0); |
if (v && d) |
res = snprintf(buf, size, "%s %s", v->name, |
d->name); |
else if (!synth) |
return NULL; |
else if (!v) |
res = snprintf(buf, size, "Unknown device %04x:%04x", iv, id); |
else /* !d */ |
res = snprintf(buf, size, "%s Unknown device %04x", v->name, id); |
} |
break; |
case PCI_LOOKUP_SUBSYSTEM | PCI_LOOKUP_VENDOR: |
isv = va_arg(args, int); |
if (num) |
res = snprintf(buf, size, "%04x", isv); |
else if (v = id_lookup(a, ID_VENDOR, isv, 0, 0, 0)) |
return (char *) v->name; |
else if (synth) |
res = snprintf(buf, size, "Unknown vendor %04x", isv); |
else |
return NULL; |
break; |
case PCI_LOOKUP_SUBSYSTEM | PCI_LOOKUP_DEVICE: |
iv = va_arg(args, int); |
id = va_arg(args, int); |
isv = va_arg(args, int); |
isd = va_arg(args, int); |
if (num) |
res = snprintf(buf, size, "%04x", isd); |
else if (d = id_lookup_subsys(a, iv, id, isv, isd)) |
return (char *) d->name; |
else if (synth) |
res = snprintf(buf, size, "Unknown device %04x", isd); |
else |
return NULL; |
break; |
case PCI_LOOKUP_VENDOR | PCI_LOOKUP_DEVICE | PCI_LOOKUP_SUBSYSTEM: |
iv = va_arg(args, int); |
id = va_arg(args, int); |
isv = va_arg(args, int); |
isd = va_arg(args, int); |
if (num) |
res = snprintf(buf, size, "%04x:%04x", isv, isd); |
else { |
v = id_lookup(a, ID_VENDOR, isv, 0, 0, 0); |
d = id_lookup_subsys(a, iv, id, isv, isd); |
if (v && d) |
res = snprintf(buf, size, "%s %s", v->name, d->name); |
else if (!synth) |
return NULL; |
else if (!v) |
res = snprintf(buf, size, "Unknown device %04x:%04x", isv, isd); |
else /* !d */ |
res = snprintf(buf, size, "%s Unknown device %04x", v->name, isd); |
} |
break; |
case PCI_LOOKUP_CLASS: |
icls = va_arg(args, int); |
if (num) |
res = snprintf(buf, size, "%04x", icls); |
else if (cls = id_lookup(a, ID_SUBCLASS, icls >> 8, icls & 0xff, 0, 0)) |
return (char *) cls->name; |
else if (cls = id_lookup(a, ID_CLASS, icls, 0, 0, 0)) |
res = snprintf(buf, size, "%s [%04x]", cls->name, icls); |
else if (synth) |
res = snprintf(buf, size, "Class %04x", icls); |
else |
return NULL; |
break; |
case PCI_LOOKUP_PROGIF: |
icls = va_arg(args, int); |
ipif = va_arg(args, int); |
if (num) |
res = snprintf(buf, size, "%02x", ipif); |
else if (pif = id_lookup(a, ID_PROGIF, icls >> 8, icls & 0xff, ipif, 0)) |
return (char *) pif->name; |
else if (icls == 0x0101 && !(ipif & 0x70)) { |
/* IDE controllers have complex prog-if semantics */ |
res = snprintf(buf, size, "%s%s%s%s%s", |
(ipif & 0x80) ? "Master " : "", |
(ipif & 0x08) ? "SecP " : "", |
(ipif & 0x04) ? "SecO " : "", |
(ipif & 0x02) ? "PriP " : "", |
(ipif & 0x01) ? "PriO " : ""); |
if (res > 0 && res < size) |
buf[--res] = 0; |
} else if (synth) |
res = snprintf(buf, size, "ProgIf %02x", ipif); |
else |
return NULL; |
break; |
default: |
return "<pci_lookup_name: invalid request>"; |
} |
if (res < 0 || res >= size) |
return "<pci_lookup_name: buffer too small>"; |
else |
return buf; |
} |
/tags/0.3.0/uspace/srv/pci/libpci/generic.c |
---|
0,0 → 1,206 |
/* |
* The PCI Library -- Generic Direct Access Functions |
* |
* Copyright (c) 1997--2000 Martin Mares <mj@ucw.cz> |
* |
* May 8, 2006 - Modified and ported to HelenOS by Jakub Jermar. |
* |
* Can be freely distributed and used under the terms of the GNU GPL. |
*/ |
#include <string.h> |
#include "internal.h" |
void pci_generic_scan_bus(struct pci_access *a, byte * busmap, int bus) |
{ |
int dev, multi, ht; |
struct pci_dev *t; |
a->debug("Scanning bus %02x for devices...\n", bus); |
if (busmap[bus]) { |
a->warning("Bus %02x seen twice (firmware bug). Ignored.", |
bus); |
return; |
} |
busmap[bus] = 1; |
t = pci_alloc_dev(a); |
t->bus = bus; |
for (dev = 0; dev < 32; dev++) { |
t->dev = dev; |
multi = 0; |
for (t->func = 0; !t->func || multi && t->func < 8; |
t->func++) { |
u32 vd = pci_read_long(t, PCI_VENDOR_ID); |
struct pci_dev *d; |
if (!vd || vd == 0xffffffff) |
continue; |
ht = pci_read_byte(t, PCI_HEADER_TYPE); |
if (!t->func) |
multi = ht & 0x80; |
ht &= 0x7f; |
d = pci_alloc_dev(a); |
d->bus = t->bus; |
d->dev = t->dev; |
d->func = t->func; |
d->vendor_id = vd & 0xffff; |
d->device_id = vd >> 16U; |
d->known_fields = PCI_FILL_IDENT; |
d->hdrtype = ht; |
pci_link_dev(a, d); |
switch (ht) { |
case PCI_HEADER_TYPE_NORMAL: |
break; |
case PCI_HEADER_TYPE_BRIDGE: |
case PCI_HEADER_TYPE_CARDBUS: |
pci_generic_scan_bus(a, busmap, |
pci_read_byte(t, |
PCI_SECONDARY_BUS)); |
break; |
default: |
a->debug |
("Device %04x:%02x:%02x.%d has unknown header type %02x.\n", |
d->domain, d->bus, d->dev, d->func, |
ht); |
} |
} |
} |
pci_free_dev(t); |
} |
void pci_generic_scan(struct pci_access *a) |
{ |
byte busmap[256]; |
bzero(busmap, sizeof(busmap)); |
pci_generic_scan_bus(a, busmap, 0); |
} |
int pci_generic_fill_info(struct pci_dev *d, int flags) |
{ |
struct pci_access *a = d->access; |
if ((flags & (PCI_FILL_BASES | PCI_FILL_ROM_BASE)) |
&& d->hdrtype < 0) |
d->hdrtype = pci_read_byte(d, PCI_HEADER_TYPE) & 0x7f; |
if (flags & PCI_FILL_IDENT) { |
d->vendor_id = pci_read_word(d, PCI_VENDOR_ID); |
d->device_id = pci_read_word(d, PCI_DEVICE_ID); |
} |
if (flags & PCI_FILL_IRQ) |
d->irq = pci_read_byte(d, PCI_INTERRUPT_LINE); |
if (flags & PCI_FILL_BASES) { |
int cnt = 0, i; |
bzero(d->base_addr, sizeof(d->base_addr)); |
switch (d->hdrtype) { |
case PCI_HEADER_TYPE_NORMAL: |
cnt = 6; |
break; |
case PCI_HEADER_TYPE_BRIDGE: |
cnt = 2; |
break; |
case PCI_HEADER_TYPE_CARDBUS: |
cnt = 1; |
break; |
} |
if (cnt) { |
for (i = 0; i < cnt; i++) { |
u32 x = pci_read_long(d, PCI_BASE_ADDRESS_0 + i * 4); |
if (!x || x == (u32) ~ 0) |
continue; |
if ((x & PCI_BASE_ADDRESS_SPACE) == PCI_BASE_ADDRESS_SPACE_IO) |
d->base_addr[i] = x; |
else { |
if ((x & PCI_BASE_ADDRESS_MEM_TYPE_MASK) != PCI_BASE_ADDRESS_MEM_TYPE_64) |
d->base_addr[i] = x; |
else if (i >= cnt - 1) |
a->warning("%04x:%02x:%02x.%d: Invalid 64-bit address seen for BAR %d.", |
d->domain, d->bus, |
d->dev, d->func, i); |
else { |
u32 y = pci_read_long(d, PCI_BASE_ADDRESS_0 + (++i) * 4); |
#ifdef PCI_HAVE_64BIT_ADDRESS |
d->base_addr[i - 1] = x | (((pciaddr_t) y) << 32); |
#else |
if (y) |
a->warning("%04x:%02x:%02x.%d 64-bit device address ignored.", |
d->domain, |
d->bus, |
d->dev, |
d->func); |
else |
d->base_addr[i - 1] = x; |
#endif |
} |
} |
} |
} |
} |
if (flags & PCI_FILL_ROM_BASE) { |
int reg = 0; |
d->rom_base_addr = 0; |
switch (d->hdrtype) { |
case PCI_HEADER_TYPE_NORMAL: |
reg = PCI_ROM_ADDRESS; |
break; |
case PCI_HEADER_TYPE_BRIDGE: |
reg = PCI_ROM_ADDRESS1; |
break; |
} |
if (reg) { |
u32 u = pci_read_long(d, reg); |
if (u != 0xffffffff) |
d->rom_base_addr = u; |
} |
} |
return flags & ~PCI_FILL_SIZES; |
} |
static int |
pci_generic_block_op(struct pci_dev *d, int pos, byte * buf, int len, |
int (*r) (struct pci_dev * d, int pos, byte * buf, |
int len)) |
{ |
if ((pos & 1) && len >= 1) { |
if (!r(d, pos, buf, 1)) |
return 0; |
pos++; |
buf++; |
len--; |
} |
if ((pos & 3) && len >= 2) { |
if (!r(d, pos, buf, 2)) |
return 0; |
pos += 2; |
buf += 2; |
len -= 2; |
} |
while (len >= 4) { |
if (!r(d, pos, buf, 4)) |
return 0; |
pos += 4; |
buf += 4; |
len -= 4; |
} |
if (len >= 2) { |
if (!r(d, pos, buf, 2)) |
return 0; |
pos += 2; |
buf += 2; |
len -= 2; |
} |
if (len && !r(d, pos, buf, 1)) |
return 0; |
return 1; |
} |
int pci_generic_block_read(struct pci_dev *d, int pos, byte * buf, int len) |
{ |
return pci_generic_block_op(d, pos, buf, len, d->access->methods->read); |
} |
int pci_generic_block_write(struct pci_dev *d, int pos, byte * buf, int len) |
{ |
return pci_generic_block_op(d, pos, buf, len, d->access->methods->write); |
} |
/tags/0.3.0/uspace/srv/pci/libpci/sysdep.h |
---|
0,0 → 1,26 |
/* |
* The PCI Library -- System-Dependent Stuff |
* |
* Copyright (c) 1997--2004 Martin Mares <mj@ucw.cz> |
* |
* May 8, 2006 - Modified and ported to HelenOS by Jakub Jermar. |
* |
* Can be freely distributed and used under the terms of the GNU GPL. |
*/ |
#ifdef __GNUC__ |
#define UNUSED __attribute__((unused)) |
#define NONRET __attribute__((noreturn)) |
#else |
#define UNUSED |
#define NONRET |
#define inline |
#endif |
typedef u8 byte; |
typedef u16 word; |
#define cpu_to_le16(x) (x) |
#define cpu_to_le32(x) (x) |
#define le16_to_cpu(x) (x) |
#define le32_to_cpu(x) (x) |
/tags/0.3.0/uspace/srv/pci/libpci/header.h |
---|
0,0 → 1,937 |
/* |
* The PCI Library -- PCI Header Structure (based on <linux/pci.h>) |
* |
* Copyright (c) 1997--2005 Martin Mares <mj@ucw.cz> |
* |
* May 8, 2006 - Modified and ported to HelenOS by Jakub Jermar. |
* |
* Can be freely distributed and used under the terms of the GNU GPL. |
*/ |
/* |
* Under PCI, each device has 256 bytes of configuration address space, |
* of which the first 64 bytes are standardized as follows: |
*/ |
#define PCI_VENDOR_ID 0x00 /* 16 bits */ |
#define PCI_DEVICE_ID 0x02 /* 16 bits */ |
#define PCI_COMMAND 0x04 /* 16 bits */ |
#define PCI_COMMAND_IO 0x1 /* Enable response in I/O space */ |
#define PCI_COMMAND_MEMORY 0x2 /* Enable response in Memory space */ |
#define PCI_COMMAND_MASTER 0x4 /* Enable bus mastering */ |
#define PCI_COMMAND_SPECIAL 0x8 /* Enable response to special cycles */ |
#define PCI_COMMAND_INVALIDATE 0x10 /* Use memory write and invalidate */ |
#define PCI_COMMAND_VGA_PALETTE 0x20 /* Enable palette snooping */ |
#define PCI_COMMAND_PARITY 0x40 /* Enable parity checking */ |
#define PCI_COMMAND_WAIT 0x80 /* Enable address/data stepping */ |
#define PCI_COMMAND_SERR 0x100 /* Enable SERR */ |
#define PCI_COMMAND_FAST_BACK 0x200 /* Enable back-to-back writes */ |
#define PCI_STATUS 0x06 /* 16 bits */ |
#define PCI_STATUS_CAP_LIST 0x10 /* Support Capability List */ |
#define PCI_STATUS_66MHZ 0x20 /* Support 66 Mhz PCI 2.1 bus */ |
#define PCI_STATUS_UDF 0x40 /* Support User Definable Features [obsolete] */ |
#define PCI_STATUS_FAST_BACK 0x80 /* Accept fast-back to back */ |
#define PCI_STATUS_PARITY 0x100 /* Detected parity error */ |
#define PCI_STATUS_DEVSEL_MASK 0x600 /* DEVSEL timing */ |
#define PCI_STATUS_DEVSEL_FAST 0x000 |
#define PCI_STATUS_DEVSEL_MEDIUM 0x200 |
#define PCI_STATUS_DEVSEL_SLOW 0x400 |
#define PCI_STATUS_SIG_TARGET_ABORT 0x800 /* Set on target abort */ |
#define PCI_STATUS_REC_TARGET_ABORT 0x1000 /* Master ack of " */ |
#define PCI_STATUS_REC_MASTER_ABORT 0x2000 /* Set on master abort */ |
#define PCI_STATUS_SIG_SYSTEM_ERROR 0x4000 /* Set when we drive SERR */ |
#define PCI_STATUS_DETECTED_PARITY 0x8000 /* Set on parity error */ |
#define PCI_CLASS_REVISION 0x08 /* High 24 bits are class, low 8 |
revision */ |
#define PCI_REVISION_ID 0x08 /* Revision ID */ |
#define PCI_CLASS_PROG 0x09 /* Reg. Level Programming Interface */ |
#define PCI_CLASS_DEVICE 0x0a /* Device class */ |
#define PCI_CACHE_LINE_SIZE 0x0c /* 8 bits */ |
#define PCI_LATENCY_TIMER 0x0d /* 8 bits */ |
#define PCI_HEADER_TYPE 0x0e /* 8 bits */ |
#define PCI_HEADER_TYPE_NORMAL 0 |
#define PCI_HEADER_TYPE_BRIDGE 1 |
#define PCI_HEADER_TYPE_CARDBUS 2 |
#define PCI_BIST 0x0f /* 8 bits */ |
#define PCI_BIST_CODE_MASK 0x0f /* Return result */ |
#define PCI_BIST_START 0x40 /* 1 to start BIST, 2 secs or less */ |
#define PCI_BIST_CAPABLE 0x80 /* 1 if BIST capable */ |
/* |
* Base addresses specify locations in memory or I/O space. |
* Decoded size can be determined by writing a value of |
* 0xffffffff to the register, and reading it back. Only |
* 1 bits are decoded. |
*/ |
#define PCI_BASE_ADDRESS_0 0x10 /* 32 bits */ |
#define PCI_BASE_ADDRESS_1 0x14 /* 32 bits [htype 0,1 only] */ |
#define PCI_BASE_ADDRESS_2 0x18 /* 32 bits [htype 0 only] */ |
#define PCI_BASE_ADDRESS_3 0x1c /* 32 bits */ |
#define PCI_BASE_ADDRESS_4 0x20 /* 32 bits */ |
#define PCI_BASE_ADDRESS_5 0x24 /* 32 bits */ |
#define PCI_BASE_ADDRESS_SPACE 0x01 /* 0 = memory, 1 = I/O */ |
#define PCI_BASE_ADDRESS_SPACE_IO 0x01 |
#define PCI_BASE_ADDRESS_SPACE_MEMORY 0x00 |
#define PCI_BASE_ADDRESS_MEM_TYPE_MASK 0x06 |
#define PCI_BASE_ADDRESS_MEM_TYPE_32 0x00 /* 32 bit address */ |
#define PCI_BASE_ADDRESS_MEM_TYPE_1M 0x02 /* Below 1M [obsolete] */ |
#define PCI_BASE_ADDRESS_MEM_TYPE_64 0x04 /* 64 bit address */ |
#define PCI_BASE_ADDRESS_MEM_PREFETCH 0x08 /* prefetchable? */ |
#define PCI_BASE_ADDRESS_MEM_MASK (~(pciaddr_t)0x0f) |
#define PCI_BASE_ADDRESS_IO_MASK (~(pciaddr_t)0x03) |
/* bit 1 is reserved if address_space = 1 */ |
/* Header type 0 (normal devices) */ |
#define PCI_CARDBUS_CIS 0x28 |
#define PCI_SUBSYSTEM_VENDOR_ID 0x2c |
#define PCI_SUBSYSTEM_ID 0x2e |
#define PCI_ROM_ADDRESS 0x30 /* Bits 31..11 are address, 10..1 reserved */ |
#define PCI_ROM_ADDRESS_ENABLE 0x01 |
#define PCI_ROM_ADDRESS_MASK (~(pciaddr_t)0x7ff) |
#define PCI_CAPABILITY_LIST 0x34 /* Offset of first capability list entry */ |
/* 0x35-0x3b are reserved */ |
#define PCI_INTERRUPT_LINE 0x3c /* 8 bits */ |
#define PCI_INTERRUPT_PIN 0x3d /* 8 bits */ |
#define PCI_MIN_GNT 0x3e /* 8 bits */ |
#define PCI_MAX_LAT 0x3f /* 8 bits */ |
/* Header type 1 (PCI-to-PCI bridges) */ |
#define PCI_PRIMARY_BUS 0x18 /* Primary bus number */ |
#define PCI_SECONDARY_BUS 0x19 /* Secondary bus number */ |
#define PCI_SUBORDINATE_BUS 0x1a /* Highest bus number behind the bridge */ |
#define PCI_SEC_LATENCY_TIMER 0x1b /* Latency timer for secondary interface */ |
#define PCI_IO_BASE 0x1c /* I/O range behind the bridge */ |
#define PCI_IO_LIMIT 0x1d |
#define PCI_IO_RANGE_TYPE_MASK 0x0f /* I/O bridging type */ |
#define PCI_IO_RANGE_TYPE_16 0x00 |
#define PCI_IO_RANGE_TYPE_32 0x01 |
#define PCI_IO_RANGE_MASK ~0x0f |
#define PCI_SEC_STATUS 0x1e /* Secondary status register */ |
#define PCI_MEMORY_BASE 0x20 /* Memory range behind */ |
#define PCI_MEMORY_LIMIT 0x22 |
#define PCI_MEMORY_RANGE_TYPE_MASK 0x0f |
#define PCI_MEMORY_RANGE_MASK ~0x0f |
#define PCI_PREF_MEMORY_BASE 0x24 /* Prefetchable memory range behind */ |
#define PCI_PREF_MEMORY_LIMIT 0x26 |
#define PCI_PREF_RANGE_TYPE_MASK 0x0f |
#define PCI_PREF_RANGE_TYPE_32 0x00 |
#define PCI_PREF_RANGE_TYPE_64 0x01 |
#define PCI_PREF_RANGE_MASK ~0x0f |
#define PCI_PREF_BASE_UPPER32 0x28 /* Upper half of prefetchable memory range */ |
#define PCI_PREF_LIMIT_UPPER32 0x2c |
#define PCI_IO_BASE_UPPER16 0x30 /* Upper half of I/O addresses */ |
#define PCI_IO_LIMIT_UPPER16 0x32 |
/* 0x34 same as for htype 0 */ |
/* 0x35-0x3b is reserved */ |
#define PCI_ROM_ADDRESS1 0x38 /* Same as PCI_ROM_ADDRESS, but for htype 1 */ |
/* 0x3c-0x3d are same as for htype 0 */ |
#define PCI_BRIDGE_CONTROL 0x3e |
#define PCI_BRIDGE_CTL_PARITY 0x01 /* Enable parity detection on secondary interface */ |
#define PCI_BRIDGE_CTL_SERR 0x02 /* The same for SERR forwarding */ |
#define PCI_BRIDGE_CTL_NO_ISA 0x04 /* Disable bridging of ISA ports */ |
#define PCI_BRIDGE_CTL_VGA 0x08 /* Forward VGA addresses */ |
#define PCI_BRIDGE_CTL_MASTER_ABORT 0x20 /* Report master aborts */ |
#define PCI_BRIDGE_CTL_BUS_RESET 0x40 /* Secondary bus reset */ |
#define PCI_BRIDGE_CTL_FAST_BACK 0x80 /* Fast Back2Back enabled on secondary interface */ |
/* Header type 2 (CardBus bridges) */ |
/* 0x14-0x15 reserved */ |
#define PCI_CB_SEC_STATUS 0x16 /* Secondary status */ |
#define PCI_CB_PRIMARY_BUS 0x18 /* PCI bus number */ |
#define PCI_CB_CARD_BUS 0x19 /* CardBus bus number */ |
#define PCI_CB_SUBORDINATE_BUS 0x1a /* Subordinate bus number */ |
#define PCI_CB_LATENCY_TIMER 0x1b /* CardBus latency timer */ |
#define PCI_CB_MEMORY_BASE_0 0x1c |
#define PCI_CB_MEMORY_LIMIT_0 0x20 |
#define PCI_CB_MEMORY_BASE_1 0x24 |
#define PCI_CB_MEMORY_LIMIT_1 0x28 |
#define PCI_CB_IO_BASE_0 0x2c |
#define PCI_CB_IO_BASE_0_HI 0x2e |
#define PCI_CB_IO_LIMIT_0 0x30 |
#define PCI_CB_IO_LIMIT_0_HI 0x32 |
#define PCI_CB_IO_BASE_1 0x34 |
#define PCI_CB_IO_BASE_1_HI 0x36 |
#define PCI_CB_IO_LIMIT_1 0x38 |
#define PCI_CB_IO_LIMIT_1_HI 0x3a |
#define PCI_CB_IO_RANGE_MASK ~0x03 |
/* 0x3c-0x3d are same as for htype 0 */ |
#define PCI_CB_BRIDGE_CONTROL 0x3e |
#define PCI_CB_BRIDGE_CTL_PARITY 0x01 /* Similar to standard bridge control register */ |
#define PCI_CB_BRIDGE_CTL_SERR 0x02 |
#define PCI_CB_BRIDGE_CTL_ISA 0x04 |
#define PCI_CB_BRIDGE_CTL_VGA 0x08 |
#define PCI_CB_BRIDGE_CTL_MASTER_ABORT 0x20 |
#define PCI_CB_BRIDGE_CTL_CB_RESET 0x40 /* CardBus reset */ |
#define PCI_CB_BRIDGE_CTL_16BIT_INT 0x80 /* Enable interrupt for 16-bit cards */ |
#define PCI_CB_BRIDGE_CTL_PREFETCH_MEM0 0x100 /* Prefetch enable for both memory regions */ |
#define PCI_CB_BRIDGE_CTL_PREFETCH_MEM1 0x200 |
#define PCI_CB_BRIDGE_CTL_POST_WRITES 0x400 |
#define PCI_CB_SUBSYSTEM_VENDOR_ID 0x40 |
#define PCI_CB_SUBSYSTEM_ID 0x42 |
#define PCI_CB_LEGACY_MODE_BASE 0x44 /* 16-bit PC Card legacy mode base address (ExCa) */ |
/* 0x48-0x7f reserved */ |
/* Capability lists */ |
#define PCI_CAP_LIST_ID 0 /* Capability ID */ |
#define PCI_CAP_ID_PM 0x01 /* Power Management */ |
#define PCI_CAP_ID_AGP 0x02 /* Accelerated Graphics Port */ |
#define PCI_CAP_ID_VPD 0x03 /* Vital Product Data */ |
#define PCI_CAP_ID_SLOTID 0x04 /* Slot Identification */ |
#define PCI_CAP_ID_MSI 0x05 /* Message Signalled Interrupts */ |
#define PCI_CAP_ID_CHSWP 0x06 /* CompactPCI HotSwap */ |
#define PCI_CAP_ID_PCIX 0x07 /* PCI-X */ |
#define PCI_CAP_ID_HT 0x08 /* HyperTransport */ |
#define PCI_CAP_ID_VNDR 0x09 /* Vendor specific */ |
#define PCI_CAP_ID_DBG 0x0A /* Debug port */ |
#define PCI_CAP_ID_CCRC 0x0B /* CompactPCI Central Resource Control */ |
#define PCI_CAP_ID_AGP3 0x0E /* AGP 8x */ |
#define PCI_CAP_ID_EXP 0x10 /* PCI Express */ |
#define PCI_CAP_ID_MSIX 0x11 /* MSI-X */ |
#define PCI_CAP_LIST_NEXT 1 /* Next capability in the list */ |
#define PCI_CAP_FLAGS 2 /* Capability defined flags (16 bits) */ |
#define PCI_CAP_SIZEOF 4 |
/* Capabilities residing in the PCI Express extended configuration space */ |
#define PCI_EXT_CAP_ID_AER 0x01 /* Advanced Error Reporting */ |
#define PCI_EXT_CAP_ID_VC 0x02 /* Virtual Channel */ |
#define PCI_EXT_CAP_ID_DSN 0x03 /* Device Serial Number */ |
#define PCI_EXT_CAP_ID_PB 0x04 /* Power Budgeting */ |
/* Power Management Registers */ |
#define PCI_PM_CAP_VER_MASK 0x0007 /* Version (2=PM1.1) */ |
#define PCI_PM_CAP_PME_CLOCK 0x0008 /* Clock required for PME generation */ |
#define PCI_PM_CAP_DSI 0x0020 /* Device specific initialization required */ |
#define PCI_PM_CAP_AUX_C_MASK 0x01c0 /* Maximum aux current required in D3cold */ |
#define PCI_PM_CAP_D1 0x0200 /* D1 power state support */ |
#define PCI_PM_CAP_D2 0x0400 /* D2 power state support */ |
#define PCI_PM_CAP_PME_D0 0x0800 /* PME can be asserted from D0 */ |
#define PCI_PM_CAP_PME_D1 0x1000 /* PME can be asserted from D1 */ |
#define PCI_PM_CAP_PME_D2 0x2000 /* PME can be asserted from D2 */ |
#define PCI_PM_CAP_PME_D3_HOT 0x4000 /* PME can be asserted from D3hot */ |
#define PCI_PM_CAP_PME_D3_COLD 0x8000 /* PME can be asserted from D3cold */ |
#define PCI_PM_CTRL 4 /* PM control and status register */ |
#define PCI_PM_CTRL_STATE_MASK 0x0003 /* Current power state (D0 to D3) */ |
#define PCI_PM_CTRL_PME_ENABLE 0x0100 /* PME pin enable */ |
#define PCI_PM_CTRL_DATA_SEL_MASK 0x1e00 /* PM table data index */ |
#define PCI_PM_CTRL_DATA_SCALE_MASK 0x6000 /* PM table data scaling factor */ |
#define PCI_PM_CTRL_PME_STATUS 0x8000 /* PME pin status */ |
#define PCI_PM_PPB_EXTENSIONS 6 /* PPB support extensions */ |
#define PCI_PM_PPB_B2_B3 0x40 /* If bridge enters D3hot, bus enters: 0=B3, 1=B2 */ |
#define PCI_PM_BPCC_ENABLE 0x80 /* Secondary bus is power managed */ |
#define PCI_PM_DATA_REGISTER 7 /* PM table contents read here */ |
#define PCI_PM_SIZEOF 8 |
/* AGP registers */ |
#define PCI_AGP_VERSION 2 /* BCD version number */ |
#define PCI_AGP_RFU 3 /* Rest of capability flags */ |
#define PCI_AGP_STATUS 4 /* Status register */ |
#define PCI_AGP_STATUS_RQ_MASK 0xff000000 /* Maximum number of requests - 1 */ |
#define PCI_AGP_STATUS_ISOCH 0x10000 /* Isochronous transactions supported */ |
#define PCI_AGP_STATUS_ARQSZ_MASK 0xe000 /* log2(optimum async req size in bytes) - 4 */ |
#define PCI_AGP_STATUS_CAL_MASK 0x1c00 /* Calibration cycle timing */ |
#define PCI_AGP_STATUS_SBA 0x0200 /* Sideband addressing supported */ |
#define PCI_AGP_STATUS_ITA_COH 0x0100 /* In-aperture accesses always coherent */ |
#define PCI_AGP_STATUS_GART64 0x0080 /* 64-bit GART entries supported */ |
#define PCI_AGP_STATUS_HTRANS 0x0040 /* If 0, core logic can xlate host CPU accesses thru aperture */ |
#define PCI_AGP_STATUS_64BIT 0x0020 /* 64-bit addressing cycles supported */ |
#define PCI_AGP_STATUS_FW 0x0010 /* Fast write transfers supported */ |
#define PCI_AGP_STATUS_AGP3 0x0008 /* AGP3 mode supported */ |
#define PCI_AGP_STATUS_RATE4 0x0004 /* 4x transfer rate supported (RFU in AGP3 mode) */ |
#define PCI_AGP_STATUS_RATE2 0x0002 /* 2x transfer rate supported (8x in AGP3 mode) */ |
#define PCI_AGP_STATUS_RATE1 0x0001 /* 1x transfer rate supported (4x in AGP3 mode) */ |
#define PCI_AGP_COMMAND 8 /* Control register */ |
#define PCI_AGP_COMMAND_RQ_MASK 0xff000000 /* Master: Maximum number of requests */ |
#define PCI_AGP_COMMAND_ARQSZ_MASK 0xe000 /* log2(optimum async req size in bytes) - 4 */ |
#define PCI_AGP_COMMAND_CAL_MASK 0x1c00 /* Calibration cycle timing */ |
#define PCI_AGP_COMMAND_SBA 0x0200 /* Sideband addressing enabled */ |
#define PCI_AGP_COMMAND_AGP 0x0100 /* Allow processing of AGP transactions */ |
#define PCI_AGP_COMMAND_GART64 0x0080 /* 64-bit GART entries enabled */ |
#define PCI_AGP_COMMAND_64BIT 0x0020 /* Allow generation of 64-bit addr cycles */ |
#define PCI_AGP_COMMAND_FW 0x0010 /* Enable FW transfers */ |
#define PCI_AGP_COMMAND_RATE4 0x0004 /* Use 4x rate (RFU in AGP3 mode) */ |
#define PCI_AGP_COMMAND_RATE2 0x0002 /* Use 2x rate (8x in AGP3 mode) */ |
#define PCI_AGP_COMMAND_RATE1 0x0001 /* Use 1x rate (4x in AGP3 mode) */ |
#define PCI_AGP_SIZEOF 12 |
/* Slot Identification */ |
#define PCI_SID_ESR 2 /* Expansion Slot Register */ |
#define PCI_SID_ESR_NSLOTS 0x1f /* Number of expansion slots available */ |
#define PCI_SID_ESR_FIC 0x20 /* First In Chassis Flag */ |
#define PCI_SID_CHASSIS_NR 3 /* Chassis Number */ |
/* Message Signalled Interrupts registers */ |
#define PCI_MSI_FLAGS 2 /* Various flags */ |
#define PCI_MSI_FLAGS_64BIT 0x80 /* 64-bit addresses allowed */ |
#define PCI_MSI_FLAGS_QSIZE 0x70 /* Message queue size configured */ |
#define PCI_MSI_FLAGS_QMASK 0x0e /* Maximum queue size available */ |
#define PCI_MSI_FLAGS_ENABLE 0x01 /* MSI feature enabled */ |
#define PCI_MSI_RFU 3 /* Rest of capability flags */ |
#define PCI_MSI_ADDRESS_LO 4 /* Lower 32 bits */ |
#define PCI_MSI_ADDRESS_HI 8 /* Upper 32 bits (if PCI_MSI_FLAGS_64BIT set) */ |
#define PCI_MSI_DATA_32 8 /* 16 bits of data for 32-bit devices */ |
#define PCI_MSI_DATA_64 12 /* 16 bits of data for 64-bit devices */ |
/* PCI-X */ |
#define PCI_PCIX_COMMAND 2 /* Command register offset */ |
#define PCI_PCIX_COMMAND_DPERE 0x0001 /* Data Parity Error Recover Enable */ |
#define PCI_PCIX_COMMAND_ERO 0x0002 /* Enable Relaxed Ordering */ |
#define PCI_PCIX_COMMAND_MAX_MEM_READ_BYTE_COUNT 0x000c /* Maximum Memory Read Byte Count */ |
#define PCI_PCIX_COMMAND_MAX_OUTSTANDING_SPLIT_TRANS 0x0070 |
#define PCI_PCIX_COMMAND_RESERVED 0xf80 |
#define PCI_PCIX_STATUS 4 /* Status register offset */ |
#define PCI_PCIX_STATUS_FUNCTION 0x00000007 |
#define PCI_PCIX_STATUS_DEVICE 0x000000f8 |
#define PCI_PCIX_STATUS_BUS 0x0000ff00 |
#define PCI_PCIX_STATUS_64BIT 0x00010000 |
#define PCI_PCIX_STATUS_133MHZ 0x00020000 |
#define PCI_PCIX_STATUS_SC_DISCARDED 0x00040000 /* Split Completion Discarded */ |
#define PCI_PCIX_STATUS_UNEXPECTED_SC 0x00080000 /* Unexpected Split Completion */ |
#define PCI_PCIX_STATUS_DEVICE_COMPLEXITY 0x00100000 /* 0 = simple device, 1 = bridge device */ |
#define PCI_PCIX_STATUS_DESIGNED_MAX_MEM_READ_BYTE_COUNT 0x00600000 /* 0 = 512 bytes, 1 = 1024, 2 = 2048, 3 = 4096 */ |
#define PCI_PCIX_STATUS_DESIGNED_MAX_OUTSTANDING_SPLIT_TRANS 0x03800000 |
#define PCI_PCIX_STATUS_DESIGNED_MAX_CUMULATIVE_READ_SIZE 0x1c000000 |
#define PCI_PCIX_STATUS_RCVD_SC_ERR_MESS 0x20000000 /* Received Split Completion Error Message */ |
#define PCI_PCIX_STATUS_266MHZ 0x40000000 /* 266 MHz capable */ |
#define PCI_PCIX_STATUS_533MHZ 0x80000000 /* 533 MHz capable */ |
#define PCI_PCIX_SIZEOF 4 |
/* PCI-X Bridges */ |
#define PCI_PCIX_BRIDGE_SEC_STATUS 2 /* Secondary bus status register offset */ |
#define PCI_PCIX_BRIDGE_SEC_STATUS_64BIT 0x0001 |
#define PCI_PCIX_BRIDGE_SEC_STATUS_133MHZ 0x0002 |
#define PCI_PCIX_BRIDGE_SEC_STATUS_SC_DISCARDED 0x0004 /* Split Completion Discarded on secondary bus */ |
#define PCI_PCIX_BRIDGE_SEC_STATUS_UNEXPECTED_SC 0x0008 /* Unexpected Split Completion on secondary bus */ |
#define PCI_PCIX_BRIDGE_SEC_STATUS_SC_OVERRUN 0x0010 /* Split Completion Overrun on secondary bus */ |
#define PCI_PCIX_BRIDGE_SEC_STATUS_SPLIT_REQUEST_DELAYED 0x0020 |
#define PCI_PCIX_BRIDGE_SEC_STATUS_CLOCK_FREQ 0x01c0 |
#define PCI_PCIX_BRIDGE_SEC_STATUS_RESERVED 0xfe00 |
#define PCI_PCIX_BRIDGE_STATUS 4 /* Primary bus status register offset */ |
#define PCI_PCIX_BRIDGE_STATUS_FUNCTION 0x00000007 |
#define PCI_PCIX_BRIDGE_STATUS_DEVICE 0x000000f8 |
#define PCI_PCIX_BRIDGE_STATUS_BUS 0x0000ff00 |
#define PCI_PCIX_BRIDGE_STATUS_64BIT 0x00010000 |
#define PCI_PCIX_BRIDGE_STATUS_133MHZ 0x00020000 |
#define PCI_PCIX_BRIDGE_STATUS_SC_DISCARDED 0x00040000 /* Split Completion Discarded */ |
#define PCI_PCIX_BRIDGE_STATUS_UNEXPECTED_SC 0x00080000 /* Unexpected Split Completion */ |
#define PCI_PCIX_BRIDGE_STATUS_SC_OVERRUN 0x00100000 /* Split Completion Overrun */ |
#define PCI_PCIX_BRIDGE_STATUS_SPLIT_REQUEST_DELAYED 0x00200000 |
#define PCI_PCIX_BRIDGE_STATUS_RESERVED 0xffc00000 |
#define PCI_PCIX_BRIDGE_UPSTREAM_SPLIT_TRANS_CTRL 8 /* Upstream Split Transaction Register offset */ |
#define PCI_PCIX_BRIDGE_DOWNSTREAM_SPLIT_TRANS_CTRL 12 /* Downstream Split Transaction Register offset */ |
#define PCI_PCIX_BRIDGE_STR_CAPACITY 0x0000ffff |
#define PCI_PCIX_BRIDGE_STR_COMMITMENT_LIMIT 0xffff0000 |
#define PCI_PCIX_BRIDGE_SIZEOF 12 |
/* HyperTransport (as of spec rev. 2.00) */ |
#define PCI_HT_CMD 2 /* Command Register */ |
#define PCI_HT_CMD_TYP_HI 0xe000 /* Capability Type high part */ |
#define PCI_HT_CMD_TYP_HI_PRI 0x0000 /* Slave or Primary Interface */ |
#define PCI_HT_CMD_TYP_HI_SEC 0x2000 /* Host or Secondary Interface */ |
#define PCI_HT_CMD_TYP 0xf800 /* Capability Type */ |
#define PCI_HT_CMD_TYP_SW 0x4000 /* Switch */ |
#define PCI_HT_CMD_TYP_IDC 0x8000 /* Interrupt Discovery and Configuration */ |
#define PCI_HT_CMD_TYP_RID 0x8800 /* Revision ID */ |
#define PCI_HT_CMD_TYP_UIDC 0x9000 /* UnitID Clumping */ |
#define PCI_HT_CMD_TYP_ECSA 0x9800 /* Extended Configuration Space Access */ |
#define PCI_HT_CMD_TYP_AM 0xa000 /* Address Mapping */ |
#define PCI_HT_CMD_TYP_MSIM 0xa800 /* MSI Mapping */ |
#define PCI_HT_CMD_TYP_DR 0xb000 /* DirectRoute */ |
#define PCI_HT_CMD_TYP_VCS 0xb800 /* VCSet */ |
#define PCI_HT_CMD_TYP_RM 0xc000 /* Retry Mode */ |
#define PCI_HT_CMD_TYP_X86 0xc800 /* X86 (reserved) */ |
/* Link Control Register */ |
#define PCI_HT_LCTR_CFLE 0x0002 /* CRC Flood Enable */ |
#define PCI_HT_LCTR_CST 0x0004 /* CRC Start Test */ |
#define PCI_HT_LCTR_CFE 0x0008 /* CRC Force Error */ |
#define PCI_HT_LCTR_LKFAIL 0x0010 /* Link Failure */ |
#define PCI_HT_LCTR_INIT 0x0020 /* Initialization Complete */ |
#define PCI_HT_LCTR_EOC 0x0040 /* End of Chain */ |
#define PCI_HT_LCTR_TXO 0x0080 /* Transmitter Off */ |
#define PCI_HT_LCTR_CRCERR 0x0f00 /* CRC Error */ |
#define PCI_HT_LCTR_ISOCEN 0x1000 /* Isochronous Flow Control Enable */ |
#define PCI_HT_LCTR_LSEN 0x2000 /* LDTSTOP# Tristate Enable */ |
#define PCI_HT_LCTR_EXTCTL 0x4000 /* Extended CTL Time */ |
#define PCI_HT_LCTR_64B 0x8000 /* 64-bit Addressing Enable */ |
/* Link Configuration Register */ |
#define PCI_HT_LCNF_MLWI 0x0007 /* Max Link Width In */ |
#define PCI_HT_LCNF_LW_8B 0x0 /* Link Width 8 bits */ |
#define PCI_HT_LCNF_LW_16B 0x1 /* Link Width 16 bits */ |
#define PCI_HT_LCNF_LW_32B 0x3 /* Link Width 32 bits */ |
#define PCI_HT_LCNF_LW_2B 0x4 /* Link Width 2 bits */ |
#define PCI_HT_LCNF_LW_4B 0x5 /* Link Width 4 bits */ |
#define PCI_HT_LCNF_LW_NC 0x7 /* Link physically not connected */ |
#define PCI_HT_LCNF_DFI 0x0008 /* Doubleword Flow Control In */ |
#define PCI_HT_LCNF_MLWO 0x0070 /* Max Link Width Out */ |
#define PCI_HT_LCNF_DFO 0x0080 /* Doubleword Flow Control Out */ |
#define PCI_HT_LCNF_LWI 0x0700 /* Link Width In */ |
#define PCI_HT_LCNF_DFIE 0x0800 /* Doubleword Flow Control In Enable */ |
#define PCI_HT_LCNF_LWO 0x7000 /* Link Width Out */ |
#define PCI_HT_LCNF_DFOE 0x8000 /* Doubleword Flow Control Out Enable */ |
/* Revision ID Register */ |
#define PCI_HT_RID_MIN 0x1f /* Minor Revision */ |
#define PCI_HT_RID_MAJ 0xe0 /* Major Revision */ |
/* Link Frequency/Error Register */ |
#define PCI_HT_LFRER_FREQ 0x0f /* Transmitter Clock Frequency */ |
#define PCI_HT_LFRER_200 0x00 /* 200MHz */ |
#define PCI_HT_LFRER_300 0x01 /* 300MHz */ |
#define PCI_HT_LFRER_400 0x02 /* 400MHz */ |
#define PCI_HT_LFRER_500 0x03 /* 500MHz */ |
#define PCI_HT_LFRER_600 0x04 /* 600MHz */ |
#define PCI_HT_LFRER_800 0x05 /* 800MHz */ |
#define PCI_HT_LFRER_1000 0x06 /* 1.0GHz */ |
#define PCI_HT_LFRER_1200 0x07 /* 1.2GHz */ |
#define PCI_HT_LFRER_1400 0x08 /* 1.4GHz */ |
#define PCI_HT_LFRER_1600 0x09 /* 1.6GHz */ |
#define PCI_HT_LFRER_VEND 0x0f /* Vendor-Specific */ |
#define PCI_HT_LFRER_ERR 0xf0 /* Link Error */ |
#define PCI_HT_LFRER_PROT 0x10 /* Protocol Error */ |
#define PCI_HT_LFRER_OV 0x20 /* Overflow Error */ |
#define PCI_HT_LFRER_EOC 0x40 /* End of Chain Error */ |
#define PCI_HT_LFRER_CTLT 0x80 /* CTL Timeout */ |
/* Link Frequency Capability Register */ |
#define PCI_HT_LFCAP_200 0x0001 /* 200MHz */ |
#define PCI_HT_LFCAP_300 0x0002 /* 300MHz */ |
#define PCI_HT_LFCAP_400 0x0004 /* 400MHz */ |
#define PCI_HT_LFCAP_500 0x0008 /* 500MHz */ |
#define PCI_HT_LFCAP_600 0x0010 /* 600MHz */ |
#define PCI_HT_LFCAP_800 0x0020 /* 800MHz */ |
#define PCI_HT_LFCAP_1000 0x0040 /* 1.0GHz */ |
#define PCI_HT_LFCAP_1200 0x0080 /* 1.2GHz */ |
#define PCI_HT_LFCAP_1400 0x0100 /* 1.4GHz */ |
#define PCI_HT_LFCAP_1600 0x0200 /* 1.6GHz */ |
#define PCI_HT_LFCAP_VEND 0x8000 /* Vendor-Specific */ |
/* Feature Register */ |
#define PCI_HT_FTR_ISOCFC 0x0001 /* Isochronous Flow Control Mode */ |
#define PCI_HT_FTR_LDTSTOP 0x0002 /* LDTSTOP# Supported */ |
#define PCI_HT_FTR_CRCTM 0x0004 /* CRC Test Mode */ |
#define PCI_HT_FTR_ECTLT 0x0008 /* Extended CTL Time Required */ |
#define PCI_HT_FTR_64BA 0x0010 /* 64-bit Addressing */ |
#define PCI_HT_FTR_UIDRD 0x0020 /* UnitID Reorder Disable */ |
/* Error Handling Register */ |
#define PCI_HT_EH_PFLE 0x0001 /* Protocol Error Flood Enable */ |
#define PCI_HT_EH_OFLE 0x0002 /* Overflow Error Flood Enable */ |
#define PCI_HT_EH_PFE 0x0004 /* Protocol Error Fatal Enable */ |
#define PCI_HT_EH_OFE 0x0008 /* Overflow Error Fatal Enable */ |
#define PCI_HT_EH_EOCFE 0x0010 /* End of Chain Error Fatal Enable */ |
#define PCI_HT_EH_RFE 0x0020 /* Response Error Fatal Enable */ |
#define PCI_HT_EH_CRCFE 0x0040 /* CRC Error Fatal Enable */ |
#define PCI_HT_EH_SERRFE 0x0080 /* System Error Fatal Enable (B */ |
#define PCI_HT_EH_CF 0x0100 /* Chain Fail */ |
#define PCI_HT_EH_RE 0x0200 /* Response Error */ |
#define PCI_HT_EH_PNFE 0x0400 /* Protocol Error Nonfatal Enable */ |
#define PCI_HT_EH_ONFE 0x0800 /* Overflow Error Nonfatal Enable */ |
#define PCI_HT_EH_EOCNFE 0x1000 /* End of Chain Error Nonfatal Enable */ |
#define PCI_HT_EH_RNFE 0x2000 /* Response Error Nonfatal Enable */ |
#define PCI_HT_EH_CRCNFE 0x4000 /* CRC Error Nonfatal Enable */ |
#define PCI_HT_EH_SERRNFE 0x8000 /* System Error Nonfatal Enable */ |
/* HyperTransport: Slave or Primary Interface */ |
#define PCI_HT_PRI_CMD 2 /* Command Register */ |
#define PCI_HT_PRI_CMD_BUID 0x001f /* Base UnitID */ |
#define PCI_HT_PRI_CMD_UC 0x03e0 /* Unit Count */ |
#define PCI_HT_PRI_CMD_MH 0x0400 /* Master Host */ |
#define PCI_HT_PRI_CMD_DD 0x0800 /* Default Direction */ |
#define PCI_HT_PRI_CMD_DUL 0x1000 /* Drop on Uninitialized Link */ |
#define PCI_HT_PRI_LCTR0 4 /* Link Control 0 Register */ |
#define PCI_HT_PRI_LCNF0 6 /* Link Config 0 Register */ |
#define PCI_HT_PRI_LCTR1 8 /* Link Control 1 Register */ |
#define PCI_HT_PRI_LCNF1 10 /* Link Config 1 Register */ |
#define PCI_HT_PRI_RID 12 /* Revision ID Register */ |
#define PCI_HT_PRI_LFRER0 13 /* Link Frequency/Error 0 Register */ |
#define PCI_HT_PRI_LFCAP0 14 /* Link Frequency Capability 0 Register */ |
#define PCI_HT_PRI_FTR 16 /* Feature Register */ |
#define PCI_HT_PRI_LFRER1 17 /* Link Frequency/Error 1 Register */ |
#define PCI_HT_PRI_LFCAP1 18 /* Link Frequency Capability 1 Register */ |
#define PCI_HT_PRI_ES 20 /* Enumeration Scratchpad Register */ |
#define PCI_HT_PRI_EH 22 /* Error Handling Register */ |
#define PCI_HT_PRI_MBU 24 /* Memory Base Upper Register */ |
#define PCI_HT_PRI_MLU 25 /* Memory Limit Upper Register */ |
#define PCI_HT_PRI_BN 26 /* Bus Number Register */ |
#define PCI_HT_PRI_SIZEOF 28 |
/* HyperTransport: Host or Secondary Interface */ |
#define PCI_HT_SEC_CMD 2 /* Command Register */ |
#define PCI_HT_SEC_CMD_WR 0x0001 /* Warm Reset */ |
#define PCI_HT_SEC_CMD_DE 0x0002 /* Double-Ended */ |
#define PCI_HT_SEC_CMD_DN 0x0076 /* Device Number */ |
#define PCI_HT_SEC_CMD_CS 0x0080 /* Chain Side */ |
#define PCI_HT_SEC_CMD_HH 0x0100 /* Host Hide */ |
#define PCI_HT_SEC_CMD_AS 0x0400 /* Act as Slave */ |
#define PCI_HT_SEC_CMD_HIECE 0x0800 /* Host Inbound End of Chain Error */ |
#define PCI_HT_SEC_CMD_DUL 0x1000 /* Drop on Uninitialized Link */ |
#define PCI_HT_SEC_LCTR 4 /* Link Control Register */ |
#define PCI_HT_SEC_LCNF 6 /* Link Config Register */ |
#define PCI_HT_SEC_RID 8 /* Revision ID Register */ |
#define PCI_HT_SEC_LFRER 9 /* Link Frequency/Error Register */ |
#define PCI_HT_SEC_LFCAP 10 /* Link Frequency Capability Register */ |
#define PCI_HT_SEC_FTR 12 /* Feature Register */ |
#define PCI_HT_SEC_FTR_EXTRS 0x0100 /* Extended Register Set */ |
#define PCI_HT_SEC_FTR_UCNFE 0x0200 /* Upstream Configuration Enable */ |
#define PCI_HT_SEC_ES 16 /* Enumeration Scratchpad Register */ |
#define PCI_HT_SEC_EH 18 /* Error Handling Register */ |
#define PCI_HT_SEC_MBU 20 /* Memory Base Upper Register */ |
#define PCI_HT_SEC_MLU 21 /* Memory Limit Upper Register */ |
#define PCI_HT_SEC_SIZEOF 24 |
/* HyperTransport: Switch */ |
#define PCI_HT_SW_CMD 2 /* Switch Command Register */ |
#define PCI_HT_SW_CMD_VIBERR 0x0080 /* VIB Error */ |
#define PCI_HT_SW_CMD_VIBFL 0x0100 /* VIB Flood */ |
#define PCI_HT_SW_CMD_VIBFT 0x0200 /* VIB Fatal */ |
#define PCI_HT_SW_CMD_VIBNFT 0x0400 /* VIB Nonfatal */ |
#define PCI_HT_SW_PMASK 4 /* Partition Mask Register */ |
#define PCI_HT_SW_SWINF 8 /* Switch Info Register */ |
#define PCI_HT_SW_SWINF_DP 0x0000001f /* Default Port */ |
#define PCI_HT_SW_SWINF_EN 0x00000020 /* Enable Decode */ |
#define PCI_HT_SW_SWINF_CR 0x00000040 /* Cold Reset */ |
#define PCI_HT_SW_SWINF_PCIDX 0x00000f00 /* Performance Counter Index */ |
#define PCI_HT_SW_SWINF_BLRIDX 0x0003f000 /* Base/Limit Range Index */ |
#define PCI_HT_SW_SWINF_SBIDX 0x00002000 /* Secondary Base Range Index */ |
#define PCI_HT_SW_SWINF_HP 0x00040000 /* Hot Plug */ |
#define PCI_HT_SW_SWINF_HIDE 0x00080000 /* Hide Port */ |
#define PCI_HT_SW_PCD 12 /* Performance Counter Data Register */ |
#define PCI_HT_SW_BLRD 16 /* Base/Limit Range Data Register */ |
#define PCI_HT_SW_SBD 20 /* Secondary Base Data Register */ |
#define PCI_HT_SW_SIZEOF 24 |
/* Counter indices */ |
#define PCI_HT_SW_PC_PCR 0x0 /* Posted Command Receive */ |
#define PCI_HT_SW_PC_NPCR 0x1 /* Nonposted Command Receive */ |
#define PCI_HT_SW_PC_RCR 0x2 /* Response Command Receive */ |
#define PCI_HT_SW_PC_PDWR 0x3 /* Posted DW Receive */ |
#define PCI_HT_SW_PC_NPDWR 0x4 /* Nonposted DW Receive */ |
#define PCI_HT_SW_PC_RDWR 0x5 /* Response DW Receive */ |
#define PCI_HT_SW_PC_PCT 0x6 /* Posted Command Transmit */ |
#define PCI_HT_SW_PC_NPCT 0x7 /* Nonposted Command Transmit */ |
#define PCI_HT_SW_PC_RCT 0x8 /* Response Command Transmit */ |
#define PCI_HT_SW_PC_PDWT 0x9 /* Posted DW Transmit */ |
#define PCI_HT_SW_PC_NPDWT 0xa /* Nonposted DW Transmit */ |
#define PCI_HT_SW_PC_RDWT 0xb /* Response DW Transmit */ |
/* Base/Limit Range indices */ |
#define PCI_HT_SW_BLR_BASE0_LO 0x0 /* Base 0[31:1], Enable */ |
#define PCI_HT_SW_BLR_BASE0_HI 0x1 /* Base 0 Upper */ |
#define PCI_HT_SW_BLR_LIM0_LO 0x2 /* Limit 0 Lower */ |
#define PCI_HT_SW_BLR_LIM0_HI 0x3 /* Limit 0 Upper */ |
/* Secondary Base indices */ |
#define PCI_HT_SW_SB_LO 0x0 /* Secondary Base[31:1], Enable */ |
#define PCI_HT_SW_S0_HI 0x1 /* Secondary Base Upper */ |
/* HyperTransport: Interrupt Discovery and Configuration */ |
#define PCI_HT_IDC_IDX 2 /* Index Register */ |
#define PCI_HT_IDC_DATA 4 /* Data Register */ |
#define PCI_HT_IDC_SIZEOF 8 |
/* Register indices */ |
#define PCI_HT_IDC_IDX_LINT 0x01 /* Last Interrupt Register */ |
#define PCI_HT_IDC_LINT 0x00ff0000 /* Last interrupt definition */ |
#define PCI_HT_IDC_IDX_IDR 0x10 /* Interrupt Definition Registers */ |
/* Low part (at index) */ |
#define PCI_HT_IDC_IDR_MASK 0x10000001 /* Mask */ |
#define PCI_HT_IDC_IDR_POL 0x10000002 /* Polarity */ |
#define PCI_HT_IDC_IDR_II_2 0x1000001c /* IntrInfo[4:2]: Message Type */ |
#define PCI_HT_IDC_IDR_II_5 0x10000020 /* IntrInfo[5]: Request EOI */ |
#define PCI_HT_IDC_IDR_II_6 0x00ffffc0 /* IntrInfo[23:6] */ |
#define PCI_HT_IDC_IDR_II_24 0xff000000 /* IntrInfo[31:24] */ |
/* High part (at index + 1) */ |
#define PCI_HT_IDC_IDR_II_32 0x00ffffff /* IntrInfo[55:32] */ |
#define PCI_HT_IDC_IDR_PASSPW 0x40000000 /* PassPW setting for messages */ |
#define PCI_HT_IDC_IDR_WEOI 0x80000000 /* Waiting for EOI */ |
/* HyperTransport: Revision ID */ |
#define PCI_HT_RID_RID 2 /* Revision Register */ |
#define PCI_HT_RID_SIZEOF 4 |
/* HyperTransport: UnitID Clumping */ |
#define PCI_HT_UIDC_CS 4 /* Clumping Support Register */ |
#define PCI_HT_UIDC_CE 8 /* Clumping Enable Register */ |
#define PCI_HT_UIDC_SIZEOF 12 |
/* HyperTransport: Extended Configuration Space Access */ |
#define PCI_HT_ECSA_ADDR 4 /* Configuration Address Register */ |
#define PCI_HT_ECSA_ADDR_REG 0x00000ffc /* Register */ |
#define PCI_HT_ECSA_ADDR_FUN 0x00007000 /* Function */ |
#define PCI_HT_ECSA_ADDR_DEV 0x000f1000 /* Device */ |
#define PCI_HT_ECSA_ADDR_BUS 0x0ff00000 /* Bus Number */ |
#define PCI_HT_ECSA_ADDR_TYPE 0x10000000 /* Access Type */ |
#define PCI_HT_ECSA_DATA 8 /* Configuration Data Register */ |
#define PCI_HT_ECSA_SIZEOF 12 |
/* HyperTransport: Address Mapping */ |
#define PCI_HT_AM_CMD 2 /* Command Register */ |
#define PCI_HT_AM_CMD_NDMA 0x000f /* Number of DMA Mappings */ |
#define PCI_HT_AM_CMD_IOSIZ 0x01f0 /* I/O Size */ |
#define PCI_HT_AM_CMD_MT 0x0600 /* Map Type */ |
#define PCI_HT_AM_CMD_MT_40B 0x0000 /* 40-bit */ |
#define PCI_HT_AM_CMD_MT_64B 0x0200 /* 64-bit */ |
/* Window Control Register bits */ |
#define PCI_HT_AM_SBW_CTR_COMP 0x1 /* Compat */ |
#define PCI_HT_AM_SBW_CTR_NCOH 0x2 /* NonCoherent */ |
#define PCI_HT_AM_SBW_CTR_ISOC 0x4 /* Isochronous */ |
#define PCI_HT_AM_SBW_CTR_EN 0x8 /* Enable */ |
/* HyperTransport: 40-bit Address Mapping */ |
#define PCI_HT_AM40_SBNPW 4 /* Secondary Bus Non-Prefetchable Window Register */ |
#define PCI_HT_AM40_SBW_BASE 0x000fffff /* Window Base */ |
#define PCI_HT_AM40_SBW_CTR 0xf0000000 /* Window Control */ |
#define PCI_HT_AM40_SBPW 8 /* Secondary Bus Prefetchable Window Register */ |
#define PCI_HT_AM40_DMA_PBASE0 12 /* DMA Window Primary Base 0 Register */ |
#define PCI_HT_AM40_DMA_CTR0 15 /* DMA Window Control 0 Register */ |
#define PCI_HT_AM40_DMA_CTR_CTR 0xf0 /* Window Control */ |
#define PCI_HT_AM40_DMA_SLIM0 16 /* DMA Window Secondary Limit 0 Register */ |
#define PCI_HT_AM40_DMA_SBASE0 18 /* DMA Window Secondary Base 0 Register */ |
#define PCI_HT_AM40_SIZEOF 12 /* size is variable: 12 + 8 * NDMA */ |
/* HyperTransport: 64-bit Address Mapping */ |
#define PCI_HT_AM64_IDX 4 /* Index Register */ |
#define PCI_HT_AM64_DATA_LO 8 /* Data Lower Register */ |
#define PCI_HT_AM64_DATA_HI 12 /* Data Upper Register */ |
#define PCI_HT_AM64_SIZEOF 16 |
/* Register indices */ |
#define PCI_HT_AM64_IDX_SBNPW 0x00 /* Secondary Bus Non-Prefetchable Window Register */ |
#define PCI_HT_AM64_W_BASE_LO 0xfff00000 /* Window Base Lower */ |
#define PCI_HT_AM64_W_CTR 0x0000000f /* Window Control */ |
#define PCI_HT_AM64_IDX_SBPW 0x01 /* Secondary Bus Prefetchable Window Register */ |
#define PCI_HT_AM64_IDX_PBNPW 0x02 /* Primary Bus Non-Prefetchable Window Register */ |
#define PCI_HT_AM64_IDX_DMAPB0 0x04 /* DMA Window Primary Base 0 Register */ |
#define PCI_HT_AM64_IDX_DMASB0 0x05 /* DMA Window Secondary Base 0 Register */ |
#define PCI_HT_AM64_IDX_DMASL0 0x06 /* DMA Window Secondary Limit 0 Register */ |
/* HyperTransport: MSI Mapping */ |
#define PCI_HT_MSIM_CMD 2 /* Command Register */ |
#define PCI_HT_MSIM_CMD_EN 0x0001 /* Mapping Active */ |
#define PCI_HT_MSIM_CMD_FIXD 0x0002 /* MSI Mapping Address Fixed */ |
#define PCI_HT_MSIM_ADDR_LO 4 /* MSI Mapping Address Lower Register */ |
#define PCI_HT_MSIM_ADDR_HI 8 /* MSI Mapping Address Upper Register */ |
#define PCI_HT_MSIM_SIZEOF 12 |
/* HyperTransport: DirectRoute */ |
#define PCI_HT_DR_CMD 2 /* Command Register */ |
#define PCI_HT_DR_CMD_NDRS 0x000f /* Number of DirectRoute Spaces */ |
#define PCI_HT_DR_CMD_IDX 0x01f0 /* Index */ |
#define PCI_HT_DR_EN 4 /* Enable Vector Register */ |
#define PCI_HT_DR_DATA 8 /* Data Register */ |
#define PCI_HT_DR_SIZEOF 12 |
/* Register indices */ |
#define PCI_HT_DR_IDX_BASE_LO 0x00 /* DirectRoute Base Lower Register */ |
#define PCI_HT_DR_OTNRD 0x00000001 /* Opposite to Normal Request Direction */ |
#define PCI_HT_DR_BL_LO 0xffffff00 /* Base/Limit Lower */ |
#define PCI_HT_DR_IDX_BASE_HI 0x01 /* DirectRoute Base Upper Register */ |
#define PCI_HT_DR_IDX_LIMIT_LO 0x02 /* DirectRoute Limit Lower Register */ |
#define PCI_HT_DR_IDX_LIMIT_HI 0x03 /* DirectRoute Limit Upper Register */ |
/* HyperTransport: VCSet */ |
#define PCI_HT_VCS_SUP 4 /* VCSets Supported Register */ |
#define PCI_HT_VCS_L1EN 5 /* Link 1 VCSets Enabled Register */ |
#define PCI_HT_VCS_L0EN 6 /* Link 0 VCSets Enabled Register */ |
#define PCI_HT_VCS_SBD 8 /* Stream Bucket Depth Register */ |
#define PCI_HT_VCS_SINT 9 /* Stream Interval Register */ |
#define PCI_HT_VCS_SSUP 10 /* Number of Streaming VCs Supported Register */ |
#define PCI_HT_VCS_SSUP_0 0x00 /* Streaming VC 0 */ |
#define PCI_HT_VCS_SSUP_3 0x01 /* Streaming VCs 0-3 */ |
#define PCI_HT_VCS_SSUP_15 0x02 /* Streaming VCs 0-15 */ |
#define PCI_HT_VCS_NFCBD 12 /* Non-FC Bucket Depth Register */ |
#define PCI_HT_VCS_NFCINT 13 /* Non-FC Bucket Interval Register */ |
#define PCI_HT_VCS_SIZEOF 16 |
/* HyperTransport: Retry Mode */ |
#define PCI_HT_RM_CTR0 4 /* Control 0 Register */ |
#define PCI_HT_RM_CTR_LRETEN 0x01 /* Link Retry Enable */ |
#define PCI_HT_RM_CTR_FSER 0x02 /* Force Single Error */ |
#define PCI_HT_RM_CTR_ROLNEN 0x04 /* Rollover Nonfatal Enable */ |
#define PCI_HT_RM_CTR_FSS 0x08 /* Force Single Stomp */ |
#define PCI_HT_RM_CTR_RETNEN 0x10 /* Retry Nonfatal Enable */ |
#define PCI_HT_RM_CTR_RETFEN 0x20 /* Retry Fatal Enable */ |
#define PCI_HT_RM_CTR_AA 0xc0 /* Allowed Attempts */ |
#define PCI_HT_RM_STS0 5 /* Status 0 Register */ |
#define PCI_HT_RM_STS_RETSNT 0x01 /* Retry Sent */ |
#define PCI_HT_RM_STS_CNTROL 0x02 /* Count Rollover */ |
#define PCI_HT_RM_STS_SRCV 0x04 /* Stomp Received */ |
#define PCI_HT_RM_CTR1 6 /* Control 1 Register */ |
#define PCI_HT_RM_STS1 7 /* Status 1 Register */ |
#define PCI_HT_RM_CNT0 8 /* Retry Count 0 Register */ |
#define PCI_HT_RM_CNT1 10 /* Retry Count 1 Register */ |
#define PCI_HT_RM_SIZEOF 12 |
/* PCI Express */ |
#define PCI_EXP_FLAGS 0x2 /* Capabilities register */ |
#define PCI_EXP_FLAGS_VERS 0x000f /* Capability version */ |
#define PCI_EXP_FLAGS_TYPE 0x00f0 /* Device/Port type */ |
#define PCI_EXP_TYPE_ENDPOINT 0x0 /* Express Endpoint */ |
#define PCI_EXP_TYPE_LEG_END 0x1 /* Legacy Endpoint */ |
#define PCI_EXP_TYPE_ROOT_PORT 0x4 /* Root Port */ |
#define PCI_EXP_TYPE_UPSTREAM 0x5 /* Upstream Port */ |
#define PCI_EXP_TYPE_DOWNSTREAM 0x6 /* Downstream Port */ |
#define PCI_EXP_TYPE_PCI_BRIDGE 0x7 /* PCI/PCI-X Bridge */ |
#define PCI_EXP_FLAGS_SLOT 0x0100 /* Slot implemented */ |
#define PCI_EXP_FLAGS_IRQ 0x3e00 /* Interrupt message number */ |
#define PCI_EXP_DEVCAP 0x4 /* Device capabilities */ |
#define PCI_EXP_DEVCAP_PAYLOAD 0x07 /* Max_Payload_Size */ |
#define PCI_EXP_DEVCAP_PHANTOM 0x18 /* Phantom functions */ |
#define PCI_EXP_DEVCAP_EXT_TAG 0x20 /* Extended tags */ |
#define PCI_EXP_DEVCAP_L0S 0x1c0 /* L0s Acceptable Latency */ |
#define PCI_EXP_DEVCAP_L1 0xe00 /* L1 Acceptable Latency */ |
#define PCI_EXP_DEVCAP_ATN_BUT 0x1000 /* Attention Button Present */ |
#define PCI_EXP_DEVCAP_ATN_IND 0x2000 /* Attention Indicator Present */ |
#define PCI_EXP_DEVCAP_PWR_IND 0x4000 /* Power Indicator Present */ |
#define PCI_EXP_DEVCAP_PWR_VAL 0x3fc0000 /* Slot Power Limit Value */ |
#define PCI_EXP_DEVCAP_PWR_SCL 0xc000000 /* Slot Power Limit Scale */ |
#define PCI_EXP_DEVCTL 0x8 /* Device Control */ |
#define PCI_EXP_DEVCTL_CERE 0x0001 /* Correctable Error Reporting En. */ |
#define PCI_EXP_DEVCTL_NFERE 0x0002 /* Non-Fatal Error Reporting Enable */ |
#define PCI_EXP_DEVCTL_FERE 0x0004 /* Fatal Error Reporting Enable */ |
#define PCI_EXP_DEVCTL_URRE 0x0008 /* Unsupported Request Reporting En. */ |
#define PCI_EXP_DEVCTL_RELAXED 0x0010 /* Enable Relaxed Ordering */ |
#define PCI_EXP_DEVCTL_PAYLOAD 0x00e0 /* Max_Payload_Size */ |
#define PCI_EXP_DEVCTL_EXT_TAG 0x0100 /* Extended Tag Field Enable */ |
#define PCI_EXP_DEVCTL_PHANTOM 0x0200 /* Phantom Functions Enable */ |
#define PCI_EXP_DEVCTL_AUX_PME 0x0400 /* Auxiliary Power PM Enable */ |
#define PCI_EXP_DEVCTL_NOSNOOP 0x0800 /* Enable No Snoop */ |
#define PCI_EXP_DEVCTL_READRQ 0x7000 /* Max_Read_Request_Size */ |
#define PCI_EXP_DEVSTA 0xa /* Device Status */ |
#define PCI_EXP_DEVSTA_CED 0x01 /* Correctable Error Detected */ |
#define PCI_EXP_DEVSTA_NFED 0x02 /* Non-Fatal Error Detected */ |
#define PCI_EXP_DEVSTA_FED 0x04 /* Fatal Error Detected */ |
#define PCI_EXP_DEVSTA_URD 0x08 /* Unsupported Request Detected */ |
#define PCI_EXP_DEVSTA_AUXPD 0x10 /* AUX Power Detected */ |
#define PCI_EXP_DEVSTA_TRPND 0x20 /* Transactions Pending */ |
#define PCI_EXP_LNKCAP 0xc /* Link Capabilities */ |
#define PCI_EXP_LNKCAP_SPEED 0x0000f /* Maximum Link Speed */ |
#define PCI_EXP_LNKCAP_WIDTH 0x003f0 /* Maximum Link Width */ |
#define PCI_EXP_LNKCAP_ASPM 0x00c00 /* Active State Power Management */ |
#define PCI_EXP_LNKCAP_L0S 0x07000 /* L0s Acceptable Latency */ |
#define PCI_EXP_LNKCAP_L1 0x38000 /* L1 Acceptable Latency */ |
#define PCI_EXP_LNKCAP_PORT 0xff000000 /* Port Number */ |
#define PCI_EXP_LNKCTL 0x10 /* Link Control */ |
#define PCI_EXP_LNKCTL_ASPM 0x0003 /* ASPM Control */ |
#define PCI_EXP_LNKCTL_RCB 0x0008 /* Read Completion Boundary */ |
#define PCI_EXP_LNKCTL_DISABLE 0x0010 /* Link Disable */ |
#define PCI_EXP_LNKCTL_RETRAIN 0x0020 /* Retrain Link */ |
#define PCI_EXP_LNKCTL_CLOCK 0x0040 /* Common Clock Configuration */ |
#define PCI_EXP_LNKCTL_XSYNCH 0x0080 /* Extended Synch */ |
#define PCI_EXP_LNKSTA 0x12 /* Link Status */ |
#define PCI_EXP_LNKSTA_SPEED 0x000f /* Negotiated Link Speed */ |
#define PCI_EXP_LNKSTA_WIDTH 0x03f0 /* Negotiated Link Width */ |
#define PCI_EXP_LNKSTA_TR_ERR 0x0400 /* Training Error */ |
#define PCI_EXP_LNKSTA_TRAIN 0x0800 /* Link Training */ |
#define PCI_EXP_LNKSTA_SL_CLK 0x1000 /* Slot Clock Configuration */ |
#define PCI_EXP_SLTCAP 0x14 /* Slot Capabilities */ |
#define PCI_EXP_SLTCAP_ATNB 0x0001 /* Attention Button Present */ |
#define PCI_EXP_SLTCAP_PWRC 0x0002 /* Power Controller Present */ |
#define PCI_EXP_SLTCAP_MRL 0x0004 /* MRL Sensor Present */ |
#define PCI_EXP_SLTCAP_ATNI 0x0008 /* Attention Indicator Present */ |
#define PCI_EXP_SLTCAP_PWRI 0x0010 /* Power Indicator Present */ |
#define PCI_EXP_SLTCAP_HPS 0x0020 /* Hot-Plug Surprise */ |
#define PCI_EXP_SLTCAP_HPC 0x0040 /* Hot-Plug Capable */ |
#define PCI_EXP_SLTCAP_PWR_VAL 0x00007f80 /* Slot Power Limit Value */ |
#define PCI_EXP_SLTCAP_PWR_SCL 0x00018000 /* Slot Power Limit Scale */ |
#define PCI_EXP_SLTCAP_PSN 0xfff80000 /* Physical Slot Number */ |
#define PCI_EXP_SLTCTL 0x18 /* Slot Control */ |
#define PCI_EXP_SLTCTL_ATNB 0x0001 /* Attention Button Pressed Enable */ |
#define PCI_EXP_SLTCTL_PWRF 0x0002 /* Power Fault Detected Enable */ |
#define PCI_EXP_SLTCTL_MRLS 0x0004 /* MRL Sensor Changed Enable */ |
#define PCI_EXP_SLTCTL_PRSD 0x0008 /* Presence Detect Changed Enable */ |
#define PCI_EXP_SLTCTL_CMDC 0x0010 /* Command Completed Interrupt Enable */ |
#define PCI_EXP_SLTCTL_HPIE 0x0020 /* Hot-Plug Interrupt Enable */ |
#define PCI_EXP_SLTCTL_ATNI 0x00C0 /* Attention Indicator Control */ |
#define PCI_EXP_SLTCTL_PWRI 0x0300 /* Power Indicator Control */ |
#define PCI_EXP_SLTCTL_PWRC 0x0400 /* Power Controller Control */ |
#define PCI_EXP_SLTSTA 0x1a /* Slot Status */ |
#define PCI_EXP_RTCTL 0x1c /* Root Control */ |
#define PCI_EXP_RTCTL_SECEE 0x1 /* System Error on Correctable Error */ |
#define PCI_EXP_RTCTL_SENFEE 0x1 /* System Error on Non-Fatal Error */ |
#define PCI_EXP_RTCTL_SEFEE 0x1 /* System Error on Fatal Error */ |
#define PCI_EXP_RTCTL_PMEIE 0x1 /* PME Interrupt Enable */ |
#define PCI_EXP_RTSTA 0x20 /* Root Status */ |
/* MSI-X */ |
#define PCI_MSIX_ENABLE 0x8000 |
#define PCI_MSIX_MASK 0x4000 |
#define PCI_MSIX_TABSIZE 0x03ff |
#define PCI_MSIX_TABLE 4 |
#define PCI_MSIX_PBA 8 |
#define PCI_MSIX_BIR 0x7 |
/* Advanced Error Reporting */ |
#define PCI_ERR_UNCOR_STATUS 4 /* Uncorrectable Error Status */ |
#define PCI_ERR_UNC_TRAIN 0x00000001 /* Training */ |
#define PCI_ERR_UNC_DLP 0x00000010 /* Data Link Protocol */ |
#define PCI_ERR_UNC_POISON_TLP 0x00001000 /* Poisoned TLP */ |
#define PCI_ERR_UNC_FCP 0x00002000 /* Flow Control Protocol */ |
#define PCI_ERR_UNC_COMP_TIME 0x00004000 /* Completion Timeout */ |
#define PCI_ERR_UNC_COMP_ABORT 0x00008000 /* Completer Abort */ |
#define PCI_ERR_UNC_UNX_COMP 0x00010000 /* Unexpected Completion */ |
#define PCI_ERR_UNC_RX_OVER 0x00020000 /* Receiver Overflow */ |
#define PCI_ERR_UNC_MALF_TLP 0x00040000 /* Malformed TLP */ |
#define PCI_ERR_UNC_ECRC 0x00080000 /* ECRC Error Status */ |
#define PCI_ERR_UNC_UNSUP 0x00100000 /* Unsupported Request */ |
#define PCI_ERR_UNCOR_MASK 8 /* Uncorrectable Error Mask */ |
/* Same bits as above */ |
#define PCI_ERR_UNCOR_SEVER 12 /* Uncorrectable Error Severity */ |
/* Same bits as above */ |
#define PCI_ERR_COR_STATUS 16 /* Correctable Error Status */ |
#define PCI_ERR_COR_RCVR 0x00000001 /* Receiver Error Status */ |
#define PCI_ERR_COR_BAD_TLP 0x00000040 /* Bad TLP Status */ |
#define PCI_ERR_COR_BAD_DLLP 0x00000080 /* Bad DLLP Status */ |
#define PCI_ERR_COR_REP_ROLL 0x00000100 /* REPLAY_NUM Rollover */ |
#define PCI_ERR_COR_REP_TIMER 0x00001000 /* Replay Timer Timeout */ |
#define PCI_ERR_COR_MASK 20 /* Correctable Error Mask */ |
/* Same bits as above */ |
#define PCI_ERR_CAP 24 /* Advanced Error Capabilities */ |
#define PCI_ERR_CAP_FEP(x) ((x) & 31) /* First Error Pointer */ |
#define PCI_ERR_CAP_ECRC_GENC 0x00000020 /* ECRC Generation Capable */ |
#define PCI_ERR_CAP_ECRC_GENE 0x00000040 /* ECRC Generation Enable */ |
#define PCI_ERR_CAP_ECRC_CHKC 0x00000080 /* ECRC Check Capable */ |
#define PCI_ERR_CAP_ECRC_CHKE 0x00000100 /* ECRC Check Enable */ |
#define PCI_ERR_HEADER_LOG 28 /* Header Log Register (16 bytes) */ |
#define PCI_ERR_ROOT_COMMAND 44 /* Root Error Command */ |
#define PCI_ERR_ROOT_STATUS 48 |
#define PCI_ERR_ROOT_COR_SRC 52 |
#define PCI_ERR_ROOT_SRC 54 |
/* Virtual Channel */ |
#define PCI_VC_PORT_REG1 4 |
#define PCI_VC_PORT_REG2 8 |
#define PCI_VC_PORT_CTRL 12 |
#define PCI_VC_PORT_STATUS 14 |
#define PCI_VC_RES_CAP 16 |
#define PCI_VC_RES_CTRL 20 |
#define PCI_VC_RES_STATUS 26 |
/* Power Budgeting */ |
#define PCI_PWR_DSR 4 /* Data Select Register */ |
#define PCI_PWR_DATA 8 /* Data Register */ |
#define PCI_PWR_DATA_BASE(x) ((x) & 0xff) /* Base Power */ |
#define PCI_PWR_DATA_SCALE(x) (((x) >> 8) & 3) /* Data Scale */ |
#define PCI_PWR_DATA_PM_SUB(x) (((x) >> 10) & 7) /* PM Sub State */ |
#define PCI_PWR_DATA_PM_STATE(x) (((x) >> 13) & 3) /* PM State */ |
#define PCI_PWR_DATA_TYPE(x) (((x) >> 15) & 7) /* Type */ |
#define PCI_PWR_DATA_RAIL(x) (((x) >> 18) & 7) /* Power Rail */ |
#define PCI_PWR_CAP 12 /* Capability */ |
#define PCI_PWR_CAP_BUDGET(x) ((x) & 1) /* Included in system budget */ |
/* |
* The PCI interface treats multi-function devices as independent |
* devices. The slot/function address of each device is encoded |
* in a single byte as follows: |
* |
* 7:3 = slot |
* 2:0 = function |
*/ |
#define PCI_DEVFN(slot,func) ((((slot) & 0x1f) << 3) | ((func) & 0x07)) |
#define PCI_SLOT(devfn) (((devfn) >> 3) & 0x1f) |
#define PCI_FUNC(devfn) ((devfn) & 0x07) |
/* Device classes and subclasses */ |
#define PCI_CLASS_NOT_DEFINED 0x0000 |
#define PCI_CLASS_NOT_DEFINED_VGA 0x0001 |
#define PCI_BASE_CLASS_STORAGE 0x01 |
#define PCI_CLASS_STORAGE_SCSI 0x0100 |
#define PCI_CLASS_STORAGE_IDE 0x0101 |
#define PCI_CLASS_STORAGE_FLOPPY 0x0102 |
#define PCI_CLASS_STORAGE_IPI 0x0103 |
#define PCI_CLASS_STORAGE_RAID 0x0104 |
#define PCI_CLASS_STORAGE_OTHER 0x0180 |
#define PCI_BASE_CLASS_NETWORK 0x02 |
#define PCI_CLASS_NETWORK_ETHERNET 0x0200 |
#define PCI_CLASS_NETWORK_TOKEN_RING 0x0201 |
#define PCI_CLASS_NETWORK_FDDI 0x0202 |
#define PCI_CLASS_NETWORK_ATM 0x0203 |
#define PCI_CLASS_NETWORK_OTHER 0x0280 |
#define PCI_BASE_CLASS_DISPLAY 0x03 |
#define PCI_CLASS_DISPLAY_VGA 0x0300 |
#define PCI_CLASS_DISPLAY_XGA 0x0301 |
#define PCI_CLASS_DISPLAY_OTHER 0x0380 |
#define PCI_BASE_CLASS_MULTIMEDIA 0x04 |
#define PCI_CLASS_MULTIMEDIA_VIDEO 0x0400 |
#define PCI_CLASS_MULTIMEDIA_AUDIO 0x0401 |
#define PCI_CLASS_MULTIMEDIA_OTHER 0x0480 |
#define PCI_BASE_CLASS_MEMORY 0x05 |
#define PCI_CLASS_MEMORY_RAM 0x0500 |
#define PCI_CLASS_MEMORY_FLASH 0x0501 |
#define PCI_CLASS_MEMORY_OTHER 0x0580 |
#define PCI_BASE_CLASS_BRIDGE 0x06 |
#define PCI_CLASS_BRIDGE_HOST 0x0600 |
#define PCI_CLASS_BRIDGE_ISA 0x0601 |
#define PCI_CLASS_BRIDGE_EISA 0x0602 |
#define PCI_CLASS_BRIDGE_MC 0x0603 |
#define PCI_CLASS_BRIDGE_PCI 0x0604 |
#define PCI_CLASS_BRIDGE_PCMCIA 0x0605 |
#define PCI_CLASS_BRIDGE_NUBUS 0x0606 |
#define PCI_CLASS_BRIDGE_CARDBUS 0x0607 |
#define PCI_CLASS_BRIDGE_OTHER 0x0680 |
#define PCI_BASE_CLASS_COMMUNICATION 0x07 |
#define PCI_CLASS_COMMUNICATION_SERIAL 0x0700 |
#define PCI_CLASS_COMMUNICATION_PARALLEL 0x0701 |
#define PCI_CLASS_COMMUNICATION_OTHER 0x0780 |
#define PCI_BASE_CLASS_SYSTEM 0x08 |
#define PCI_CLASS_SYSTEM_PIC 0x0800 |
#define PCI_CLASS_SYSTEM_DMA 0x0801 |
#define PCI_CLASS_SYSTEM_TIMER 0x0802 |
#define PCI_CLASS_SYSTEM_RTC 0x0803 |
#define PCI_CLASS_SYSTEM_OTHER 0x0880 |
#define PCI_BASE_CLASS_INPUT 0x09 |
#define PCI_CLASS_INPUT_KEYBOARD 0x0900 |
#define PCI_CLASS_INPUT_PEN 0x0901 |
#define PCI_CLASS_INPUT_MOUSE 0x0902 |
#define PCI_CLASS_INPUT_OTHER 0x0980 |
#define PCI_BASE_CLASS_DOCKING 0x0a |
#define PCI_CLASS_DOCKING_GENERIC 0x0a00 |
#define PCI_CLASS_DOCKING_OTHER 0x0a01 |
#define PCI_BASE_CLASS_PROCESSOR 0x0b |
#define PCI_CLASS_PROCESSOR_386 0x0b00 |
#define PCI_CLASS_PROCESSOR_486 0x0b01 |
#define PCI_CLASS_PROCESSOR_PENTIUM 0x0b02 |
#define PCI_CLASS_PROCESSOR_ALPHA 0x0b10 |
#define PCI_CLASS_PROCESSOR_POWERPC 0x0b20 |
#define PCI_CLASS_PROCESSOR_CO 0x0b40 |
#define PCI_BASE_CLASS_SERIAL 0x0c |
#define PCI_CLASS_SERIAL_FIREWIRE 0x0c00 |
#define PCI_CLASS_SERIAL_ACCESS 0x0c01 |
#define PCI_CLASS_SERIAL_SSA 0x0c02 |
#define PCI_CLASS_SERIAL_USB 0x0c03 |
#define PCI_CLASS_SERIAL_FIBER 0x0c04 |
#define PCI_CLASS_OTHERS 0xff |
/* Several ID's we need in the library */ |
#define PCI_VENDOR_ID_INTEL 0x8086 |
#define PCI_VENDOR_ID_COMPAQ 0x0e11 |
/tags/0.3.0/uspace/srv/pci/libpci/pci_ids.h |
---|
0,0 → 1,11934 |
/* DO NOT EDIT, THIS FILE IS AUTOMATICALLY GENERATED */ |
char *pci_ids[] = { |
"0000 Gammagraphx, Inc.", |
"001a Ascend Communications, Inc.", |
"0033 Paradyne corp.", |
"003d Lockheed Martin-Marietta Corp", |
"0059 Tiger Jet Network Inc. (Wrong ID)", |
"0070 Hauppauge computer works Inc.", |
"0071 Nebula Electronics Ltd.", |
"0095 Silicon Image, Inc. (Wrong ID)", |
" 0680 Ultra ATA/133 IDE RAID CONTROLLER CARD", |
"00a7 Teles AG (Wrong ID)", |
"00f5 BFG Technologies, Inc.", |
"0100 Ncipher Corp Ltd", |
"0123 General Dynamics", |
"018a LevelOne", |
" 0106 FPC-0106TX misprogrammed [RTL81xx]", |
"021b Compaq Computer Corporation", |
" 8139 HNE-300 (RealTek RTL8139c) [iPaq Networking]", |
"0270 Hauppauge computer works Inc. (Wrong ID)", |
"0291 Davicom Semiconductor, Inc.", |
" 8212 DM9102A(DM9102AE, SM9102AF) Ethernet 100/10 MBit(Rev 40)", |
"02ac SpeedStream", |
" 1012 1012 PCMCIA 10/100 Ethernet Card [RTL81xx]", |
"0315 SK-Electronics Co., Ltd.", |
"0357 TTTech AG", |
" 000a TTP-Monitoring Card V2.0", |
"0432 SCM Microsystems, Inc.", |
" 0001 Pluto2 DVB-T Receiver for PCMCIA [EasyWatch MobilSet]", |
"045e Microsoft", |
" 006e MN-510 802.11b wireless USB paddle", |
" 00c2 MN-710 wireless USB paddle", |
"04cf Myson Century, Inc", |
" 8818 CS8818 USB2.0-to-ATAPI Bridge Controller with Embedded PHY", |
"050d Belkin", |
" 0109 F5U409-CU USB/Serial Portable Adapter", |
" 7050 F5D7050 802.11g Wireless USB Adapter", |
"05e3 CyberDoor", |
" 0701 CBD516", |
"066f Sigmatel Inc.", |
" 3410 SMTP3410", |
" 3500 SMTP3500", |
"0675 Dynalink", |
" 1700 IS64PH ISDN Adapter", |
" 1702 IS64PH ISDN Adapter", |
" 1703 ISDN Adapter (PCI Bus, DV, W)", |
" 1704 ISDN Adapter (PCI Bus, D, C)", |
"067b Prolific Technology, Inc.", |
" 3507 PL-3507 Hi-Speed USB & IEEE 1394 Combo to IDE Bridge Controller", |
"0721 Sapphire, Inc.", |
"07e2 ELMEG Communication Systems GmbH", |
"0925 VIA Technologies, Inc. (Wrong ID)", |
"09c1 Arris", |
" 0704 CM 200E Cable Modem", |
"0a89 BREA Technologies Inc", |
"0b0b Rhino Equiment Corp.", |
" 0105 Rhino R1T1", |
" 0205 Rhino R4FXO", |
" 0305 Rhino R4T1", |
" 0405 Rhino R8FXX", |
" 0505 Rhino R24FXX", |
" 0506 Rhino R2T1", |
"0b49 ASCII Corporation", |
" 064f Trance Vibrator", |
"0e11 Compaq Computer Corporation", |
" 0001 PCI to EISA Bridge", |
" 0002 PCI to ISA Bridge", |
" 0046 Smart Array 64xx", |
" 0e11 409a Smart Array 641", |
" 0e11 409b Smart Array 642", |
" 0e11 409c Smart Array 6400", |
" 0e11 409d Smart Array 6400 EM", |
" 0049 NC7132 Gigabit Upgrade Module", |
" 004a NC6136 Gigabit Server Adapter", |
" 005a Remote Insight II board - Lights-Out", |
" 007c NC7770 1000BaseTX", |
" 007d NC6770 1000BaseTX", |
" 0085 NC7780 1000BaseTX", |
" 00b1 Remote Insight II board - PCI device", |
" 00bb NC7760", |
" 00ca NC7771", |
" 00cb NC7781", |
" 00cf NC7772", |
" 00d0 NC7782", |
" 00d1 NC7783", |
" 00e3 NC7761", |
" 0508 Netelligent 4/16 Token Ring", |
" 1000 Triflex/Pentium Bridge, Model 1000", |
" 2000 Triflex/Pentium Bridge, Model 2000", |
" 3032 QVision 1280/p", |
" 3033 QVision 1280/p", |
" 3034 QVision 1280/p", |
" 4000 4000 [Triflex]", |
" 4030 SMART-2/P", |
" 4031 SMART-2SL", |
" 4032 Smart Array 3200", |
" 4033 Smart Array 3100ES", |
" 4034 Smart Array 221", |
" 4040 Integrated Array", |
" 4048 Compaq Raid LC2", |
" 4050 Smart Array 4200", |
" 4051 Smart Array 4250ES", |
" 4058 Smart Array 431", |
" 4070 Smart Array 5300", |
" 4080 Smart Array 5i", |
" 4082 Smart Array 532", |
" 4083 Smart Array 5312", |
" 4091 Smart Array 6i", |
" 409a Smart Array 641", |
" 409b Smart Array 642", |
" 409c Smart Array 6400", |
" 409d Smart Array 6400 EM", |
" 6010 HotPlug PCI Bridge 6010", |
" 7020 USB Controller", |
" a0ec Fibre Channel Host Controller", |
" a0f0 Advanced System Management Controller", |
" a0f3 Triflex PCI to ISA Bridge", |
" a0f7 PCI Hotplug Controller", |
" 8086 002a PCI Hotplug Controller A", |
" 8086 002b PCI Hotplug Controller B", |
" a0f8 ZFMicro Chipset USB", |
" a0fc FibreChannel HBA Tachyon", |
" ae10 Smart-2/P RAID Controller", |
" 0e11 4030 Smart-2/P Array Controller", |
" 0e11 4031 Smart-2SL Array Controller", |
" 0e11 4032 Smart Array Controller", |
" 0e11 4033 Smart 3100ES Array Controller", |
" ae29 MIS-L", |
" ae2a MPC", |
" ae2b MIS-E", |
" ae31 System Management Controller", |
" ae32 Netelligent 10/100 TX PCI UTP", |
" ae33 Triflex Dual EIDE Controller", |
" ae34 Netelligent 10 T PCI UTP", |
" ae35 Integrated NetFlex-3/P", |
" ae40 Netelligent Dual 10/100 TX PCI UTP", |
" ae43 Netelligent Integrated 10/100 TX UTP", |
" ae69 CETUS-L", |
" ae6c Northstar", |
" ae6d NorthStar CPU to PCI Bridge", |
" b011 Netelligent 10/100 TX Embedded UTP", |
" b012 Netelligent 10 T/2 PCI UTP/Coax", |
" b01e NC3120 Fast Ethernet NIC", |
" b01f NC3122 Fast Ethernet NIC", |
" b02f NC1120 Ethernet NIC", |
" b030 Netelligent 10/100 TX UTP", |
" b04a 10/100 TX PCI Intel WOL UTP Controller", |
" b060 Smart Array 5300 Controller", |
" b0c6 NC3161 Fast Ethernet NIC", |
" b0c7 NC3160 Fast Ethernet NIC", |
" b0d7 NC3121 Fast Ethernet NIC", |
" b0dd NC3131 Fast Ethernet NIC", |
" b0de NC3132 Fast Ethernet Module", |
" b0df NC6132 Gigabit Module", |
" b0e0 NC6133 Gigabit Module", |
" b0e1 NC3133 Fast Ethernet Module", |
" b123 NC6134 Gigabit NIC", |
" b134 NC3163 Fast Ethernet NIC", |
" b13c NC3162 Fast Ethernet NIC", |
" b144 NC3123 Fast Ethernet NIC", |
" b163 NC3134 Fast Ethernet NIC", |
" b164 NC3165 Fast Ethernet Upgrade Module", |
" b178 Smart Array 5i/532", |
" 0e11 4080 Smart Array 5i", |
" 0e11 4082 Smart Array 532", |
" 0e11 4083 Smart Array 5312", |
" b1a4 NC7131 Gigabit Server Adapter", |
" b200 Memory Hot-Plug Controller", |
" b203 Integrated Lights Out Controller", |
" b204 Integrated Lights Out Processor", |
" f130 NetFlex-3/P ThunderLAN 1.0", |
" f150 NetFlex-3/P ThunderLAN 2.3", |
"0e21 Cowon Systems, Inc.", |
"0e55 HaSoTec GmbH", |
"1000 LSI Logic / Symbios Logic", |
" 0001 53c810", |
" 1000 1000 LSI53C810AE PCI to SCSI I/O Processor", |
" 0002 53c820", |
" 0003 53c825", |
" 1000 1000 LSI53C825AE PCI to SCSI I/O Processor (Ultra Wide)", |
" 0004 53c815", |
" 0005 53c810AP", |
" 0006 53c860", |
" 1000 1000 LSI53C860E PCI to Ultra SCSI I/O Processor", |
" 000a 53c1510", |
" 1000 1000 LSI53C1510 PCI to Dual Channel Wide Ultra2 SCSI Controller (Nonintelligent mode)", |
" 000b 53C896/897", |
" 0e11 6004 EOB003 Series SCSI host adapter", |
" 1000 1000 LSI53C896/7 PCI to Dual Channel Ultra2 SCSI Multifunction Controller", |
" 1000 1010 LSI22910 PCI to Dual Channel Ultra2 SCSI host adapter", |
" 1000 1020 LSI21002 PCI to Dual Channel Ultra2 SCSI host adapter", |
" 13e9 1000 6221L-4U", |
" 000c 53c895", |
" 1000 1010 LSI8951U PCI to Ultra2 SCSI host adapter", |
" 1000 1020 LSI8952U PCI to Ultra2 SCSI host adapter", |
" 1de1 3906 DC-390U2B SCSI adapter", |
" 1de1 3907 DC-390U2W", |
" 000d 53c885", |
" 000f 53c875", |
" 0e11 7004 Embedded Ultra Wide SCSI Controller", |
" 1000 1000 LSI53C876/E PCI to Dual Channel SCSI Controller", |
" 1000 1010 LSI22801 PCI to Dual Channel Ultra SCSI host adapter", |
" 1000 1020 LSI22802 PCI to Dual Channel Ultra SCSI host adapter", |
" 1092 8760 FirePort 40 Dual SCSI Controller", |
" 1de1 3904 DC390F/U Ultra Wide SCSI Adapter", |
" 4c53 1000 CC7/CR7/CP7/VC7/VP7/VR7 mainboard", |
" 4c53 1050 CT7 mainboard", |
" 0010 53C1510", |
" 0e11 4040 Integrated Array Controller", |
" 0e11 4048 RAID LC2 Controller", |
" 1000 1000 53C1510 PCI to Dual Channel Wide Ultra2 SCSI Controller (Intelligent mode)", |
" 0012 53c895a", |
" 1000 1000 LSI53C895A PCI to Ultra2 SCSI Controller", |
" 0013 53c875a", |
" 1000 1000 LSI53C875A PCI to Ultra SCSI Controller", |
" 0020 53c1010 Ultra3 SCSI Adapter", |
" 1000 1000 LSI53C1010-33 PCI to Dual Channel Ultra160 SCSI Controller", |
" 1de1 1020 DC-390U3W", |
" 0021 53c1010 66MHz Ultra3 SCSI Adapter", |
" 1000 1000 LSI53C1000/1000R/1010R/1010-66 PCI to Ultra160 SCSI Controller", |
" 1000 1010 Asus TR-DLS onboard 53C1010-66", |
" 124b 1070 PMC-USCSI3", |
" 4c53 1080 CT8 mainboard", |
" 4c53 1300 P017 mezzanine (32-bit PMC)", |
" 4c53 1310 P017 mezzanine (64-bit PMC)", |
" 0030 53c1030 PCI-X Fusion-MPT Dual Ultra320 SCSI", |
" 0e11 00da ProLiant ML 350", |
" 1028 0123 PowerEdge 2600", |
" 1028 014a PowerEdge 1750", |
" 1028 016c PowerEdge 1850 MPT Fusion SCSI/RAID (Perc 4)", |
" 1028 0183 PowerEdge 1800", |
" 1028 1010 LSI U320 SCSI Controller", |
" 124b 1170 PMC-USCSI320", |
" 1734 1052 Primergy RX300 S2", |
" 0031 53c1030ZC PCI-X Fusion-MPT Dual Ultra320 SCSI", |
" 0032 53c1035 PCI-X Fusion-MPT Dual Ultra320 SCSI", |
" 1000 1000 LSI53C1020/1030 PCI-X to Ultra320 SCSI Controller", |
" 0033 1030ZC_53c1035 PCI-X Fusion-MPT Dual Ultra320 SCSI", |
" 0040 53c1035 PCI-X Fusion-MPT Dual Ultra320 SCSI", |
" 1000 0033 MegaRAID SCSI 320-2XR", |
" 1000 0066 MegaRAID SCSI 320-2XRWS", |
" 0041 53C1035ZC PCI-X Fusion-MPT Dual Ultra320 SCSI", |
" 0050 SAS1064 PCI-X Fusion-MPT SAS", |
" 0054 SAS1068 PCI-X Fusion-MPT SAS", |
" 0056 SAS1064E PCI-Express Fusion-MPT SAS", |
" 0058 SAS1068E PCI-Express Fusion-MPT SAS", |
" 005a SAS1066E PCI-Express Fusion-MPT SAS", |
" 005c SAS1064A PCI-X Fusion-MPT SAS", |
" 005e SAS1066 PCI-X Fusion-MPT SAS", |
" 0060 SAS1078 PCI-X Fusion-MPT SAS", |
" 0062 SAS1078 PCI-Express Fusion-MPT SAS", |
" 1000 0062 SAS1078 PCI-Express Fusion-MPT SAS", |
" 008f 53c875J", |
" 1092 8000 FirePort 40 SCSI Controller", |
" 1092 8760 FirePort 40 Dual SCSI Host Adapter", |
" 0407 MegaRAID", |
" 1000 0530 MegaRAID 530 SCSI 320-0X RAID Controller", |
" 1000 0531 MegaRAID 531 SCSI 320-4X RAID Controller", |
" 1000 0532 MegaRAID 532 SCSI 320-2X RAID Controller", |
" 1028 0531 PowerEdge Expandable RAID Controller 4/QC", |
" 1028 0533 PowerEdge Expandable RAID Controller 4/QC", |
" 8086 0530 MegaRAID Intel RAID Controller SRCZCRX", |
" 8086 0532 MegaRAID Intel RAID Controller SRCU42X", |
" 0408 MegaRAID", |
" 1000 0001 MegaRAID SCSI 320-1E RAID Controller", |
" 1000 0002 MegaRAID SCSI 320-2E RAID Controller", |
" 1025 004d MegaRAID ACER ROMB-2E RAID Controller", |
" 1028 0001 PowerEdge RAID Controller PERC4e/SC", |
" 1028 0002 PowerEdge RAID Controller PERC4e/DC", |
" 1734 1065 FSC MegaRAID PCI Express ROMB", |
" 8086 0002 MegaRAID Intel RAID Controller SRCU42E", |
" 0409 MegaRAID", |
" 1000 3004 MegaRAID SATA 300-4X RAID Controller", |
" 1000 3008 MegaRAID SATA 300-8X RAID Controller", |
" 8086 3008 MegaRAID RAID Controller SRCS28X", |
" 8086 3431 MegaRAID RAID Controller Alief SROMBU42E", |
" 8086 3499 MegaRAID RAID Controller Harwich SROMBU42E", |
" 0621 FC909 Fibre Channel Adapter", |
" 0622 FC929 Fibre Channel Adapter", |
" 1000 1020 44929 O Dual Fibre Channel card", |
" 0623 FC929 LAN", |
" 0624 FC919 Fibre Channel Adapter", |
" 0625 FC919 LAN", |
" 0626 FC929X Fibre Channel Adapter", |
" 1000 1010 7202-XP-LC Dual Fibre Channel card", |
" 0627 FC929X LAN", |
" 0628 FC919X Fibre Channel Adapter", |
" 0629 FC919X LAN", |
" 0640 FC949X Fibre Channel Adapter", |
" 0642 FC939X Fibre Channel Adapter", |
" 0646 FC949ES Fibre Channel Adapter", |
" 0701 83C885 NT50 DigitalScape Fast Ethernet", |
" 0702 Yellowfin G-NIC gigabit ethernet", |
" 1318 0000 PEI100X", |
" 0804 SA2010", |
" 0805 SA2010ZC", |
" 0806 SA2020", |
" 0807 SA2020ZC", |
" 0901 61C102", |
" 1000 63C815", |
" 1960 MegaRAID", |
" 1000 0518 MegaRAID 518 SCSI 320-2 Controller", |
" 1000 0520 MegaRAID 520 SCSI 320-1 Controller", |
" 1000 0522 MegaRAID 522 i4 133 RAID Controller", |
" 1000 0523 MegaRAID SATA 150-6 RAID Controller", |
" 1000 4523 MegaRAID SATA 150-4 RAID Controller", |
" 1000 a520 MegaRAID ZCR SCSI 320-0 Controller", |
" 1028 0518 MegaRAID 518 DELL PERC 4/DC RAID Controller", |
" 1028 0520 MegaRAID 520 DELL PERC 4/SC RAID Controller", |
" 1028 0531 PowerEdge Expandable RAID Controller 4/QC", |
" 1028 0533 PowerEdge Expandable RAID Controller 4/QC", |
" 8086 0520 MegaRAIDRAID Controller SRCU41L", |
" 8086 0523 MegaRAID RAID Controller SRCS16", |
"1001 Kolter Electronic", |
" 0010 PCI 1616 Measurement card with 32 digital I/O lines", |
" 0011 OPTO-PCI Opto-Isolated digital I/O board", |
" 0012 PCI-AD/DA Analogue I/O board", |
" 0013 PCI-OPTO-RELAIS Digital I/O board with relay outputs", |
" 0014 PCI-Counter/Timer Counter Timer board", |
" 0015 PCI-DAC416 Analogue output board", |
" 0016 PCI-MFB Analogue I/O board", |
" 0017 PROTO-3 PCI Prototyping board", |
" 9100 INI-9100/9100W SCSI Host", |
"1002 ATI Technologies Inc", |
" 3150 M24 1P [Radeon Mobility X600]", |
" 3152 M22 [Radeon Mobility X300]", |
" 3154 M24 1T [FireGL M24 GL]", |
" 3e50 RV380 0x3e50 [Radeon X600]", |
" 3e54 RV380 0x3e54 [FireGL V3200]", |
" 3e70 RV380 [Radeon X600] Secondary", |
" 4136 Radeon IGP 320 M", |
" 4137 Radeon IGP330/340/350", |
" 4144 R300 AD [Radeon 9500 Pro]", |
" 4145 R300 AE [Radeon 9700 Pro]", |
" 4146 R300 AF [Radeon 9700 Pro]", |
" 4147 R300 AG [FireGL Z1/X1]", |
" 4148 R350 AH [Radeon 9800]", |
" 4149 R350 AI [Radeon 9800]", |
" 414a R350 AJ [Radeon 9800]", |
" 414b R350 AK [Fire GL X2]", |
" 4150 RV350 AP [Radeon 9600]", |
" 1002 0002 R9600 Pro primary (Asus OEM for HP)", |
" 1002 0003 R9600 Pro secondary (Asus OEM for HP)", |
" 1002 4722 All-in-Wonder 2006 AGP Edition", |
" 1458 4024 Giga-Byte GV-R96128D Primary", |
" 148c 2064 PowerColor R96A-C3N", |
" 148c 2066 PowerColor R96A-C3N", |
" 174b 7c19 Sapphire Atlantis Radeon 9600 Pro", |
" 174b 7c29 GC-R9600PRO Primary [Sapphire]", |
" 17ee 2002 Radeon 9600 256Mb Primary", |
" 18bc 0101 GC-R9600PRO Primary", |
" 4151 RV350 AQ [Radeon 9600]", |
" 1043 c004 A9600SE", |
" 4152 RV350 AR [Radeon 9600]", |
" 1002 0002 Radeon 9600XT", |
" 1002 4772 All-in-Wonder 9600 XT", |
" 1043 c002 Radeon 9600 XT TVD", |
" 1043 c01a A9600XT/TD", |
" 174b 7c29 Sapphire Radeon 9600XT", |
" 1787 4002 Radeon 9600 XT", |
" 4153 RV350 AS [Radeon 9550]", |
" 1462 932c 865PE Neo2-V (MS-6788) mainboard", |
" 4154 RV350 AT [Fire GL T2]", |
" 4155 RV350 AU [Fire GL T2]", |
" 4156 RV350 AV [Fire GL T2]", |
" 4157 RV350 AW [Fire GL T2]", |
" 4158 68800AX [Mach32]", |
" 4164 R300 AD [Radeon 9500 Pro] (Secondary)", |
" 4165 R300 AE [Radeon 9700 Pro] (Secondary)", |
" 4166 R300 AF [Radeon 9700 Pro] (Secondary)", |
" 4168 Radeon R350 [Radeon 9800] (Secondary)", |
" 4170 RV350 AP [Radeon 9600] (Secondary)", |
" 1002 0003 R9600 Pro secondary (Asus OEM for HP)", |
" 1002 4723 All-in-Wonder 2006 AGP Edition (Secondary)", |
" 1458 4025 Giga-Byte GV-R96128D Secondary", |
" 148c 2067 PowerColor R96A-C3N (Secondary)", |
" 174b 7c28 GC-R9600PRO Secondary [Sapphire]", |
" 17ee 2003 Radeon 9600 256Mb Secondary", |
" 18bc 0100 GC-R9600PRO Secondary", |
" 4171 RV350 AQ [Radeon 9600] (Secondary)", |
" 1043 c005 A9600SE (Secondary)", |
" 4172 RV350 AR [Radeon 9600] (Secondary)", |
" 1002 0003 Radeon 9600XT (Secondary)", |
" 1002 4773 All-in-Wonder 9600 XT (Secondary)", |
" 1043 c003 A9600XT (Secondary)", |
" 1043 c01b A9600XT/TD (Secondary)", |
" 174b 7c28 Sapphire Radeon 9600XT (Secondary)", |
" 1787 4003 Radeon 9600 XT (Secondary)", |
" 4173 RV350 ?? [Radeon 9550] (Secondary)", |
" 4237 Radeon 7000 IGP", |
" 4242 R200 BB [Radeon All in Wonder 8500DV]", |
" 1002 02aa Radeon 8500 AIW DV Edition", |
" 4243 R200 BC [Radeon All in Wonder 8500]", |
" 4336 Radeon Mobility U1", |
" 1002 4336 Pavilion ze4300 ATI Radeon Mobility U1 (IGP 320 M)", |
" 103c 0024 Pavilion ze4400 builtin Video", |
" 161f 2029 eMachines M5312 builtin Video", |
" 4337 Radeon IGP 330M/340M/350M", |
" 1014 053a ThinkPad R40e (2684-HVG) builtin VGA controller", |
" 103c 0850 Radeon IGP 345M", |
" 4341 IXP150 AC'97 Audio Controller", |
" 4345 EHCI USB Controller", |
" 4347 OHCI USB Controller #1", |
" 4348 OHCI USB Controller #2", |
" 4349 ATI Dual Channel Bus Master PCI IDE Controller", |
" 434d IXP AC'97 Modem", |
" 4353 ATI SMBus", |
" 4354 215CT [Mach64 CT]", |
" 4358 210888CX [Mach64 CX]", |
" 4363 ATI SMBus", |
" 436e ATI 436E Serial ATA Controller", |
" 4370 IXP SB400 AC'97 Audio Controller", |
" 1025 0079 Aspire 5024WLMMi", |
" 103c 308b MX6125", |
" 107b 0300 MX6421", |
" 4371 IXP SB400 PCI-PCI Bridge", |
" 103c 308b MX6125", |
" 4372 IXP SB400 SMBus Controller", |
" 1025 0080 Aspire 5024WLMMi", |
" 103c 308b MX6125", |
" 4373 IXP SB400 USB2 Host Controller", |
" 1025 0080 Aspire 5024WLMMi", |
" 103c 308b MX6125", |
" 4374 IXP SB400 USB Host Controller", |
" 103c 308b MX6125", |
" 4375 IXP SB400 USB Host Controller", |
" 1025 0080 Aspire 5024WLMMi", |
" 103c 308b MX6125", |
" 4376 Standard Dual Channel PCI IDE Controller ATI", |
" 1025 0080 Aspire 5024WLMMi", |
" 103c 308b MX6125", |
" 4377 IXP SB400 PCI-ISA Bridge", |
" 1025 0080 Aspire 5024WLMi", |
" 103c 308b MX6125", |
" 4378 ATI SB400 - AC'97 Modem Controller", |
" 1025 0080 Aspire 5024WLMMi", |
" 103c 308b MX6125", |
" 4379 ATI 4379 Serial ATA Controller", |
" 437a ATI 437A Serial ATA Controller", |
" 437b SB450 HDA Audio", |
" 4380 SB600 Non-Raid-5 SATA", |
" 4381 SB600 Raid-5 SATA", |
" 4382 SB600 AC97 Audio", |
" 4383 SB600 Azalia", |
" 4384 SB600 PCI to PCI Bridge", |
" 4385 SB600 SMBus", |
" 4386 SB600 USB Controller (EHCI)", |
" 4387 SB600 USB (OHCI0)", |
" 4388 SB600 USB (OHCI1)", |
" 4389 SB600 USB (OHCI2)", |
" 438a SB600 USB (OHCI3)", |
" 438b SB600 USB (OHCI4)", |
" 438c SB600 IDE", |
" 438d SB600 PCI to LPC Bridge", |
" 438e SB600 AC97 Modem", |
" 4437 Radeon Mobility 7000 IGP", |
" 4554 210888ET [Mach64 ET]", |
" 4654 Mach64 VT", |
" 4742 3D Rage Pro AGP 1X/2X", |
" 1002 0040 Rage Pro Turbo AGP 2X", |
" 1002 0044 Rage Pro Turbo AGP 2X", |
" 1002 0061 Rage Pro AIW AGP 2X", |
" 1002 0062 Rage Pro AIW AGP 2X", |
" 1002 0063 Rage Pro AIW AGP 2X", |
" 1002 0080 Rage Pro Turbo AGP 2X", |
" 1002 0084 Rage Pro Turbo AGP 2X", |
" 1002 4742 Rage Pro Turbo AGP 2X", |
" 1002 8001 Rage Pro Turbo AGP 2X", |
" 1028 0082 Rage Pro Turbo AGP 2X", |
" 1028 4082 Optiplex GX1 Onboard Display Adapter", |
" 1028 8082 Rage Pro Turbo AGP 2X", |
" 1028 c082 Rage Pro Turbo AGP 2X", |
" 8086 4152 Xpert 98D AGP 2X", |
" 8086 464a Rage Pro Turbo AGP 2X", |
" 4744 3D Rage Pro AGP 1X", |
" 1002 4744 Rage Pro Turbo AGP", |
" 4747 3D Rage Pro", |
" 4749 3D Rage Pro", |
" 1002 0061 Rage Pro AIW", |
" 1002 0062 Rage Pro AIW", |
" 474c Rage XC", |
" 474d Rage XL AGP 2X", |
" 1002 0004 Xpert 98 RXL AGP 2X", |
" 1002 0008 Xpert 98 RXL AGP 2X", |
" 1002 0080 Rage XL AGP 2X", |
" 1002 0084 Xpert 98 AGP 2X", |
" 1002 474d Rage XL AGP", |
" 1033 806a Rage XL AGP", |
" 474e Rage XC AGP", |
" 1002 474e Rage XC AGP", |
" 474f Rage XL", |
" 1002 0008 Rage XL", |
" 1002 474f Rage XL", |
" 4750 3D Rage Pro 215GP", |
" 1002 0040 Rage Pro Turbo", |
" 1002 0044 Rage Pro Turbo", |
" 1002 0080 Rage Pro Turbo", |
" 1002 0084 Rage Pro Turbo", |
" 1002 4750 Rage Pro Turbo", |
" 4751 3D Rage Pro 215GQ", |
" 4752 Rage XL", |
" 0e11 001e Proliant Rage XL", |
" 1002 0008 Rage XL", |
" 1002 4752 Proliant Rage XL", |
" 1002 8008 Rage XL", |
" 1028 00ce PowerEdge 1400", |
" 1028 00d1 PowerEdge 2550", |
" 1028 00d9 PowerEdge 2500", |
" 1028 0134 Poweredge SC600", |
" 103c 10e1 NetServer Rage XL", |
" 1734 007a Primergy RX300", |
" 8086 3411 SDS2 Mainboard", |
" 8086 3427 S875WP1-E mainboard", |
" 4753 Rage XC", |
" 1002 4753 Rage XC", |
" 4754 3D Rage I/II 215GT [Mach64 GT]", |
" 4755 3D Rage II+ 215GTB [Mach64 GTB]", |
" 4756 3D Rage IIC 215IIC [Mach64 GT IIC]", |
" 1002 4756 Rage IIC", |
" 4757 3D Rage IIC AGP", |
" 1002 4757 Rage IIC AGP", |
" 1028 0089 Rage 3D IIC", |
" 1028 008e PowerEdge 1300 onboard video", |
" 1028 4082 Rage 3D IIC", |
" 1028 8082 Rage 3D IIC", |
" 1028 c082 Rage 3D IIC", |
" 4758 210888GX [Mach64 GX]", |
" 4759 3D Rage IIC", |
" 475a 3D Rage IIC AGP", |
" 1002 0084 Rage 3D Pro AGP 2x XPERT 98", |
" 1002 0087 Rage 3D IIC", |
" 1002 475a Rage IIC AGP", |
" 4964 Radeon RV250 Id [Radeon 9000]", |
" 4965 Radeon RV250 Ie [Radeon 9000]", |
" 4966 Radeon RV250 If [Radeon 9000]", |
" 10f1 0002 RV250 If [Tachyon G9000 PRO]", |
" 148c 2039 RV250 If [Radeon 9000 Pro 'Evil Commando']", |
" 1509 9a00 RV250 If [Radeon 9000 'AT009']", |
" 1681 0040 RV250 If [3D prophet 9000]", |
" 174b 7176 RV250 If [Sapphire Radeon 9000 Pro]", |
" 174b 7192 RV250 If [Radeon 9000 'Atlantis']", |
" 17af 2005 RV250 If [Excalibur Radeon 9000 Pro]", |
" 17af 2006 RV250 If [Excalibur Radeon 9000]", |
" 4967 Radeon RV250 Ig [Radeon 9000]", |
" 496e Radeon RV250 [Radeon 9000] (Secondary)", |
" 4a48 R420 JH [Radeon X800]", |
" 4a49 R420 JI [Radeon X800PRO]", |
" 4a4a R420 JJ [Radeon X800SE]", |
" 4a4b R420 JK [Radeon X800]", |
" 4a4c R420 JL [Radeon X800]", |
" 4a4d R420 JM [FireGL X3]", |
" 4a4e M18 JN [Radeon Mobility 9800]", |
" 4a50 R420 JP [Radeon X800XT]", |
" 4a70 R420 [X800XT-PE] (Secondary)", |
" 4b49 R480 [Radeon X850XT]", |
" 4b4b R480 [Radeon X850Pro]", |
" 4b4c R481 [Radeon X850XT-PE]", |
" 4b69 R480 [Radeon X850XT] (Secondary)", |
" 4b6b R480 [Radeon X850Pro] (Secondary)", |
" 4b6c R481 [Radeon X850XT-PE] (Secondary)", |
" 4c42 3D Rage LT Pro AGP-133", |
" 0e11 b0e7 Rage LT Pro (Compaq Presario 5240)", |
" 0e11 b0e8 Rage 3D LT Pro", |
" 0e11 b10e 3D Rage LT Pro (Compaq Armada 1750)", |
" 1002 0040 Rage LT Pro AGP 2X", |
" 1002 0044 Rage LT Pro AGP 2X", |
" 1002 4c42 Rage LT Pro AGP 2X", |
" 1002 8001 Rage LT Pro AGP 2X", |
" 1028 0085 Rage 3D LT Pro", |
" 4c44 3D Rage LT Pro AGP-66", |
" 4c45 Rage Mobility M3 AGP", |
" 4c46 Rage Mobility M3 AGP 2x", |
" 1028 00b1 Latitude C600", |
" 4c47 3D Rage LT-G 215LG", |
" 4c49 3D Rage LT Pro", |
" 1002 0004 Rage LT Pro", |
" 1002 0040 Rage LT Pro", |
" 1002 0044 Rage LT Pro", |
" 1002 4c49 Rage LT Pro", |
" 4c4d Rage Mobility P/M AGP 2x", |
" 0e11 b111 Armada M700", |
" 0e11 b160 Armada E500", |
" 1002 0084 Xpert 98 AGP 2X (Mobility)", |
" 1014 0154 ThinkPad A20m/A21m", |
" 1028 00aa Latitude CPt", |
" 1028 00bb Latitude CPx", |
" 10e1 10cf Fujitsu Siemens LifeBook C Series", |
" 1179 ff00 Satellite 1715XCDS laptop", |
" 13bd 1019 PC-AR10", |
" 4c4e Rage Mobility L AGP 2x", |
" 4c50 3D Rage LT Pro", |
" 1002 4c50 Rage LT Pro", |
" 4c51 3D Rage LT Pro", |
" 4c52 Rage Mobility P/M", |
" 1033 8112 Versa Note VXi", |
" 4c53 Rage Mobility L", |
" 4c54 264LT [Mach64 LT]", |
" 4c57 Radeon Mobility M7 LW [Radeon Mobility 7500]", |
" 1014 0517 ThinkPad T30", |
" 1028 00e6 Radeon Mobility M7 LW (Dell Inspiron 8100)", |
" 1028 012a Latitude C640", |
" 144d c006 Radeon Mobility M7 LW in vpr Matrix 170B4", |
" 4c58 Radeon RV200 LX [Mobility FireGL 7800 M7]", |
" 4c59 Radeon Mobility M6 LY", |
" 0e11 b111 Evo N600c", |
" 1014 0235 ThinkPad A30/A30p (2652/2653)", |
" 1014 0239 ThinkPad X22/X23/X24", |
" 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP", |
" 104d 8140 PCG-Z1SP laptop", |
" 1509 1930 Medion MD9703", |
" 4c5a Radeon Mobility M6 LZ", |
" 4c64 Radeon R250 Ld [Radeon Mobility 9000 M9]", |
" 4c65 Radeon R250 Le [Radeon Mobility 9000 M9]", |
" 4c66 Radeon R250 [Radeon Mobility 9200]", |
" 4c67 Radeon R250 Lg [Radeon Mobility 9000 M9]", |
" 4c6e Radeon R250 Ln [Radeon Mobility 9000 M9] [Secondary]", |
" 4d46 Rage Mobility M4 AGP", |
" 4d4c Rage Mobility M4 AGP", |
" 4e44 Radeon R300 ND [Radeon 9700 Pro]", |
" 1002 515e Radeon ES1000", |
" 1002 5965 Radeon ES1000", |
" 4e45 Radeon R300 NE [Radeon 9500 Pro]", |
" 1002 0002 Radeon R300 NE [Radeon 9500 Pro]", |
" 1681 0002 Hercules 3D Prophet 9500 PRO [Radeon 9500 Pro]", |
" 4e46 RV350 NF [Radeon 9600]", |
" 4e47 Radeon R300 NG [FireGL X1]", |
" 4e48 Radeon R350 [Radeon 9800 Pro]", |
" 4e49 Radeon R350 [Radeon 9800]", |
" 4e4a RV350 NJ [Radeon 9800 XT]", |
" 4e4b R350 NK [Fire GL X2]", |
" 4e50 RV350 [Mobility Radeon 9600 M10]", |
" 1025 005a TravelMate 290", |
" 103c 088c NC8000 laptop", |
" 103c 0890 NC6000 laptop", |
" 1462 0311 MSI M510A", |
" 1734 1055 Amilo M1420W", |
" 4e51 M10 NQ [Radeon Mobility 9600]", |
" 4e52 RV350 [Mobility Radeon 9600 M10]", |
" 4e53 M10 NS [Radeon Mobility 9600]", |
" 4e54 M10 NT [FireGL Mobility T2]", |
" 4e56 M11 NV [FireGL Mobility T2e]", |
" 4e64 Radeon R300 [Radeon 9700 Pro] (Secondary)", |
" 4e65 Radeon R300 [Radeon 9500 Pro] (Secondary)", |
" 1002 0003 Radeon R300 NE [Radeon 9500 Pro]", |
" 1681 0003 Hercules 3D Prophet 9500 PRO [Radeon 9500 Pro] (Secondary)", |
" 4e66 RV350 NF [Radeon 9600] (Secondary)", |
" 4e67 Radeon R300 [FireGL X1] (Secondary)", |
" 4e68 Radeon R350 [Radeon 9800 Pro] (Secondary)", |
" 4e69 Radeon R350 [Radeon 9800] (Secondary)", |
" 4e6a RV350 NJ [Radeon 9800 XT] (Secondary)", |
" 1002 4e71 ATI Technologies Inc M10 NQ [Radeon Mobility 9600]", |
" 4e71 M10 NQ [Radeon Mobility 9600] (Secondary)", |
" 4f72 RV250 [Radeon 9000 Series]", |
" 4f73 Radeon RV250 [Radeon 9000 Series] (Secondary)", |
" 5041 Rage 128 PA/PRO", |
" 5042 Rage 128 PB/PRO AGP 2x", |
" 5043 Rage 128 PC/PRO AGP 4x", |
" 5044 Rage 128 PD/PRO TMDS", |
" 1002 0028 Rage 128 AIW", |
" 1002 0029 Rage 128 AIW", |
" 5045 Rage 128 PE/PRO AGP 2x TMDS", |
" 5046 Rage 128 PF/PRO AGP 4x TMDS", |
" 1002 0004 Rage Fury Pro", |
" 1002 0008 Rage Fury Pro/Xpert 2000 Pro", |
" 1002 0014 Rage Fury Pro", |
" 1002 0018 Rage Fury Pro/Xpert 2000 Pro", |
" 1002 0028 Rage 128 Pro AIW AGP", |
" 1002 002a Rage 128 Pro AIW AGP", |
" 1002 0048 Rage Fury Pro", |
" 1002 2000 Rage Fury MAXX AGP 4x (TMDS) (VGA device)", |
" 1002 2001 Rage Fury MAXX AGP 4x (TMDS) (Extra device?!)", |
" 5047 Rage 128 PG/PRO", |
" 5048 Rage 128 PH/PRO AGP 2x", |
" 5049 Rage 128 PI/PRO AGP 4x", |
" 504a Rage 128 PJ/PRO TMDS", |
" 504b Rage 128 PK/PRO AGP 2x TMDS", |
" 504c Rage 128 PL/PRO AGP 4x TMDS", |
" 504d Rage 128 PM/PRO", |
" 504e Rage 128 PN/PRO AGP 2x", |
" 504f Rage 128 PO/PRO AGP 4x", |
" 5050 Rage 128 PP/PRO TMDS [Xpert 128]", |
" 1002 0008 Xpert 128", |
" 5051 Rage 128 PQ/PRO AGP 2x TMDS", |
" 5052 Rage 128 PR/PRO AGP 4x TMDS", |
" 5053 Rage 128 PS/PRO", |
" 5054 Rage 128 PT/PRO AGP 2x", |
" 5055 Rage 128 PU/PRO AGP 4x", |
" 5056 Rage 128 PV/PRO TMDS", |
" 5057 Rage 128 PW/PRO AGP 2x TMDS", |
" 5058 Rage 128 PX/PRO AGP 4x TMDS", |
" 5144 Radeon R100 QD [Radeon 7200]", |
" 1002 0008 Radeon 7000/Radeon VE", |
" 1002 0009 Radeon 7000/Radeon", |
" 1002 000a Radeon 7000/Radeon", |
" 1002 001a Radeon 7000/Radeon", |
" 1002 0029 Radeon AIW", |
" 1002 0038 Radeon 7000/Radeon", |
" 1002 0039 Radeon 7000/Radeon", |
" 1002 008a Radeon 7000/Radeon", |
" 1002 00ba Radeon 7000/Radeon", |
" 1002 0139 Radeon 7000/Radeon", |
" 1002 028a Radeon 7000/Radeon", |
" 1002 02aa Radeon AIW", |
" 1002 053a Radeon 7000/Radeon", |
" 5145 Radeon R100 QE", |
" 5146 Radeon R100 QF", |
" 5147 Radeon R100 QG", |
" 5148 Radeon R200 QH [Radeon 8500]", |
" 1002 010a FireGL 8800 64Mb", |
" 1002 0152 FireGL 8800 128Mb", |
" 1002 0162 FireGL 8700 32Mb", |
" 1002 0172 FireGL 8700 64Mb", |
" 5149 Radeon R200 QI", |
" 514a Radeon R200 QJ", |
" 514b Radeon R200 QK", |
" 514c Radeon R200 QL [Radeon 8500 LE]", |
" 1002 003a Radeon R200 QL [Radeon 8500 LE]", |
" 1002 013a Radeon 8500", |
" 148c 2026 R200 QL [Radeon 8500 Evil Master II Multi Display Edition]", |
" 1681 0010 Radeon 8500 [3D Prophet 8500 128Mb]", |
" 174b 7149 Radeon R200 QL [Sapphire Radeon 8500 LE]", |
" 514d Radeon R200 QM [Radeon 9100]", |
" 514e Radeon R200 QN [Radeon 8500LE]", |
" 514f Radeon R200 QO [Radeon 8500LE]", |
" 5154 R200 QT [Radeon 8500]", |
" 5155 R200 QU [Radeon 9100]", |
" 5157 Radeon RV200 QW [Radeon 7500]", |
" 1002 013a Radeon 7500", |
" 1002 103a Dell Optiplex GX260", |
" 1458 4000 RV200 QW [RADEON 7500 PRO MAYA AR]", |
" 148c 2024 RV200 QW [Radeon 7500LE Dual Display]", |
" 148c 2025 RV200 QW [Radeon 7500 Evil Master Multi Display Edition]", |
" 148c 2036 RV200 QW [Radeon 7500 PCI Dual Display]", |
" 174b 7146 RV200 QW [Radeon 7500 LE]", |
" 174b 7147 RV200 QW [Sapphire Radeon 7500LE]", |
" 174b 7161 Radeon RV200 QW [Radeon 7500 LE]", |
" 17af 0202 RV200 QW [Excalibur Radeon 7500LE]", |
" 5158 Radeon RV200 QX [Radeon 7500]", |
" 5159 Radeon RV100 QY [Radeon 7000/VE]", |
" 1002 000a Radeon 7000/Radeon VE", |
" 1002 000b Radeon 7000", |
" 1002 0038 Radeon 7000/Radeon VE", |
" 1002 003a Radeon 7000/Radeon VE", |
" 1002 00ba Radeon 7000/Radeon VE", |
" 1002 013a Radeon 7000/Radeon VE", |
" 1002 0908 XVR-100 (supplied by Sun)", |
" 1014 029a Remote Supervisor Adapter II (RSA2)", |
" 1014 02c8 IBM eServer xSeries server mainboard", |
" 1028 019a PowerEdge SC1425", |
" 1458 4002 RV100 QY [RADEON 7000 PRO MAYA AV Series]", |
" 148c 2003 RV100 QY [Radeon 7000 Multi-Display Edition]", |
" 148c 2023 RV100 QY [Radeon 7000 Evil Master Multi-Display]", |
" 174b 7112 RV100 QY [Sapphire Radeon VE 7000]", |
" 174b 7c28 Sapphire Radeon VE 7000 DDR", |
" 1787 0202 RV100 QY [Excalibur Radeon 7000]", |
" 515a Radeon RV100 QZ [Radeon 7000/VE]", |
" 515e ES1000", |
" 515f ES1000", |
" 5168 Radeon R200 Qh", |
" 5169 Radeon R200 Qi", |
" 516a Radeon R200 Qj", |
" 516b Radeon R200 Qk", |
" 516c Radeon R200 Ql", |
" 5245 Rage 128 RE/SG", |
" 1002 0008 Xpert 128", |
" 1002 0028 Rage 128 AIW", |
" 1002 0029 Rage 128 AIW", |
" 1002 0068 Rage 128 AIW", |
" 5246 Rage 128 RF/SG AGP", |
" 1002 0004 Magnum/Xpert 128/Xpert 99", |
" 1002 0008 Magnum/Xpert128/X99/Xpert2000", |
" 1002 0028 Rage 128 AIW AGP", |
" 1002 0044 Rage Fury/Xpert 128/Xpert 2000", |
" 1002 0068 Rage 128 AIW AGP", |
" 1002 0448 Rage Fury", |
" 5247 Rage 128 RG", |
" 524b Rage 128 RK/VR", |
" 524c Rage 128 RL/VR AGP", |
" 1002 0008 Xpert 99/Xpert 2000", |
" 1002 0088 Xpert 99", |
" 5345 Rage 128 SE/4x", |
" 5346 Rage 128 SF/4x AGP 2x", |
" 1002 0048 RAGE 128 16MB VGA TVOUT AMC PAL", |
" 5347 Rage 128 SG/4x AGP 4x", |
" 5348 Rage 128 SH", |
" 534b Rage 128 SK/4x", |
" 534c Rage 128 SL/4x AGP 2x", |
" 534d Rage 128 SM/4x AGP 4x", |
" 1002 0008 Xpert 99/Xpert 2000", |
" 1002 0018 Xpert 2000", |
" 534e Rage 128 4x", |
" 5354 Mach 64 VT", |
" 1002 5654 Mach 64 reference", |
" 5446 Rage 128 Pro Ultra TF", |
" 1002 0004 Rage Fury Pro", |
" 1002 0008 Rage Fury Pro/Xpert 2000 Pro", |
" 1002 0018 Rage Fury Pro/Xpert 2000 Pro", |
" 1002 0028 Rage 128 AIW Pro AGP", |
" 1002 0029 Rage 128 AIW", |
" 1002 002a Rage 128 AIW Pro AGP", |
" 1002 002b Rage 128 AIW", |
" 1002 0048 Xpert 2000 Pro", |
" 544c Rage 128 Pro Ultra TL", |
" 5452 Rage 128 Pro Ultra TR", |
" 1002 001c Rage 128 Pro 4XL", |
" 103c 1279 Rage 128 Pro 4XL", |
" 5453 Rage 128 Pro Ultra TS", |
" 5454 Rage 128 Pro Ultra TT", |
" 5455 Rage 128 Pro Ultra TU", |
" 5460 M22 [Radeon Mobility M300]", |
" 5462 M24 [Radeon Mobility X600]", |
" 5464 M22 [FireGL GL]", |
" 5548 R423 UH [Radeon X800 (PCIE)]", |
" 5549 R423 UI [Radeon X800PRO (PCIE)]", |
" 554a R423 UJ [Radeon X800LE (PCIE)]", |
" 554b R423 UK [Radeon X800SE (PCIE)]", |
" 554d R430 [Radeon X800 XL] (PCIe)", |
" 554f R430 [Radeon X800 (PCIE)]", |
" 5550 R423 [Fire GL V7100]", |
" 5551 R423 UQ [FireGL V7200 (PCIE)]", |
" 5552 R423 UR [FireGL V5100 (PCIE)]", |
" 5554 R423 UT [FireGL V7100 (PCIE)]", |
" 556b Radeon R423 UK (PCIE) [X800 SE] (Secondary)", |
" 556d R430 [Radeon X800 XL] (PCIe) Secondary", |
" 556f R430 [Radeon X800 (PCIE) Secondary]", |
" 564a M26 [Mobility FireGL V5000]", |
" 564b M26 [Mobility FireGL V5000]", |
" 564f M26 [Radeon Mobility X700 XL] (PCIE)", |
" 5652 M26 [Radeon Mobility X700]", |
" 5653 Radeon Mobility X700 (PCIE)", |
" 1025 0080 Aspire 5024WLMi", |
" 5654 264VT [Mach64 VT]", |
" 1002 5654 Mach64VT Reference", |
" 5655 264VT3 [Mach64 VT3]", |
" 5656 264VT4 [Mach64 VT4]", |
" 5830 RS300 Host Bridge", |
" 5831 RS300 Host Bridge", |
" 5832 RS300 Host Bridge", |
" 5833 Radeon 9100 IGP Host Bridge", |
" 5834 Radeon 9100 IGP", |
" 5835 RS300M AGP [Radeon Mobility 9100IGP]", |
" 5838 Radeon 9100 IGP AGP Bridge", |
" 5940 RV280 [Radeon 9200 PRO] (Secondary)", |
" 5941 RV280 [Radeon 9200] (Secondary)", |
" 1458 4019 Gigabyte Radeon 9200", |
" 174b 7c12 Sapphire Radeon 9200", |
" 17af 200d Excalibur Radeon 9200", |
" 18bc 0050 GeXcube GC-R9200-C3 (Secondary)", |
" 5944 RV280 [Radeon 9200 SE (PCI)]", |
" 5950 RS480 Host Bridge", |
" 1025 0080 Aspire 5024WLMMi", |
" 103c 308b MX6125", |
" 5951 ATI Radeon Xpress 200 (RS480/RS482/RX480/RX482) Chipset - Host bridge", |
" 5954 RS480 [Radeon Xpress 200G Series]", |
" 1002 5954 RV370 [Radeon Xpress 200G Series]", |
" 5955 ATI Radeon XPRESS 200M 5955 (PCIE)", |
" 1002 5955 RS480 0x5955 [ATI Radeon XPRESS 200M 5955 (PCIE)]", |
" 103c 308b MX6125", |
" 5960 RV280 [Radeon 9200 PRO]", |
" 5961 RV280 [Radeon 9200]", |
" 1002 2f72 All-in-Wonder 9200 Series", |
" 1019 4c30 Radeon 9200 VIVO", |
" 12ab 5961 YUAN SMARTVGA Radeon 9200", |
" 1458 4018 Gigabyte Radeon 9200", |
" 174b 7c13 Sapphire Radeon 9200", |
" 17af 200c Excalibur Radeon 9200", |
" 18bc 0050 Radeon 9200 Game Buster", |
" 18bc 0051 GeXcube GC-R9200-C3", |
" 18bc 0053 Radeon 9200 Game Buster VIVO", |
" 5962 RV280 [Radeon 9200]", |
" 5964 RV280 [Radeon 9200 SE]", |
" 1043 c006 ASUS Radeon 9200 SE / TD / 128M", |
" 1458 4018 Radeon 9200 SE", |
" 1458 4032 Radeon 9200 SE 128MB", |
" 147b 6191 R9200SE-DT", |
" 148c 2073 CN-AG92E", |
" 174b 7c13 Sapphire Radeon 9200 SE", |
" 1787 5964 Excalibur 9200SE VIVO 128M", |
" 17af 2012 Radeon 9200 SE Excalibur", |
" 18bc 0170 Sapphire Radeon 9200 SE 128MB Game Buster", |
" 18bc 0173 GC-R9200L(SE)-C3H [Radeon 9200 Game Buster]", |
" 5969 ES1000", |
" 5974 RS482 [Radeon Xpress 200]", |
" 5975 RS482 [Radeon Xpress 200M]", |
" 5a34 RS480 PCI-X Root Port", |
" 5a36 RS480 PCI Bridge", |
" 5a38 RS480 PCI Bridge", |
" 5a39 RS480 PCI Bridge", |
" 5a3f RS480 PCI Bridge", |
" 5a41 RS400 [Radeon Xpress 200]", |
" 5a42 RS400 [Radeon Xpress 200M]", |
" 5a61 RC410 [Radeon Xpress 200]", |
" 5a62 RC410 [Radeon Xpress 200M]", |
" 5b60 RV370 5B60 [Radeon X300 (PCIE)]", |
" 1043 002a Extreme AX300SE-X", |
" 1043 032e Extreme AX300/TD", |
" 1462 0400 RX300SE-TD128E (MS-8940 REV:200)", |
" 1462 0402 RX300SE-TD128E (MS-8940)", |
" 5b62 RV370 5B62 [Radeon X600 (PCIE)]", |
" 5b63 RV370 [Sapphire X550 Silent]", |
" 5b64 RV370 5B64 [FireGL V3100 (PCIE)]", |
" 5b65 RV370 5B65 [FireGL D1100 (PCIE)]", |
" 5b70 RV370 [Radeon X300SE]", |
" 1462 0403 RX300SE-TD128E (MS-8940) (secondary display)", |
" 5b72 Radeon X600(RV380)", |
" 5b73 RV370 secondary [Sapphire X550 Silent]", |
" 5b74 RV370 5B64 [FireGL V3100 (PCIE)] (Secondary)", |
" 5c61 M9+ 5C61 [Radeon Mobility 9200 (AGP)]", |
" 5c63 M9+ 5C63 [Radeon Mobility 9200 (AGP)]", |
" 1002 5c63 Apple iBook G4 2004", |
" 5d44 RV280 [Radeon 9200 SE] (Secondary)", |
" 1458 4019 Radeon 9200 SE (Secondary)", |
" 1458 4032 Radeon 9200 SE 128MB", |
" 174b 7c12 Sapphire Radeon 9200 SE (Secondary)", |
" 1787 5965 Excalibur 9200SE VIVO 128M (Secondary)", |
" 17af 2013 Radeon 9200 SE Excalibur (Secondary)", |
" 18bc 0171 Radeon 9200 SE 128MB Game Buster (Secondary)", |
" 18bc 0172 GC-R9200L(SE)-C3H [Radeon 9200 Game Buster]", |
" 5d48 M28 [Radeon Mobility X800XT]", |
" 5d49 M28 [Mobility FireGL V5100]", |
" 5d4a Mobility Radeon X800", |
" 5d4d R480 [Radeon X850XT Platinum (PCIE)]", |
" 5d4f R480 [Radeon X800 GTO (PCIE)]", |
" 5d52 R480 [Radeon X850XT (PCIE)] (Primary)", |
" 1002 0b12 PowerColor X850XT PCIe Primary", |
" 1002 0b13 PowerColor X850XT PCIe Secondary", |
" 5d57 R423 5F57 [Radeon X800XT (PCIE)]", |
" 5d6d R480 [Radeon X850XT Platinum (PCIE)] (Secondary)", |
" 5d6f R480 [Radeon X800 GTO (PCIE)] (Secondary)", |
" 5d72 R480 [Radeon X850XT (PCIE)] (Secondary)", |
" 5d77 R423 5F57 [Radeon X800XT (PCIE)] (Secondary)", |
" 5e48 RV410 [FireGL V5000]", |
" 5e49 RV410 [FireGL V3300]", |
" 5e4a RV410 [Radeon X700XT]", |
" 5e4b RV410 [Radeon X700 Pro (PCIE)]", |
" 5e4c RV410 [Radeon X700SE]", |
" 5e4d RV410 [Radeon X700 (PCIE)]", |
" 148c 2116 PowerColor Bravo X700", |
" 5e4f RV410 [Radeon X700]", |
" 5e6b RV410 [Radeon X700 Pro (PCIE)] Secondary", |
" 5e6d RV410 [Radeon X700 (PCIE)] (Secondary)", |
" 148c 2117 PowerColor Bravo X700", |
" 5f57 R423 [Radeon X800XT (PCIE)]", |
" 700f PCI Bridge [IGP 320M]", |
" 7010 PCI Bridge [IGP 340M]", |
" 7100 R520 [Radeon X1800]", |
" 7105 R520 [FireGL]", |
" 7109 R520 [Radeon X1800]", |
" 1002 0322 All-in-Wonder X1800XL", |
" 1002 0d02 Radeon X1800 CrossFire Edition", |
" 7120 R520 [Radeon X1800] (Secondary)", |
" 7129 R520 [Radeon X1800] (Secondary)", |
" 1002 0323 All-in-Wonder X1800XL (Secondary)", |
" 1002 0d03 Radeon X1800 CrossFire Edition (Secondary)", |
" 7142 RV515 [Radeon X1300]", |
" 1002 0322 All-in-Wonder 2006 PCI-E Edition", |
" 7145 Radeon Mobility X1400", |
" 7146 RV515 [Radeon X1300]", |
" 1002 0322 All-in-Wonder 2006 PCI-E Edition", |
" 7149 M52 [ATI Mobility Radeon X1300]", |
" 714a M52 [ATI Mobility Radeon X1300]", |
" 714b M52 [ATI Mobility Radeon X1300]", |
" 714c M52 [ATI Mobility Radeon X1300]", |
" 7162 RV515 [Radeon X1300] (Secondary)", |
" 1002 0323 All-in-Wonder 2006 PCI-E Edition (Secondary)", |
" 7166 RV515 [Radeon X1300] (Secondary)", |
" 1002 0323 All-in-Wonder 2006 PCI-E Edition (Secondary)", |
" 71c0 RV530 [Radeon X1600]", |
" 71c2 RV530 [Radeon X1600]", |
" 71c4 M56GL [ATI Mobility FireGL V5200]", |
" 71c5 M56P [Radeon Mobility X1600]", |
" 71e0 RV530 [Radeon X1600] (Secondary)", |
" 71e2 RV530 [Radeon X1600] (Secondary)", |
" 7833 Radeon 9100 IGP Host Bridge", |
" 7834 Radeon 9100 PRO IGP", |
" 7835 Radeon Mobility 9200 IGP", |
" 7838 Radeon 9100 IGP PCI/AGP Bridge", |
" 7c37 RV350 AQ [Radeon 9600 SE]", |
" cab0 AGP Bridge [IGP 320M]", |
" cab2 RS200/RS200M AGP Bridge [IGP 340M]", |
" cab3 R200 AGP Bridge [Mobility Radeon 7000 IGP]", |
" cbb2 RS200/RS200M AGP Bridge [IGP 340M]", |
"1003 ULSI Systems", |
" 0201 US201", |
"1004 VLSI Technology Inc", |
" 0005 82C592-FC1", |
" 0006 82C593-FC1", |
" 0007 82C594-AFC2", |
" 0008 82C596/7 [Wildcat]", |
" 0009 82C597-AFC2", |
" 000c 82C541 [Lynx]", |
" 000d 82C543 [Lynx]", |
" 0101 82C532", |
" 0102 82C534 [Eagle]", |
" 0103 82C538", |
" 0104 82C535", |
" 0105 82C147", |
" 0200 82C975", |
" 0280 82C925", |
" 0304 QSound ThunderBird PCI Audio", |
" 1004 0304 QSound ThunderBird PCI Audio", |
" 122d 1206 DSP368 Audio", |
" 1483 5020 XWave Thunder 3D Audio", |
" 0305 QSound ThunderBird PCI Audio Gameport", |
" 1004 0305 QSound ThunderBird PCI Audio Gameport", |
" 122d 1207 DSP368 Audio Gameport", |
" 1483 5021 XWave Thunder 3D Audio Gameport", |
" 0306 QSound ThunderBird PCI Audio Support Registers", |
" 1004 0306 QSound ThunderBird PCI Audio Support Registers", |
" 122d 1208 DSP368 Audio Support Registers", |
" 1483 5022 XWave Thunder 3D Audio Support Registers", |
" 0307 Thunderbird", |
" 0308 Thunderbird", |
" 0702 VAS96011 [Golden Gate II]", |
" 0703 Tollgate", |
"1005 Avance Logic Inc. [ALI]", |
" 2064 ALG2032/2064", |
" 2128 ALG2364A", |
" 2301 ALG2301", |
" 2302 ALG2302", |
" 2364 ALG2364", |
" 2464 ALG2364A", |
" 2501 ALG2564A/25128A", |
"1006 Reply Group", |
"1007 NetFrame Systems Inc", |
"1008 Epson", |
"100a Phoenix Technologies", |
"100b National Semiconductor Corporation", |
" 0001 DP83810", |
" 0002 87415/87560 IDE", |
" 000e 87560 Legacy I/O", |
" 000f FireWire Controller", |
" 0011 NS87560 National PCI System I/O", |
" 0012 USB Controller", |
" 0020 DP83815 (MacPhyter) Ethernet Controller", |
" 103c 0024 Pavilion ze4400 builtin Network", |
" 12d9 000c Aculab E1/T1 PMXc cPCI carrier card", |
" 1385 f311 FA311 / FA312 (FA311 with WoL HW)", |
" 0021 PC87200 PCI to ISA Bridge", |
" 0022 DP83820 10/100/1000 Ethernet Controller", |
" 0028 Geode GX2 Host Bridge", |
" 002a CS5535 South Bridge", |
" 002b CS5535 ISA bridge", |
" 002d CS5535 IDE", |
" 002e CS5535 Audio", |
" 002f CS5535 USB", |
" 0030 Geode GX2 Graphics Processor", |
" 0035 DP83065 [Saturn] 10/100/1000 Ethernet Controller", |
" 0500 SCx200 Bridge", |
" 0501 SCx200 SMI", |
" 0502 SCx200 IDE", |
" 0503 SCx200 Audio", |
" 0504 SCx200 Video", |
" 0505 SCx200 XBus", |
" 0510 SC1100 Bridge", |
" 0511 SC1100 SMI", |
" 0515 SC1100 XBus", |
" d001 87410 IDE", |
"100c Tseng Labs Inc", |
" 3202 ET4000/W32p rev A", |
" 3205 ET4000/W32p rev B", |
" 3206 ET4000/W32p rev C", |
" 3207 ET4000/W32p rev D", |
" 3208 ET6000", |
" 4702 ET6300", |
"100d AST Research Inc", |
"100e Weitek", |
" 9000 P9000 Viper", |
" 9001 P9000 Viper", |
" 9002 P9000 Viper", |
" 9100 P9100 Viper Pro/SE", |
"1010 Video Logic, Ltd.", |
"1011 Digital Equipment Corporation", |
" 0001 DECchip 21050", |
" 0002 DECchip 21040 [Tulip]", |
" 0004 DECchip 21030 [TGA]", |
" 0007 NVRAM [Zephyr NVRAM]", |
" 0008 KZPSA [KZPSA]", |
" 0009 DECchip 21140 [FasterNet]", |
" 1025 0310 21140 Fast Ethernet", |
" 10b8 2001 SMC9332BDT EtherPower 10/100", |
" 10b8 2002 SMC9332BVT EtherPower T4 10/100", |
" 10b8 2003 SMC9334BDT EtherPower 10/100 (1-port)", |
" 1109 2400 ANA-6944A/TX Fast Ethernet", |
" 1112 2300 RNS2300 Fast Ethernet", |
" 1112 2320 RNS2320 Fast Ethernet", |
" 1112 2340 RNS2340 Fast Ethernet", |
" 1113 1207 EN-1207-TX Fast Ethernet", |
" 1186 1100 DFE-500TX Fast Ethernet", |
" 1186 1112 DFE-570TX Fast Ethernet", |
" 1186 1140 DFE-660 Cardbus Ethernet 10/100", |
" 1186 1142 DFE-660 Cardbus Ethernet 10/100", |
" 11f6 0503 Freedomline Fast Ethernet", |
" 1282 9100 AEF-380TXD Fast Ethernet", |
" 1385 1100 FA310TX Fast Ethernet", |
" 2646 0001 KNE100TX Fast Ethernet", |
" 000a 21230 Video Codec", |
" 000d PBXGB [TGA2]", |
" 000f PCI-to-PDQ Interface Chip [PFI]", |
" 1011 def1 FDDI controller (DEFPA)", |
" 103c def1 FDDI controller (3X-DEFPA)", |
" 0014 DECchip 21041 [Tulip Pass 3]", |
" 1186 0100 DE-530+", |
" 0016 DGLPB [OPPO]", |
" 0017 PV-PCI Graphics Controller (ZLXp-L)", |
" 0019 DECchip 21142/43", |
" 1011 500a DE500A Fast Ethernet", |
" 1011 500b DE500B Fast Ethernet", |
" 1014 0001 10/100 EtherJet Cardbus", |
" 1025 0315 ALN315 Fast Ethernet", |
" 1033 800c PC-9821-CS01 100BASE-TX Interface Card", |
" 1033 800d PC-9821NR-B06 100BASE-TX Interface Card", |
" 108d 0016 Rapidfire 2327 10/100 Ethernet", |
" 108d 0017 GoCard 2250 Ethernet 10/100 Cardbus", |
" 10b8 2005 SMC8032DT Extreme Ethernet 10/100", |
" 10b8 8034 SMC8034 Extreme Ethernet 10/100", |
" 10ef 8169 Cardbus Fast Ethernet", |
" 1109 2a00 ANA-6911A/TX Fast Ethernet", |
" 1109 2b00 ANA-6911A/TXC Fast Ethernet", |
" 1109 3000 ANA-6922/TX Fast Ethernet", |
" 1113 1207 Cheetah Fast Ethernet", |
" 1113 2220 Cardbus Fast Ethernet", |
" 115d 0002 Cardbus Ethernet 10/100", |
" 1179 0203 Fast Ethernet", |
" 1179 0204 Cardbus Fast Ethernet", |
" 1186 1100 DFE-500TX Fast Ethernet", |
" 1186 1101 DFE-500TX Fast Ethernet", |
" 1186 1102 DFE-500TX Fast Ethernet", |
" 1186 1112 DFE-570TX Quad Fast Ethernet", |
" 1259 2800 AT-2800Tx Fast Ethernet", |
" 1266 0004 Eagle Fast EtherMAX", |
" 12af 0019 NetFlyer Cardbus Fast Ethernet", |
" 1374 0001 Cardbus Ethernet Card 10/100", |
" 1374 0002 Cardbus Ethernet Card 10/100", |
" 1374 0007 Cardbus Ethernet Card 10/100", |
" 1374 0008 Cardbus Ethernet Card 10/100", |
" 1385 2100 FA510", |
" 1395 0001 10/100 Ethernet CardBus PC Card", |
" 13d1 ab01 EtherFast 10/100 Cardbus (PCMPC200)", |
" 14cb 0100 LNDL-100N 100Base-TX Ethernet PC Card", |
" 8086 0001 EtherExpress PRO/100 Mobile CardBus 32", |
" 001a Farallon PN9000SX Gigabit Ethernet", |
" 0021 DECchip 21052", |
" 0022 DECchip 21150", |
" 0023 DECchip 21150", |
" 0024 DECchip 21152", |
" 0025 DECchip 21153", |
" 0026 DECchip 21154", |
" 0034 56k Modem Cardbus", |
" 1374 0003 56k Modem Cardbus", |
" 0045 DECchip 21553", |
" 0046 DECchip 21554", |
" 0e11 4050 Integrated Smart Array", |
" 0e11 4051 Integrated Smart Array", |
" 0e11 4058 Integrated Smart Array", |
" 103c 10c2 Hewlett-Packard NetRAID-4M", |
" 12d9 000a IP Telephony card", |
" 4c53 1050 CT7 mainboard", |
" 4c53 1051 CE7 mainboard", |
" 9005 0364 5400S (Mustang)", |
" 9005 0365 5400S (Mustang)", |
" 9005 1364 Dell PowerEdge RAID Controller 2", |
" 9005 1365 Dell PowerEdge RAID Controller 2", |
" e4bf 1000 CC8-1-BLUES", |
" 1065 StrongARM DC21285", |
" 1069 0020 DAC960P / DAC1164P", |
"1012 Micronics Computers Inc", |
"1013 Cirrus Logic", |
" 0038 GD 7548", |
" 0040 GD 7555 Flat Panel GUI Accelerator", |
" 004c GD 7556 Video/Graphics LCD/CRT Ctrlr", |
" 00a0 GD 5430/40 [Alpine]", |
" 00a2 GD 5432 [Alpine]", |
" 00a4 GD 5434-4 [Alpine]", |
" 00a8 GD 5434-8 [Alpine]", |
" 00ac GD 5436 [Alpine]", |
" 00b0 GD 5440", |
" 00b8 GD 5446", |
" 00bc GD 5480", |
" 1013 00bc CL-GD5480", |
" 00d0 GD 5462", |
" 00d2 GD 5462 [Laguna I]", |
" 00d4 GD 5464 [Laguna]", |
" 00d5 GD 5464 BD [Laguna]", |
" 00d6 GD 5465 [Laguna]", |
" 13ce 8031 Barco Metheus 2 Megapixel, Dual Head", |
" 13cf 8031 Barco Metheus 2 Megapixel, Dual Head", |
" 00e8 GD 5436U", |
" 1100 CL 6729", |
" 1110 PD 6832 PCMCIA/CardBus Ctrlr", |
" 1112 PD 6834 PCMCIA/CardBus Ctrlr", |
" 1113 PD 6833 PCMCIA/CardBus Ctrlr", |
" 1200 GD 7542 [Nordic]", |
" 1202 GD 7543 [Viking]", |
" 1204 GD 7541 [Nordic Light]", |
" 4000 MD 5620 [CLM Data Fax Voice]", |
" 4400 CD 4400", |
" 6001 CS 4610/11 [CrystalClear SoundFusion Audio Accelerator]", |
" 1014 1010 CS4610 SoundFusion Audio Accelerator", |
" 6003 CS 4614/22/24 [CrystalClear SoundFusion Audio Accelerator]", |
" 1013 4280 Crystal SoundFusion PCI Audio Accelerator", |
" 1014 0153 ThinkPad A20m", |
" 153b 1136 SiXPack 5.1+", |
" 1681 0050 Game Theater XP", |
" 1681 a011 Fortissimo III 7.1", |
" 6004 CS 4614/22/24 [CrystalClear SoundFusion Audio Accelerator]", |
" 6005 Crystal CS4281 PCI Audio", |
" 1013 4281 Crystal CS4281 PCI Audio", |
" 10cf 10a8 Crystal CS4281 PCI Audio", |
" 10cf 10a9 Crystal CS4281 PCI Audio", |
" 10cf 10aa Crystal CS4281 PCI Audio", |
" 10cf 10ab Crystal CS4281 PCI Audio", |
" 10cf 10ac Crystal CS4281 PCI Audio", |
" 10cf 10ad Crystal CS4281 PCI Audio", |
" 10cf 10b4 Crystal CS4281 PCI Audio", |
" 1179 0001 Crystal CS4281 PCI Audio", |
" 14c0 000c Crystal CS4281 PCI Audio", |
"1014 IBM", |
" 0002 PCI to MCA Bridge", |
" 0005 Alta Lite", |
" 0007 Alta MP", |
" 000a Fire Coral", |
" 0017 CPU to PCI Bridge", |
" 0018 TR Auto LANstreamer", |
" 001b GXT-150P", |
" 001c Carrera", |
" 001d 82G2675", |
" 0020 GXT1000 Graphics Adapter", |
" 0022 IBM27-82351", |
" 002d Python", |
" 002e SCSI RAID Adapter [ServeRAID]", |
" 1014 002e ServeRAID-3x", |
" 1014 022e ServeRAID-4H", |
" 0031 2 Port Serial Adapter", |
" 1014 0031 2721 WAN IOA - 2 Port Sync Serial Adapter", |
" 0036 Miami", |
" 0037 82660 CPU to PCI Bridge", |
" 003a CPU to PCI Bridge", |
" 003c GXT250P/GXT255P Graphics Adapter", |
" 003e 16/4 Token ring UTP/STP controller", |
" 1014 003e Token-Ring Adapter", |
" 1014 00cd Token-Ring Adapter + Wake-On-LAN", |
" 1014 00ce 16/4 Token-Ring Adapter 2", |
" 1014 00cf 16/4 Token-Ring Adapter Special", |
" 1014 00e4 High-Speed 100/16/4 Token-Ring Adapter", |
" 1014 00e5 16/4 Token-Ring Adapter 2 + Wake-On-LAN", |
" 1014 016d iSeries 2744 Card", |
" 0045 SSA Adapter", |
" 0046 MPIC interrupt controller", |
" 0047 PCI to PCI Bridge", |
" 0048 PCI to PCI Bridge", |
" 0049 Warhead SCSI Controller", |
" 004e ATM Controller (14104e00)", |
" 004f ATM Controller (14104f00)", |
" 0050 ATM Controller (14105000)", |
" 0053 25 MBit ATM Controller", |
" 0054 GXT500P/GXT550P Graphics Adapter", |
" 0057 MPEG PCI Bridge", |
" 005c i82557B 10/100", |
" 005e GXT800P Graphics Adapter", |
" 007c ATM Controller (14107c00)", |
" 007d 3780IDSP [MWave]", |
" 008b EADS PCI to PCI Bridge", |
" 008e GXT3000P Graphics Adapter", |
" 0090 GXT 3000P", |
" 1014 008e GXT-3000P", |
" 0091 SSA Adapter", |
" 0095 20H2999 PCI Docking Bridge", |
" 0096 Chukar chipset SCSI controller", |
" 1014 0097 iSeries 2778 DASD IOA", |
" 1014 0098 iSeries 2763 DASD IOA", |
" 1014 0099 iSeries 2748 DASD IOA", |
" 009f PCI 4758 Cryptographic Accelerator", |
" 00a5 ATM Controller (1410a500)", |
" 00a6 ATM 155MBPS MM Controller (1410a600)", |
" 00b7 256-bit Graphics Rasterizer [Fire GL1]", |
" 1092 00b8 FireGL1 AGP 32Mb", |
" 00b8 GXT2000P Graphics Adapter", |
" 00be ATM 622MBPS Controller (1410be00)", |
" 00dc Advanced Systems Management Adapter (ASMA)", |
" 00fc CPC710 Dual Bridge and Memory Controller (PCI-64)", |
" 0104 Gigabit Ethernet-SX Adapter", |
" 0105 CPC710 Dual Bridge and Memory Controller (PCI-32)", |
" 010f Remote Supervisor Adapter (RSA)", |
" 0142 Yotta Video Compositor Input", |
" 1014 0143 Yotta Input Controller (ytin)", |
" 0144 Yotta Video Compositor Output", |
" 1014 0145 Yotta Output Controller (ytout)", |
" 0156 405GP PLB to PCI Bridge", |
" 015e 622Mbps ATM PCI Adapter", |
" 0160 64bit/66MHz PCI ATM 155 MMF", |
" 016e GXT4000P Graphics Adapter", |
" 0170 GXT6000P Graphics Adapter", |
" 017d GXT300P Graphics Adapter", |
" 0180 Snipe chipset SCSI controller", |
" 1014 0241 iSeries 2757 DASD IOA", |
" 1014 0264 Quad Channel PCI-X U320 SCSI RAID Adapter (2780)", |
" 0188 EADS-X PCI-X to PCI-X Bridge", |
" 01a7 PCI-X to PCI-X Bridge", |
" 01bd ServeRAID Controller", |
" 1014 01be ServeRAID-4M", |
" 1014 01bf ServeRAID-4L", |
" 1014 0208 ServeRAID-4Mx", |
" 1014 020e ServeRAID-4Lx", |
" 1014 022e ServeRAID-4H", |
" 1014 0258 ServeRAID-5i", |
" 1014 0259 ServeRAID-5i", |
" 01c1 64bit/66MHz PCI ATM 155 UTP", |
" 01e6 Cryptographic Accelerator", |
" 01ff 10/100 Mbps Ethernet", |
" 0219 Multiport Serial Adapter", |
" 1014 021a Dual RVX", |
" 1014 0251 Internal Modem/RVX", |
" 1014 0252 Quad Internal Modem", |
" 021b GXT6500P Graphics Adapter", |
" 021c GXT4500P Graphics Adapter", |
" 0233 GXT135P Graphics Adapter", |
" 0266 PCI-X Dual Channel SCSI", |
" 0268 Gigabit Ethernet-SX Adapter (PCI-X)", |
" 0269 10/100/1000 Base-TX Ethernet Adapter (PCI-X)", |
" 028c Citrine chipset SCSI controller", |
" 1014 028d Dual Channel PCI-X DDR SAS RAID Adapter (572E)", |
" 1014 02be Dual Channel PCI-X DDR U320 SCSI RAID Adapter (571B)", |
" 1014 02c0 Dual Channel PCI-X DDR U320 SCSI Adapter (571A)", |
" 1014 030d PCI-X DDR Auxiliary Cache Adapter (575B)", |
" 02a1 Calgary PCI-X Host Bridge", |
" 02bd Obsidian chipset SCSI controller", |
" 1014 02c1 PCI-X DDR 3Gb SAS Adapter (572A/572C)", |
" 1014 02c2 PCI-X DDR 3Gb SAS RAID Adapter (572B/571D)", |
" 0302 Winnipeg PCI-X Host Bridge", |
" 0314 ZISC 036 Neural accelerator card", |
" 3022 QLA3022 Network Adapter", |
" 4022 QLA3022 Network Adapter", |
" ffff MPIC-2 interrupt controller", |
"1015 LSI Logic Corp of Canada", |
"1016 ICL Personal Systems", |
"1017 SPEA Software AG", |
" 5343 SPEA 3D Accelerator", |
"1018 Unisys Systems", |
"1019 Elitegroup Computer Systems", |
"101a AT&T GIS (NCR)", |
" 0005 100VG ethernet", |
"101b Vitesse Semiconductor", |
"101c Western Digital", |
" 0193 33C193A", |
" 0196 33C196A", |
" 0197 33C197A", |
" 0296 33C296A", |
" 3193 7193", |
" 3197 7197", |
" 3296 33C296A", |
" 4296 34C296", |
" 9710 Pipeline 9710", |
" 9712 Pipeline 9712", |
" c24a 90C", |
"101e American Megatrends Inc.", |
" 0009 MegaRAID 428 Ultra RAID Controller (rev 03)", |
" 1960 MegaRAID", |
" 101e 0471 MegaRAID 471 Enterprise 1600 RAID Controller", |
" 101e 0475 MegaRAID 475 Express 500/500LC RAID Controller", |
" 101e 0477 MegaRAID 477 Elite 3100 RAID Controller", |
" 101e 0493 MegaRAID 493 Elite 1600 RAID Controller", |
" 101e 0494 MegaRAID 494 Elite 1650 RAID Controller", |
" 101e 0503 MegaRAID 503 Enterprise 1650 RAID Controller", |
" 101e 0511 MegaRAID 511 i4 IDE RAID Controller", |
" 101e 0522 MegaRAID 522 i4133 RAID Controller", |
" 1028 0471 PowerEdge RAID Controller 3/QC", |
" 1028 0475 PowerEdge RAID Controller 3/SC", |
" 1028 0493 PowerEdge RAID Controller 3/DC", |
" 1028 0511 PowerEdge Cost Effective RAID Controller ATA100/4Ch", |
" 103c 60e7 NetRAID-1M", |
" 9010 MegaRAID 428 Ultra RAID Controller", |
" 9030 EIDE Controller", |
" 9031 EIDE Controller", |
" 9032 EIDE & SCSI Controller", |
" 9033 SCSI Controller", |
" 9040 Multimedia card", |
" 9060 MegaRAID 434 Ultra GT RAID Controller", |
" 9063 MegaRAC", |
" 101e 0767 Dell Remote Assistant Card 2", |
"101f PictureTel", |
"1020 Hitachi Computer Products", |
"1021 OKI Electric Industry Co. Ltd.", |
"1022 Advanced Micro Devices [AMD]", |
" 1100 K8 [Athlon64/Opteron] HyperTransport Technology Configuration", |
" 1101 K8 [Athlon64/Opteron] Address Map", |
" 1102 K8 [Athlon64/Opteron] DRAM Controller", |
" 1103 K8 [Athlon64/Opteron] Miscellaneous Control", |
" 2000 79c970 [PCnet32 LANCE]", |
" 1014 2000 NetFinity 10/100 Fast Ethernet", |
" 1022 2000 PCnet - Fast 79C971", |
" 103c 104c Ethernet with LAN remote power Adapter", |
" 103c 1064 Ethernet with LAN remote power Adapter", |
" 103c 1065 Ethernet with LAN remote power Adapter", |
" 103c 106c Ethernet with LAN remote power Adapter", |
" 103c 106e Ethernet with LAN remote power Adapter", |
" 103c 10ea Ethernet with LAN remote power Adapter", |
" 1113 1220 EN1220 10/100 Fast Ethernet", |
" 1259 2450 AT-2450 10/100 Fast Ethernet", |
" 1259 2454 AT-2450v4 10Mb Ethernet Adapter", |
" 1259 2700 AT-2700TX 10/100 Fast Ethernet", |
" 1259 2701 AT-2700FX 100Mb Ethernet", |
" 1259 2702 AT-2700FTX 10/100 Mb Fiber/Copper Fast Ethernet", |
" 1259 2703 AT-2701FX", |
" 4c53 1000 CC7/CR7/CP7/VC7/VP7/VR7 mainboard", |
" 4c53 1010 CP5/CR6 mainboard", |
" 4c53 1020 VR6 mainboard", |
" 4c53 1030 PC5 mainboard", |
" 4c53 1040 CL7 mainboard", |
" 4c53 1060 PC7 mainboard", |
" 2001 79c978 [HomePNA]", |
" 1092 0a78 Multimedia Home Network Adapter", |
" 1668 0299 ActionLink Home Network Adapter", |
" 2003 Am 1771 MBW [Alchemy]", |
" 2020 53c974 [PCscsi]", |
" 2040 79c974", |
" 2081 Geode LX Video", |
" 2082 Geode LX AES Security Block", |
" 208f CS5536 GeodeLink PCI South Bridge", |
" 2090 CS5536 [Geode companion] ISA", |
" 2091 CS5536 [Geode companion] FLASH", |
" 2093 CS5536 [Geode companion] Audio", |
" 2094 CS5536 [Geode companion] OHC", |
" 2095 CS5536 [Geode companion] EHC", |
" 2096 CS5536 [Geode companion] UDC", |
" 2097 CS5536 [Geode companion] UOC", |
" 209a CS5536 [Geode companion] IDE", |
" 3000 ELanSC520 Microcontroller", |
" 7006 AMD-751 [Irongate] System Controller", |
" 7007 AMD-751 [Irongate] AGP Bridge", |
" 700a AMD-IGR4 AGP Host to PCI Bridge", |
" 700b AMD-IGR4 PCI to PCI Bridge", |
" 700c AMD-760 MP [IGD4-2P] System Controller", |
" 700d AMD-760 MP [IGD4-2P] AGP Bridge", |
" 700e AMD-760 [IGD4-1P] System Controller", |
" 700f AMD-760 [IGD4-1P] AGP Bridge", |
" 7400 AMD-755 [Cobra] ISA", |
" 7401 AMD-755 [Cobra] IDE", |
" 7403 AMD-755 [Cobra] ACPI", |
" 7404 AMD-755 [Cobra] USB", |
" 7408 AMD-756 [Viper] ISA", |
" 7409 AMD-756 [Viper] IDE", |
" 740b AMD-756 [Viper] ACPI", |
" 740c AMD-756 [Viper] USB", |
" 7410 AMD-766 [ViperPlus] ISA", |
" 7411 AMD-766 [ViperPlus] IDE", |
" 7413 AMD-766 [ViperPlus] ACPI", |
" 7414 AMD-766 [ViperPlus] USB", |
" 7440 AMD-768 [Opus] ISA", |
" 1043 8044 A7M-D Mainboard", |
" 7441 AMD-768 [Opus] IDE", |
" 7443 AMD-768 [Opus] ACPI", |
" 1043 8044 A7M-D Mainboard", |
" 7445 AMD-768 [Opus] Audio", |
" 7446 AMD-768 [Opus] MC97 Modem (Smart Link HAMR5600 compatible)", |
" 7448 AMD-768 [Opus] PCI", |
" 7449 AMD-768 [Opus] USB", |
" 7450 AMD-8131 PCI-X Bridge", |
" 7451 AMD-8131 PCI-X IOAPIC", |
" 7454 AMD-8151 System Controller", |
" 7455 AMD-8151 AGP Bridge", |
" 7458 AMD-8132 PCI-X Bridge", |
" 7459 AMD-8132 PCI-X IOAPIC", |
" 7460 AMD-8111 PCI", |
" 161f 3017 HDAMB", |
" 7461 AMD-8111 USB", |
" 7462 AMD-8111 Ethernet", |
" 7464 AMD-8111 USB", |
" 161f 3017 HDAMB", |
" 7468 AMD-8111 LPC", |
" 161f 3017 HDAMB", |
" 7469 AMD-8111 IDE", |
" 1022 2b80 AMD-8111 IDE [Quartet]", |
" 161f 3017 HDAMB", |
" 746a AMD-8111 SMBus 2.0", |
" 746b AMD-8111 ACPI", |
" 161f 3017 HDAMB", |
" 746d AMD-8111 AC97 Audio", |
" 161f 3017 HDAMB", |
" 746e AMD-8111 MC97 Modem", |
" 756b AMD-8111 ACPI", |
"1023 Trident Microsystems", |
" 0194 82C194", |
" 2000 4DWave DX", |
" 2001 4DWave NX", |
" 122d 1400 Trident PCI288-Q3DII (NX)", |
" 2100 CyberBlade XP4m32", |
" 2200 XGI Volari XP5", |
" 8400 CyberBlade/i7", |
" 1023 8400 CyberBlade i7 AGP", |
" 8420 CyberBlade/i7d", |
" 0e11 b15a CyberBlade i7 AGP", |
" 8500 CyberBlade/i1", |
" 8520 CyberBlade i1", |
" 0e11 b16e CyberBlade i1 AGP", |
" 1023 8520 CyberBlade i1 AGP", |
" 8620 CyberBlade/i1", |
" 1014 0502 ThinkPad R30/T30", |
" 1014 1025 Travelmate 352TE", |
" 8820 CyberBlade XPAi1", |
" 9320 TGUI 9320", |
" 9350 GUI Accelerator", |
" 9360 Flat panel GUI Accelerator", |
" 9382 Cyber 9382 [Reference design]", |
" 9383 Cyber 9383 [Reference design]", |
" 9385 Cyber 9385 [Reference design]", |
" 9386 Cyber 9386", |
" 9388 Cyber 9388", |
" 9397 Cyber 9397", |
" 939a Cyber 9397DVD", |
" 9420 TGUI 9420", |
" 9430 TGUI 9430", |
" 9440 TGUI 9440", |
" 9460 TGUI 9460", |
" 9470 TGUI 9470", |
" 9520 Cyber 9520", |
" 9525 Cyber 9525", |
" 10cf 1094 Lifebook C6155", |
" 9540 Cyber 9540", |
" 9660 TGUI 9660/938x/968x", |
" 9680 TGUI 9680", |
" 9682 TGUI 9682", |
" 9683 TGUI 9683", |
" 9685 ProVIDIA 9685", |
" 9750 3DImage 9750", |
" 1014 9750 3DImage 9750", |
" 1023 9750 3DImage 9750", |
" 9753 TGUI 9753", |
" 9754 TGUI 9754", |
" 9759 TGUI 975", |
" 9783 TGUI 9783", |
" 9785 TGUI 9785", |
" 9850 3DImage 9850", |
" 9880 Blade 3D PCI/AGP", |
" 1023 9880 Blade 3D", |
" 9910 CyberBlade/XP", |
" 9930 CyberBlade/XPm", |
"1024 Zenith Data Systems", |
"1025 Acer Incorporated [ALI]", |
" 1435 M1435", |
" 1445 M1445", |
" 1449 M1449", |
" 1451 M1451", |
" 1461 M1461", |
" 1489 M1489", |
" 1511 M1511", |
" 1512 ALI M1512 Aladdin", |
" 1513 M1513", |
" 1521 ALI M1521 Aladdin III CPU Bridge", |
" 10b9 1521 ALI M1521 Aladdin III CPU Bridge", |
" 1523 ALI M1523 ISA Bridge", |
" 10b9 1523 ALI M1523 ISA Bridge", |
" 1531 M1531 Northbridge [Aladdin IV/IV+]", |
" 1533 M1533 PCI-to-ISA Bridge", |
" 10b9 1533 ALI M1533 Aladdin IV/V ISA South Bridge", |
" 1535 M1535 PCI Bridge + Super I/O + FIR", |
" 1541 M1541 Northbridge [Aladdin V]", |
" 10b9 1541 ALI M1541 Aladdin V/V+ AGP+PCI North Bridge", |
" 1542 M1542 Northbridge [Aladdin V]", |
" 1543 M1543 PCI-to-ISA Bridge + Super I/O + FIR", |
" 1561 M1561 Northbridge [Aladdin 7]", |
" 1621 M1621 Northbridge [Aladdin-Pro II]", |
" 1631 M1631 Northbridge+3D Graphics [Aladdin TNT2]", |
" 1641 M1641 Northbridge [Aladdin-Pro IV]", |
" 1647 M1647 [MaGiK1] PCI North Bridge", |
" 1671 M1671 Northbridge [ALADDiN-P4]", |
" 1672 Northbridge [CyberALADDiN-P4]", |
" 3141 M3141", |
" 3143 M3143", |
" 3145 M3145", |
" 3147 M3147", |
" 3149 M3149", |
" 3151 M3151", |
" 3307 M3307 MPEG-I Video Controller", |
" 3309 M3309 MPEG-II Video w/ Software Audio Decoder", |
" 3321 M3321 MPEG-II Audio/Video Decoder", |
" 5212 M4803", |
" 5215 ALI PCI EIDE Controller", |
" 5217 M5217H", |
" 5219 M5219", |
" 5225 M5225", |
" 5229 M5229", |
" 5235 M5235", |
" 5237 M5237 PCI USB Host Controller", |
" 5240 EIDE Controller", |
" 5241 PCMCIA Bridge", |
" 5242 General Purpose Controller", |
" 5243 PCI to PCI Bridge Controller", |
" 5244 Floppy Disk Controller", |
" 5247 M1541 PCI to PCI Bridge", |
" 5251 M5251 P1394 Controller", |
" 5427 PCI to AGP Bridge", |
" 5451 M5451 PCI AC-Link Controller Audio Device", |
" 5453 M5453 PCI AC-Link Controller Modem Device", |
" 7101 M7101 PCI PMU Power Management Controller", |
" 10b9 7101 M7101 PCI PMU Power Management Controller", |
"1028 Dell", |
" 0001 PowerEdge Expandable RAID Controller 2/Si", |
" 1028 0001 PowerEdge 2400", |
" 0002 PowerEdge Expandable RAID Controller 3/Di", |
" 1028 0002 PowerEdge 4400", |
" 0003 PowerEdge Expandable RAID Controller 3/Si", |
" 1028 0003 PowerEdge 2450", |
" 0006 PowerEdge Expandable RAID Controller 3/Di", |
" 0007 Remote Access Card III", |
" 0008 Remote Access Card III", |
" 0009 Remote Access Card III: BMC/SMIC device not present", |
" 000a PowerEdge Expandable RAID Controller 3/Di", |
" 000c Embedded Remote Access or ERA/O", |
" 000d Embedded Remote Access: BMC/SMIC device", |
" 000e PowerEdge Expandable RAID controller 4/Di", |
" 000f PowerEdge Expandable RAID controller 4/Di", |
" 0010 Remote Access Card 4", |
" 0011 Remote Access Card 4 Daughter Card", |
" 0012 Remote Access Card 4 Daughter Card Virtual UART", |
" 0013 PowerEdge Expandable RAID controller 4", |
" 1028 016c PowerEdge Expandable RAID Controller 4e/Si", |
" 1028 016d PowerEdge Expandable RAID Controller 4e/Di", |
" 1028 016e PowerEdge Expandable RAID Controller 4e/Di", |
" 1028 016f PowerEdge Expandable RAID Controller 4e/Di", |
" 1028 0170 PowerEdge Expandable RAID Controller 4e/Di", |
" 0014 Remote Access Card 4 Daughter Card SMIC interface", |
" 0015 PowerEdge Expandable RAID controller 5", |
"1029 Siemens Nixdorf IS", |
"102a LSI Logic", |
" 0000 HYDRA", |
" 0010 ASPEN", |
" 001f AHA-2940U2/U2W /7890/7891 SCSI Controllers", |
" 9005 000f 2940U2W SCSI Controller", |
" 9005 0106 2940U2W SCSI Controller", |
" 9005 a180 2940U2W SCSI Controller", |
" 00c5 AIC-7899 U160/m SCSI Controller", |
" 1028 00c5 PowerEdge 2550/2650/4600", |
" 00cf AIC-7899P U160/m", |
" 1028 0106 PowerEdge 4600", |
" 1028 0121 PowerEdge 2650", |
"102b Matrox Graphics, Inc.", |
" 0010 MGA-I [Impression?]", |
" 0100 MGA 1064SG [Mystique]", |
" 0518 MGA-II [Athena]", |
" 0519 MGA 2064W [Millennium]", |
" 051a MGA 1064SG [Mystique]", |
" 102b 0100 MGA-1064SG Mystique", |
" 102b 1100 MGA-1084SG Mystique", |
" 102b 1200 MGA-1084SG Mystique", |
" 1100 102b MGA-1084SG Mystique", |
" 110a 0018 Scenic Pro C5 (D1025)", |
" 051b MGA 2164W [Millennium II]", |
" 102b 051b MGA-2164W Millennium II", |
" 102b 1100 MGA-2164W Millennium II", |
" 102b 1200 MGA-2164W Millennium II", |
" 051e MGA 1064SG [Mystique] AGP", |
" 051f MGA 2164W [Millennium II] AGP", |
" 0520 MGA G200", |
" 102b dbc2 G200 Multi-Monitor", |
" 102b dbc8 G200 Multi-Monitor", |
" 102b dbe2 G200 Multi-Monitor", |
" 102b dbe8 G200 Multi-Monitor", |
" 102b ff03 Millennium G200 SD", |
" 102b ff04 Marvel G200", |
" 0521 MGA G200 AGP", |
" 1014 ff03 Millennium G200 AGP", |
" 102b 48e9 Mystique G200 AGP", |
" 102b 48f8 Millennium G200 SD AGP", |
" 102b 4a60 Millennium G200 LE AGP", |
" 102b 4a64 Millennium G200 AGP", |
" 102b c93c Millennium G200 AGP", |
" 102b c9b0 Millennium G200 AGP", |
" 102b c9bc Millennium G200 AGP", |
" 102b ca60 Millennium G250 LE AGP", |
" 102b ca6c Millennium G250 AGP", |
" 102b dbbc Millennium G200 AGP", |
" 102b dbc2 Millennium G200 MMS (Dual G200)", |
" 102b dbc3 G200 Multi-Monitor", |
" 102b dbc8 Millennium G200 MMS (Dual G200)", |
" 102b dbd2 G200 Multi-Monitor", |
" 102b dbd3 G200 Multi-Monitor", |
" 102b dbd4 G200 Multi-Monitor", |
" 102b dbd5 G200 Multi-Monitor", |
" 102b dbd8 G200 Multi-Monitor", |
" 102b dbd9 G200 Multi-Monitor", |
" 102b dbe2 Millennium G200 MMS (Quad G200)", |
" 102b dbe3 G200 Multi-Monitor", |
" 102b dbe8 Millennium G200 MMS (Quad G200)", |
" 102b dbf2 G200 Multi-Monitor", |
" 102b dbf3 G200 Multi-Monitor", |
" 102b dbf4 G200 Multi-Monitor", |
" 102b dbf5 G200 Multi-Monitor", |
" 102b dbf8 G200 Multi-Monitor", |
" 102b dbf9 G200 Multi-Monitor", |
" 102b f806 Mystique G200 Video AGP", |
" 102b ff00 MGA-G200 AGP", |
" 102b ff02 Mystique G200 AGP", |
" 102b ff03 Millennium G200 AGP", |
" 102b ff04 Marvel G200 AGP", |
" 110a 0032 MGA-G200 AGP", |
" 0522 MGA G200e [Pilot] ServerEngines (SEP1)", |
" 0525 MGA G400/G450", |
" 0e11 b16f MGA-G400 AGP", |
" 102b 0328 Millennium G400 16Mb SDRAM", |
" 102b 0338 Millennium G400 16Mb SDRAM", |
" 102b 0378 Millennium G400 32Mb SDRAM", |
" 102b 0541 Millennium G450 Dual Head", |
" 102b 0542 Millennium G450 Dual Head LX", |
" 102b 0543 Millennium G450 Single Head LX", |
" 102b 0641 Millennium G450 32Mb SDRAM Dual Head", |
" 102b 0642 Millennium G450 32Mb SDRAM Dual Head LX", |
" 102b 0643 Millennium G450 32Mb SDRAM Single Head LX", |
" 102b 07c0 Millennium G450 Dual Head LE", |
" 102b 07c1 Millennium G450 SDR Dual Head LE", |
" 102b 0d41 Millennium G450 Dual Head PCI", |
" 102b 0d42 Millennium G450 Dual Head LX PCI", |
" 102b 0d43 Millennium G450 32Mb Dual Head PCI", |
" 102b 0e00 Marvel G450 eTV", |
" 102b 0e01 Marvel G450 eTV", |
" 102b 0e02 Marvel G450 eTV", |
" 102b 0e03 Marvel G450 eTV", |
" 102b 0f80 Millennium G450 Low Profile", |
" 102b 0f81 Millennium G450 Low Profile", |
" 102b 0f82 Millennium G450 Low Profile DVI", |
" 102b 0f83 Millennium G450 Low Profile DVI", |
" 102b 19d8 Millennium G400 16Mb SGRAM", |
" 102b 19f8 Millennium G400 32Mb SGRAM", |
" 102b 2159 Millennium G400 Dual Head 16Mb", |
" 102b 2179 Millennium G400 MAX/Dual Head 32Mb", |
" 102b 217d Millennium G400 Dual Head Max", |
" 102b 23c0 Millennium G450", |
" 102b 23c1 Millennium G450", |
" 102b 23c2 Millennium G450 DVI", |
" 102b 23c3 Millennium G450 DVI", |
" 102b 2f58 Millennium G400", |
" 102b 2f78 Millennium G400", |
" 102b 3693 Marvel G400 AGP", |
" 102b 5dd0 4Sight II", |
" 102b 5f50 4Sight II", |
" 102b 5f51 4Sight II", |
" 102b 5f52 4Sight II", |
" 102b 9010 Millennium G400 Dual Head", |
" 1458 0400 GA-G400", |
" 1705 0001 Millennium G450 32MB SGRAM", |
" 1705 0002 Millennium G450 16MB SGRAM", |
" 1705 0003 Millennium G450 32MB", |
" 1705 0004 Millennium G450 16MB", |
" 0527 MGA Parhelia AGP", |
" 102b 0840 Parhelia 128Mb", |
" 102b 0850 Parhelia 256MB AGP 4X", |
" 0528 Parhelia 8X", |
" 102b 1020 Parhelia 128MB", |
" 102b 1030 Parhelia 256 MB Dual DVI", |
" 102b 14e1 Parhelia PCI 256MB", |
" 102b 2021 QID Pro", |
" 0d10 MGA Ultima/Impression", |
" 1000 MGA G100 [Productiva]", |
" 102b ff01 Productiva G100", |
" 102b ff05 Productiva G100 Multi-Monitor", |
" 1001 MGA G100 [Productiva] AGP", |
" 102b 1001 MGA-G100 AGP", |
" 102b ff00 MGA-G100 AGP", |
" 102b ff01 MGA-G100 Productiva AGP", |
" 102b ff03 Millennium G100 AGP", |
" 102b ff04 MGA-G100 AGP", |
" 102b ff05 MGA-G100 Productiva AGP Multi-Monitor", |
" 110a 001e MGA-G100 AGP", |
" 2007 MGA Mistral", |
" 2527 MGA G550 AGP", |
" 102b 0f83 Millennium G550", |
" 102b 0f84 Millennium G550 Dual Head DDR 32Mb", |
" 102b 1e41 Millennium G550", |
" 2537 Millenium P650/P750", |
" 102b 1820 Millennium P750 64MB", |
" 102b 1830 Millennium P650 64MB", |
" 102b 1c10 QID 128MB", |
" 102b 2811 Millennium P650 Low-profile PCI 64MB", |
" 102b 2c11 QID Low-profile PCI", |
" 2538 Millenium P650 PCIe", |
" 102b 08c7 Millennium P650 PCIe 128MB", |
" 102b 0907 Millennium P650 PCIe 64MB", |
" 102b 1047 Millennium P650 LP PCIe 128MB", |
" 102b 1087 Millennium P650 LP PCIe 64MB", |
" 102b 2538 Parhelia APVe", |
" 102b 3007 QID Low-profile PCIe", |
" 4536 VIA Framegrabber", |
" 6573 Shark 10/100 Multiport SwitchNIC", |
"102c Chips and Technologies", |
" 00b8 F64310", |
" 00c0 F69000 HiQVideo", |
" 102c 00c0 F69000 HiQVideo", |
" 4c53 1000 CC7/CR7/CP7/VC7/VP7/VR7 mainboard", |
" 4c53 1010 CP5/CR6 mainboard", |
" 4c53 1020 VR6 mainboard", |
" 4c53 1030 PC5 mainboard", |
" 4c53 1050 CT7 mainboard", |
" 4c53 1051 CE7 mainboard", |
" 00d0 F65545", |
" 00d8 F65545", |
" 00dc F65548", |
" 00e0 F65550", |
" 00e4 F65554", |
" 00e5 F65555 HiQVPro", |
" 0e11 b049 Armada 1700 Laptop Display Controller", |
" 1179 0001 Satellite Pro", |
" 00f0 F68554", |
" 00f4 F68554 HiQVision", |
" 00f5 F68555", |
" 0c30 F69030", |
" 4c53 1000 CC7/CR7/CP7/VC7/VP7/VR7 mainboard", |
" 4c53 1050 CT7 mainboard", |
" 4c53 1051 CE7 mainboard", |
" 4c53 1080 CT8 mainboard", |
"102d Wyse Technology Inc.", |
" 50dc 3328 Audio", |
"102e Olivetti Advanced Technology", |
"102f Toshiba America", |
" 0009 r4x00", |
" 000a TX3927 MIPS RISC PCI Controller", |
" 0020 ATM Meteor 155", |
" 102f 00f8 ATM Meteor 155", |
" 0030 TC35815CF PCI 10/100 Mbit Ethernet Controller", |
" 0031 TC35815CF PCI 10/100 Mbit Ethernet Controller with WOL", |
" 0105 TC86C001 [goku-s] IDE", |
" 0106 TC86C001 [goku-s] USB 1.1 Host", |
" 0107 TC86C001 [goku-s] USB Device Controller", |
" 0108 TC86C001 [goku-s] I2C/SIO/GPIO Controller", |
" 0180 TX4927/38 MIPS RISC PCI Controller", |
" 0181 TX4925 MIPS RISC PCI Controller", |
" 0182 TX4937 MIPS RISC PCI Controller", |
"1030 TMC Research", |
"1031 Miro Computer Products AG", |
" 5601 DC20 ASIC", |
" 5607 Video I/O & motion JPEG compressor", |
" 5631 Media 3D", |
" 6057 MiroVideo DC10/DC30+", |
"1032 Compaq", |
"1033 NEC Corporation", |
" 0000 Vr4181A USB Host or Function Control Unit", |
" 0001 PCI to 486-like bus Bridge", |
" 0002 PCI to VL98 Bridge", |
" 0003 ATM Controller", |
" 0004 R4000 PCI Bridge", |
" 0005 PCI to 486-like bus Bridge", |
" 0006 PC-9800 Graphic Accelerator", |
" 0007 PCI to UX-Bus Bridge", |
" 0008 PC-9800 Graphic Accelerator", |
" 0009 PCI to PC9800 Core-Graph Bridge", |
" 0016 PCI to VL Bridge", |
" 001a [Nile II]", |
" 0021 Vrc4373 [Nile I]", |
" 0029 PowerVR PCX1", |
" 002a PowerVR 3D", |
" 002c Star Alpha 2", |
" 002d PCI to C-bus Bridge", |
" 0035 USB", |
" 1033 0035 Hama USB 2.0 CardBus", |
" 1179 0001 USB", |
" 12ee 7000 Root Hub", |
" 14c2 0105 PTI-205N USB 2.0 Host Controller", |
" 1799 0001 Root Hub", |
" 1931 000a GlobeTrotter Fusion Quad Lite (PPP data)", |
" 1931 000b GlobeTrotter Fusion Quad Lite (GSM data)", |
" 807d 0035 PCI-USB2 (OHCI subsystem)", |
" 003b PCI to C-bus Bridge", |
" 003e NAPCCARD Cardbus Controller", |
" 0046 PowerVR PCX2 [midas]", |
" 005a Vrc5074 [Nile 4]", |
" 0063 Firewarden", |
" 0067 PowerVR Neon 250 Chipset", |
" 1010 0020 PowerVR Neon 250 AGP 32Mb", |
" 1010 0080 PowerVR Neon 250 AGP 16Mb", |
" 1010 0088 PowerVR Neon 250 16Mb", |
" 1010 0090 PowerVR Neon 250 AGP 16Mb", |
" 1010 0098 PowerVR Neon 250 16Mb", |
" 1010 00a0 PowerVR Neon 250 AGP 32Mb", |
" 1010 00a8 PowerVR Neon 250 32Mb", |
" 1010 0120 PowerVR Neon 250 AGP 32Mb", |
" 0072 uPD72874 IEEE1394 OHCI 1.1 3-port PHY-Link Ctrlr", |
" 0074 56k Voice Modem", |
" 1033 8014 RCV56ACF 56k Voice Modem", |
" 009b Vrc5476", |
" 00a5 VRC4173", |
" 00a6 VRC5477 AC97", |
" 00cd IEEE 1394 [OrangeLink] Host Controller", |
" 12ee 8011 Root hub", |
" 00ce IEEE 1394 Host Controller", |
" 00df Vr4131", |
" 00e0 USB 2.0", |
" 12ee 7001 Root hub", |
" 14c2 0205 PTI-205N USB 2.0 Host Controller", |
" 1799 0002 Root Hub", |
" 807d 1043 PCI-USB2 (EHCI subsystem)", |
" 00e7 IEEE 1394 Host Controller", |
" 00f2 uPD72874 IEEE1394 OHCI 1.1 3-port PHY-Link Ctrlr", |
" 00f3 uPD6113x Multimedia Decoder/Processor [EMMA2]", |
" 010c VR7701", |
" 0125 uPD720400 PCI Express - PCI/PCI-X Bridge", |
"1034 Framatome Connectors USA Inc.", |
"1035 Comp. & Comm. Research Lab", |
"1036 Future Domain Corp.", |
" 0000 TMC-18C30 [36C70]", |
"1037 Hitachi Micro Systems", |
"1038 AMP, Inc", |
"1039 Silicon Integrated Systems [SiS]", |
" 0001 Virtual PCI-to-PCI bridge (AGP)", |
" 0002 SG86C202", |
" 0003 SiS AGP Port (virtual PCI-to-PCI bridge)", |
" 0004 PCI-to-PCI bridge", |
" 0006 85C501/2/3", |
" 0008 SiS85C503/5513 (LPC Bridge)", |
" 0009 ACPI", |
" 000a PCI-to-PCI bridge", |
" 0016 SiS961/2 SMBus Controller", |
" 0018 SiS85C503/5513 (LPC Bridge)", |
" 0180 RAID bus controller 180 SATA/PATA [SiS]", |
" 0181 SATA", |
" 0182 182 SATA/RAID Controller", |
" 0190 190 Gigabit Ethernet Adapter", |
" 0191 191 Gigabit Ethernet Adapter", |
" 0200 5597/5598/6326 VGA", |
" 1039 0000 SiS5597 SVGA (Shared RAM)", |
" 0204 82C204", |
" 0205 SG86C205", |
" 0300 300/305 PCI/AGP VGA Display Adapter", |
" 107d 2720 Leadtek WinFast VR300", |
" 0310 315H PCI/AGP VGA Display Adapter", |
" 0315 315 PCI/AGP VGA Display Adapter", |
" 0325 315PRO PCI/AGP VGA Display Adapter", |
" 0330 330 [Xabre] PCI/AGP VGA Display Adapter", |
" 0406 85C501/2", |
" 0496 85C496", |
" 0530 530 Host", |
" 0540 540 Host", |
" 0550 550 Host", |
" 0597 5513C", |
" 0601 85C601", |
" 0620 620 Host", |
" 0630 630 Host", |
" 0633 633 Host", |
" 0635 635 Host", |
" 0645 SiS645 Host & Memory & AGP Controller", |
" 0646 SiS645DX Host & Memory & AGP Controller", |
" 0648 645xx", |
" 0650 650/M650 Host", |
" 0651 651 Host", |
" 0655 655 Host", |
" 0660 660 Host", |
" 0661 661FX/M661FX/M661MX Host", |
" 0730 730 Host", |
" 0733 733 Host", |
" 0735 735 Host", |
" 0740 740 Host", |
" 0741 741/741GX/M741 Host", |
" 0745 745 Host", |
" 0746 746 Host", |
" 0755 755 Host", |
" 0760 760/M760 Host", |
" 0761 761/M761 Host", |
" 0900 SiS900 PCI Fast Ethernet", |
" 1019 0a14 K7S5A motherboard", |
" 1039 0900 SiS900 10/100 Ethernet Adapter", |
" 1043 8035 CUSI-FX motherboard", |
" 0961 SiS961 [MuTIOL Media IO]", |
" 0962 SiS962 [MuTIOL Media IO]", |
" 0963 SiS963 [MuTIOL Media IO]", |
" 0964 SiS964 [MuTIOL Media IO]", |
" 0965 SiS965 [MuTIOL Media IO]", |
" 3602 83C602", |
" 5107 5107", |
" 5300 SiS540 PCI Display Adapter", |
" 5315 550 PCI/AGP VGA Display Adapter", |
" 5401 486 PCI Chipset", |
" 5511 5511/5512", |
" 5513 5513 [IDE]", |
" 1019 0970 P6STP-FL motherboard", |
" 1039 5513 SiS5513 EIDE Controller (A,B step)", |
" 1043 8035 CUSI-FX motherboard", |
" 5517 5517", |
" 5571 5571", |
" 5581 5581 Pentium Chipset", |
" 5582 5582", |
" 5591 5591/5592 Host", |
" 5596 5596 Pentium Chipset", |
" 5597 5597 [SiS5582]", |
" 5600 5600 Host", |
" 6204 Video decoder & MPEG interface", |
" 6205 VGA Controller", |
" 6236 6236 3D-AGP", |
" 6300 630/730 PCI/AGP VGA Display Adapter", |
" 1019 0970 P6STP-FL motherboard", |
" 1043 8035 CUSI-FX motherboard", |
" 6306 530/620 PCI/AGP VGA Display Adapter", |
" 1039 6306 SiS530,620 GUI Accelerator+3D", |
" 6325 65x/M650/740 PCI/AGP VGA Display Adapter", |
" 6326 86C326 5598/6326", |
" 1039 6326 SiS6326 GUI Accelerator", |
" 1092 0a50 SpeedStar A50", |
" 1092 0a70 SpeedStar A70", |
" 1092 4910 SpeedStar A70", |
" 1092 4920 SpeedStar A70", |
" 1569 6326 SiS6326 GUI Accelerator", |
" 6330 661/741/760/761 PCI/AGP VGA Display Adapter", |
" 1039 6330 [M]661xX/[M]741[GX]/[M]760 PCI/AGP VGA Adapter", |
" 7001 USB 1.0 Controller", |
" 1019 0a14 K7S5A motherboard", |
" 1039 7000 Onboard USB Controller", |
" 1462 5470 K7SOM+ 5.2C Motherboard", |
" 7002 USB 2.0 Controller", |
" 1509 7002 Onboard USB Controller", |
" 7007 FireWire Controller", |
" 7012 AC'97 Sound Controller", |
" 15bd 1001 DFI 661FX motherboard", |
" 7013 AC'97 Modem Controller", |
" 7016 SiS7016 PCI Fast Ethernet Adapter", |
" 1039 7016 SiS7016 10/100 Ethernet Adapter", |
" 7018 SiS PCI Audio Accelerator", |
" 1014 01b6 SiS PCI Audio Accelerator", |
" 1014 01b7 SiS PCI Audio Accelerator", |
" 1019 7018 SiS PCI Audio Accelerator", |
" 1025 000e SiS PCI Audio Accelerator", |
" 1025 0018 SiS PCI Audio Accelerator", |
" 1039 7018 SiS PCI Audio Accelerator", |
" 1043 800b SiS PCI Audio Accelerator", |
" 1054 7018 SiS PCI Audio Accelerator", |
" 107d 5330 SiS PCI Audio Accelerator", |
" 107d 5350 SiS PCI Audio Accelerator", |
" 1170 3209 SiS PCI Audio Accelerator", |
" 1462 400a SiS PCI Audio Accelerator", |
" 14a4 2089 SiS PCI Audio Accelerator", |
" 14cd 2194 SiS PCI Audio Accelerator", |
" 14ff 1100 SiS PCI Audio Accelerator", |
" 152d 8808 SiS PCI Audio Accelerator", |
" 1558 1103 SiS PCI Audio Accelerator", |
" 1558 2200 SiS PCI Audio Accelerator", |
" 1563 7018 SiS PCI Audio Accelerator", |
" 15c5 0111 SiS PCI Audio Accelerator", |
" 270f a171 SiS PCI Audio Accelerator", |
" a0a0 0022 SiS PCI Audio Accelerator", |
" 7019 SiS7019 Audio Accelerator", |
"103a Seiko Epson Corporation", |
"103b Tatung Co. of America", |
"103c Hewlett-Packard Company", |
" 002a NX9000 Notebook", |
" 1005 A4977A Visualize EG", |
" 1008 Visualize FX", |
" 1028 Tach TL Fibre Channel Host Adapter", |
" 1029 Tach XL2 Fibre Channel Host Adapter", |
" 107e 000f Interphase 5560 Fibre Channel Adapter", |
" 9004 9210 1Gb/2Gb Family Fibre Channel Controller", |
" 9004 9211 1Gb/2Gb Family Fibre Channel Controller", |
" 102a Tach TS Fibre Channel Host Adapter", |
" 107e 000e Interphase 5540/5541 Fibre Channel Adapter", |
" 9004 9110 1Gb/2Gb Family Fibre Channel Controller", |
" 9004 9111 1Gb/2Gb Family Fibre Channel Controller", |
" 1030 J2585A DeskDirect 10/100VG NIC", |
" 1031 J2585B HP 10/100VG PCI LAN Adapter", |
" 103c 1040 J2973A DeskDirect 10BaseT NIC", |
" 103c 1041 J2585B DeskDirect 10/100VG NIC", |
" 103c 1042 J2970A DeskDirect 10BaseT/2 NIC", |
" 1040 J2973A DeskDirect 10BaseT NIC", |
" 1041 J2585B DeskDirect 10/100 NIC", |
" 1042 J2970A DeskDirect 10BaseT/2 NIC", |
" 1048 Diva Serial [GSP] Multiport UART", |
" 103c 1049 Tosca Console", |
" 103c 104a Tosca Secondary", |
" 103c 104b Maestro SP2", |
" 103c 1223 Superdome Console", |
" 103c 1226 Keystone SP2", |
" 103c 1227 Powerbar SP2", |
" 103c 1282 Everest SP2", |
" 103c 1301 Diva RMP3", |
" 1054 PCI Local Bus Adapter", |
" 1064 79C970 PCnet Ethernet Controller", |
" 108b Visualize FXe", |
" 10c1 NetServer Smart IRQ Router", |
" 10ed TopTools Remote Control", |
" 10f0 rio System Bus Adapter", |
" 10f1 rio I/O Controller", |
" 1200 82557B 10/100 NIC", |
" 1219 NetServer PCI Hot-Plug Controller", |
" 121a NetServer SMIC Controller", |
" 121b NetServer Legacy COM Port Decoder", |
" 121c NetServer PCI COM Port Decoder", |
" 1229 zx1 System Bus Adapter", |
" 122a zx1 I/O Controller", |
" 122e zx1 Local Bus Adapter", |
" 127c sx1000 I/O Controller", |
" 1290 Auxiliary Diva Serial Port", |
" 1291 Auxiliary Diva Serial Port", |
" 12b4 zx1 QuickSilver AGP8x Local Bus Adapter", |
" 12f8 Broadcom BCM4306 802.11b/g Wireless LAN", |
" 12fa BCM4306 802.11b/g Wireless LAN Controller", |
" 2910 E2910A PCIBus Exerciser", |
" 2925 E2925A 32 Bit, 33 MHzPCI Exerciser & Analyzer", |
" 3080 Pavilion ze2028ea", |
" 3085 Realtek RTL8139/8139C/8139C+", |
" 3220 Hewlett-Packard Smart Array P600", |
" 3230 Hewlett-Packard Smart Array Controller", |
"103e Solliday Engineering", |
"103f Synopsys/Logic Modeling Group", |
"1040 Accelgraphics Inc.", |
"1041 Computrend", |
"1042 Micron", |
" 1000 PC Tech RZ1000", |
" 1001 PC Tech RZ1001", |
" 3000 Samurai_0", |
" 3010 Samurai_1", |
" 3020 Samurai_IDE", |
"1043 ASUSTeK Computer Inc.", |
" 0675 ISDNLink P-IN100-ST-D", |
" 0675 1704 ISDN Adapter (PCI Bus, D, C)", |
" 0675 1707 ISDN Adapter (PCI Bus, DV, W)", |
" 10cf 105e ISDN Adapter (PCI Bus, DV, W)", |
" 0c11 A7N8X Motherboard nForce2 IDE/USB/SMBus", |
" 4015 v7100 SDRAM [GeForce2 MX]", |
" 4021 v7100 Combo Deluxe [GeForce2 MX + TV tuner]", |
" 4057 v8200 GeForce 3", |
" 8043 v8240 PAL 128M [P4T] Motherboard", |
" 807b v9280/TD [Geforce4 TI4200 8X With TV-Out and DVI]", |
" 8095 A7N8X Motherboard nForce2 AC97 Audio", |
" 80ac A7N8X Motherboard nForce2 AGP/Memory", |
" 80bb v9180 Magic/T [GeForce4 MX440 AGP 8x 64MB TV-out]", |
" 80c5 nForce3 chipset motherboard [SK8N]", |
" 80df v9520 Magic/T", |
" 8187 802.11a/b/g Wireless LAN Card", |
" 8188 Tiger Hybrid TV Capture Device", |
"1044 Adaptec (formerly DPT)", |
" 1012 Domino RAID Engine", |
" a400 SmartCache/Raid I-IV Controller", |
" a500 PCI Bridge", |
" a501 SmartRAID V Controller", |
" 1044 c001 PM1554U2 Ultra2 Single Channel", |
" 1044 c002 PM1654U2 Ultra2 Single Channel", |
" 1044 c003 PM1564U3 Ultra3 Single Channel", |
" 1044 c004 PM1564U3 Ultra3 Dual Channel", |
" 1044 c005 PM1554U2 Ultra2 Single Channel (NON ACPI)", |
" 1044 c00a PM2554U2 Ultra2 Single Channel", |
" 1044 c00b PM2654U2 Ultra2 Single Channel", |
" 1044 c00c PM2664U3 Ultra3 Single Channel", |
" 1044 c00d PM2664U3 Ultra3 Dual Channel", |
" 1044 c00e PM2554U2 Ultra2 Single Channel (NON ACPI)", |
" 1044 c00f PM2654U2 Ultra2 Single Channel (NON ACPI)", |
" 1044 c014 PM3754U2 Ultra2 Single Channel (NON ACPI)", |
" 1044 c015 PM3755U2B Ultra2 Single Channel (NON ACPI)", |
" 1044 c016 PM3755F Fibre Channel (NON ACPI)", |
" 1044 c01e PM3757U2 Ultra2 Single Channel", |
" 1044 c01f PM3757U2 Ultra2 Dual Channel", |
" 1044 c020 PM3767U3 Ultra3 Dual Channel", |
" 1044 c021 PM3767U3 Ultra3 Quad Channel", |
" 1044 c028 PM2865U3 Ultra3 Single Channel", |
" 1044 c029 PM2865U3 Ultra3 Dual Channel", |
" 1044 c02a PM2865F Fibre Channel", |
" 1044 c03c 2000S Ultra3 Single Channel", |
" 1044 c03d 2000S Ultra3 Dual Channel", |
" 1044 c03e 2000F Fibre Channel", |
" 1044 c046 3000S Ultra3 Single Channel", |
" 1044 c047 3000S Ultra3 Dual Channel", |
" 1044 c048 3000F Fibre Channel", |
" 1044 c050 5000S Ultra3 Single Channel", |
" 1044 c051 5000S Ultra3 Dual Channel", |
" 1044 c052 5000F Fibre Channel", |
" 1044 c05a 2400A UDMA Four Channel", |
" 1044 c05b 2400A UDMA Four Channel DAC", |
" 1044 c064 3010S Ultra3 Dual Channel", |
" 1044 c065 3410S Ultra160 Four Channel", |
" 1044 c066 3010S Fibre Channel", |
" a511 SmartRAID V Controller", |
" 1044 c032 ASR-2005S I2O Zero Channel", |
" 1044 c035 ASR-2010S I2O Zero Channel", |
"1045 OPTi Inc.", |
" a0f8 82C750 [Vendetta] USB Controller", |
" c101 92C264", |
" c178 92C178", |
" c556 82X556 [Viper]", |
" c557 82C557 [Viper-M]", |
" c558 82C558 [Viper-M ISA+IDE]", |
" c567 82C750 [Vendetta], device 0", |
" c568 82C750 [Vendetta], device 1", |
" c569 82C579 [Viper XPress+ Chipset]", |
" c621 82C621 [Viper-M/N+]", |
" c700 82C700 [FireStar]", |
" c701 82C701 [FireStar Plus]", |
" c814 82C814 [Firebridge 1]", |
" c822 82C822", |
" c824 82C824", |
" c825 82C825 [Firebridge 2]", |
" c832 82C832", |
" c861 82C861", |
" c895 82C895", |
" c935 EV1935 ECTIVA MachOne PCIAudio", |
" d568 82C825 [Firebridge 2]", |
" d721 IDE [FireStar]", |
"1046 IPC Corporation, Ltd.", |
"1047 Genoa Systems Corp", |
"1048 Elsa AG", |
" 0c60 Gladiac MX", |
" 0d22 Quadro4 900XGL [ELSA GLoria4 900XGL]", |
" 1000 QuickStep 1000", |
" 3000 QuickStep 3000", |
" 8901 Gloria XL", |
" 1048 0935 GLoria XL (Virge)", |
"1049 Fountain Technologies, Inc.", |
"104a STMicroelectronics", |
" 0008 STG 2000X", |
" 0009 STG 1764X", |
" 0010 STG4000 [3D Prophet Kyro Series]", |
" 0209 STPC Consumer/Industrial North- and Southbridge", |
" 020a STPC Atlas/ConsumerS/Consumer IIA Northbridge", |
" 0210 STPC Atlas ISA Bridge", |
" 021a STPC Consumer S Southbridge", |
" 021b STPC Consumer IIA Southbridge", |
" 0500 ST70137 [Unicorn] ADSL DMT Transceiver", |
" 0564 STPC Client Northbridge", |
" 0981 21x4x DEC-Tulip compatible 10/100 Ethernet", |
" 1746 STG 1764X", |
" 2774 21x4x DEC-Tulip compatible 10/100 Ethernet", |
" 3520 MPEG-II decoder card", |
" 55cc STPC Client Southbridge", |
"104b BusLogic", |
" 0140 BT-946C (old) [multimaster 01]", |
" 1040 BT-946C (BA80C30) [MultiMaster 10]", |
" 8130 Flashpoint LT", |
"104c Texas Instruments", |
" 0500 100 MBit LAN Controller", |
" 0508 TMS380C2X Compressor Interface", |
" 1000 Eagle i/f AS", |
" 104c PCI1510 PC card Cardbus Controller", |
" 3d04 TVP4010 [Permedia]", |
" 3d07 TVP4020 [Permedia 2]", |
" 1011 4d10 Comet", |
" 1040 000f AccelStar II", |
" 1040 0011 AccelStar II", |
" 1048 0a31 WINNER 2000", |
" 1048 0a32 GLoria Synergy", |
" 1048 0a34 GLoria Synergy", |
" 1048 0a35 GLoria Synergy", |
" 1048 0a36 GLoria Synergy", |
" 1048 0a43 GLoria Synergy", |
" 1048 0a44 GLoria Synergy", |
" 107d 2633 WinFast 3D L2300", |
" 1092 0127 FIRE GL 1000 PRO", |
" 1092 0136 FIRE GL 1000 PRO", |
" 1092 0141 FIRE GL 1000 PRO", |
" 1092 0146 FIRE GL 1000 PRO", |
" 1092 0148 FIRE GL 1000 PRO", |
" 1092 0149 FIRE GL 1000 PRO", |
" 1092 0152 FIRE GL 1000 PRO", |
" 1092 0154 FIRE GL 1000 PRO", |
" 1092 0155 FIRE GL 1000 PRO", |
" 1092 0156 FIRE GL 1000 PRO", |
" 1092 0157 FIRE GL 1000 PRO", |
" 1097 3d01 Jeronimo Pro", |
" 1102 100f Graphics Blaster Extreme", |
" 3d3d 0100 Reference Permedia 2 3D", |
" 8000 PCILynx/PCILynx2 IEEE 1394 Link Layer Controller", |
" e4bf 1010 CF1-1-SNARE", |
" e4bf 1020 CF1-2-SNARE", |
" 8009 FireWire Controller", |
" 104d 8032 8032 OHCI i.LINK (IEEE 1394) Controller", |
" 8017 PCI4410 FireWire Controller", |
" 8019 TSB12LV23 IEEE-1394 Controller", |
" 11bd 000a Studio DV500-1394", |
" 11bd 000e Studio DV", |
" e4bf 1010 CF2-1-CYMBAL", |
" 8020 TSB12LV26 IEEE-1394 Controller (Link)", |
" 11bd 000f Studio DV500-1394", |
" 8021 TSB43AA22 IEEE-1394 Controller (PHY/Link Integrated)", |
" 104d 80df Vaio PCG-FX403", |
" 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP", |
" 8022 TSB43AB22 IEEE-1394a-2000 Controller (PHY/Link)", |
" 8023 TSB43AB22/A IEEE-1394a-2000 Controller (PHY/Link)", |
" 103c 088c NC8000 laptop", |
" 1043 808b K8N4-E Mainboard", |
" 8024 TSB43AB23 IEEE-1394a-2000 Controller (PHY/Link)", |
" 8025 TSB82AA2 IEEE-1394b Link Layer Controller", |
" 1458 1000 GA-K8N Ultra-9 Mainboard", |
" 8026 TSB43AB21 IEEE-1394a-2000 Controller (PHY/Link)", |
" 1025 003c Aspire 2001WLCi (Compaq CL50 motherboard)", |
" 103c 006a NX9500", |
" 1043 808d A7V333 mainboard.", |
" 8027 PCI4451 IEEE-1394 Controller", |
" 1028 00e6 PCI4451 IEEE-1394 Controller (Dell Inspiron 8100)", |
" 8029 PCI4510 IEEE-1394 Controller", |
" 1028 0163 Latitude D505", |
" 1028 0196 Inspiron 5160", |
" 1071 8160 MIM2900", |
" 802b PCI7410,7510,7610 OHCI-Lynx Controller", |
" 1028 0139 Latitude D400", |
" 1028 014e PCI7410,7510,7610 OHCI-Lynx Controller (Dell Latitude D800)", |
" 802e PCI7x20 1394a-2000 OHCI Two-Port PHY/Link-Layer Controller", |
" 8031 PCIxx21/x515 Cardbus Controller", |
" 1025 0080 Aspire 5024WLMi", |
" 103c 099c NX6110/NC6120", |
" 103c 308b MX6125", |
" 8032 OHCI Compliant IEEE 1394 Host Controller", |
" 1025 0080 Aspire 5024WLMi", |
" 103c 099c NX6110/NC6120", |
" 103c 308b MX6125", |
" 8033 PCIxx21 Integrated FlashMedia Controller", |
" 1025 0080 Aspire 5024WLMi", |
" 103c 099c NX6110/NC6120", |
" 103c 308b MX6125", |
" 8034 PCI6411, PCI6421, PCI6611, PCI6621, PCI7411, PCI7421, PCI7611, PCI7621 Secure Digital (SD) Controller", |
" 1025 0080 Aspire 5024WLMi", |
" 103c 099c NX6110/NC6120", |
" 103c 308b MX6125", |
" 8035 PCI6411, PCI6421, PCI6611, PCI6621, PCI7411, PCI7421, PCI7611, PCI7621 Smart Card Controller (SMC)", |
" 103c 099c NX6110/NC6120", |
" 8036 PCI6515 Cardbus Controller", |
" 8038 PCI6515 SmartCard Controller", |
" 803b 5-in-1 Multimedia Card Reader (SD/MMC/MS/MS PRO/xD)", |
" 8201 PCI1620 Firmware Loading Function", |
" 8204 PCI7410,7510,7610 PCI Firmware Loading Function", |
" 1028 0139 Latitude D400", |
" 1028 014e Latitude D800", |
" 8231 XIO2000(A)/XIO2200 PCI Express-to-PCI Bridge", |
" 8235 XIO2200 IEEE-1394a-2000 Controller (PHY/Link)", |
" 8400 ACX 100 22Mbps Wireless Interface", |
" 1186 3b00 DWL-650+ PC Card cardbus 22Mbs Wireless Adapter [AirPlus]", |
" 1186 3b01 DWL-520+ 22Mbps PCI Wireless Adapter", |
" 16ab 8501 WL-8305 IEEE802.11b+ Wireless LAN PCI Adapter", |
" 8401 ACX 100 22Mbps Wireless Interface", |
" 9000 Wireless Interface (of unknown type)", |
" 9065 TMS320DM642", |
" 9066 ACX 111 54Mbps Wireless Interface", |
" 104c 9066 Trendnet TEW-421PC Wireless PCI Adapter", |
" 1186 3b04 DWL-G520+ Wireless PCI Adapter", |
" 1186 3b05 DWL-G650+ AirPlusG+ CardBus Wireless LAN", |
" 13d1 aba0 SWLMP-54108 108Mbps Wireless mini PCI card 802.11g+", |
" 1737 0033 WPC54G Ver.2 802.11G PC Card", |
" a001 TDC1570", |
" a100 TDC1561", |
" a102 TNETA1575 HyperSAR Plus w/PCI Host i/f & UTOPIA i/f", |
" a106 TMS320C6414 TMS320C6415 TMS320C6416", |
" 175c 5000 ASI50xx Audio Adapter", |
" 175c 6400 ASI6400 Cobranet series", |
" 175c 8700 ASI87xx Radio Tuner card", |
" ac10 PCI1050", |
" ac11 PCI1053", |
" ac12 PCI1130", |
" ac13 PCI1031", |
" ac15 PCI1131", |
" ac16 PCI1250", |
" 1014 0092 ThinkPad 600", |
" ac17 PCI1220", |
" ac18 PCI1260", |
" ac19 PCI1221", |
" ac1a PCI1210", |
" ac1b PCI1450", |
" 0e11 b113 Armada M700", |
" 1014 0130 Thinkpad T20/T22/A21m", |
" ac1c PCI1225", |
" 0e11 b121 Armada E500", |
" 1028 0088 Latitude CPi A400XT", |
" ac1d PCI1251A", |
" ac1e PCI1211", |
" ac1f PCI1251B", |
" ac20 TI 2030", |
" ac21 PCI2031", |
" ac22 PCI2032 PCI Docking Bridge", |
" ac23 PCI2250 PCI-to-PCI Bridge", |
" ac28 PCI2050 PCI-to-PCI Bridge", |
" ac30 PCI1260 PC card Cardbus Controller", |
" ac40 PCI4450 PC card Cardbus Controller", |
" ac41 PCI4410 PC card Cardbus Controller", |
" ac42 PCI4451 PC card Cardbus Controller", |
" 1028 00e6 PCI4451 PC card CardBus Controller (Dell Inspiron 8100)", |
" ac44 PCI4510 PC card Cardbus Controller", |
" 1028 0163 Latitude D505", |
" 1028 0196 Inspiron 5160", |
" 1071 8160 MIM2000", |
" ac46 PCI4520 PC card Cardbus Controller", |
" ac47 PCI7510 PC card Cardbus Controller", |
" 1028 0139 Latitude D400", |
" 1028 013f Precision M60", |
" 1028 014e Latitude D800", |
" ac4a PCI7510,7610 PC card Cardbus Controller", |
" 1028 0139 Latitude D400", |
" 1028 014e Latitude D800", |
" ac50 PCI1410 PC card Cardbus Controller", |
" ac51 PCI1420", |
" 0e11 004e Evo N600c", |
" 1014 0148 ThinkPad A20m", |
" 1014 023b ThinkPad T23 (2647-4MG)", |
" 1028 00b1 Latitude C600", |
" 1028 012a Latitude C640", |
" 1033 80cd Versa Note VXi", |
" 1095 10cf Fujitsu-Siemens LifeBook C Series", |
" 10cf 1095 Lifebook S-4510/C6155", |
" e4bf 1000 CP2-2-HIPHOP", |
" ac52 PCI1451 PC card Cardbus Controller", |
" ac53 PCI1421 PC card Cardbus Controller", |
" ac54 PCI1620 PC Card Controller", |
" ac55 PCI1520 PC card Cardbus Controller", |
" 1014 0512 ThinkPad T30/T40", |
" ac56 PCI1510 PC card Cardbus Controller", |
" 1014 0528 ThinkPad R40e (2684-HVG) Cardbus Controller", |
" ac60 PCI2040 PCI to DSP Bridge Controller", |
" 175c 5100 ASI51xx Audio Adapter", |
" 175c 6100 ASI61xx Audio Adapter", |
" 175c 6200 ASI62xx Audio Adapter", |
" 175c 8800 ASI88xx Audio Adapter", |
" ac8d PCI 7620", |
" ac8e PCI7420 CardBus Controller", |
" ac8f PCI7420/PCI7620 Dual Socket CardBus and Smart Card Cont. w/ 1394a-2000 OHCI Two-Port PHY/Link-Layer Cont. and SD/MS-Pro Sockets", |
" fe00 FireWire Host Controller", |
" fe03 12C01A FireWire Host Controller", |
"104d Sony Corporation", |
" 8004 DTL-H2500 [Playstation development board]", |
" 8009 CXD1947Q i.LINK Controller", |
" 8039 CXD3222 i.LINK Controller", |
" 8056 Rockwell HCF 56K modem", |
" 808a Memory Stick Controller", |
"104e Oak Technology, Inc", |
" 0017 OTI-64017", |
" 0107 OTI-107 [Spitfire]", |
" 0109 Video Adapter", |
" 0111 OTI-64111 [Spitfire]", |
" 0217 OTI-64217", |
" 0317 OTI-64317", |
"104f Co-time Computer Ltd", |
"1050 Winbond Electronics Corp", |
" 0000 NE2000", |
" 0001 W83769F", |
" 0033 W89C33D 802.11 a/b/g BB/MAC", |
" 0105 W82C105", |
" 0840 W89C840", |
" 1050 0001 W89C840 Ethernet Adapter", |
" 1050 0840 W89C840 Ethernet Adapter", |
" 0940 W89C940", |
" 5a5a W89C940F", |
" 6692 W6692", |
" 1043 1702 ISDN Adapter (PCI Bus, D, W)", |
" 1043 1703 ISDN Adapter (PCI Bus, DV, W)", |
" 1043 1707 ISDN Adapter (PCI Bus, DV, W)", |
" 144f 1702 ISDN Adapter (PCI Bus, D, W)", |
" 144f 1703 ISDN Adapter (PCI Bus, DV, W)", |
" 144f 1707 ISDN Adapter (PCI Bus, DV, W)", |
" 9921 W99200F MPEG-1 Video Encoder", |
" 9922 W99200F/W9922PF MPEG-1/2 Video Encoder", |
" 9970 W9970CF", |
"1051 Anigma, Inc.", |
"1052 ?Young Micro Systems", |
"1053 Young Micro Systems", |
"1054 Hitachi, Ltd", |
"1055 Efar Microsystems", |
" 9130 SLC90E66 [Victory66] IDE", |
" 9460 SLC90E66 [Victory66] ISA", |
" 9462 SLC90E66 [Victory66] USB", |
" 9463 SLC90E66 [Victory66] ACPI", |
"1056 ICL", |
"1057 Motorola", |
" 0001 MPC105 [Eagle]", |
" 0002 MPC106 [Grackle]", |
" 0003 MPC8240 [Kahlua]", |
" 0004 MPC107", |
" 0006 MPC8245 [Unity]", |
" 0008 MPC8540", |
" 0009 MPC8560", |
" 0100 MC145575 [HFC-PCI]", |
" 0431 KTI829c 100VG", |
" 1801 DSP56301 Digital Signal Processor", |
" 14fb 0101 Transas Radar Imitator Board [RIM]", |
" 14fb 0102 Transas Radar Imitator Board [RIM-2]", |
" 14fb 0202 Transas Radar Integrator Board [RIB-2]", |
" 14fb 0611 1 channel CAN bus Controller [CanPci-1]", |
" 14fb 0612 2 channels CAN bus Controller [CanPci-2]", |
" 14fb 0613 3 channels CAN bus Controller [CanPci-3]", |
" 14fb 0614 4 channels CAN bus Controller [CanPci-4]", |
" 14fb 0621 1 channel CAN bus Controller [CanPci2-1]", |
" 14fb 0622 2 channels CAN bus Controller [CanPci2-2]", |
" 14fb 0810 Transas VTS Radar Integrator Board [RIB-4]", |
" 175c 4200 ASI4215 Audio Adapter", |
" 175c 4300 ASI43xx Audio Adapter", |
" 175c 4400 ASI4401 Audio Adapter", |
" ecc0 0010 Darla", |
" ecc0 0020 Gina", |
" ecc0 0030 Layla rev.0", |
" ecc0 0031 Layla rev.1", |
" ecc0 0040 Darla24 rev.0", |
" ecc0 0041 Darla24 rev.1", |
" ecc0 0050 Gina24 rev.0", |
" ecc0 0051 Gina24 rev.1", |
" ecc0 0070 Mona rev.0", |
" ecc0 0071 Mona rev.1", |
" ecc0 0072 Mona rev.2", |
" 18c0 MPC8265A/8266/8272", |
" 18c1 MPC8271/MPC8272", |
" 3410 DSP56361 Digital Signal Processor", |
" ecc0 0050 Gina24 rev.0", |
" ecc0 0051 Gina24 rev.1", |
" ecc0 0060 Layla24", |
" ecc0 0070 Mona rev.0", |
" ecc0 0071 Mona rev.1", |
" ecc0 0072 Mona rev.2", |
" ecc0 0080 Mia rev.0", |
" ecc0 0081 Mia rev.1", |
" ecc0 0090 Indigo", |
" ecc0 00a0 Indigo IO", |
" ecc0 00b0 Indigo DJ", |
" ecc0 0100 3G", |
" 4801 Raven", |
" 4802 Falcon", |
" 4803 Hawk", |
" 4806 CPX8216", |
" 4d68 20268", |
" 5600 SM56 PCI Modem", |
" 1057 0300 SM56 PCI Speakerphone Modem", |
" 1057 0301 SM56 PCI Voice Modem", |
" 1057 0302 SM56 PCI Fax Modem", |
" 1057 5600 SM56 PCI Voice modem", |
" 13d2 0300 SM56 PCI Speakerphone Modem", |
" 13d2 0301 SM56 PCI Voice modem", |
" 13d2 0302 SM56 PCI Fax Modem", |
" 1436 0300 SM56 PCI Speakerphone Modem", |
" 1436 0301 SM56 PCI Voice modem", |
" 1436 0302 SM56 PCI Fax Modem", |
" 144f 100c SM56 PCI Fax Modem", |
" 1494 0300 SM56 PCI Speakerphone Modem", |
" 1494 0301 SM56 PCI Voice modem", |
" 14c8 0300 SM56 PCI Speakerphone Modem", |
" 14c8 0302 SM56 PCI Fax Modem", |
" 1668 0300 SM56 PCI Speakerphone Modem", |
" 1668 0302 SM56 PCI Fax Modem", |
" 5608 Wildcard X100P", |
" 5803 MPC5200", |
" 5806 MCF54 Coldfire", |
" 5808 MPC8220", |
" 5809 MPC5200B", |
" 6400 MPC190 Security Processor (S1 family, encryption)", |
" 6405 MPC184 Security Processor (S1 family)", |
"1058 Electronics & Telecommunications RSH", |
"1059 Teknor Industrial Computers Inc", |
"105a Promise Technology, Inc.", |
" 0d30 PDC20265 (FastTrak100 Lite/Ultra100)", |
" 105a 4d33 Ultra100", |
" 0d38 20263", |
" 105a 4d39 Fasttrak66", |
" 1275 20275", |
" 3318 PDC20318 (SATA150 TX4)", |
" 3319 PDC20319 (FastTrak S150 TX4)", |
" 8086 3427 S875WP1-E mainboard", |
" 3371 PDC20371 (FastTrak S150 TX2plus)", |
" 3373 PDC20378 (FastTrak 378/SATA 378)", |
" 1043 80f5 K8V Deluxe/PC-DL Deluxe motherboard", |
" 1462 702e K8T NEO FIS2R motherboard", |
" 3375 PDC20375 (SATA150 TX2plus)", |
" 3376 PDC20376 (FastTrak 376)", |
" 1043 809e A7V8X motherboard", |
" 3515 PDC40719 [FastTrak TX4300/TX4310]", |
" 3519 PDC40519 (FastTrak TX4200)", |
" 3570 20771 (FastTrak TX2300)", |
" 3571 PDC20571 (FastTrak TX2200)", |
" 3574 PDC20579 SATAII 150 IDE Controller", |
" 3577 PDC40779 (SATA 300 779)", |
" 3d17 PDC40718 (SATA 300 TX4)", |
" 3d18 PDC20518/PDC40518 (SATAII 150 TX4)", |
" 3d73 PDC40775 (SATA 300 TX2plus)", |
" 3d75 PDC20575 (SATAII150 TX2plus)", |
" 4d30 PDC20267 (FastTrak100/Ultra100)", |
" 105a 4d33 Ultra100", |
" 105a 4d39 FastTrak100", |
" 4d33 20246", |
" 105a 4d33 20246 IDE Controller", |
" 4d38 PDC20262 (FastTrak66/Ultra66)", |
" 105a 4d30 Ultra Device on SuperTrak", |
" 105a 4d33 Ultra66", |
" 105a 4d39 FastTrak66", |
" 4d68 PDC20268 (Ultra100 TX2)", |
" 105a 4d68 Ultra100TX2", |
" 4d69 20269", |
" 105a 4d68 Ultra133TX2", |
" 5275 PDC20276 (MBFastTrak133 Lite)", |
" 1043 807e A7V333 motherboard.", |
" 105a 0275 SuperTrak SX6000 IDE", |
" 105a 1275 MBFastTrak133 Lite (tm) Controller (RAID mode)", |
" 1458 b001 MBUltra 133", |
" 5300 DC5300", |
" 6268 PDC20270 (FastTrak100 LP/TX2/TX4)", |
" 105a 4d68 FastTrak100 TX2", |
" 6269 PDC20271 (FastTrak TX2000)", |
" 105a 6269 FastTrak TX2/TX2000", |
" 6621 PDC20621 (FastTrak S150 SX4/FastTrak SX4000 lite)", |
" 6622 PDC20621 [SATA150 SX4] 4 Channel IDE RAID Controller", |
" 6624 PDC20621 [FastTrak SX4100]", |
" 6626 PDC20618 (Ultra 618)", |
" 6629 PDC20619 (FastTrak TX4000)", |
" 7275 PDC20277 (SBFastTrak133 Lite)", |
" 8002 SATAII150 SX8", |
"105b Foxconn International, Inc.", |
"105c Wipro Infotech Limited", |
"105d Number 9 Computer Company", |
" 2309 Imagine 128", |
" 2339 Imagine 128-II", |
" 105d 0000 Imagine 128 series 2 4Mb VRAM", |
" 105d 0001 Imagine 128 series 2 4Mb VRAM", |
" 105d 0002 Imagine 128 series 2 4Mb VRAM", |
" 105d 0003 Imagine 128 series 2 4Mb VRAM", |
" 105d 0004 Imagine 128 series 2 4Mb VRAM", |
" 105d 0005 Imagine 128 series 2 4Mb VRAM", |
" 105d 0006 Imagine 128 series 2 4Mb VRAM", |
" 105d 0007 Imagine 128 series 2 4Mb VRAM", |
" 105d 0008 Imagine 128 series 2e 4Mb DRAM", |
" 105d 0009 Imagine 128 series 2e 4Mb DRAM", |
" 105d 000a Imagine 128 series 2 8Mb VRAM", |
" 105d 000b Imagine 128 series 2 8Mb H-VRAM", |
" 11a4 000a Barco Metheus 5 Megapixel", |
" 13cc 0000 Barco Metheus 5 Megapixel", |
" 13cc 0004 Barco Metheus 5 Megapixel", |
" 13cc 0005 Barco Metheus 5 Megapixel", |
" 13cc 0006 Barco Metheus 5 Megapixel", |
" 13cc 0008 Barco Metheus 5 Megapixel", |
" 13cc 0009 Barco Metheus 5 Megapixel", |
" 13cc 000a Barco Metheus 5 Megapixel", |
" 13cc 000c Barco Metheus 5 Megapixel", |
" 493d Imagine 128 T2R [Ticket to Ride]", |
" 11a4 000a Barco Metheus 5 Megapixel, Dual Head", |
" 11a4 000b Barco Metheus 5 Megapixel, Dual Head", |
" 13cc 0002 Barco Metheus 4 Megapixel, Dual Head", |
" 13cc 0003 Barco Metheus 5 Megapixel, Dual Head", |
" 13cc 0007 Barco Metheus 5 Megapixel, Dual Head", |
" 13cc 0008 Barco Metheus 5 Megapixel, Dual Head", |
" 13cc 0009 Barco Metheus 5 Megapixel, Dual Head", |
" 13cc 000a Barco Metheus 5 Megapixel, Dual Head", |
" 5348 Revolution 4", |
" 105d 0037 Revolution IV-FP AGP (For SGI 1600SW)", |
" 11a4 0028 PVS5600M", |
" 11a4 0038 PVS5600D", |
"105e Vtech Computers Ltd", |
"105f Infotronic America Inc", |
"1060 United Microelectronics [UMC]", |
" 0001 UM82C881", |
" 0002 UM82C886", |
" 0101 UM8673F", |
" 0881 UM8881", |
" 0886 UM8886F", |
" 0891 UM8891A", |
" 1001 UM886A", |
" 673a UM8886BF", |
" 673b EIDE Master/DMA", |
" 8710 UM8710", |
" 886a UM8886A", |
" 8881 UM8881F", |
" 8886 UM8886F", |
" 888a UM8886A", |
" 8891 UM8891A", |
" 9017 UM9017F", |
" 9018 UM9018", |
" 9026 UM9026", |
" e881 UM8881N", |
" e886 UM8886N", |
" e88a UM8886N", |
" e891 UM8891N", |
"1061 I.I.T.", |
" 0001 AGX016", |
" 0002 IIT3204/3501", |
"1062 Maspar Computer Corp", |
"1063 Ocean Office Automation", |
"1064 Alcatel", |
"1065 Texas Microsystems", |
"1066 PicoPower Technology", |
" 0000 PT80C826", |
" 0001 PT86C521 [Vesuvius v1] Host Bridge", |
" 0002 PT86C523 [Vesuvius v3] PCI-ISA Bridge Master", |
" 0003 PT86C524 [Nile] PCI-to-PCI Bridge", |
" 0004 PT86C525 [Nile-II] PCI-to-PCI Bridge", |
" 0005 National PC87550 System Controller", |
" 8002 PT86C523 [Vesuvius v3] PCI-ISA Bridge Slave", |
"1067 Mitsubishi Electric", |
" 0301 AccelGraphics AccelECLIPSE", |
" 0304 AccelGALAXY A2100 [OEM Evans & Sutherland]", |
" 0308 Tornado 3000 [OEM Evans & Sutherland]", |
" 1002 VG500 [VolumePro Volume Rendering Accelerator]", |
"1068 Diversified Technology", |
"1069 Mylex Corporation", |
" 0001 DAC960P", |
" 0002 DAC960PD", |
" 0010 DAC960PG", |
" 0020 DAC960LA", |
" 0050 AcceleRAID 352/170/160 support Device", |
" 1069 0050 AcceleRAID 352 support Device", |
" 1069 0052 AcceleRAID 170 support Device", |
" 1069 0054 AcceleRAID 160 support Device", |
" b166 AcceleRAID 600/500/400/Sapphire support Device", |
" 1014 0242 iSeries 2872 DASD IOA", |
" 1014 0266 Dual Channel PCI-X U320 SCSI Adapter", |
" 1014 0278 Dual Channel PCI-X U320 SCSI RAID Adapter", |
" 1014 02d3 Dual Channel PCI-X U320 SCSI Adapter", |
" 1014 02d4 Dual Channel PCI-X U320 SCSI RAID Adapter", |
" 1069 0200 AcceleRAID 400, Single Channel, PCI-X, U320, SCSI RAID", |
" 1069 0202 AcceleRAID Sapphire, Dual Channel, PCI-X, U320, SCSI RAID", |
" 1069 0204 AcceleRAID 500, Dual Channel, Low-Profile, PCI-X, U320, SCSI RAID", |
" 1069 0206 AcceleRAID 600, Dual Channel, PCI-X, U320, SCSI RAID", |
" ba55 eXtremeRAID 1100 support Device", |
" ba56 eXtremeRAID 2000/3000 support Device", |
" 1069 0030 eXtremeRAID 3000 support Device", |
" 1069 0040 eXtremeRAID 2000 support Device", |
" ba57 eXtremeRAID 4000/5000 support Device", |
" 1069 0072 eXtremeRAID 5000 support Device", |
"106a Aten Research Inc", |
"106b Apple Computer Inc.", |
" 0001 Bandit PowerPC host bridge", |
" 0002 Grand Central I/O", |
" 0003 Control Video", |
" 0004 PlanB Video-In", |
" 0007 O'Hare I/O", |
" 000c DOS on Mac", |
" 000e Hydra Mac I/O", |
" 0010 Heathrow Mac I/O", |
" 0017 Paddington Mac I/O", |
" 0018 UniNorth FireWire", |
" 0019 KeyLargo USB", |
" 001e UniNorth Internal PCI", |
" 001f UniNorth PCI", |
" 0020 UniNorth AGP", |
" 0021 UniNorth GMAC (Sun GEM)", |
" 0022 KeyLargo Mac I/O", |
" 0024 UniNorth/Pangea GMAC (Sun GEM)", |
" 0025 KeyLargo/Pangea Mac I/O", |
" 0026 KeyLargo/Pangea USB", |
" 0027 UniNorth/Pangea AGP", |
" 0028 UniNorth/Pangea PCI", |
" 0029 UniNorth/Pangea Internal PCI", |
" 002d UniNorth 1.5 AGP", |
" 002e UniNorth 1.5 PCI", |
" 002f UniNorth 1.5 Internal PCI", |
" 0030 UniNorth/Pangea FireWire", |
" 0031 UniNorth 2 FireWire", |
" 106b 5811 iBook G4 2004", |
" 0032 UniNorth 2 GMAC (Sun GEM)", |
" 0033 UniNorth 2 ATA/100", |
" 0034 UniNorth 2 AGP", |
" 0035 UniNorth 2 PCI", |
" 0036 UniNorth 2 Internal PCI", |
" 003b UniNorth/Intrepid ATA/100", |
" 003e KeyLargo/Intrepid Mac I/O", |
" 003f KeyLargo/Intrepid USB", |
" 0040 K2 KeyLargo USB", |
" 0041 K2 KeyLargo Mac/IO", |
" 0042 K2 FireWire", |
" 0043 K2 ATA/100", |
" 0045 K2 HT-PCI Bridge", |
" 0046 K2 HT-PCI Bridge", |
" 0047 K2 HT-PCI Bridge", |
" 0048 K2 HT-PCI Bridge", |
" 0049 K2 HT-PCI Bridge", |
" 004b U3 AGP", |
" 004c K2 GMAC (Sun GEM)", |
" 004f Shasta Mac I/O", |
" 0050 Shasta IDE", |
" 0051 Shasta (Sun GEM)", |
" 0052 Shasta Firewire", |
" 0053 Shasta PCI Bridge", |
" 0054 Shasta PCI Bridge", |
" 0055 Shasta PCI Bridge", |
" 0058 U3L AGP Bridge", |
" 0059 U3H AGP Bridge", |
" 0066 Intrepid2 AGP Bridge", |
" 0067 Intrepid2 PCI Bridge", |
" 0068 Intrepid2 PCI Bridge", |
" 0069 Intrepid2 ATA/100", |
" 006a Intrepid2 Firewire", |
" 006b Intrepid2 GMAC (Sun GEM)", |
" 1645 Tigon3 Gigabit Ethernet NIC (BCM5701)", |
"106c Hynix Semiconductor", |
" 8801 Dual Pentium ISA/PCI Motherboard", |
" 8802 PowerPC ISA/PCI Motherboard", |
" 8803 Dual Window Graphics Accelerator", |
" 8804 LAN Controller", |
" 8805 100-BaseT LAN", |
"106d Sequent Computer Systems", |
"106e DFI, Inc", |
"106f City Gate Development Ltd", |
"1070 Daewoo Telecom Ltd", |
"1071 Mitac", |
" 8160 Mitac 8060B Mobile Platform", |
"1072 GIT Co Ltd", |
"1073 Yamaha Corporation", |
" 0001 3D GUI Accelerator", |
" 0002 YGV615 [RPA3 3D-Graphics Controller]", |
" 0003 YMF-740", |
" 0004 YMF-724", |
" 1073 0004 YMF724-Based PCI Audio Adapter", |
" 0005 DS1 Audio", |
" 1073 0005 DS-XG PCI Audio CODEC", |
" 0006 DS1 Audio", |
" 0008 DS1 Audio", |
" 1073 0008 DS-XG PCI Audio CODEC", |
" 000a DS1L Audio", |
" 1073 0004 DS-XG PCI Audio CODEC", |
" 1073 000a DS-XG PCI Audio CODEC", |
" 000c YMF-740C [DS-1L Audio Controller]", |
" 107a 000c DS-XG PCI Audio CODEC", |
" 000d YMF-724F [DS-1 Audio Controller]", |
" 1073 000d DS-XG PCI Audio CODEC", |
" 0010 YMF-744B [DS-1S Audio Controller]", |
" 1073 0006 DS-XG PCI Audio CODEC", |
" 1073 0010 DS-XG PCI Audio CODEC", |
" 0012 YMF-754 [DS-1E Audio Controller]", |
" 1073 0012 DS-XG PCI Audio Codec", |
" 0020 DS-1 Audio", |
" 2000 DS2416 Digital Mixing Card", |
" 1073 2000 DS2416 Digital Mixing Card", |
"1074 NexGen Microsystems", |
" 4e78 82c500/1", |
"1075 Advanced Integrations Research", |
"1076 Chaintech Computer Co. Ltd", |
"1077 QLogic Corp.", |
" 1016 ISP10160 Single Channel Ultra3 SCSI Processor", |
" 1020 ISP1020 Fast-wide SCSI", |
" 1022 ISP1022 Fast-wide SCSI", |
" 1080 ISP1080 SCSI Host Adapter", |
" 1216 ISP12160 Dual Channel Ultra3 SCSI Processor", |
" 101e 8471 QLA12160 on AMI MegaRAID", |
" 101e 8493 QLA12160 on AMI MegaRAID", |
" 1240 ISP1240 SCSI Host Adapter", |
" 1280 ISP1280 SCSI Host Adapter", |
" 2020 ISP2020A Fast!SCSI Basic Adapter", |
" 2100 QLA2100 64-bit Fibre Channel Adapter", |
" 1077 0001 QLA2100 64-bit Fibre Channel Adapter", |
" 2200 QLA2200 64-bit Fibre Channel Adapter", |
" 1077 0002 QLA2200", |
" 2300 QLA2300 64-bit Fibre Channel Adapter", |
" 2312 QLA2312 Fibre Channel Adapter", |
" 2322 QLA2322 Fibre Channel Adapter", |
" 2422 QLA2422 Fibre Channel Adapter", |
" 2432 QLA2432 Fibre Channel Adapter", |
" 3010 QLA3010 Network Adapter", |
" 3022 QLA3022 Network Adapter", |
" 4010 QLA4010 iSCSI TOE Adapter", |
" 4022 QLA4022 iSCSI TOE Adapter", |
" 6312 QLA6312 Fibre Channel Adapter", |
" 6322 QLA6322 Fibre Channel Adapter", |
"1078 Cyrix Corporation", |
" 0000 5510 [Grappa]", |
" 0001 PCI Master", |
" 0002 5520 [Cognac]", |
" 0100 5530 Legacy [Kahlua]", |
" 0101 5530 SMI [Kahlua]", |
" 0102 5530 IDE [Kahlua]", |
" 0103 5530 Audio [Kahlua]", |
" 0104 5530 Video [Kahlua]", |
" 0400 ZFMicro PCI Bridge", |
" 0401 ZFMicro Chipset SMI", |
" 0402 ZFMicro Chipset IDE", |
" 0403 ZFMicro Expansion Bus", |
"1079 I-Bus", |
"107a NetWorth", |
"107b Gateway 2000", |
"107c LG Electronics [Lucky Goldstar Co. Ltd]", |
"107d LeadTek Research Inc.", |
" 0000 P86C850", |
" 204d [GeForce 7800 GTX] Winfast PX7800 GTX TDH", |
" 2134 WinFast 3D S320 II", |
" 2971 [GeForce FX 5900] WinFast A350 TDH MyViVo", |
"107e Interphase Corporation", |
" 0001 5515 ATM Adapter [Flipper]", |
" 0002 100 VG AnyLan Controller", |
" 0004 5526 Fibre Channel Host Adapter", |
" 0005 x526 Fibre Channel Host Adapter", |
" 0008 5525/5575 ATM Adapter (155 Mbit) [Atlantic]", |
" 9003 5535-4P-BRI-ST", |
" 9007 5535-4P-BRI-U", |
" 9008 5535-1P-SR", |
" 900c 5535-1P-SR-ST", |
" 900e 5535-1P-SR-U", |
" 9011 5535-1P-PRI", |
" 9013 5535-2P-PRI", |
" 9023 5536-4P-BRI-ST", |
" 9027 5536-4P-BRI-U", |
" 9031 5536-1P-PRI", |
" 9033 5536-2P-PRI", |
"107f Data Technology Corporation", |
" 0802 SL82C105", |
"1080 Contaq Microsystems", |
" 0600 82C599", |
" c691 Cypress CY82C691", |
" c693 82c693", |
"1081 Supermac Technology", |
" 0d47 Radius PCI to NuBUS Bridge", |
"1082 EFA Corporation of America", |
"1083 Forex Computer Corporation", |
" 0001 FR710", |
"1084 Parador", |
"1085 Tulip Computers Int.B.V.", |
"1086 J. Bond Computer Systems", |
"1087 Cache Computer", |
"1088 Microcomputer Systems (M) Son", |
"1089 Data General Corporation", |
"108a SBS Technologies", |
" 0001 VME Bridge Model 617", |
" 0010 VME Bridge Model 618", |
" 0040 dataBLIZZARD", |
" 3000 VME Bridge Model 2706", |
"108c Oakleigh Systems Inc.", |
"108d Olicom", |
" 0001 Token-Ring 16/4 PCI Adapter (3136/3137)", |
" 0002 16/4 Token Ring", |
" 0004 RapidFire 3139 Token-Ring 16/4 PCI Adapter", |
" 108d 0004 OC-3139/3140 RapidFire Token-Ring 16/4 Adapter", |
" 0005 GoCard 3250 Token-Ring 16/4 CardBus PC Card", |
" 0006 OC-3530 RapidFire Token-Ring 100", |
" 0007 RapidFire 3141 Token-Ring 16/4 PCI Fiber Adapter", |
" 108d 0007 OC-3141 RapidFire Token-Ring 16/4 Adapter", |
" 0008 RapidFire 3540 HSTR 100/16/4 PCI Adapter", |
" 108d 0008 OC-3540 RapidFire HSTR 100/16/4 Adapter", |
" 0011 OC-2315", |
" 0012 OC-2325", |
" 0013 OC-2183/2185", |
" 0014 OC-2326", |
" 0019 OC-2327/2250 10/100 Ethernet Adapter", |
" 108d 0016 OC-2327 Rapidfire 10/100 Ethernet Adapter", |
" 108d 0017 OC-2250 GoCard 10/100 Ethernet Adapter", |
" 0021 OC-6151/6152 [RapidFire ATM 155]", |
" 0022 ATM Adapter", |
"108e Sun Microsystems Computer Corp.", |
" 0001 EBUS", |
" 1000 EBUS", |
" 1001 Happy Meal", |
" 1100 RIO EBUS", |
" 1101 RIO GEM", |
" 1102 RIO 1394", |
" 1103 RIO USB", |
" 1648 [bge] Gigabit Ethernet", |
" 2bad GEM", |
" 5000 Simba Advanced PCI Bridge", |
" 5043 SunPCI Co-processor", |
" 8000 Psycho PCI Bus Module", |
" 8001 Schizo PCI Bus Module", |
" 8002 Schizo+ PCI Bus Module", |
" a000 Ultra IIi", |
" a001 Ultra IIe", |
" a801 Tomatillo PCI Bus Module", |
" abba Cassini 10/100/1000", |
"108f Systemsoft", |
"1090 Compro Computer Services, Inc.", |
"1091 Intergraph Corporation", |
" 0020 3D graphics processor", |
" 0021 3D graphics processor w/Texturing", |
" 0040 3D graphics frame buffer", |
" 0041 3D graphics frame buffer", |
" 0060 Proprietary bus bridge", |
" 00e4 Powerstorm 4D50T", |
" 0720 Motion JPEG codec", |
" 07a0 Sun Expert3D-Lite Graphics Accelerator", |
" 1091 Sun Expert3D Graphics Accelerator", |
"1092 Diamond Multimedia Systems", |
" 00a0 Speedstar Pro SE", |
" 00a8 Speedstar 64", |
" 0550 Viper V550", |
" 08d4 Supra 2260 Modem", |
" 094c SupraExpress 56i Pro", |
" 1092 Viper V330", |
" 6120 Maximum DVD", |
" 8810 Stealth SE", |
" 8811 Stealth 64/SE", |
" 8880 Stealth", |
" 8881 Stealth", |
" 88b0 Stealth 64", |
" 88b1 Stealth 64", |
" 88c0 Stealth 64", |
" 88c1 Stealth 64", |
" 88d0 Stealth 64", |
" 88d1 Stealth 64", |
" 88f0 Stealth 64", |
" 88f1 Stealth 64", |
" 9999 DMD-I0928-1 'Monster sound' sound chip", |
"1093 National Instruments", |
" 0160 PCI-DIO-96", |
" 0162 PCI-MIO-16XE-50", |
" 1150 PCI-DIO-32HS High Speed Digital I/O Board", |
" 1170 PCI-MIO-16XE-10", |
" 1180 PCI-MIO-16E-1", |
" 1190 PCI-MIO-16E-4", |
" 1310 PCI-6602", |
" 1330 PCI-6031E", |
" 1350 PCI-6071E", |
" 14e0 PCI-6110", |
" 14f0 PCI-6111", |
" 17d0 PCI-6503", |
" 1870 PCI-6713", |
" 1880 PCI-6711", |
" 18b0 PCI-6052E", |
" 2410 PCI-6733", |
" 2890 PCI-6036E", |
" 2a60 PCI-6023E", |
" 2a70 PCI-6024E", |
" 2a80 PCI-6025E", |
" 2c80 PCI-6035E", |
" 2ca0 PCI-6034E", |
" 70a9 PCI-6528 (Digital I/O at 60V)", |
" 70b8 PCI-6251 [M Series - High Speed Multifunction DAQ]", |
" b001 IMAQ-PCI-1408", |
" b011 IMAQ-PXI-1408", |
" b021 IMAQ-PCI-1424", |
" b031 IMAQ-PCI-1413", |
" b041 IMAQ-PCI-1407", |
" b051 IMAQ-PXI-1407", |
" b061 IMAQ-PCI-1411", |
" b071 IMAQ-PCI-1422", |
" b081 IMAQ-PXI-1422", |
" b091 IMAQ-PXI-1411", |
" c801 PCI-GPIB", |
" c831 PCI-GPIB bridge", |
"1094 First International Computers [FIC]", |
"1095 Silicon Image, Inc.", |
" 0240 Adaptec AAR-1210SA SATA HostRAID Controller", |
" 0640 PCI0640", |
" 0643 PCI0643", |
" 0646 PCI0646", |
" 0647 PCI0647", |
" 0648 PCI0648", |
" 1043 8025 CUBX motherboard", |
" 0649 SiI 0649 Ultra ATA/100 PCI to ATA Host Controller", |
" 0e11 005d Integrated Ultra ATA-100 Dual Channel Controller", |
" 0e11 007e Integrated Ultra ATA-100 IDE RAID Controller", |
" 101e 0649 AMI MegaRAID IDE 100 Controller", |
" 0650 PBC0650A", |
" 0670 USB0670", |
" 1095 0670 USB0670", |
" 0673 USB0673", |
" 0680 PCI0680 Ultra ATA-133 Host Controller", |
" 1095 3680 Winic W-680 (Silicon Image 680 based)", |
" 3112 SiI 3112 [SATALink/SATARaid] Serial ATA Controller", |
" 1095 3112 SiI 3112 SATALink Controller", |
" 1095 6112 SiI 3112 SATARaid Controller", |
" 9005 0250 SATAConnect 1205SA Host Controller", |
" 3114 SiI 3114 [SATALink/SATARaid] Serial ATA Controller", |
" 1095 3114 SiI 3114 SATALink Controller", |
" 1095 6114 SiI 3114 SATARaid Controller", |
" 3124 SiI 3124 PCI-X Serial ATA Controller", |
" 1095 3124 SiI 3124 PCI-X Serial ATA Controller", |
" 3132 SiI 3132 Serial ATA Raid II Controller", |
" 3512 SiI 3512 [SATALink/SATARaid] Serial ATA Controller", |
" 1095 3512 SiI 3512 SATALink Controller", |
" 1095 6512 SiI 3512 SATARaid Controller", |
"1096 Alacron", |
"1097 Appian Technology", |
"1098 Quantum Designs (H.K.) Ltd", |
" 0001 QD-8500", |
" 0002 QD-8580", |
"1099 Samsung Electronics Co., Ltd", |
"109a Packard Bell", |
"109b Gemlight Computer Ltd.", |
"109c Megachips Corporation", |
"109d Zida Technologies Ltd.", |
"109e Brooktree Corporation", |
" 032e Bt878 Video Capture", |
" 0350 Bt848 Video Capture", |
" 0351 Bt849A Video capture", |
" 0369 Bt878 Video Capture", |
" 1002 0001 TV-Wonder", |
" 1002 0003 TV-Wonder/VE", |
" 036c Bt879(??) Video Capture", |
" 13e9 0070 Win/TV (Video Section)", |
" 036e Bt878 Video Capture", |
" 0070 13eb WinTV Series", |
" 0070 ff01 Viewcast Osprey 200", |
" 0071 0101 DigiTV PCI", |
" 107d 6606 WinFast TV 2000", |
" 11bd 0012 PCTV pro (TV + FM stereo receiver)", |
" 11bd 001c PCTV Sat (DBC receiver)", |
" 127a 0001 Bt878 Mediastream Controller NTSC", |
" 127a 0002 Bt878 Mediastream Controller PAL BG", |
" 127a 0003 Bt878a Mediastream Controller PAL BG", |
" 127a 0048 Bt878/832 Mediastream Controller", |
" 144f 3000 MagicTView CPH060 - Video", |
" 1461 0002 TV98 Series (TV/No FM/Remote)", |
" 1461 0003 AverMedia UltraTV PCI 350", |
" 1461 0004 AVerTV WDM Video Capture", |
" 1461 0761 AverTV DVB-T", |
" 14f1 0001 Bt878 Mediastream Controller NTSC", |
" 14f1 0002 Bt878 Mediastream Controller PAL BG", |
" 14f1 0003 Bt878a Mediastream Controller PAL BG", |
" 14f1 0048 Bt878/832 Mediastream Controller", |
" 1822 0001 VisionPlus DVB card", |
" 1851 1850 FlyVideo'98 - Video", |
" 1851 1851 FlyVideo II", |
" 1852 1852 FlyVideo'98 - Video (with FM Tuner)", |
" 18ac d500 DViCO FusionHDTV5 Lite", |
" 270f fc00 Digitop DTT-1000", |
" bd11 1200 PCTV pro (TV + FM stereo receiver)", |
" 036f Bt879 Video Capture", |
" 127a 0044 Bt879 Video Capture NTSC", |
" 127a 0122 Bt879 Video Capture PAL I", |
" 127a 0144 Bt879 Video Capture NTSC", |
" 127a 0222 Bt879 Video Capture PAL BG", |
" 127a 0244 Bt879a Video Capture NTSC", |
" 127a 0322 Bt879 Video Capture NTSC", |
" 127a 0422 Bt879 Video Capture NTSC", |
" 127a 1122 Bt879 Video Capture PAL I", |
" 127a 1222 Bt879 Video Capture PAL BG", |
" 127a 1322 Bt879 Video Capture NTSC", |
" 127a 1522 Bt879a Video Capture PAL I", |
" 127a 1622 Bt879a Video Capture PAL BG", |
" 127a 1722 Bt879a Video Capture NTSC", |
" 14f1 0044 Bt879 Video Capture NTSC", |
" 14f1 0122 Bt879 Video Capture PAL I", |
" 14f1 0144 Bt879 Video Capture NTSC", |
" 14f1 0222 Bt879 Video Capture PAL BG", |
" 14f1 0244 Bt879a Video Capture NTSC", |
" 14f1 0322 Bt879 Video Capture NTSC", |
" 14f1 0422 Bt879 Video Capture NTSC", |
" 14f1 1122 Bt879 Video Capture PAL I", |
" 14f1 1222 Bt879 Video Capture PAL BG", |
" 14f1 1322 Bt879 Video Capture NTSC", |
" 14f1 1522 Bt879a Video Capture PAL I", |
" 14f1 1622 Bt879a Video Capture PAL BG", |
" 14f1 1722 Bt879a Video Capture NTSC", |
" 1851 1850 FlyVideo'98 - Video", |
" 1851 1851 FlyVideo II", |
" 1852 1852 FlyVideo'98 - Video (with FM Tuner)", |
" 0370 Bt880 Video Capture", |
" 1851 1850 FlyVideo'98", |
" 1851 1851 FlyVideo'98 EZ - video", |
" 1852 1852 FlyVideo'98 (with FM Tuner)", |
" 0878 Bt878 Audio Capture", |
" 0070 13eb WinTV Series", |
" 0070 ff01 Viewcast Osprey 200", |
" 0071 0101 DigiTV PCI", |
" 1002 0001 TV-Wonder", |
" 1002 0003 TV-Wonder/VE", |
" 11bd 0012 PCTV pro (TV + FM stereo receiver, audio section)", |
" 11bd 001c PCTV Sat (DBC receiver)", |
" 127a 0001 Bt878 Video Capture (Audio Section)", |
" 127a 0002 Bt878 Video Capture (Audio Section)", |
" 127a 0003 Bt878 Video Capture (Audio Section)", |
" 127a 0048 Bt878 Video Capture (Audio Section)", |
" 13e9 0070 Win/TV (Audio Section)", |
" 144f 3000 MagicTView CPH060 - Audio", |
" 1461 0002 Avermedia PCTV98 Audio Capture", |
" 1461 0004 AVerTV WDM Audio Capture", |
" 1461 0761 AVerTV DVB-T", |
" 14f1 0001 Bt878 Video Capture (Audio Section)", |
" 14f1 0002 Bt878 Video Capture (Audio Section)", |
" 14f1 0003 Bt878 Video Capture (Audio Section)", |
" 14f1 0048 Bt878 Video Capture (Audio Section)", |
" 1822 0001 VisionPlus DVB Card", |
" 18ac d500 DViCO FusionHDTV5 Lite", |
" 270f fc00 Digitop DTT-1000", |
" bd11 1200 PCTV pro (TV + FM stereo receiver, audio section)", |
" 0879 Bt879 Audio Capture", |
" 127a 0044 Bt879 Video Capture (Audio Section)", |
" 127a 0122 Bt879 Video Capture (Audio Section)", |
" 127a 0144 Bt879 Video Capture (Audio Section)", |
" 127a 0222 Bt879 Video Capture (Audio Section)", |
" 127a 0244 Bt879 Video Capture (Audio Section)", |
" 127a 0322 Bt879 Video Capture (Audio Section)", |
" 127a 0422 Bt879 Video Capture (Audio Section)", |
" 127a 1122 Bt879 Video Capture (Audio Section)", |
" 127a 1222 Bt879 Video Capture (Audio Section)", |
" 127a 1322 Bt879 Video Capture (Audio Section)", |
" 127a 1522 Bt879 Video Capture (Audio Section)", |
" 127a 1622 Bt879 Video Capture (Audio Section)", |
" 127a 1722 Bt879 Video Capture (Audio Section)", |
" 14f1 0044 Bt879 Video Capture (Audio Section)", |
" 14f1 0122 Bt879 Video Capture (Audio Section)", |
" 14f1 0144 Bt879 Video Capture (Audio Section)", |
" 14f1 0222 Bt879 Video Capture (Audio Section)", |
" 14f1 0244 Bt879 Video Capture (Audio Section)", |
" 14f1 0322 Bt879 Video Capture (Audio Section)", |
" 14f1 0422 Bt879 Video Capture (Audio Section)", |
" 14f1 1122 Bt879 Video Capture (Audio Section)", |
" 14f1 1222 Bt879 Video Capture (Audio Section)", |
" 14f1 1322 Bt879 Video Capture (Audio Section)", |
" 14f1 1522 Bt879 Video Capture (Audio Section)", |
" 14f1 1622 Bt879 Video Capture (Audio Section)", |
" 14f1 1722 Bt879 Video Capture (Audio Section)", |
" 0880 Bt880 Audio Capture", |
" 2115 BtV 2115 Mediastream controller", |
" 2125 BtV 2125 Mediastream controller", |
" 2164 BtV 2164", |
" 2165 BtV 2165", |
" 8230 Bt8230 ATM Segment/Reassembly Ctrlr (SRC)", |
" 8472 Bt8472", |
" 8474 Bt8474", |
"109f Trigem Computer Inc.", |
"10a0 Meidensha Corporation", |
"10a1 Juko Electronics Ind. Co. Ltd", |
"10a2 Quantum Corporation", |
"10a3 Everex Systems Inc", |
"10a4 Globe Manufacturing Sales", |
"10a5 Smart Link Ltd.", |
" 3052 SmartPCI562 56K Modem", |
" 5449 SmartPCI561 modem", |
"10a6 Informtech Industrial Ltd.", |
"10a7 Benchmarq Microelectronics", |
"10a8 Sierra Semiconductor", |
" 0000 STB Horizon 64", |
"10a9 Silicon Graphics, Inc.", |
" 0001 Crosstalk to PCI Bridge", |
" 0002 Linc I/O controller", |
" 0003 IOC3 I/O controller", |
" 0004 O2 MACE", |
" 0005 RAD Audio", |
" 0006 HPCEX", |
" 0007 RPCEX", |
" 0008 DiVO VIP", |
" 0009 AceNIC Gigabit Ethernet", |
" 10a9 8002 AceNIC Gigabit Ethernet", |
" 0010 AMP Video I/O", |
" 0011 GRIP", |
" 0012 SGH PSHAC GSN", |
" 1001 Magic Carpet", |
" 1002 Lithium", |
" 1003 Dual JPEG 1", |
" 1004 Dual JPEG 2", |
" 1005 Dual JPEG 3", |
" 1006 Dual JPEG 4", |
" 1007 Dual JPEG 5", |
" 1008 Cesium", |
" 100a IOC4 I/O controller", |
" 2001 Fibre Channel", |
" 2002 ASDE", |
" 4001 TIO-CE PCI Express Bridge", |
" 4002 TIO-CE PCI Express Port", |
" 8001 O2 1394", |
" 8002 G-net NT", |
" 8010 Broadcom e-net [SGI IO9/IO10 BaseIO]", |
" 8018 Broadcom e-net [SGI A330 Server BaseIO]", |
"10aa ACC Microelectronics", |
" 0000 ACCM 2188", |
"10ab Digicom", |
"10ac Honeywell IAC", |
"10ad Symphony Labs", |
" 0001 W83769F", |
" 0003 SL82C103", |
" 0005 SL82C105", |
" 0103 SL82c103", |
" 0105 SL82c105", |
" 0565 W83C553", |
"10ae Cornerstone Technology", |
"10af Micro Computer Systems Inc", |
"10b0 CardExpert Technology", |
"10b1 Cabletron Systems Inc", |
"10b2 Raytheon Company", |
"10b3 Databook Inc", |
" 3106 DB87144", |
" b106 DB87144", |
"10b4 STB Systems Inc", |
" 1b1d Velocity 128 3D", |
" 10b4 237e Velocity 4400", |
"10b5 PLX Technology, Inc.", |
" 0001 i960 PCI bus interface", |
" 1042 Brandywine / jxi2, Inc. - PMC-SyncClock32, IRIG A & B, Nasa 36", |
" 1076 VScom 800 8 port serial adaptor", |
" 1077 VScom 400 4 port serial adaptor", |
" 1078 VScom 210 2 port serial and 1 port parallel adaptor", |
" 1103 VScom 200 2 port serial adaptor", |
" 1146 VScom 010 1 port parallel adaptor", |
" 1147 VScom 020 2 port parallel adaptor", |
" 2540 IXXAT CAN-Interface PC-I 04/PCI", |
" 2724 Thales PCSM Security Card", |
" 6540 PCI6540/6466 PCI-PCI bridge (transparent mode)", |
" 4c53 10e0 PSL09 PrPMC", |
" 6541 PCI6540/6466 PCI-PCI bridge (non-transparent mode, primary side)", |
" 4c53 10e0 PSL09 PrPMC", |
" 6542 PCI6540/6466 PCI-PCI bridge (non-transparent mode, secondary side)", |
" 4c53 10e0 PSL09 PrPMC", |
" 8111 PEX 8111 PCI Express-to-PCI Bridge", |
" 8114 PEX 8114 PCI Express-to-PCI/PCI-X Bridge", |
" 8516 PEX 8516 Versatile PCI Express Switch", |
" 8532 PEX 8532 Versatile PCI Express Switch", |
" 9030 PCI <-> IOBus Bridge Hot Swap", |
" 10b5 2862 Alpermann+Velte PCL PCI LV (3V/5V): Timecode Reader Board", |
" 10b5 2906 Alpermann+Velte PCI TS (3V/5V): Time Synchronisation Board", |
" 10b5 2940 Alpermann+Velte PCL PCI D (3V/5V): Timecode Reader Board", |
" 10b5 2977 IXXAT iPC-I XC16/PCI CAN Board", |
" 10b5 2978 SH ARC-PCIu SOHARD ARCNET card", |
" 10b5 3025 Alpermann+Velte PCL PCI L (3V/5V): Timecode Reader Board", |
" 10b5 3068 Alpermann+Velte PCL PCI HD (3V/5V): Timecode Reader Board", |
" 1397 3136 4xS0-ISDN PCI Adapter", |
" 1397 3137 S2M-E1-ISDN PCI Adapter", |
" 1518 0200 Kontron ThinkIO-C", |
" 15ed 1002 MCCS 8-port Serial Hot Swap", |
" 15ed 1003 MCCS 16-port Serial Hot Swap", |
" 9036 9036", |
" 9050 PCI <-> IOBus Bridge", |
" 10b5 1067 IXXAT CAN i165", |
" 10b5 1172 IK220 (Heidenhain)", |
" 10b5 2036 SatPak GPS", |
" 10b5 2221 Alpermann+Velte PCL PCI LV: Timecode Reader Board", |
" 10b5 2273 SH ARC-PCI SOHARD ARCNET card", |
" 10b5 2431 Alpermann+Velte PCL PCI D: Timecode Reader Board", |
" 10b5 2905 Alpermann+Velte PCI TS: Time Synchronisation Board", |
" 10b5 9050 MP9050", |
" 1498 0362 TPMC866 8 Channel Serial Card", |
" 1522 0001 RockForce 4 Port V.90 Data/Fax/Voice Modem", |
" 1522 0002 RockForce 2 Port V.90 Data/Fax/Voice Modem", |
" 1522 0003 RockForce 6 Port V.90 Data/Fax/Voice Modem", |
" 1522 0004 RockForce 8 Port V.90 Data/Fax/Voice Modem", |
" 1522 0010 RockForce2000 4 Port V.90 Data/Fax/Voice Modem", |
" 1522 0020 RockForce2000 2 Port V.90 Data/Fax/Voice Modem", |
" 15ed 1000 Macrolink MCCS 8-port Serial", |
" 15ed 1001 Macrolink MCCS 16-port Serial", |
" 15ed 1002 Macrolink MCCS 8-port Serial Hot Swap", |
" 15ed 1003 Macrolink MCCS 16-port Serial Hot Swap", |
" 5654 2036 OpenSwitch 6 Telephony card", |
" 5654 3132 OpenSwitch 12 Telephony card", |
" 5654 5634 OpenLine4 Telephony Card", |
" d531 c002 PCIntelliCAN 2xSJA1000 CAN bus", |
" d84d 4006 EX-4006 1P", |
" d84d 4008 EX-4008 1P EPP/ECP", |
" d84d 4014 EX-4014 2P", |
" d84d 4018 EX-4018 3P EPP/ECP", |
" d84d 4025 EX-4025 1S(16C550) RS-232", |
" d84d 4027 EX-4027 1S(16C650) RS-232", |
" d84d 4028 EX-4028 1S(16C850) RS-232", |
" d84d 4036 EX-4036 2S(16C650) RS-232", |
" d84d 4037 EX-4037 2S(16C650) RS-232", |
" d84d 4038 EX-4038 2S(16C850) RS-232", |
" d84d 4052 EX-4052 1S(16C550) RS-422/485", |
" d84d 4053 EX-4053 2S(16C550) RS-422/485", |
" d84d 4055 EX-4055 4S(16C550) RS-232", |
" d84d 4058 EX-4055 4S(16C650) RS-232", |
" d84d 4065 EX-4065 8S(16C550) RS-232", |
" d84d 4068 EX-4068 8S(16C650) RS-232", |
" d84d 4078 EX-4078 2S(16C552) RS-232+1P", |
" 9054 PCI <-> IOBus Bridge", |
" 10b5 2455 Wessex Techology PHIL-PCI", |
" 10b5 2696 Innes Corp AM Radcap card", |
" 10b5 2717 Innes Corp Auricon card", |
" 10b5 2844 Innes Corp TVS Encoder card", |
" 12c7 4001 Intel Dialogic DM/V960-4T1 PCI", |
" 12d9 0002 PCI Prosody Card rev 1.5", |
" 16df 0011 PIKA PrimeNet MM PCI", |
" 16df 0012 PIKA PrimeNet MM cPCI 8", |
" 16df 0013 PIKA PrimeNet MM cPCI 8 (without CAS Signaling)", |
" 16df 0014 PIKA PrimeNet MM cPCI 4", |
" 16df 0015 PIKA Daytona MM", |
" 16df 0016 PIKA InLine MM", |
" 9056 Francois", |
" 10b5 2979 CellinkBlade 11 - CPCI board VoATM AAL1", |
" 9060 9060", |
" 906d 9060SD", |
" 125c 0640 Aries 16000P", |
" 906e 9060ES", |
" 9080 9080", |
" 103c 10eb (Agilent) E2777B 83K Series Optical Communication Interface", |
" 103c 10ec (Agilent) E6978-66442 PCI CIC", |
" 10b5 9080 9080 [real subsystem ID not set]", |
" 129d 0002 Aculab PCI Prosidy card", |
" 12d9 0002 PCI Prosody Card", |
" 12df 4422 4422PCI ['Do-All' Telemetry Data Aquisition System]", |
" bb04 B&B 3PCIOSD1A Isolated PCI Serial", |
"10b6 Madge Networks", |
" 0001 Smart 16/4 PCI Ringnode", |
" 0002 Smart 16/4 PCI Ringnode Mk2", |
" 10b6 0002 Smart 16/4 PCI Ringnode Mk2", |
" 10b6 0006 16/4 CardBus Adapter", |
" 0003 Smart 16/4 PCI Ringnode Mk3", |
" 0e11 b0fd Compaq NC4621 PCI, 4/16, WOL", |
" 10b6 0003 Smart 16/4 PCI Ringnode Mk3", |
" 10b6 0007 Presto PCI Plus Adapter", |
" 0004 Smart 16/4 PCI Ringnode Mk1", |
" 0006 16/4 Cardbus Adapter", |
" 10b6 0006 16/4 CardBus Adapter", |
" 0007 Presto PCI Adapter", |
" 10b6 0007 Presto PCI", |
" 0009 Smart 100/16/4 PCI-HS Ringnode", |
" 10b6 0009 Smart 100/16/4 PCI-HS Ringnode", |
" 000a Smart 100/16/4 PCI Ringnode", |
" 10b6 000a Smart 100/16/4 PCI Ringnode", |
" 000b 16/4 CardBus Adapter Mk2", |
" 10b6 0008 16/4 CardBus Adapter Mk2", |
" 10b6 000b 16/4 Cardbus Adapter Mk2", |
" 000c RapidFire 3140V2 16/4 TR Adapter", |
" 10b6 000c RapidFire 3140V2 16/4 TR Adapter", |
" 1000 Collage 25/155 ATM Client Adapter", |
" 1001 Collage 155 ATM Server Adapter", |
"10b7 3Com Corporation", |
" 0001 3c985 1000BaseSX (SX/TX)", |
" 0013 AR5212 802.11abg NIC (3CRDAG675)", |
" 10b7 2031 3CRDAG675 11a/b/g Wireless PCI Adapter", |
" 0910 3C910-A01", |
" 1006 MINI PCI type 3B Data Fax Modem", |
" 1007 Mini PCI 56k Winmodem", |
" 10b7 615c Mini PCI 56K Modem", |
" 1201 3c982-TXM 10/100baseTX Dual Port A [Hydra]", |
" 1202 3c982-TXM 10/100baseTX Dual Port B [Hydra]", |
" 1700 3c940 10/100/1000Base-T [Marvell]", |
" 1043 80eb A7V600/P4P800/K8V motherboard", |
" 10b7 0010 3C940 Gigabit LOM Ethernet Adapter", |
" 10b7 0020 3C941 Gigabit LOM Ethernet Adapter", |
" 147b 1407 KV8-MAX3 motherboard", |
" 3390 3c339 TokenLink Velocity", |
" 3590 3c359 TokenLink Velocity XL", |
" 10b7 3590 TokenLink Velocity XL Adapter (3C359/359B)", |
" 4500 3c450 HomePNA [Tornado]", |
" 5055 3c555 Laptop Hurricane", |
" 5057 3c575 Megahertz 10/100 LAN CardBus [Boomerang]", |
" 10b7 5a57 3C575 Megahertz 10/100 LAN Cardbus PC Card", |
" 5157 3cCFE575BT Megahertz 10/100 LAN CardBus [Cyclone]", |
" 10b7 5b57 3C575 Megahertz 10/100 LAN Cardbus PC Card", |
" 5257 3cCFE575CT CardBus [Cyclone]", |
" 10b7 5c57 FE575C-3Com 10/100 LAN CardBus-Fast Ethernet", |
" 5900 3c590 10BaseT [Vortex]", |
" 5920 3c592 EISA 10mbps Demon/Vortex", |
" 5950 3c595 100BaseTX [Vortex]", |
" 5951 3c595 100BaseT4 [Vortex]", |
" 5952 3c595 100Base-MII [Vortex]", |
" 5970 3c597 EISA Fast Demon/Vortex", |
" 5b57 3c595 Megahertz 10/100 LAN CardBus [Boomerang]", |
" 10b7 5b57 3C575 Megahertz 10/100 LAN Cardbus PC Card", |
" 6000 3CRSHPW796 [OfficeConnect Wireless CardBus]", |
" 6001 3com 3CRWE154G72 [Office Connect Wireless LAN Adapter]", |
" 6055 3c556 Hurricane CardBus [Cyclone]", |
" 6056 3c556B CardBus [Tornado]", |
" 10b7 6556 10/100 Mini PCI Ethernet Adapter", |
" 6560 3cCFE656 CardBus [Cyclone]", |
" 10b7 656a 3CCFEM656 10/100 LAN+56K Modem CardBus", |
" 6561 3cCFEM656 10/100 LAN+56K Modem CardBus", |
" 10b7 656b 3CCFEM656 10/100 LAN+56K Modem CardBus", |
" 6562 3cCFEM656B 10/100 LAN+Winmodem CardBus [Cyclone]", |
" 10b7 656b 3CCFEM656B 10/100 LAN+56K Modem CardBus", |
" 6563 3cCFEM656B 10/100 LAN+56K Modem CardBus", |
" 10b7 656b 3CCFEM656 10/100 LAN+56K Modem CardBus", |
" 6564 3cXFEM656C 10/100 LAN+Winmodem CardBus [Tornado]", |
" 7646 3cSOHO100-TX Hurricane", |
" 7770 3CRWE777 PCI(PLX) Wireless Adaptor [Airconnect]", |
" 7940 3c803 FDDILink UTP Controller", |
" 7980 3c804 FDDILink SAS Controller", |
" 7990 3c805 FDDILink DAS Controller", |
" 80eb 3c940B 10/100/1000Base-T", |
" 8811 Token ring", |
" 9000 3c900 10BaseT [Boomerang]", |
" 9001 3c900 10Mbps Combo [Boomerang]", |
" 9004 3c900B-TPO Etherlink XL [Cyclone]", |
" 10b7 9004 3C900B-TPO Etherlink XL TPO 10Mb", |
" 9005 3c900B-Combo Etherlink XL [Cyclone]", |
" 10b7 9005 3C900B-Combo Etherlink XL Combo", |
" 9006 3c900B-TPC Etherlink XL [Cyclone]", |
" 900a 3c900B-FL 10base-FL [Cyclone]", |
" 9050 3c905 100BaseTX [Boomerang]", |
" 9051 3c905 100BaseT4 [Boomerang]", |
" 9055 3c905B 100BaseTX [Cyclone]", |
" 1028 0080 3C905B Fast Etherlink XL 10/100", |
" 1028 0081 3C905B Fast Etherlink XL 10/100", |
" 1028 0082 3C905B Fast Etherlink XL 10/100", |
" 1028 0083 3C905B Fast Etherlink XL 10/100", |
" 1028 0084 3C905B Fast Etherlink XL 10/100", |
" 1028 0085 3C905B Fast Etherlink XL 10/100", |
" 1028 0086 3C905B Fast Etherlink XL 10/100", |
" 1028 0087 3C905B Fast Etherlink XL 10/100", |
" 1028 0088 3C905B Fast Etherlink XL 10/100", |
" 1028 0089 3C905B Fast Etherlink XL 10/100", |
" 1028 0090 3C905B Fast Etherlink XL 10/100", |
" 1028 0091 3C905B Fast Etherlink XL 10/100", |
" 1028 0092 3C905B Fast Etherlink XL 10/100", |
" 1028 0093 3C905B Fast Etherlink XL 10/100", |
" 1028 0094 3C905B Fast Etherlink XL 10/100", |
" 1028 0095 3C905B Fast Etherlink XL 10/100", |
" 1028 0096 3C905B Fast Etherlink XL 10/100", |
" 1028 0097 3C905B Fast Etherlink XL 10/100", |
" 1028 0098 3C905B Fast Etherlink XL 10/100", |
" 1028 0099 3C905B Fast Etherlink XL 10/100", |
" 10b7 9055 3C905B Fast Etherlink XL 10/100", |
" 9056 3c905B-T4 Fast EtherLink XL [Cyclone]", |
" 9058 3c905B Deluxe Etherlink 10/100/BNC [Cyclone]", |
" 905a 3c905B-FX Fast Etherlink XL FX 100baseFx [Cyclone]", |
" 9200 3c905C-TX/TX-M [Tornado]", |
" 1028 0095 3C920 Integrated Fast Ethernet Controller", |
" 1028 0097 3C920 Integrated Fast Ethernet Controller", |
" 1028 00fe Optiplex GX240", |
" 1028 012a 3C920 Integrated Fast Ethernet Controller [Latitude C640]", |
" 10b7 1000 3C905C-TX Fast Etherlink for PC Management NIC", |
" 10b7 7000 10/100 Mini PCI Ethernet Adapter", |
" 10f1 2466 Tiger MPX S2466 (3C920 Integrated Fast Ethernet Controller)", |
" 9201 3C920B-EMB Integrated Fast Ethernet Controller [Tornado]", |
" 1043 80ab A7N8X Deluxe onboard 3C920B-EMB Integrated Fast Ethernet Controller", |
" 9202 3Com 3C920B-EMB-WNM Integrated Fast Ethernet Controller", |
" 9210 3C920B-EMB-WNM Integrated Fast Ethernet Controller", |
" 9300 3CSOHO100B-TX 910-A01 [tulip]", |
" 9800 3c980-TX Fast Etherlink XL Server Adapter [Cyclone]", |
" 10b7 9800 3c980-TX Fast Etherlink XL Server Adapter", |
" 9805 3c980-C 10/100baseTX NIC [Python-T]", |
" 10b7 1201 EtherLink Server 10/100 Dual Port A", |
" 10b7 1202 EtherLink Server 10/100 Dual Port B", |
" 10b7 9805 3c980 10/100baseTX NIC [Python-T]", |
" 10f1 2462 Thunder K7 S2462", |
" 9900 3C990-TX [Typhoon]", |
" 9902 3CR990-TX-95 [Typhoon 56-bit]", |
" 9903 3CR990-TX-97 [Typhoon 168-bit]", |
" 9904 3C990B-TX-M/3C990BSVR [Typhoon2]", |
" 10b7 1000 3CR990B-TX-M [Typhoon2]", |
" 10b7 2000 3CR990BSVR [Typhoon2 Server]", |
" 9905 3CR990-FX-95/97/95 [Typhon Fiber]", |
" 10b7 1101 3CR990-FX-95 [Typhoon Fiber 56-bit]", |
" 10b7 1102 3CR990-FX-97 [Typhoon Fiber 168-bit]", |
" 10b7 2101 3CR990-FX-95 Server [Typhoon Fiber 56-bit]", |
" 10b7 2102 3CR990-FX-97 Server [Typhoon Fiber 168-bit]", |
" 9908 3CR990SVR95 [Typhoon Server 56-bit]", |
" 9909 3CR990SVR97 [Typhoon Server 168-bit]", |
" 990a 3C990SVR [Typhoon Server]", |
" 990b 3C990SVR [Typhoon Server]", |
"10b8 Standard Microsystems Corp [SMC]", |
" 0005 83c170 EPIC/100 Fast Ethernet Adapter", |
" 1055 e000 LANEPIC 10/100 [EVB171Q-PCI]", |
" 1055 e002 LANEPIC 10/100 [EVB171G-PCI]", |
" 10b8 a011 EtherPower II 10/100", |
" 10b8 a014 EtherPower II 10/100", |
" 10b8 a015 EtherPower II 10/100", |
" 10b8 a016 EtherPower II 10/100", |
" 10b8 a017 EtherPower II 10/100", |
" 0006 83c175 EPIC/100 Fast Ethernet Adapter", |
" 1055 e100 LANEPIC Cardbus Fast Ethernet Adapter", |
" 1055 e102 LANEPIC Cardbus Fast Ethernet Adapter", |
" 1055 e300 LANEPIC Cardbus Fast Ethernet Adapter", |
" 1055 e302 LANEPIC Cardbus Fast Ethernet Adapter", |
" 10b8 a012 LANEPIC Cardbus Fast Ethernet Adapter", |
" 13a2 8002 LANEPIC Cardbus Fast Ethernet Adapter", |
" 13a2 8006 LANEPIC Cardbus Fast Ethernet Adapter", |
" 1000 FDC 37c665", |
" 1001 FDC 37C922", |
" 2802 SMC2802W [EZ Connect g]", |
" a011 83C170QF", |
" b106 SMC34C90", |
"10b9 ALi Corporation", |
" 0101 CMI8338/C3DX PCI Audio Device", |
" 0111 C-Media CMI8738/C3DX Audio Device (OEM)", |
" 10b9 0111 C-Media CMI8738/C3DX Audio Device (OEM)", |
" 0780 Multi-IO Card", |
" 0782 Multi-IO Card", |
" 1435 M1435", |
" 1445 M1445", |
" 1449 M1449", |
" 1451 M1451", |
" 1461 M1461", |
" 1489 M1489", |
" 1511 M1511 [Aladdin]", |
" 1512 M1512 [Aladdin]", |
" 1513 M1513 [Aladdin]", |
" 1521 M1521 [Aladdin III]", |
" 10b9 1521 ALI M1521 Aladdin III CPU Bridge", |
" 1523 M1523", |
" 10b9 1523 ALI M1523 ISA Bridge", |
" 1531 M1531 [Aladdin IV]", |
" 1533 M1533/M1535 PCI to ISA Bridge [Aladdin IV/V/V+]", |
" 1014 053b ThinkPad R40e (2684-HVG) PCI to ISA Bridge", |
" 10b9 1533 ALi M1533 Aladdin IV/V ISA Bridge", |
" 1541 M1541", |
" 10b9 1541 ALI M1541 Aladdin V/V+ AGP System Controller", |
" 1543 M1543", |
" 1563 M1563 HyperTransport South Bridge", |
" 1573 PCI to LPC Controller", |
" 1621 M1621", |
" 1631 ALI M1631 PCI North Bridge Aladdin Pro III", |
" 1632 M1632M Northbridge+Trident", |
" 1641 ALI M1641 PCI North Bridge Aladdin Pro IV", |
" 1644 M1644/M1644T Northbridge+Trident", |
" 1646 M1646 Northbridge+Trident", |
" 1647 M1647 Northbridge [MAGiK 1 / MobileMAGiK 1]", |
" 1651 M1651/M1651T Northbridge [Aladdin-Pro 5/5M,Aladdin-Pro 5T/5TM]", |
" 1671 M1671 Super P4 Northbridge [AGP4X,PCI and SDR/DDR]", |
" 1672 M1672 Northbridge [CyberALADDiN-P4]", |
" 1681 M1681 P4 Northbridge [AGP8X,HyperTransport and SDR/DDR]", |
" 1687 M1687 K8 Northbridge [AGP8X and HyperTransport]", |
" 1689 M1689 K8 Northbridge [Super K8 Single Chip]", |
" 1695 M1695 K8 Northbridge [PCI Express and HyperTransport]", |
" 1697 M1697 HTT Host Bridge", |
" 3141 M3141", |
" 3143 M3143", |
" 3145 M3145", |
" 3147 M3147", |
" 3149 M3149", |
" 3151 M3151", |
" 3307 M3307", |
" 3309 M3309", |
" 3323 M3325 Video/Audio Decoder", |
" 5212 M4803", |
" 5215 MS4803", |
" 5217 M5217H", |
" 5219 M5219", |
" 5225 M5225", |
" 5228 M5228 ALi ATA/RAID Controller", |
" 5229 M5229 IDE", |
" 1014 050f ThinkPad R30", |
" 1014 053d ThinkPad R40e (2684-HVG) builtin IDE", |
" 103c 0024 Pavilion ze4400 builtin IDE", |
" 1043 8053 A7A266 Motherboard IDE", |
" 5235 M5225", |
" 5237 USB 1.1 Controller", |
" 1014 0540 ThinkPad R40e (2684-HVG) builtin USB", |
" 103c 0024 Pavilion ze4400 builtin USB", |
" 104d 810f VAIO PCG-U1 USB/OHCI Revision 1.0", |
" 5239 USB 2.0 Controller", |
" 5243 M1541 PCI to AGP Controller", |
" 5246 AGP8X Controller", |
" 5247 PCI to AGP Controller", |
" 5249 M5249 HTT to PCI Bridge", |
" 524b PCI Express Root Port", |
" 524c PCI Express Root Port", |
" 524d PCI Express Root Port", |
" 524e PCI Express Root Port", |
" 5251 M5251 P1394 OHCI 1.0 Controller", |
" 5253 M5253 P1394 OHCI 1.1 Controller", |
" 5261 M5261 Ethernet Controller", |
" 5263 M5263 Ethernet Controller", |
" 5281 ALi M5281 Serial ATA / RAID Host Controller", |
" 5287 ULi 5287 SATA", |
" 5288 ULi M5288 SATA", |
" 5289 ULi 5289 SATA", |
" 5450 Lucent Technologies Soft Modem AMR", |
" 5451 M5451 PCI AC-Link Controller Audio Device", |
" 1014 0506 ThinkPad R30", |
" 1014 053e ThinkPad R40e (2684-HVG) builtin Audio", |
" 103c 0024 Pavilion ze4400 builtin Audio", |
" 10b9 5451 HP Compaq nc4010 (DY885AA#ABN)", |
" 5453 M5453 PCI AC-Link Controller Modem Device", |
" 5455 M5455 PCI AC-Link Controller Audio Device", |
" 5457 M5457 AC'97 Modem Controller", |
" 1014 0535 ThinkPad R40e (2684-HVG) builtin modem", |
" 103c 0024 Pavilion ze4400 builtin Modem Device", |
" 5459 SmartLink SmartPCI561 56K Modem", |
" 545a SmartLink SmartPCI563 56K Modem", |
" 5461 High Definition Audio/AC'97 Host Controller", |
" 5471 M5471 Memory Stick Controller", |
" 5473 M5473 SD-MMC Controller", |
" 7101 M7101 Power Management Controller [PMU]", |
" 1014 0510 ThinkPad R30", |
" 1014 053c ThinkPad R40e (2684-HVG) Power Management Controller", |
" 103c 0024 Pavilion ze4400", |
"10ba Mitsubishi Electric Corp.", |
" 0301 AccelGraphics AccelECLIPSE", |
" 0304 AccelGALAXY A2100 [OEM Evans & Sutherland]", |
" 0308 Tornado 3000 [OEM Evans & Sutherland]", |
" 1002 VG500 [VolumePro Volume Rendering Accelerator]", |
"10bb Dapha Electronics Corporation", |
"10bc Advanced Logic Research", |
"10bd Surecom Technology", |
" 0e34 NE-34", |
"10be Tseng Labs International Co.", |
"10bf Most Inc", |
"10c0 Boca Research Inc.", |
"10c1 ICM Co., Ltd.", |
"10c2 Auspex Systems Inc.", |
"10c3 Samsung Semiconductors, Inc.", |
" 1100 Smartether100 SC1100 LAN Adapter (i82557B)", |
"10c4 Award Software International Inc.", |
"10c5 Xerox Corporation", |
"10c6 Rambus Inc.", |
"10c7 Media Vision", |
"10c8 Neomagic Corporation", |
" 0001 NM2070 [MagicGraph 128]", |
" 0002 NM2090 [MagicGraph 128V]", |
" 0003 NM2093 [MagicGraph 128ZV]", |
" 0004 NM2160 [MagicGraph 128XD]", |
" 1014 00ba MagicGraph 128XD", |
" 1025 1007 MagicGraph 128XD", |
" 1028 0074 MagicGraph 128XD", |
" 1028 0075 MagicGraph 128XD", |
" 1028 007d MagicGraph 128XD", |
" 1028 007e MagicGraph 128XD", |
" 1033 802f MagicGraph 128XD", |
" 104d 801b MagicGraph 128XD", |
" 104d 802f MagicGraph 128XD", |
" 104d 830b MagicGraph 128XD", |
" 10ba 0e00 MagicGraph 128XD", |
" 10c8 0004 MagicGraph 128XD", |
" 10cf 1029 MagicGraph 128XD", |
" 10f7 8308 MagicGraph 128XD", |
" 10f7 8309 MagicGraph 128XD", |
" 10f7 830b MagicGraph 128XD", |
" 10f7 830d MagicGraph 128XD", |
" 10f7 8312 MagicGraph 128XD", |
" 0005 NM2200 [MagicGraph 256AV]", |
" 1014 00dd ThinkPad 570", |
" 1028 0088 Latitude CPi A", |
" 0006 NM2360 [MagicMedia 256ZX]", |
" 0016 NM2380 [MagicMedia 256XL+]", |
" 10c8 0016 MagicMedia 256XL+", |
" 0025 NM2230 [MagicGraph 256AV+]", |
" 0083 NM2093 [MagicGraph 128ZV+]", |
" 8005 NM2200 [MagicMedia 256AV Audio]", |
" 0e11 b0d1 MagicMedia 256AV Audio Device on Discovery", |
" 0e11 b126 MagicMedia 256AV Audio Device on Durango", |
" 1014 00dd MagicMedia 256AV Audio Device on BlackTip Thinkpad", |
" 1025 1003 MagicMedia 256AV Audio Device on TravelMate 720", |
" 1028 0088 Latitude CPi A", |
" 1028 008f MagicMedia 256AV Audio Device on Colorado Inspiron", |
" 103c 0007 MagicMedia 256AV Audio Device on Voyager II", |
" 103c 0008 MagicMedia 256AV Audio Device on Voyager III", |
" 103c 000d MagicMedia 256AV Audio Device on Omnibook 900", |
" 10c8 8005 MagicMedia 256AV Audio Device on FireAnt", |
" 110a 8005 MagicMedia 256AV Audio Device", |
" 14c0 0004 MagicMedia 256AV Audio Device", |
" 8006 NM2360 [MagicMedia 256ZX Audio]", |
" 8016 NM2380 [MagicMedia 256XL+ Audio]", |
"10c9 Dataexpert Corporation", |
"10ca Fujitsu Microelectr., Inc.", |
"10cb Omron Corporation", |
"10cc Mai Logic Incorporated", |
" 0660 Articia S Host Bridge", |
" 0661 Articia S PCI Bridge", |
"10cd Advanced System Products, Inc", |
" 1100 ASC1100", |
" 1200 ASC1200 [(abp940) Fast SCSI-II]", |
" 1300 ABP940-U / ABP960-U", |
" 10cd 1310 ASC1300 SCSI Adapter", |
" 2300 ABP940-UW", |
" 2500 ABP940-U2W", |
"10ce Radius", |
"10cf Fujitsu Limited.", |
" 2001 mb86605", |
"10d1 FuturePlus Systems Corp.", |
"10d2 Molex Incorporated", |
"10d3 Jabil Circuit Inc", |
"10d4 Hualon Microelectronics", |
"10d5 Autologic Inc.", |
"10d6 Cetia", |
"10d7 BCM Advanced Research", |
"10d8 Advanced Peripherals Labs", |
"10d9 Macronix, Inc. [MXIC]", |
" 0431 MX98715", |
" 0512 MX98713", |
" 0531 MX987x5", |
" 1186 1200 DFE-540TX ProFAST 10/100 Adapter", |
" 8625 MX86250", |
" 8626 Macronix MX86251 + 3Dfx Voodoo Rush", |
" 8888 MX86200", |
"10da Compaq IPG-Austin", |
" 0508 TC4048 Token Ring 4/16", |
" 3390 Tl3c3x9", |
"10db Rohm LSI Systems, Inc.", |
"10dc CERN/ECP/EDU", |
" 0001 STAR/RD24 SCI-PCI (PMC)", |
" 0002 TAR/RD24 SCI-PCI (PMC)", |
" 0021 HIPPI destination", |
" 0022 HIPPI source", |
" 10dc ATT2C15-3 FPGA", |
"10dd Evans & Sutherland", |
" 0100 Lightning 1200", |
"10de nVidia Corporation", |
" 0008 NV1 [EDGE 3D]", |
" 0009 NV1 [EDGE 3D]", |
" 0010 NV2 [Mutara V08]", |
" 0020 NV4 [RIVA TNT]", |
" 1043 0200 V3400 TNT", |
" 1048 0c18 Erazor II SGRAM", |
" 1048 0c19 Erazor II", |
" 1048 0c1b Erazor II", |
" 1048 0c1c Erazor II", |
" 1092 0550 Viper V550", |
" 1092 0552 Viper V550", |
" 1092 4804 Viper V550", |
" 1092 4808 Viper V550", |
" 1092 4810 Viper V550", |
" 1092 4812 Viper V550", |
" 1092 4815 Viper V550", |
" 1092 4820 Viper V550 with TV out", |
" 1092 4822 Viper V550", |
" 1092 4904 Viper V550", |
" 1092 4914 Viper V550", |
" 1092 8225 Viper V550", |
" 10b4 273d Velocity 4400", |
" 10b4 273e Velocity 4400", |
" 10b4 2740 Velocity 4400", |
" 10de 0020 Riva TNT", |
" 1102 1015 Graphics Blaster CT6710", |
" 1102 1016 Graphics Blaster RIVA TNT", |
" 0028 NV5 [RIVA TNT2/TNT2 Pro]", |
" 1043 0200 AGP-V3800 SGRAM", |
" 1043 0201 AGP-V3800 SDRAM", |
" 1043 0205 PCI-V3800", |
" 1043 4000 AGP-V3800PRO", |
" 1048 0c21 Synergy II", |
" 1048 0c28 Erazor III", |
" 1048 0c29 Erazor III", |
" 1048 0c2a Erazor III", |
" 1048 0c2b Erazor III", |
" 1048 0c31 Erazor III Pro", |
" 1048 0c32 Erazor III Pro", |
" 1048 0c33 Erazor III Pro", |
" 1048 0c34 Erazor III Pro", |
" 107d 2134 WinFast 3D S320 II + TV-Out", |
" 1092 4804 Viper V770", |
" 1092 4a00 Viper V770", |
" 1092 4a02 Viper V770 Ultra", |
" 1092 5a00 RIVA TNT2/TNT2 Pro", |
" 1092 6a02 Viper V770 Ultra", |
" 1092 7a02 Viper V770 Ultra", |
" 10de 0005 RIVA TNT2 Pro", |
" 10de 000f Compaq NVIDIA TNT2 Pro", |
" 1102 1020 3D Blaster RIVA TNT2", |
" 1102 1026 3D Blaster RIVA TNT2 Digital", |
" 14af 5810 Maxi Gamer Xentor", |
" 0029 NV5 [RIVA TNT2 Ultra]", |
" 1043 0200 AGP-V3800 Deluxe", |
" 1043 0201 AGP-V3800 Ultra SDRAM", |
" 1043 0205 PCI-V3800 Ultra", |
" 1048 0c2e Erazor III Ultra", |
" 1048 0c2f Erazor III Ultra", |
" 1048 0c30 Erazor III Ultra", |
" 1102 1021 3D Blaster RIVA TNT2 Ultra", |
" 1102 1029 3D Blaster RIVA TNT2 Ultra", |
" 1102 102f 3D Blaster RIVA TNT2 Ultra", |
" 14af 5820 Maxi Gamer Xentor 32", |
" 002a NV5 [Riva TnT2]", |
" 002b NV5 [Riva TnT2]", |
" 002c NV6 [Vanta/Vanta LT]", |
" 1043 0200 AGP-V3800 Combat SDRAM", |
" 1043 0201 AGP-V3800 Combat", |
" 1048 0c20 TNT2 Vanta", |
" 1048 0c21 TNT2 Vanta", |
" 1092 6820 Viper V730", |
" 1102 1031 CT6938 VANTA 8MB", |
" 1102 1034 CT6894 VANTA 16MB", |
" 14af 5008 Maxi Gamer Phoenix 2", |
" 002d NV5M64 [RIVA TNT2 Model 64/Model 64 Pro]", |
" 1043 0200 AGP-V3800M", |
" 1043 0201 AGP-V3800M", |
" 1048 0c3a Erazor III LT", |
" 1048 0c3b Erazor III LT", |
" 10de 001e M64 AGP4x", |
" 1102 1023 CT6892 RIVA TNT2 Value", |
" 1102 1024 CT6932 RIVA TNT2 Value 32Mb", |
" 1102 102c CT6931 RIVA TNT2 Value [Jumper]", |
" 1462 8808 MSI-8808", |
" 1554 1041 Pixelview RIVA TNT2 M64", |
" 1569 002d Palit Microsystems Daytona TNT2 M64", |
" 002e NV6 [Vanta]", |
" 002f NV6 [Vanta]", |
" 0034 MCP04 SMBus", |
" 0035 MCP04 IDE", |
" 0036 MCP04 Serial ATA Controller", |
" 0037 MCP04 Ethernet Controller", |
" 0038 MCP04 Ethernet Controller", |
" 003a MCP04 AC'97 Audio Controller", |
" 003b MCP04 USB Controller", |
" 003c MCP04 USB Controller", |
" 003d MCP04 PCI Bridge", |
" 003e MCP04 Serial ATA Controller", |
" 0040 NV40 [GeForce 6800 Ultra]", |
" 0041 NV40 [GeForce 6800]", |
" 1043 817b V9999 Gamer Edition", |
" 0042 NV40.2 [GeForce 6800 LE]", |
" 0043 NV40.3", |
" 0044 NV40 [GeForce 6800 XT]", |
" 0045 NV40 [GeForce 6800 GT]", |
" 0047 NV40 [GeForce 6800 GS]", |
" 1682 2109 GeForce 6800 GS", |
" 0049 NV40GL", |
" 004e NV40GL [Quadro FX 4000]", |
" 0050 CK804 ISA Bridge", |
" 1043 815a K8N4-E Mainboard", |
" 1458 0c11 GA-K8N Ultra-9 Mainboard", |
" 1462 7100 MSI K8N Diamond", |
" 0051 CK804 ISA Bridge", |
" 0052 CK804 SMBus", |
" 1043 815a K8N4-E Mainboard", |
" 1458 0c11 GA-K8N Ultra-9 Mainboard", |
" 1462 7100 MSI K8N Diamond", |
" 0053 CK804 IDE", |
" 1043 815a K8N4-E Mainboard", |
" 1458 5002 GA-K8N Ultra-9 Mainboard", |
" 1462 7100 MSI K8N Diamond", |
" 0054 CK804 Serial ATA Controller", |
" 1458 b003 GA-K8N Ultra-9 Mainboard", |
" 1462 7100 MSI K8N Diamond", |
" 0055 CK804 Serial ATA Controller", |
" 1043 815a K8N4-E Mainboard", |
" 1458 b003 GA-K8N Ultra-9 Mainboard", |
" 0056 CK804 Ethernet Controller", |
" 0057 CK804 Ethernet Controller", |
" 1043 8141 K8N4-E Mainboard", |
" 1458 e000 GA-K8N Ultra-9 Mainboard", |
" 1462 7100 MSI K8N Diamond", |
" 0058 CK804 AC'97 Modem", |
" 0059 CK804 AC'97 Audio Controller", |
" 1043 812a K8N4-E Mainboard", |
" 005a CK804 USB Controller", |
" 1043 815a K8N4-E Mainboard", |
" 1458 5004 GA-K8N Ultra-9 Mainboard", |
" 1462 7100 MSI K8N Diamond", |
" 005b CK804 USB Controller", |
" 1043 815a K8N4-E Mainboard", |
" 1458 5004 GA-K8N Ultra-9 Mainboard", |
" 1462 7100 MSI K8N Diamond", |
" 005c CK804 PCI Bridge", |
" 005d CK804 PCIE Bridge", |
" 005e CK804 Memory Controller", |
" 10f1 2891 Thunder K8SRE Mainboard", |
" 1458 5000 GA-K8N Ultra-9 Mainboard", |
" 1462 7100 MSI K8N Diamond", |
" 005f CK804 Memory Controller", |
" 0060 nForce2 ISA Bridge", |
" 1043 80ad A7N8X Mainboard", |
" a0a0 03ba UK79G-1394 motherboard", |
" 0064 nForce2 SMBus (MCP)", |
" a0a0 03bb UK79G-1394 motherboard", |
" 0065 nForce2 IDE", |
" a0a0 03b2 UK79G-1394 motherboard", |
" 0066 nForce2 Ethernet Controller", |
" 1043 80a7 A7N8X Mainboard onboard nForce2 Ethernet", |
" 0067 nForce2 USB Controller", |
" 1043 0c11 A7N8X Mainboard", |
" 0068 nForce2 USB Controller", |
" 1043 0c11 A7N8X Mainboard", |
" a0a0 03b4 UK79G-1394 motherboard", |
" 006a nForce2 AC97 Audio Controler (MCP)", |
" a0a0 0304 UK79G-1394 motherboard", |
" 006b nForce Audio Processing Unit", |
" 10de 006b nForce2 MCP Audio Processing Unit", |
" 006c nForce2 External PCI Bridge", |
" 006d nForce2 PCI Bridge", |
" 006e nForce2 FireWire (IEEE 1394) Controller", |
" a0a0 0306 UK79G-1394 motherboard", |
" 0080 MCP2A ISA bridge", |
" 147b 1c09 NV7 Motherboard", |
" 0084 MCP2A SMBus", |
" 147b 1c09 NV7 Motherboard", |
" 0085 MCP2A IDE", |
" 147b 1c09 NV7 Motherboard", |
" 0086 MCP2A Ethernet Controller", |
" 0087 MCP2A USB Controller", |
" 147b 1c09 NV7 Motherboard", |
" 0088 MCP2A USB Controller", |
" 147b 1c09 NV7 Motherboard", |
" 008a MCP2S AC'97 Audio Controller", |
" 147b 1c09 NV7 Motherboard", |
" 008b MCP2A PCI Bridge", |
" 008c MCP2A Ethernet Controller", |
" 008e nForce2 Serial ATA Controller", |
" 0090 G70 [GeForce 7800 GTX]", |
" 0091 G70 [GeForce 7800 GTX]", |
" 0092 G70 [GeForce 7800 GT]", |
" 0093 G70 [GeForce 7800 GS]", |
" 0098 GeForce Go 7800", |
" 0099 GE Force Go 7800 GTX", |
" 009d G70GL [Quadro FX4500]", |
" 00a0 NV5 [Aladdin TNT2]", |
" 14af 5810 Maxi Gamer Xentor", |
" 00c0 NV41 [GeForce 6800 GS]", |
" 00c1 NV41.1 [GeForce 6800]", |
" 00c2 NV41.2 [GeForce 6800 LE]", |
" 00c3 NV42 [Geforce 6800 XT]", |
" 00c8 NV41.8 [GeForce Go 6800]", |
" 00c9 NV41.9 [GeForce Go 6800 Ultra]", |
" 00cc NV41 [Quadro FX Go1400]", |
" 00cd NV41 [Quadro FX 3450/4000 SDI]", |
" 00ce NV41GL [Quadro FX 1400]", |
" 00d0 nForce3 LPC Bridge", |
" 00d1 nForce3 Host Bridge", |
" 00d2 nForce3 AGP Bridge", |
" 00d3 CK804 Memory Controller", |
" 00d4 nForce3 SMBus", |
" 00d5 nForce3 IDE", |
" 00d6 nForce3 Ethernet", |
" 00d7 nForce3 USB 1.1", |
" 00d8 nForce3 USB 2.0", |
" 00d9 nForce3 Audio", |
" 00da nForce3 Audio", |
" 00dd nForce3 PCI Bridge", |
" 00df CK8S Ethernet Controller", |
" 147b 1c0b NF8 Mainboard", |
" 00e0 nForce3 250Gb LPC Bridge", |
" 147b 1c0b NF8 Mainboard", |
" 00e1 nForce3 250Gb Host Bridge", |
" 147b 1c0b NF8 Mainboard", |
" 00e2 nForce3 250Gb AGP Host to PCI Bridge", |
" 00e3 CK8S Serial ATA Controller (v2.5)", |
" 147b 1c0b NF8 Mainboard", |
" 00e4 nForce 250Gb PCI System Management", |
" 147b 1c0b NF8 Mainboard", |
" 00e5 CK8S Parallel ATA Controller (v2.5)", |
" 147b 1c0b NF8 Mainboard", |
" 00e6 CK8S Ethernet Controller", |
" 00e7 CK8S USB Controller", |
" 147b 1c0b NF8 Mainboard", |
" 00e8 nForce3 EHCI USB 2.0 Controller", |
" 147b 1c0b NF8 Mainboard", |
" 00ea nForce3 250Gb AC'97 Audio Controller", |
" 147b 1c0b NF8 Mainboard", |
" 00ed nForce3 250Gb PCI-to-PCI Bridge", |
" 00ee CK8S Serial ATA Controller (v2.5)", |
" 00f0 NV40 [GeForce 6800/GeForce 6800 Ultra]", |
" 00f1 NV43 [GeForce 6600/GeForce 6600 GT]", |
" 1043 81a6 N6600GT TD 128M AGP", |
" 1682 2119 GeForce 6600 GT AGP 128MB DDR3 DUAL DVI TV", |
" 00f2 NV43 [GeForce 6600/GeForce 6600 GT]", |
" 1682 211c GeForce 6600 256MB DDR DUAL DVI TV", |
" 00f3 NV43 [GeForce 6200]", |
" 00f4 NV43 [GeForce 6600 LE]", |
" 00f5 G70 [GeForce 7800 GS]", |
" 00f6 NV43 [GeForce 6600 GS]", |
" 00f8 NV45GL [Quadro FX 3400/4400]", |
" 00f9 NV40 [GeForce 6800 Ultra/GeForce 6800 GT]", |
" 1682 2120 GEFORCE 6800 GT PCI-E", |
" 00fa NV36 [GeForce PCX 5750]", |
" 00fb NV35 [GeForce PCX 5900]", |
" 00fc NV37GL [Quadro FX 330/GeForce PCX 5300]", |
" 00fd NV37GL [Quadro FX 330/Quadro NVS280]", |
" 00fe NV38GL [Quadro FX 1300]", |
" 00ff NV18 [GeForce PCX 4300]", |
" 0100 NV10 [GeForce 256 SDR]", |
" 1043 0200 AGP-V6600 SGRAM", |
" 1043 0201 AGP-V6600 SDRAM", |
" 1043 4008 AGP-V6600 SGRAM", |
" 1043 4009 AGP-V6600 SDRAM", |
" 1048 0c41 Erazor X", |
" 1048 0c43 ERAZOR X PCI", |
" 1048 0c48 Synergy Force", |
" 1102 102d CT6941 GeForce 256", |
" 14af 5022 3D Prophet SE", |
" 0101 NV10DDR [GeForce 256 DDR]", |
" 1043 0202 AGP-V6800 DDR", |
" 1043 400a AGP-V6800 DDR SGRAM", |
" 1043 400b AGP-V6800 DDR SDRAM", |
" 1048 0c42 Erazor X", |
" 107d 2822 WinFast GeForce 256", |
" 1102 102e CT6971 GeForce 256 DDR", |
" 14af 5021 3D Prophet DDR-DVI", |
" 0103 NV10GL [Quadro]", |
" 1048 0c40 GLoria II-64", |
" 1048 0c44 GLoria II", |
" 1048 0c45 GLoria II", |
" 1048 0c4a GLoria II-64 Pro", |
" 1048 0c4b GLoria II-64 Pro DVII", |
" 0110 NV11 [GeForce2 MX/MX 400]", |
" 1043 4015 AGP-V7100 Pro", |
" 1043 4031 V7100 Pro with TV output", |
" 1048 0c60 Gladiac MX", |
" 1048 0c61 Gladiac 511PCI", |
" 1048 0c63 Gladiac 511TV-OUT 32MB", |
" 1048 0c64 Gladiac 511TV-OUT 64MB", |
" 1048 0c65 Gladiac 511TWIN", |
" 1048 0c66 Gladiac 311", |
" 10de 0091 Dell OEM GeForce 2 MX 400", |
" 10de 00a1 Apple OEM GeForce2 MX", |
" 1462 8817 MSI GeForce2 MX400 Pro32S [MS-8817]", |
" 14af 7102 3D Prophet II MX", |
" 14af 7103 3D Prophet II MX Dual-Display", |
" 0111 NV11DDR [GeForce2 MX 100 DDR/200 DDR]", |
" 0112 NV11 [GeForce2 Go]", |
" 0113 NV11GL [Quadro2 MXR/EX/Go]", |
" 0140 NV43 [GeForce 6600 GT]", |
" 0141 NV43 [GeForce 6600]", |
" 1458 3124 GV-NX66128DP Turbo Force Edition", |
" 0142 NV43 [GeForce 6600 PCIe]", |
" 0144 NV43 [GeForce Go 6600]", |
" 0145 NV43 [GeForce 6610 XL]", |
" 0146 NV43 [Geforce Go 6600TE/6200TE]", |
" 0148 NV43 [GeForce Go 6600]", |
" 0149 NV43 [GeForce Go 6600 GT]", |
" 014a Quadro NVS 440", |
" 014c Quadro FX 550", |
" 014e NV43GL [Quadro FX 540]", |
" 014f NV43 [GeForce 6200]", |
" 0150 NV15 [GeForce2 GTS/Pro]", |
" 1043 4016 V7700 AGP Video Card", |
" 1048 0c50 Gladiac", |
" 1048 0c52 Gladiac-64", |
" 107d 2840 WinFast GeForce2 GTS with TV output", |
" 107d 2842 WinFast GeForce 2 Pro", |
" 1462 8831 Creative GeForce2 Pro", |
" 0151 NV15DDR [GeForce2 Ti]", |
" 1043 405f V7700Ti", |
" 1462 5506 Creative 3D Blaster Geforce2 Titanium", |
" 0152 NV15BR [GeForce2 Ultra, Bladerunner]", |
" 1048 0c56 GLADIAC Ultra", |
" 0153 NV15GL [Quadro2 Pro]", |
" 0161 GeForce 6200 TurboCache(TM)", |
" 0162 NV43 [GeForce 6200 SE]", |
" 0164 NV44 [GeForce Go 6200]", |
" 0165 NV44 [Quadro NVS 285]", |
" 0166 NV43 [GeForce Go 6400]", |
" 0167 GeForce Go 6200 TurboCache", |
" 0168 NV43 [GeForce Go 6200 TurboCache]", |
" 0170 NV17 [GeForce4 MX 460]", |
" 0171 NV17 [GeForce4 MX 440]", |
" 10b0 0002 Gainward Pro/600 TV", |
" 10de 0008 Apple OEM GeForce4 MX 440", |
" 1462 8661 G4MX440-VTP", |
" 1462 8730 MX440SES-T (MS-8873)", |
" 1462 8852 GeForce4 MX440 PCI", |
" 147b 8f00 Abit Siluro GeForce4MX440", |
" 0172 NV17 [GeForce4 MX 420]", |
" 0173 NV17 [GeForce4 MX 440-SE]", |
" 0174 NV17 [GeForce4 440 Go]", |
" 0175 NV17 [GeForce4 420 Go]", |
" 0176 NV17 [GeForce4 420 Go 32M]", |
" 4c53 1090 Cx9 / Vx9 mainboard", |
" 0177 NV17 [GeForce4 460 Go]", |
" 0178 NV17GL [Quadro4 550 XGL]", |
" 0179 NV17 [GeForce4 420 Go 32M]", |
" 10de 0179 GeForce4 MX (Mac)", |
" 017a NV17GL [Quadro4 200/400 NVS]", |
" 017b NV17GL [Quadro4 550 XGL]", |
" 017c NV17GL [Quadro4 500 GoGL]", |
" 017d NV17 [GeForce4 410 Go 16M]", |
" 0181 NV18 [GeForce4 MX 440 AGP 8x]", |
" 1043 806f V9180 Magic", |
" 1462 8880 MS-StarForce GeForce4 MX 440 with AGP8X", |
" 1462 8900 MS-8890 GeForce 4 MX440 AGP8X", |
" 1462 9350 MSI Geforce4 MX T8X with AGP8X", |
" 147b 8f0d Siluro GF4 MX-8X", |
" 0182 NV18 [GeForce4 MX 440SE AGP 8x]", |
" 0183 NV18 [GeForce4 MX 420 AGP 8x]", |
" 0185 NV18 [GeForce4 MX 4000 AGP 8x]", |
" 0186 NV18M [GeForce4 448 Go]", |
" 0187 NV18M [GeForce4 488 Go]", |
" 0188 NV18GL [Quadro4 580 XGL]", |
" 018a NV18GL [Quadro4 NVS AGP 8x]", |
" 018b NV18GL [Quadro4 380 XGL]", |
" 018c Quadro NVS 50 PCI", |
" 018d NV18M [GeForce4 448 Go]", |
" 01a0 NVCrush11 [GeForce2 MX Integrated Graphics]", |
" 01a4 nForce CPU bridge", |
" 01ab nForce 420 Memory Controller (DDR)", |
" 01ac nForce 220/420 Memory Controller", |
" 01ad nForce 220/420 Memory Controller", |
" 01b0 nForce Audio", |
" 01b1 nForce Audio", |
" 01b2 nForce ISA Bridge", |
" 01b4 nForce PCI System Management", |
" 01b7 nForce AGP to PCI Bridge", |
" 01b8 nForce PCI-to-PCI bridge", |
" 01bc nForce IDE", |
" 01c1 nForce AC'97 Modem Controller", |
" 01c2 nForce USB Controller", |
" 01c3 nForce Ethernet Controller", |
" 01d1 GeForce 7300 LE", |
" 01d7 Quadro NVS 110M / GeForce Go 7300", |
" 01d8 GeForce Go 7400", |
" 01da Quadro NVS 110M", |
" 01de Quadro FX 350", |
" 10de 01dc Quadro FX Go350M", |
" 01df GeForce 7300 GS", |
" 01e0 nForce2 AGP (different version?)", |
" 147b 1c09 NV7 Motherboard", |
" 01e8 nForce2 AGP", |
" 01ea nForce2 Memory Controller 0", |
" a0a0 03b9 UK79G-1394 motherboard", |
" 01eb nForce2 Memory Controller 1", |
" a0a0 03b9 UK79G-1394 motherboard", |
" 01ec nForce2 Memory Controller 2", |
" a0a0 03b9 UK79G-1394 motherboard", |
" 01ed nForce2 Memory Controller 3", |
" a0a0 03b9 UK79G-1394 motherboard", |
" 01ee nForce2 Memory Controller 4", |
" a0a0 03b9 UK79G-1394 motherboard", |
" 01ef nForce2 Memory Controller 5", |
" a0a0 03b9 UK79G-1394 motherboard", |
" 01f0 NV18 [GeForce4 MX - nForce GPU]", |
" a0a0 03b5 UK79G-1394 motherboard", |
" 0200 NV20 [GeForce3]", |
" 1043 402f AGP-V8200 DDR", |
" 1048 0c70 GLADIAC 920", |
" 0201 NV20 [GeForce3 Ti 200]", |
" 0202 NV20 [GeForce3 Ti 500]", |
" 1043 405b V8200 T5", |
" 1545 002f Xtasy 6964", |
" 0203 NV20DCC [Quadro DCC]", |
" 0211 NV40 [GeForce 6800]", |
" 0212 NV40 [GeForce 6800 LE]", |
" 0215 NV40 [GeForce 6800 GT]", |
" 0218 NV40 [GeForce 6800 XT]", |
" 0221 NV43 [GeForce 6200]", |
" 0240 C51PV [GeForce 6150]", |
" 1462 7207 K8NGM2 series", |
" 0241 C51 PCI Express Bridge", |
" 0242 C51G [GeForce 6100]", |
" 0243 C51 PCI Express Bridge", |
" 0244 C51 PCI Express Bridge", |
" 0245 C51 PCI Express Bridge", |
" 0246 C51 PCI Express Bridge", |
" 0247 C51 PCI Express Bridge", |
" 0248 C51 PCI Express Bridge", |
" 0249 C51 PCI Express Bridge", |
" 024a C51 PCI Express Bridge", |
" 024b C51 PCI Express Bridge", |
" 024c C51 PCI Express Bridge", |
" 024d C51 PCI Express Bridge", |
" 024e C51 PCI Express Bridge", |
" 024f C51 PCI Express Bridge", |
" 0250 NV25 [GeForce4 Ti 4600]", |
" 0251 NV25 [GeForce4 Ti 4400]", |
" 1043 8023 v8440 GeForce 4 Ti4400", |
" 0252 NV25 [GeForce4 Ti]", |
" 0253 NV25 [GeForce4 Ti 4200]", |
" 107d 2896 WinFast A250 LE TD (Dual VGA/TV-out/DVI)", |
" 147b 8f09 Siluro (Dual VGA/TV-out/DVI)", |
" 0258 NV25GL [Quadro4 900 XGL]", |
" 0259 NV25GL [Quadro4 750 XGL]", |
" 025b NV25GL [Quadro4 700 XGL]", |
" 0260 MCP51 LPC Bridge", |
" 1462 7207 K8NGM2 series", |
" 0261 MCP51 LPC Bridge", |
" 0262 MCP51 LPC Bridge", |
" 0263 MCP51 LPC Bridge", |
" 0264 MCP51 SMBus", |
" 1462 7207 K8NGM2 series", |
" 0265 MCP51 IDE", |
" 1462 7207 K8NGM2 series", |
" 0266 MCP51 Serial ATA Controller", |
" 1462 7207 K8NGM2 series", |
" 0267 MCP51 Serial ATA Controller", |
" 1462 7207 K8NGM2 series", |
" 0268 MCP51 Ethernet Controller", |
" 0269 MCP51 Ethernet Controller", |
" 1462 7207 K8NGM2 series", |
" 026a MCP51 MCI", |
" 026b MCP51 AC97 Audio Controller", |
" 026c MCP51 High Definition Audio", |
" 1462 7207 K8NGM2 series", |
" 026d MCP51 USB Controller", |
" 1462 7207 K8NGM2 series", |
" 026e MCP51 USB Controller", |
" 1462 7207 K8NGM2 series", |
" 026f MCP51 PCI Bridge", |
" 0270 MCP51 Host Bridge", |
" 1462 7207 K8NGM2 series", |
" 0271 MCP51 PMU", |
" 0272 MCP51 Memory Controller 0", |
" 027e C51 Memory Controller 2", |
" 1462 7207 K8NGM2 series", |
" 027f C51 Memory Controller 3", |
" 1462 7207 K8NGM2 series", |
" 0280 NV28 [GeForce4 Ti 4800]", |
" 0281 NV28 [GeForce4 Ti 4200 AGP 8x]", |
" 0282 NV28 [GeForce4 Ti 4800 SE]", |
" 0286 NV28 [GeForce4 Ti 4200 Go AGP 8x]", |
" 0288 NV28GL [Quadro4 980 XGL]", |
" 0289 NV28GL [Quadro4 780 XGL]", |
" 028c NV28GLM [Quadro4 700 GoGL]", |
" 0290 GeForce 7900 GTX", |
" 0291 GeForce 7900 GT", |
" 029a G71 [Quadro FX 2500M]", |
" 029b G71 [Quadro FX 1500M]", |
" 029c Quadro FX 5500", |
" 029d Quadro FX 3500", |
" 029e Quadro FX 1500", |
" 02a0 NV2A [XGPU]", |
" 02e1 GeForce 7600 GS", |
" 02f0 C51 Host Bridge", |
" 1462 7207 K8NGM2 series", |
" 02f1 C51 Host Bridge", |
" 02f2 C51 Host Bridge", |
" 02f3 C51 Host Bridge", |
" 02f4 C51 Host Bridge", |
" 02f5 C51 Host Bridge", |
" 02f6 C51 Host Bridge", |
" 02f7 C51 Host Bridge", |
" 02f8 C51 Memory Controller 5", |
" 1462 7207 K8NGM2 series", |
" 02f9 C51 Memory Controller 4", |
" 1462 7207 K8NGM2 series", |
" 02fa C51 Memory Controller 0", |
" 1462 7207 K8NGM2 series", |
" 02fb C51 PCI Express Bridge", |
" 02fc C51 PCI Express Bridge", |
" 02fd C51 PCI Express Bridge", |
" 02fe C51 Memory Controller 1", |
" 1462 7207 K8NGM2 series", |
" 02ff C51 Host Bridge", |
" 1462 7207 K8NGM2 series", |
" 0300 NV30 [GeForce FX]", |
" 0301 NV30 [GeForce FX 5800 Ultra]", |
" 0302 NV30 [GeForce FX 5800]", |
" 0308 NV30GL [Quadro FX 2000]", |
" 0309 NV30GL [Quadro FX 1000]", |
" 0311 NV31 [GeForce FX 5600 Ultra]", |
" 0312 NV31 [GeForce FX 5600]", |
" 0313 NV31", |
" 0314 NV31 [GeForce FX 5600XT]", |
" 1043 814a V9560XT/TD", |
" 0316 NV31M", |
" 0317 NV31M Pro", |
" 031a NV31M [GeForce FX Go5600]", |
" 031b NV31M [GeForce FX Go5650]", |
" 031c NVIDIA Quadro FX Go700", |
" 031d NV31GLM", |
" 031e NV31GLM Pro", |
" 031f NV31GLM Pro", |
" 0320 NV34 [GeForce FX 5200]", |
" 0321 NV34 [GeForce FX 5200 Ultra]", |
" 0322 NV34 [GeForce FX 5200]", |
" 1462 9171 MS-8917 (FX5200-T128)", |
" 1462 9360 MS-8936 (FX5200-T128)", |
" 0323 NV34 [GeForce FX 5200LE]", |
" 0324 NV34M [GeForce FX Go5200]", |
" 1028 0196 Inspiron 5160", |
" 1071 8160 MIM2000", |
" 0325 NV34M [GeForce FX Go5250]", |
" 0326 NV34 [GeForce FX 5500]", |
" 0327 NV34 [GeForce FX 5100]", |
" 0328 NV34M [GeForce FX Go5200 32M/64M]", |
" 0329 NV34M [GeForce FX Go5200]", |
" 032a NV34GL [Quadro NVS 280 PCI]", |
" 032b NV34GL [Quadro FX 500/600 PCI]", |
" 032c NV34GLM [GeForce FX Go 5300]", |
" 032d NV34 [GeForce FX Go5100]", |
" 032f NV34GL", |
" 0330 NV35 [GeForce FX 5900 Ultra]", |
" 0331 NV35 [GeForce FX 5900]", |
" 1043 8145 V9950GE", |
" 0332 NV35 [GeForce FX 5900XT]", |
" 0333 NV38 [GeForce FX 5950 Ultra]", |
" 0334 NV35 [GeForce FX 5900ZT]", |
" 0338 NV35GL [Quadro FX 3000]", |
" 033f NV35GL [Quadro FX 700]", |
" 0341 NV36.1 [GeForce FX 5700 Ultra]", |
" 0342 NV36.2 [GeForce FX 5700]", |
" 0343 NV36 [GeForce FX 5700LE]", |
" 0344 NV36.4 [GeForce FX 5700VE]", |
" 0345 NV36.5", |
" 0347 NV36 [GeForce FX Go5700]", |
" 103c 006a NX9500", |
" 0348 NV36 [GeForce FX Go5700]", |
" 0349 NV36M Pro", |
" 034b NV36MAP", |
" 034c NV36 [Quadro FX Go1000]", |
" 034e NV36GL [Quadro FX 1100]", |
" 034f NV36GL", |
" 0360 MCP55 LPC Bridge", |
" 0361 MCP55 LPC Bridge", |
" 0362 MCP55 LPC Bridge", |
" 0363 MCP55 LPC Bridge", |
" 0364 MCP55 LPC Bridge", |
" 0365 MCP55 LPC Bridge", |
" 0366 MCP55 LPC Bridge", |
" 0367 MCP55 LPC Bridge", |
" 0368 MCP55 SMBus", |
" 0369 MCP55 Memory Controller", |
" 036a MCP55 Memory Controller", |
" 036c MCP55 USB Controller", |
" 036d MCP55 USB Controller", |
" 036e MCP55 IDE", |
" 0371 MCP55 High Definition Audio", |
" 0372 MCP55 Ethernet", |
" 0373 MCP55 Ethernet", |
" 037a MCP55 Memory Controller", |
" 037e MCP55 SATA Controller", |
" 037f MCP55 SATA Controller", |
" 0391 G70 [GeForce 7600 GT]", |
" 0392 G70 [GeForce 7600 GS]", |
" 0398 G70 [GeForce Go 7600]", |
" 039e Quadro FX 560", |
" 03e0 MCP61 LPC Bridge", |
" 03e1 MCP61 LPC Bridge", |
" 03e2 MCP61 LPC Bridge", |
" 03e3 MCP61 LPC Bridge", |
" 03e4 MCP61 High Definition Audio", |
" 03e5 MCP61 Ethernet", |
" 03e6 MCP61 Ethernet", |
" 03e7 MCP61 SATA Controller", |
" 03ea MCP61 Memory Controller", |
" 03eb MCP61 SMBus", |
" 03ec MCP61 IDE", |
" 03ee MCP61 Ethernet", |
" 03ef MCP61 Ethernet", |
" 03f0 MCP61 High Definition Audio", |
" 03f1 MCP61 USB Controller", |
" 03f2 MCP61 USB Controller", |
" 03f5 MCP61 Memory Controller", |
" 03f6 MCP61 SATA Controller", |
" 03f7 MCP61 SATA Controller", |
"10df Emulex Corporation", |
" 1ae5 LP6000 Fibre Channel Host Adapter", |
" f085 LP850 Fibre Channel Host Adapter", |
" f095 LP952 Fibre Channel Host Adapter", |
" f098 LP982 Fibre Channel Host Adapter", |
" f0a1 Thor LightPulse Fibre Channel Host Adapter", |
" f0a5 Thor LightPulse Fibre Channel Host Adapter", |
" f0b5 Viper LightPulse Fibre Channel Host Adapter", |
" f0d1 Helios LightPulse Fibre Channel Host Adapter", |
" f0d5 Helios LightPulse Fibre Channel Host Adapter", |
" f0e1 Zephyr LightPulse Fibre Channel Host Adapter", |
" f0e5 Zephyr LightPulse Fibre Channel Host Adapter", |
" f0f5 Neptune LightPulse Fibre Channel Host Adapter", |
" f700 LP7000 Fibre Channel Host Adapter", |
" f701 LP7000 Fibre Channel Host Adapter Alternate ID (JX1:2-3, JX2:1-2)", |
" f800 LP8000 Fibre Channel Host Adapter", |
" f801 LP8000 Fibre Channel Host Adapter Alternate ID (JX1:2-3, JX2:1-2)", |
" f900 LP9000 Fibre Channel Host Adapter", |
" f901 LP9000 Fibre Channel Host Adapter Alternate ID (JX1:2-3, JX2:1-2)", |
" f980 LP9802 Fibre Channel Host Adapter", |
" f981 LP9802 Fibre Channel Host Adapter Alternate ID", |
" f982 LP9802 Fibre Channel Host Adapter Alternate ID", |
" fa00 Thor-X LightPulse Fibre Channel Host Adapter", |
" fb00 Viper LightPulse Fibre Channel Host Adapter", |
" fc00 Thor-X LightPulse Fibre Channel Host Adapter", |
" fc10 Helios-X LightPulse Fibre Channel Host Adapter", |
" fc20 Zephyr-X LightPulse Fibre Channel Host Adapter", |
" fd00 Helios-X LightPulse Fibre Channel Host Adapter", |
" fe00 Zephyr-X LightPulse Fibre Channel Host Adapter", |
" ff00 Neptune LightPulse Fibre Channel Host Adapter", |
"10e0 Integrated Micro Solutions Inc.", |
" 5026 IMS5026/27/28", |
" 5027 IMS5027", |
" 5028 IMS5028", |
" 8849 IMS8849", |
" 8853 IMS8853", |
" 9128 IMS9128 [Twin turbo 128]", |
"10e1 Tekram Technology Co.,Ltd.", |
" 0391 TRM-S1040", |
" 10e1 0391 DC-315U SCSI-3 Host Adapter", |
" 690c DC-690c", |
" dc29 DC-290", |
"10e2 Aptix Corporation", |
"10e3 Tundra Semiconductor Corp.", |
" 0000 CA91C042 [Universe]", |
" 0148 Tsi148 [Tempe]", |
" 0860 CA91C860 [QSpan]", |
" 0862 CA91C862A [QSpan-II]", |
" 8260 CA91L8200B [Dual PCI PowerSpan II]", |
" 8261 CA91L8260B [Single PCI PowerSpan II]", |
"10e4 Tandem Computers", |
" 8029 Realtek 8029 Network Card", |
"10e5 Micro Industries Corporation", |
"10e6 Gainbery Computer Products Inc.", |
"10e7 Vadem", |
"10e8 Applied Micro Circuits Corp.", |
" 1072 INES GPIB-PCI (AMCC5920 based)", |
" 2011 Q-Motion Video Capture/Edit board", |
" 4750 S5930 [Matchmaker]", |
" 5920 S5920", |
" 8043 LANai4.x [Myrinet LANai interface chip]", |
" 8062 S5933_PARASTATION", |
" 807d S5933 [Matchmaker]", |
" 8088 Kongsberg Spacetec Format Synchronizer", |
" 8089 Kongsberg Spacetec Serial Output Board", |
" 809c S5933_HEPC3", |
" 80d7 PCI-9112", |
" 80d9 PCI-9118", |
" 80da PCI-9812", |
" 811a PCI-IEEE1355-DS-DE Interface", |
" 814c Fastcom ESCC-PCI (Commtech, Inc.)", |
" 8170 S5933 [Matchmaker] (Chipset Development Tool)", |
" 81e6 Multimedia video controller", |
" 8291 Fastcom 232/8-PCI (Commtech, Inc.)", |
" 82c4 Fastcom 422/4-PCI (Commtech, Inc.)", |
" 82c5 Fastcom 422/2-PCI (Commtech, Inc.)", |
" 82c6 Fastcom IG422/1-PCI (Commtech, Inc.)", |
" 82c7 Fastcom IG232/2-PCI (Commtech, Inc.)", |
" 82ca Fastcom 232/4-PCI (Commtech, Inc.)", |
" 82db AJA HDNTV HD SDI Framestore", |
" 82e2 Fastcom DIO24H-PCI (Commtech, Inc.)", |
" 8851 S5933 on Innes Corp FM Radio Capture card", |
"10e9 Alps Electric Co., Ltd.", |
"10ea Intergraphics Systems", |
" 1680 IGA-1680", |
" 1682 IGA-1682", |
" 1683 IGA-1683", |
" 2000 CyberPro 2000", |
" 2010 CyberPro 2000A", |
" 5000 CyberPro 5000", |
" 5050 CyberPro 5050", |
" 5202 CyberPro 5202", |
" 5252 CyberPro5252", |
"10eb Artists Graphics", |
" 0101 3GA", |
" 8111 Twist3 Frame Grabber", |
"10ec Realtek Semiconductor Co., Ltd.", |
" 0139 Zonet Zen3200", |
" 8029 RTL-8029(AS)", |
" 10b8 2011 EZ-Card (SMC1208)", |
" 10ec 8029 RTL-8029(AS)", |
" 1113 1208 EN1208", |
" 1186 0300 DE-528", |
" 1259 2400 AT-2400", |
" 8129 RTL-8129", |
" 10ec 8129 RT8129 Fast Ethernet Adapter", |
" 8138 RT8139 (B/C) Cardbus Fast Ethernet Adapter", |
" 10ec 8138 RT8139 (B/C) Fast Ethernet Adapter", |
" 8139 RTL-8139/8139C/8139C+", |
" 0357 000a TTP-Monitoring Card V2.0", |
" 1025 005a TravelMate 290", |
" 1025 8920 ALN-325", |
" 1025 8921 ALN-325", |
" 103c 006a NX9500", |
" 1043 8109 P5P800-MX Mainboard", |
" 1071 8160 MIM2000", |
" 10bd 0320 EP-320X-R", |
" 10ec 8139 RT8139", |
" 1113 ec01 FNC-0107TX", |
" 1186 1300 DFE-538TX", |
" 1186 1320 SN5200", |
" 1186 8139 DRN-32TX", |
" 11f6 8139 FN22-3(A) LinxPRO Ethernet Adapter", |
" 1259 2500 AT-2500TX", |
" 1259 2503 AT-2500TX/ACPI", |
" 1429 d010 ND010", |
" 1432 9130 EN-9130TX", |
" 1436 8139 RT8139", |
" 1458 e000 GA-7VM400M/7VT600 Motherboard", |
" 1462 788c 865PE Neo2-V Mainboard", |
" 146c 1439 FE-1439TX", |
" 1489 6001 GF100TXRII", |
" 1489 6002 GF100TXRA", |
" 149c 139a LFE-8139ATX", |
" 149c 8139 LFE-8139TX", |
" 14cb 0200 LNR-100 Family 10/100 Base-TX Ethernet", |
" 1695 9001 Onboard RTL8101L 10/100 MBit", |
" 1799 5000 F5D5000 PCI Card/Desktop Network PCI Card", |
" 1904 8139 RTL8139D Fast Ethernet Adapter", |
" 2646 0001 EtheRx", |
" 8e2e 7000 KF-230TX", |
" 8e2e 7100 KF-230TX/2", |
" a0a0 0007 ALN-325C", |
" 8169 RTL-8169 Gigabit Ethernet", |
" 1025 0079 Aspire 5024WLMi", |
" 1259 c107 CG-LAPCIGT", |
" 1371 434e ProG-2000L", |
" 1458 e000 GA-8I915ME-G Mainboard", |
" 1462 702c K8T NEO 2 motherboard", |
" 8180 RTL8180L 802.11b MAC", |
" 8185 RTL-8185 IEEE 802.11a/b/g Wireless LAN Controller", |
" 8197 SmartLAN56 56K Modem", |
"10ed Ascii Corporation", |
" 7310 V7310", |
"10ee Xilinx Corporation", |
" 0205 Wildcard TE205P", |
" 0210 Wildcard TE210P", |
" 0314 Wildcard TE405P/TE410P (1st Gen)", |
" 0405 Wildcard TE405P (2nd Gen)", |
" 0410 Wildcard TE410P (2nd Gen)", |
" 3fc0 RME Digi96", |
" 3fc1 RME Digi96/8", |
" 3fc2 RME Digi96/8 Pro", |
" 3fc3 RME Digi96/8 Pad", |
" 3fc4 RME Digi9652 (Hammerfall)", |
" 3fc5 RME Hammerfall DSP", |
" 3fc6 RME Hammerfall DSP MADI", |
" 8381 Ellips Santos Frame Grabber", |
" d154 Copley Controls CAN card (PCI-CAN-02)", |
"10ef Racore Computer Products, Inc.", |
" 8154 M815x Token Ring Adapter", |
"10f0 Peritek Corporation", |
"10f1 Tyan Computer", |
" 2865 Tyan Thunder K8E S2865", |
"10f2 Achme Computer, Inc.", |
"10f3 Alaris, Inc.", |
"10f4 S-MOS Systems, Inc.", |
"10f5 NKK Corporation", |
" a001 NDR4000 [NR4600 Bridge]", |
"10f6 Creative Electronic Systems SA", |
"10f7 Matsushita Electric Industrial Co., Ltd.", |
"10f8 Altos India Ltd", |
"10f9 PC Direct", |
"10fa Truevision", |
" 000c TARGA 1000", |
"10fb Thesys Gesellschaft fuer Mikroelektronik mbH", |
" 186f TH 6255", |
"10fc I-O Data Device, Inc.", |
" 0003 Cardbus IDE Controller", |
" 0005 Cardbus SCSI CBSC II", |
"10fd Soyo Computer, Inc", |
"10fe Fast Multimedia AG", |
"10ff NCube", |
"1100 Jazz Multimedia", |
"1101 Initio Corporation", |
" 1060 INI-A100U2W", |
" 9100 INI-9100/9100W", |
" 9400 INI-940", |
" 9401 INI-950", |
" 9500 360P", |
" 9502 Initio INI-9100UW Ultra Wide SCSI Controller INIC-950P chip", |
"1102 Creative Labs", |
" 0002 SB Live! EMU10k1", |
" 1102 0020 CT4850 SBLive! Value", |
" 1102 0021 CT4620 SBLive!", |
" 1102 002f SBLive! mainboard implementation", |
" 1102 100a SB Live! 5.1 Digital OEM [SB0220]", |
" 1102 4001 E-mu APS", |
" 1102 8022 CT4780 SBLive! Value", |
" 1102 8023 CT4790 SoundBlaster PCI512", |
" 1102 8024 CT4760 SBLive!", |
" 1102 8025 SBLive! Mainboard Implementation", |
" 1102 8026 CT4830 SBLive! Value", |
" 1102 8027 CT4832 SBLive! Value", |
" 1102 8028 CT4760 SBLive! OEM version", |
" 1102 8031 CT4831 SBLive! Value", |
" 1102 8040 CT4760 SBLive!", |
" 1102 8051 CT4850 SBLive! Value", |
" 1102 8061 SBLive! Player 5.1", |
" 1102 8064 SBLive! 5.1 Model SB0100", |
" 1102 8065 SBLive! 5.1 Digital Model SB0220", |
" 1102 8067 SBLive! 5.1 eMicro 28028", |
" 0004 SB Audigy", |
" 1102 0051 SB0090 Audigy Player", |
" 1102 0053 SB0090 Audigy Player/OEM", |
" 1102 0058 SB0090 Audigy Player/OEM", |
" 1102 1007 SB0240 Audigy 2 Platinum 6.1", |
" 1102 2002 SB Audigy 2 ZS (SB0350)", |
" 0006 [SB Live! Value] EMU10k1X", |
" 0007 SB Audigy LS", |
" 1102 0007 SBLive! 24bit", |
" 1102 1001 SB0310 Audigy LS", |
" 1102 1002 SB0312 Audigy LS", |
" 1102 1006 SB0410 SBLive! 24-bit", |
" 1462 1009 K8N Diamond", |
" 0008 SB0400 Audigy2 Value", |
" 1102 0008 EMU0404 Digital Audio System", |
" 4001 SB Audigy FireWire Port", |
" 1102 0010 SB Audigy FireWire Port", |
" 7002 SB Live! Game Port", |
" 1102 0020 Gameport Joystick", |
" 7003 SB Audigy Game Port", |
" 1102 0040 SB Audigy MIDI/Game Port", |
" 7004 [SB Live! Value] Input device controller", |
" 7005 SB Audigy LS Game Port", |
" 1102 1001 SB0310 Audigy LS MIDI/Game port", |
" 1102 1002 SB0312 Audigy LS MIDI/Game port", |
" 8064 SB0100 [SBLive! 5.1 OEM]", |
" 8938 Ectiva EV1938", |
" 1033 80e5 SlimTower-Jim (NEC)", |
" 1071 7150 Mitac 7150", |
" 110a 5938 Siemens Scenic Mobile 510PIII", |
" 13bd 100c Ceres-C (Sharp, Intel BX)", |
" 13bd 100d Sharp, Intel Banister", |
" 13bd 100e TwinHead P09S/P09S3 (Sharp)", |
" 13bd f6f1 Marlin (Sharp)", |
" 14ff 0e70 P88TE (TWINHEAD INTERNATIONAL Corp)", |
" 14ff c401 Notebook 9100/9200/2000 (TWINHEAD INTERNATIONAL Corp)", |
" 156d b400 G400 - Geo (AlphaTop (Taiwan))", |
" 156d b550 G560 (AlphaTop (Taiwan))", |
" 156d b560 G560 (AlphaTop (Taiwan))", |
" 156d b700 G700/U700 (AlphaTop (Taiwan))", |
" 156d b795 G795 (AlphaTop (Taiwan))", |
" 156d b797 G797 (AlphaTop (Taiwan))", |
"1103 Triones Technologies, Inc.", |
" 0003 HPT343/345/346/363", |
" 0004 HPT366/368/370/370A/372/372N", |
" 1103 0001 HPT370A", |
" 1103 0004 HPT366 UDMA66 (r1) / HPT368 UDMA66 (r2) / HPT370 UDMA100 (r3) / HPT370 UDMA100 RAID (r4)", |
" 1103 0005 HPT370 UDMA100", |
" 0005 HPT372A/372N", |
" 0006 HPT302/302N", |
" 0007 HPT371/371N", |
" 0008 HPT374", |
" 0009 HPT372N", |
"1104 RasterOps Corp.", |
"1105 Sigma Designs, Inc.", |
" 1105 REALmagic Xcard MPEG 1/2/3/4 DVD Decoder", |
" 8300 REALmagic Hollywood Plus DVD Decoder", |
" 8400 EM840x REALmagic DVD/MPEG-2 Audio/Video Decoder", |
" 8401 EM8401 REALmagic DVD/MPEG-2 A/V Decoder", |
" 8470 EM8470 REALmagic DVD/MPEG-4 A/V Decoder", |
" 8471 EM8471 REALmagic DVD/MPEG-4 A/V Decoder", |
" 8475 EM8475 REALmagic DVD/MPEG-4 A/V Decoder", |
" 1105 0001 REALmagic X-Card", |
" 8476 EM8476 REALmagic DVD/MPEG-4 A/V Decoder", |
" 127d 0000 CineView II", |
" 8485 EM8485 REALmagic DVD/MPEG-4 A/V Decoder", |
" 8486 EM8486 REALmagic DVD/MPEG-4 A/V Decoder", |
"1106 VIA Technologies, Inc.", |
" 0102 Embedded VIA Ethernet Controller", |
" 0130 VT6305 1394.A Controller", |
" 0204 K8M800 Host Bridge", |
" 0208 PT890 Host Bridge", |
" 0238 K8T890 Host Bridge", |
" 0258 PT880 Host Bridge", |
" 0259 CN400/PM880 Host Bridge", |
" 0269 KT880 Host Bridge", |
" 0282 K8T800Pro Host Bridge", |
" 1043 80a3 A8V Deluxe", |
" 0290 K8M890 Host Bridge", |
" 0293 PM896 Host Bridge", |
" 0296 P4M800 Host Bridge", |
" 0305 VT8363/8365 [KT133/KM133]", |
" 1019 0987 K7VZA Mainboard", |
" 1043 8033 A7V Mainboard", |
" 1043 803e A7V-E Mainboard", |
" 1043 8042 A7V133/A7V133-C Mainboard", |
" 147b a401 KT7/KT7-RAID/KT7A/KT7A-RAID Mainboard", |
" 0308 PT894 Host Bridge", |
" 0314 CN700/VN800/P4M800CE/Pro Host Bridge", |
" 0324 CX700 Host Bridge", |
" 0327 P4M890 Host Bridge", |
" 0336 K8M890CE Host Bridge", |
" 0340 PT900 Host Bridge", |
" 0351 VT3351 Host Bridge", |
" 0364 P4M900 Host Bridge", |
" 0391 VT8371 [KX133]", |
" 0501 VT8501 [Apollo MVP4]", |
" 0505 VT82C505", |
" 0561 VT82C576MV", |
" 0571 VT82C586A/B/VT82C686/A/B/VT823x/A/C PIPC Bus Master IDE", |
" 1019 0985 P6VXA Motherboard", |
" 1019 0a81 L7VTA v1.0 Motherboard (KT400-8235)", |
" 1043 8052 VT8233A Bus Master ATA100/66/33 IDE", |
" 1043 808c A7V8X / A7V333 motherboard", |
" 1043 80a1 A7V8X-X motherboard rev. 1.01", |
" 1043 80ed A7V600/K8V-X/A8V Deluxe motherboard", |
" 1106 0571 VT82C586/B/VT82C686/A/B/VT8233/A/C/VT8235 PIPC Bus Master IDE", |
" 1179 0001 Magnia Z310", |
" 1297 f641 FX41 motherboard", |
" 1458 5002 GA-7VAX Mainboard", |
" 1462 7020 K8T NEO 2 motherboard", |
" 147b 1407 KV8-MAX3 motherboard", |
" 1849 0571 K7VT2/K7VT6 motherboard", |
" 0576 VT82C576 3V [Apollo Master]", |
" 0585 VT82C585VP [Apollo VP1/VPX]", |
" 0586 VT82C586/A/B PCI-to-ISA [Apollo VP]", |
" 1106 0000 MVP3 ISA Bridge", |
" 0591 VT8237A SATA 2-Port Controller", |
" 0595 VT82C595 [Apollo VP2]", |
" 0596 VT82C596 ISA [Mobile South]", |
" 1106 0000 VT82C596/A/B PCI to ISA Bridge", |
" 1458 0596 VT82C596/A/B PCI to ISA Bridge", |
" 0597 VT82C597 [Apollo VP3]", |
" 0598 VT82C598 [Apollo MVP3]", |
" 0601 VT8601 [Apollo ProMedia]", |
" 0605 VT8605 [ProSavage PM133]", |
" 1043 802c CUV4X mainboard", |
" 0680 VT82C680 [Apollo P6]", |
" 0686 VT82C686 [Apollo Super South]", |
" 1019 0985 P6VXA Motherboard", |
" 1043 802c CUV4X mainboard", |
" 1043 8033 A7V Mainboard", |
" 1043 803e A7V-E Mainboard", |
" 1043 8040 A7M266 Mainboard", |
" 1043 8042 A7V133/A7V133-C Mainboard", |
" 1106 0000 VT82C686/A PCI to ISA Bridge", |
" 1106 0686 VT82C686/A PCI to ISA Bridge", |
" 1179 0001 Magnia Z310", |
" 147b a702 KG7-Lite Mainboard", |
" 0691 VT82C693A/694x [Apollo PRO133x]", |
" 1019 0985 P6VXA Motherboard", |
" 1179 0001 Magnia Z310", |
" 1458 0691 VT82C691 Apollo Pro System Controller", |
" 0693 VT82C693 [Apollo Pro Plus]", |
" 0698 VT82C693A [Apollo Pro133 AGP]", |
" 0926 VT82C926 [Amazon]", |
" 1000 VT82C570MV", |
" 1106 VT82C570MV", |
" 1204 K8M800 Host Bridge", |
" 1208 PT890 Host Bridge", |
" 1238 K8T890 Host Bridge", |
" 1258 PT880 Host Bridge", |
" 1259 CN400/PM880 Host Bridge", |
" 1269 KT880 Host Bridge", |
" 1282 K8T800Pro Host Bridge", |
" 1290 K8M890 Host Bridge", |
" 1293 PM896 Host Bridge", |
" 1296 P4M800 Host Bridge", |
" 1308 PT894 Host Bridge", |
" 1314 CN700/VN800/P4M800CE/Pro Host Bridge", |
" 1324 CX700 Host Bridge", |
" 1327 P4M890 Host Bridge", |
" 1336 K8M890CE Host Bridge", |
" 1340 PT900 Host Bridge", |
" 1351 VT3351 Host Bridge", |
" 1364 P4M900 Host Bridge", |
" 1571 VT82C576M/VT82C586", |
" 1595 VT82C595/97 [Apollo VP2/97]", |
" 2204 K8M800 Host Bridge", |
" 2208 PT890 Host Bridge", |
" 2238 K8T890 Host Bridge", |
" 2258 PT880 Host Bridge", |
" 2259 CN400/PM880 Host Bridge", |
" 2269 KT880 Host Bridge", |
" 2282 K8T800Pro Host Bridge", |
" 2290 K8M890 Host Bridge", |
" 2293 PM896 Host Bridge", |
" 2296 P4M800 Host Bridge", |
" 2308 PT894 Host Bridge", |
" 2314 CN700/VN800/P4M800CE/Pro Host Bridge", |
" 2324 CX700 Host Bridge", |
" 2327 P4M890 Host Bridge", |
" 2336 K8M890CE Host Bridge", |
" 2340 PT900 Host Bridge", |
" 2351 VT3351 Host Bridge", |
" 2364 P4M900 Host Bridge", |
" 287a VT8251 PCI to PCI Bridge", |
" 287b VT8251 Host Bridge", |
" 287c VT8251 PCIE Root Port", |
" 287d VT8251 PCIE Root Port", |
" 287e VT8251 Ultra VLINK Controller", |
" 3022 CLE266", |
" 3038 VT82xxxxx UHCI USB 1.1 Controller", |
" 0925 1234 USB Controller", |
" 1019 0985 P6VXA Motherboard", |
" 1019 0a81 L7VTA v1.0 Motherboard (KT400-8235)", |
" 1043 8080 A7V333 motherboard", |
" 1043 808c VT6202 USB2.0 4 port controller", |
" 1043 80a1 A7V8X-X motherboard", |
" 1043 80ed A7V600/K8V-X/A8V Deluxe motherboard", |
" 1179 0001 Magnia Z310", |
" 1458 5004 GA-7VAX Mainboard", |
" 1462 7020 K8T NEO 2 motherboard", |
" 147b 1407 KV8-MAX3 motherboard", |
" 182d 201d CN-029 USB2.0 4 port PCI Card", |
" 1849 3038 K7VT6", |
" 3040 VT82C586B ACPI", |
" 3043 VT86C100A [Rhine]", |
" 10bd 0000 VT86C100A Fast Ethernet Adapter", |
" 1106 0100 VT86C100A Fast Ethernet Adapter", |
" 1186 1400 DFE-530TX rev A", |
" 3044 IEEE 1394 Host Controller", |
" 1025 005a TravelMate 290", |
" 1043 808a A8V Deluxe", |
" 1458 1000 GA-7VT600-1394 Motherboard", |
" 1462 207d K8NGM2 series motherboard", |
" 1462 702d K8T NEO 2 motherboard", |
" 1462 971d MS-6917", |
" 3050 VT82C596 Power Management", |
" 3051 VT82C596 Power Management", |
" 3053 VT6105M [Rhine-III]", |
" 3057 VT82C686 [Apollo Super ACPI]", |
" 1019 0985 P6VXA Motherboard", |
" 1019 0987 K7VZA Motherboard", |
" 1043 8033 A7V Mainboard", |
" 1043 803e A7V-E Mainboard", |
" 1043 8040 A7M266 Mainboard", |
" 1043 8042 A7V133/A7V133-C Mainboard", |
" 1179 0001 Magnia Z310", |
" 3058 VT82C686 AC97 Audio Controller", |
" 0e11 0097 SoundMax Digital Integrated Audio", |
" 0e11 b194 Soundmax integrated digital audio", |
" 1019 0985 P6VXA Motherboard", |
" 1019 0987 K7VZA Motherboard", |
" 1043 1106 A7V133/A7V133-C Mainboard", |
" 1106 4511 Onboard Audio on EP7KXA", |
" 1458 7600 Onboard Audio", |
" 1462 3091 MS-6309 Onboard Audio", |
" 1462 3300 MS-6330 Onboard Audio", |
" 15dd 7609 Onboard Audio", |
" 3059 VT8233/A/8235/8237 AC97 Audio Controller", |
" 1019 0a81 L7VTA v1.0 Motherboard (KT400-8235)", |
" 1043 8095 A7V8X Motherboard (Realtek ALC650 codec)", |
" 1043 80a1 A7V8X-X Motherboard", |
" 1043 80b0 A7V600/K8V Deluxe motherboard (ADI AD1980 codec [SoundMAX])", |
" 1043 812a A8V Deluxe motherboard (Realtek ALC850 codec)", |
" 1106 3059 L7VMM2 Motherboard", |
" 1106 4161 K7VT2 motherboard", |
" 1106 4170 PCPartner P4M800-8237R Motherboard", |
" 1106 4552 Soyo KT-600 Dragon Plus (Realtek ALC 650)", |
" 1297 c160 FX41 motherboard (Realtek ALC650 codec)", |
" 1458 a002 GA-7VAX Onboard Audio (Realtek ALC650)", |
" 1462 0080 K8T NEO 2 motherboard", |
" 1462 3800 KT266 onboard audio", |
" 147b 1407 KV8-MAX3 motherboard", |
" 1849 9761 K7VT6 motherboard", |
" 4005 4710 MSI K7T266 Pro2-RU (MSI-6380 v2) onboard audio (Realtek/ALC 200/200P)", |
" a0a0 01b6 AK77-8XN onboard audio", |
" 3065 VT6102 [Rhine-II]", |
" 1043 80a1 A7V8X-X Motherboard", |
" 1106 0102 VT6102 [Rhine II] Embeded Ethernet Controller on VT8235", |
" 1186 1400 DFE-530TX rev A", |
" 1186 1401 DFE-530TX rev B", |
" 13b9 1421 LD-10/100AL PCI Fast Ethernet Adapter (rev.B)", |
" 147b 1c09 NV7 Motherboard", |
" 1695 3005 VT6103", |
" 1695 300c Realtek ALC655 sound chip", |
" 1849 3065 K7VT6 motherboard", |
" 3068 AC'97 Modem Controller", |
" 1462 309e MS-6309 Saturn Motherboard", |
" 3074 VT8233 PCI to ISA Bridge", |
" 1043 8052 VT8233A", |
" 3091 VT8633 [Apollo Pro266]", |
" 3099 VT8366/A/7 [Apollo KT266/A/333]", |
" 1043 8064 A7V266-E Mainboard", |
" 1043 807f A7V333 Mainboard", |
" 1849 3099 K7VT2 motherboard", |
" 3101 VT8653 Host Bridge", |
" 3102 VT8662 Host Bridge", |
" 3103 VT8615 Host Bridge", |
" 3104 USB 2.0", |
" 1019 0a81 L7VTA v1.0 Motherboard (KT400-8235)", |
" 1043 808c A7V8X motherboard", |
" 1043 80a1 A7V8X-X motherboard rev 1.01", |
" 1043 80ed A7V600/K8V-X/A8V Deluxe motherboard", |
" 1297 f641 FX41 motherboard", |
" 1458 5004 GA-7VAX Mainboard", |
" 1462 7020 K8T NEO 2 motherboard", |
" 147b 1407 KV8-MAX3 motherboard", |
" 182d 201d CN-029 USB 2.0 4 port PCI Card", |
" 1849 3104 K7VT6 motherboard", |
" 3106 VT6105 [Rhine-III]", |
" 1186 1403 DFE-530TX rev C", |
" 3108 S3 Unichrome Pro VGA Adapter", |
" 3109 VT8233C PCI to ISA Bridge", |
" 3112 VT8361 [KLE133] Host Bridge", |
" 3113 VPX/VPX2 PCI to PCI Bridge Controller", |
" 3116 VT8375 [KM266/KL266] Host Bridge", |
" 1297 f641 FX41 motherboard", |
" 3118 S3 Unichrome Pro VGA Adapter", |
" 3119 VT6120/VT6121/VT6122 Gigabit Ethernet Adapter", |
" 3122 VT8623 [Apollo CLE266] integrated CastleRock graphics", |
" 3123 VT8623 [Apollo CLE266]", |
" 3128 VT8753 [P4X266 AGP]", |
" 3133 VT3133 Host Bridge", |
" 3147 VT8233A ISA Bridge", |
" 1043 808c A7V333 motherboard", |
" 3148 P4M266 Host Bridge", |
" 3149 VIA VT6420 SATA RAID Controller", |
" 1043 80ed A7V600/K8V Deluxe/K8V-X/A8V Deluxe motherboard", |
" 1458 b003 GA-7VM400AM(F) Motherboard", |
" 1462 7020 K8T Neo 2 Motherboard", |
" 147b 1407 KV8-MAX3 motherboard", |
" 147b 1408 KV7", |
" 1849 3149 K7VT6 motherboard", |
" 3156 P/KN266 Host Bridge", |
" 3164 VT6410 ATA133 RAID controller", |
" 1043 80f4 P4P800 Mainboard Deluxe ATX", |
" 1462 7028 915P/G Neo2", |
" 3168 VT8374 P4X400 Host Controller/AGP Bridge", |
" 3177 VT8235 ISA Bridge", |
" 1019 0a81 L7VTA v1.0 Motherboard (KT400-8235)", |
" 1043 808c A7V8X motherboard", |
" 1043 80a1 A7V8X-X motherboard", |
" 1297 f641 FX41 motherboard", |
" 1458 5001 GA-7VAX Mainboard", |
" 1849 3177 K7VT2 motherboard", |
" 3178 ProSavageDDR P4N333 Host Bridge", |
" 3188 VT8385 [K8T800 AGP] Host Bridge", |
" 1043 80a3 K8V Deluxe/K8V-X motherboard", |
" 147b 1407 KV8-MAX3 motherboard", |
" 3189 VT8377 [KT400/KT600 AGP] Host Bridge", |
" 1043 807f A7V8X motherboard", |
" 1458 5000 GA-7VAX Mainboard", |
" 1849 3189 K7VT6 motherboard", |
" 3204 K8M800 Host Bridge", |
" 3205 VT8378 [KM400/A] Chipset Host Bridge", |
" 1458 5000 GA-7VM400M Motherboard", |
" 3208 PT890 Host Bridge", |
" 3213 VPX/VPX2 PCI to PCI Bridge Controller", |
" 3218 K8T800M Host Bridge", |
" 3227 VT8237 ISA bridge [KT600/K8T800/K8T890 South]", |
" 1043 80ed A7V600/K8V-X/A8V Deluxe motherboard", |
" 1106 3227 DFI KT600-AL Motherboard", |
" 1458 5001 GA-7VT600 Motherboard", |
" 147b 1407 KV8-MAX3 motherboard", |
" 1849 3227 K7VT4 motherboard", |
" 3238 K8T890 Host Bridge", |
" 3249 VT6421 IDE RAID Controller", |
" 324a CX700 PCI to PCI Bridge", |
" 324b CX700 Host Bridge", |
" 324e CX700 Internal Module Bus", |
" 3258 PT880 Host Bridge", |
" 3259 CN400/PM880 Host Bridge", |
" 3269 KT880 Host Bridge", |
" 3282 K8T800Pro Host Bridge", |
" 3287 VT8251 PCI to ISA Bridge", |
" 3288 VIA High Definition Audio Controller", |
" 3290 K8M890 Host Bridge", |
" 3296 P4M800 Host Bridge", |
" 3324 CX700 Host Bridge", |
" 3327 P4M890 Host Bridge", |
" 3336 K8M890CE Host Bridge", |
" 3337 VT8237A PCI to ISA Bridge", |
" 3340 PT900 Host Bridge", |
" 3344 UniChrome Pro IGP", |
" 3349 VT8251 AHCI/SATA 4-Port Controller", |
" 3351 VT3351 Host Bridge", |
" 3364 P4M900 Host Bridge", |
" 337a VT8237A PCI to PCI Bridge", |
" 337b VT8237A Host Bridge", |
" 4149 VIA VT6420 (ATA133) Controller", |
" 4204 K8M800 Host Bridge", |
" 4208 PT890 Host Bridge", |
" 4238 K8T890 Host Bridge", |
" 4258 PT880 Host Bridge", |
" 4259 CN400/PM880 Host Bridge", |
" 4269 KT880 Host Bridge", |
" 4282 K8T800Pro Host Bridge", |
" 4290 K8M890 Host Bridge", |
" 4293 PM896 Host Bridge", |
" 4296 P4M800 Host Bridge", |
" 4308 PT894 Host Bridge", |
" 4314 CN700/VN800/P4M800CE/Pro Host Bridge", |
" 4324 CX700 Host Bridge", |
" 4327 P4M890 Host Bridge", |
" 4336 K8M890CE Host Bridge", |
" 4340 PT900 Host Bridge", |
" 4351 VT3351 Host Bridge", |
" 4364 P4M900 Host Bridge", |
" 5030 VT82C596 ACPI [Apollo PRO]", |
" 5208 PT890 I/O APIC Interrupt Controller", |
" 5238 K8T890 I/O APIC Interrupt Controller", |
" 5290 K8M890 I/O APIC Interrupt Controller", |
" 5308 PT894 I/O APIC Interrupt Controller", |
" 5327 P4M890 I/O APIC Interrupt Controller", |
" 5336 K8M890CE I/O APIC Interrupt Controller", |
" 5340 PT900 I/O APIC Interrupt Controller", |
" 5351 VT3351 I/O APIC Interrupt Controller", |
" 5364 P4M900 I/O APIC Interrupt Controller", |
" 6100 VT85C100A [Rhine II]", |
" 6327 P4M890 Security Device", |
" 7204 K8M800 Host Bridge", |
" 7205 VT8378 [S3 UniChrome] Integrated Video", |
" 1458 d000 Gigabyte GA-7VM400(A)M(F) Motherboard", |
" 7208 PT890 Host Bridge", |
" 7238 K8T890 Host Bridge", |
" 7258 PT880 Host Bridge", |
" 7259 CN400/PM880 Host Bridge", |
" 7269 KT880 Host Bridge", |
" 7282 K8T800Pro Host Bridge", |
" 7290 K8M890 Host Bridge", |
" 7293 PM896 Host Bridge", |
" 7296 P4M800 Host Bridge", |
" 7308 PT894 Host Bridge", |
" 7314 CN700/VN800/P4M800CE/Pro Host Bridge", |
" 7324 CX700 Host Bridge", |
" 7327 P4M890 Host Bridge", |
" 7336 K8M890CE Host Bridge", |
" 7340 PT900 Host Bridge", |
" 7351 VT3351 Host Bridge", |
" 7364 P4M900 Host Bridge", |
" 8231 VT8231 [PCI-to-ISA Bridge]", |
" 8235 VT8235 ACPI", |
" 8305 VT8363/8365 [KT133/KM133 AGP]", |
" 8324 CX700 PCI to ISA Bridge", |
" 8391 VT8371 [KX133 AGP]", |
" 8501 VT8501 [Apollo MVP4 AGP]", |
" 8596 VT82C596 [Apollo PRO AGP]", |
" 8597 VT82C597 [Apollo VP3 AGP]", |
" 8598 VT82C598/694x [Apollo MVP3/Pro133x AGP]", |
" 1019 0985 P6VXA Motherboard", |
" 8601 VT8601 [Apollo ProMedia AGP]", |
" 8605 VT8605 [PM133 AGP]", |
" 8691 VT82C691 [Apollo Pro]", |
" 8693 VT82C693 [Apollo Pro Plus] PCI Bridge", |
" a208 PT890 PCI to PCI Bridge Controller", |
" a238 K8T890 PCI to PCI Bridge Controller", |
" a327 P4M890 PCI to PCI Bridge Controller", |
" a364 P4M900 PCI to PCI Bridge Controller", |
" b091 VT8633 [Apollo Pro266 AGP]", |
" b099 VT8366/A/7 [Apollo KT266/A/333 AGP]", |
" b101 VT8653 AGP Bridge", |
" b102 VT8362 AGP Bridge", |
" b103 VT8615 AGP Bridge", |
" b112 VT8361 [KLE133] AGP Bridge", |
" b113 VPX/VPX2 I/O APIC Interrupt Controller", |
" b115 VT8363/8365 [KT133/KM133] PCI Bridge", |
" b168 VT8235 PCI Bridge", |
" b188 VT8237 PCI bridge [K8T800/K8T890 South]", |
" 147b 1407 KV8-MAX3 motherboard", |
" b198 VT8237 PCI Bridge", |
" b213 VPX/VPX2 I/O APIC Interrupt Controller", |
" b999 [K8T890 North / VT8237 South] PCI Bridge", |
" c208 PT890 PCI to PCI Bridge Controller", |
" c238 K8T890 PCI to PCI Bridge Controller", |
" c327 P4M890 PCI to PCI Bridge Controller", |
" c340 PT900 PCI to PCI Bridge Controller", |
" c364 P4M900 PCI to PCI Bridge Controller", |
" d104 VT8237 Integrated Fast Ethernet Controller", |
" d208 PT890 PCI to PCI Bridge Controller", |
" d213 VPX/VPX2 PCI to PCI Bridge Controller", |
" d238 K8T890 PCI to PCI Bridge Controller", |
" d340 PT900 PCI to PCI Bridge Controller", |
" e208 PT890 PCI to PCI Bridge Controller", |
" e238 K8T890 PCI to PCI Bridge Controller", |
" e340 PT900 PCI to PCI Bridge Controller", |
" f208 PT890 PCI to PCI Bridge Controller", |
" f238 K8T890 PCI to PCI Bridge Controller", |
" f340 PT900 PCI to PCI Bridge Controller", |
"1107 Stratus Computers", |
" 0576 VIA VT82C570MV [Apollo] (Wrong vendor ID!)", |
"1108 Proteon, Inc.", |
" 0100 p1690plus_AA", |
" 0101 p1690plus_AB", |
" 0105 P1690Plus", |
" 0108 P1690Plus", |
" 0138 P1690Plus", |
" 0139 P1690Plus", |
" 013c P1690Plus", |
" 013d P1690Plus", |
"1109 Cogent Data Technologies, Inc.", |
" 1400 EM110TX [EX110TX]", |
"110a Siemens Nixdorf AG", |
" 0002 Pirahna 2-port", |
" 0005 Tulip controller, power management, switch extender", |
" 0006 FSC PINC (I/O-APIC)", |
" 0015 FSC Multiprocessor Interrupt Controller", |
" 001d FSC Copernicus Management Controller", |
" 007b FSC Remote Service Controller, mailbox device", |
" 007c FSC Remote Service Controller, shared memory device", |
" 007d FSC Remote Service Controller, SMIC device", |
" 2101 HST SAPHIR V Primary PCI (ISDN/PMx)", |
" 2102 DSCC4 PEB/PEF 20534 DMA Supported Serial Communication Controller with 4 Channels", |
" 2104 Eicon Diva 2.02 compatible passive ISDN card", |
" 3142 SIMATIC NET CP 5613A1 (Profibus Adapter)", |
" 4021 SIMATIC NET CP 5512 (Profibus and MPI Cardbus Adapter)", |
" 4029 SIMATIC NET CP 5613A2 (Profibus Adapter)", |
" 4942 FPGA I-Bus Tracer for MBD", |
" 6120 SZB6120", |
"110b Chromatic Research Inc.", |
" 0001 Mpact Media Processor", |
" 0004 Mpact 2", |
"110c Mini-Max Technology, Inc.", |
"110d Znyx Advanced Systems", |
"110e CPU Technology", |
"110f Ross Technology", |
"1110 Powerhouse Systems", |
" 6037 Firepower Powerized SMP I/O ASIC", |
" 6073 Firepower Powerized SMP I/O ASIC", |
"1111 Santa Cruz Operation", |
"1112 Osicom Technologies Inc", |
" 2200 FDDI Adapter", |
" 2300 Fast Ethernet Adapter", |
" 2340 4 Port Fast Ethernet Adapter", |
" 2400 ATM Adapter", |
"1113 Accton Technology Corporation", |
" 1211 SMC2-1211TX", |
" 103c 1207 EN-1207D Fast Ethernet Adapter", |
" 1113 1211 EN-1207D Fast Ethernet Adapter", |
" 1216 EN-1216 Ethernet Adapter", |
" 1113 2242 EN2242 10/100 Ethernet Mini-PCI Card", |
" 111a 1020 SpeedStream 1020 PCI 10/100 Ethernet Adaptor [EN-1207F-TX ?]", |
" 1217 EN-1217 Ethernet Adapter", |
" 5105 10Mbps Network card", |
" 9211 EN-1207D Fast Ethernet Adapter", |
" 1113 9211 EN-1207D Fast Ethernet Adapter", |
" 9511 21x4x DEC-Tulip compatible Fast Ethernet", |
" d301 CPWNA100 (Philips wireless PCMCIA)", |
" ec02 SMC 1244TX v3", |
"1114 Atmel Corporation", |
" 0506 at76c506 802.11b Wireless Network Adaptor", |
"1115 3D Labs", |
"1116 Data Translation", |
" 0022 DT3001", |
" 0023 DT3002", |
" 0024 DT3003", |
" 0025 DT3004", |
" 0026 DT3005", |
" 0027 DT3001-PGL", |
" 0028 DT3003-PGL", |
"1117 Datacube, Inc", |
" 9500 Max-1C SVGA card", |
" 9501 Max-1C image processing", |
"1118 Berg Electronics", |
"1119 ICP Vortex Computersysteme GmbH", |
" 0000 GDT 6000/6020/6050", |
" 0001 GDT 6000B/6010", |
" 0002 GDT 6110/6510", |
" 0003 GDT 6120/6520", |
" 0004 GDT 6530", |
" 0005 GDT 6550", |
" 0006 GDT 6117/6517", |
" 0007 GDT 6127/6527", |
" 0008 GDT 6537", |
" 0009 GDT 6557/6557-ECC", |
" 000a GDT 6115/6515", |
" 000b GDT 6125/6525", |
" 000c GDT 6535", |
" 000d GDT 6555", |
" 0010 GDT 6115/6515", |
" 0011 GDT 6125/6525", |
" 0012 GDT 6535", |
" 0013 GDT 6555/6555-ECC", |
" 0100 GDT 6117RP/6517RP", |
" 0101 GDT 6127RP/6527RP", |
" 0102 GDT 6537RP", |
" 0103 GDT 6557RP", |
" 0104 GDT 6111RP/6511RP", |
" 0105 GDT 6121RP/6521RP", |
" 0110 GDT 6117RD/6517RD", |
" 0111 GDT 6127RD/6527RD", |
" 0112 GDT 6537RD", |
" 0113 GDT 6557RD", |
" 0114 GDT 6111RD/6511RD", |
" 0115 GDT 6121RD/6521RD", |
" 0118 GDT 6118RD/6518RD/6618RD", |
" 0119 GDT 6128RD/6528RD/6628RD", |
" 011a GDT 6538RD/6638RD", |
" 011b GDT 6558RD/6658RD", |
" 0120 GDT 6117RP2/6517RP2", |
" 0121 GDT 6127RP2/6527RP2", |
" 0122 GDT 6537RP2", |
" 0123 GDT 6557RP2", |
" 0124 GDT 6111RP2/6511RP2", |
" 0125 GDT 6121RP2/6521RP2", |
" 0136 GDT 6113RS/6513RS", |
" 0137 GDT 6123RS/6523RS", |
" 0138 GDT 6118RS/6518RS/6618RS", |
" 0139 GDT 6128RS/6528RS/6628RS", |
" 013a GDT 6538RS/6638RS", |
" 013b GDT 6558RS/6658RS", |
" 013c GDT 6533RS/6633RS", |
" 013d GDT 6543RS/6643RS", |
" 013e GDT 6553RS/6653RS", |
" 013f GDT 6563RS/6663RS", |
" 0166 GDT 7113RN/7513RN/7613RN", |
" 0167 GDT 7123RN/7523RN/7623RN", |
" 0168 GDT 7118RN/7518RN/7518RN", |
" 0169 GDT 7128RN/7528RN/7628RN", |
" 016a GDT 7538RN/7638RN", |
" 016b GDT 7558RN/7658RN", |
" 016c GDT 7533RN/7633RN", |
" 016d GDT 7543RN/7643RN", |
" 016e GDT 7553RN/7653RN", |
" 016f GDT 7563RN/7663RN", |
" 01d6 GDT 4x13RZ", |
" 01d7 GDT 4x23RZ", |
" 01f6 GDT 8x13RZ", |
" 01f7 GDT 8x23RZ", |
" 01fc GDT 8x33RZ", |
" 01fd GDT 8x43RZ", |
" 01fe GDT 8x53RZ", |
" 01ff GDT 8x63RZ", |
" 0210 GDT 6519RD/6619RD", |
" 0211 GDT 6529RD/6629RD", |
" 0260 GDT 7519RN/7619RN", |
" 0261 GDT 7529RN/7629RN", |
" 02ff GDT MAXRP", |
" 0300 GDT NEWRX", |
"111a Efficient Networks, Inc", |
" 0000 155P-MF1 (FPGA)", |
" 0002 155P-MF1 (ASIC)", |
" 0003 ENI-25P ATM", |
" 111a 0000 ENI-25p Miniport ATM Adapter", |
" 0005 SpeedStream (LANAI)", |
" 111a 0001 ENI-3010 ATM", |
" 111a 0009 ENI-3060 ADSL (VPI=0)", |
" 111a 0101 ENI-3010 ATM", |
" 111a 0109 ENI-3060CO ADSL (VPI=0)", |
" 111a 0809 ENI-3060 ADSL (VPI=0 or 8)", |
" 111a 0909 ENI-3060CO ADSL (VPI=0 or 8)", |
" 111a 0a09 ENI-3060 ADSL (VPI=<0..15>)", |
" 0007 SpeedStream ADSL", |
" 111a 1001 ENI-3061 ADSL [ASIC]", |
" 1203 SpeedStream 1023 Wireless PCI Adapter", |
"111b Teledyne Electronic Systems", |
"111c Tricord Systems Inc.", |
" 0001 Powerbis Bridge", |
"111d Integrated Device Technology, Inc.", |
" 0001 IDT77201/77211 155Mbps ATM SAR Controller [NICStAR]", |
" 0003 IDT77222/77252 155Mbps ATM MICRO ABR SAR Controller", |
" 0004 IDT77V252 155Mbps ATM MICRO ABR SAR Controller", |
" 0005 IDT77V222 155Mbps ATM MICRO ABR SAR Controller", |
"111e Eldec", |
"111f Precision Digital Images", |
" 4a47 Precision MX Video engine interface", |
" 5243 Frame capture bus interface", |
"1120 EMC Corporation", |
"1121 Zilog", |
"1122 Multi-tech Systems, Inc.", |
"1123 Excellent Design, Inc.", |
"1124 Leutron Vision AG", |
" 2581 Picport Monochrome", |
"1125 Eurocore", |
"1126 Vigra", |
"1127 FORE Systems Inc", |
" 0200 ForeRunner PCA-200 ATM", |
" 0210 PCA-200PC", |
" 0250 ATM", |
" 0300 ForeRunner PCA-200EPC ATM", |
" 0310 ATM", |
" 0400 ForeRunnerHE ATM Adapter", |
" 1127 0400 ForeRunnerHE ATM", |
"1129 Firmworks", |
"112a Hermes Electronics Company, Ltd.", |
"112b Linotype - Hell AG", |
"112c Zenith Data Systems", |
"112d Ravicad", |
"112e Infomedia Microelectronics Inc.", |
"112f Imaging Technology Inc", |
" 0000 MVC IC-PCI", |
" 0001 MVC IM-PCI Video frame grabber/processor", |
" 0008 PC-CamLink PCI framegrabber", |
"1130 Computervision", |
"1131 Philips Semiconductors", |
" 1561 USB 1.1 Host Controller", |
" 1562 USB 2.0 Host Controller", |
" 3400 SmartPCI56(UCB1500) 56K Modem", |
" 5400 TriMedia TM1000/1100", |
" 5402 TriMedia TM-1300", |
" 1244 0f00 Fritz!Card DSL", |
" 5405 TriMedia TM1500", |
" 5406 TriMedia TM1700", |
" 7130 SAA7130 Video Broadcast Decoder", |
" 102b 48d0 Matrox CronosPlus", |
" 1048 226b ELSA EX-VISION 300TV", |
" 1131 2001 10MOONS PCI TV CAPTURE CARD", |
" 1131 2005 Techcom (India) TV Tuner Card (SSD-TV-670)", |
" 1461 050c Nagase Sangyo TransGear 3000TV", |
" 1461 10ff AVerMedia DVD EZMaker", |
" 1461 2108 AverMedia AverTV/305", |
" 1461 2115 AverMedia AverTV Studio 305", |
" 153b 1152 Terratec Cinergy 200 TV", |
" 185b c100 Compro VideoMate TV PVR/FM", |
" 185b c901 Videomate DVB-T200", |
" 5168 0138 LifeView FlyVIDEO2000", |
" 7133 SAA7133/SAA7135 Video Broadcast Decoder", |
" 0000 4091 Beholder BeholdTV 409 FM", |
" 1019 4cb5 Elitegroup ECS TVP3XP FM1236 Tuner Card (NTSC,FM)", |
" 1043 0210 FlyTV mini Asus Digimatrix", |
" 1043 4843 ASUS TV-FM 7133", |
" 1043 4845 TV-FM 7135", |
" 1043 4862 P7131 Dual", |
" 1131 2001 Proteus Pro [philips reference design]", |
" 1131 2018 Tiger reference design", |
" 1131 4ee9 MonsterTV Mobile", |
" 11bd 002b PCTV Stereo", |
" 11bd 002e PCTV 110i (saa7133)", |
" 12ab 0800 PURPLE TV", |
" 1421 0335 Instant TV DVB-T Cardbus", |
" 1421 1370 Instant TV (saa7135)", |
" 1435 7330 VFG7330", |
" 1435 7350 VFG7350", |
" 1461 1044 AVerTVHD MCE A180", |
" 1461 f31f Avermedia AVerTV GO 007 FM", |
" 1462 6231 TV@Anywhere plus", |
" 1489 0214 LifeView FlyTV Platinum FM", |
" 14c0 1212 LifeView FlyTV Platinum Mini2", |
" 153b 1160 Cinergy 250 PCI TV", |
" 153b 1162 Terratec Cinergy 400 mobile", |
" 185b c100 VideoMate TV", |
" 5168 0306 LifeView FlyDVB-T DUO", |
" 5168 0319 LifeView FlyDVB Trio", |
" 7134 SAA7134/SAA7135HL Video Broadcast Decoder", |
" 1019 4cb4 Elitegroup ECS TVP3XP FM1216 Tuner Card(PAL-BG,FM)", |
" 1043 0210 Digimatrix TV", |
" 1043 4840 ASUS TV-FM 7134", |
" 1131 2004 EUROPA V3 reference design", |
" 1131 4e85 SKNet Monster TV", |
" 1131 6752 EMPRESS", |
" 11bd 002b PCTV Stereo", |
" 11bd 002d PCTV 300i DVB-T + PAL", |
" 1461 2c00 AverTV Hybrid+FM PCI", |
" 1461 9715 AVerTV Studio 307", |
" 1461 a70a Avermedia AVerTV 307", |
" 1461 a70b AverMedia M156 / Medion 2819", |
" 1461 d6ee Cardbus TV/Radio (E500)", |
" 1471 b7e9 AVerTV Cardbus plus", |
" 153b 1142 Terratec Cinergy 400 TV", |
" 153b 1143 Terratec Cinergy 600 TV", |
" 153b 1158 Terratec Cinergy 600 TV MK3", |
" 1540 9524 ProVideo PV952", |
" 16be 0003 Medion 7134", |
" 185b c200 Compro VideoMate Gold+ Pal", |
" 185b c900 Videomate DVB-T300", |
" 1894 a006 KNC One TV-Station DVR", |
" 1894 fe01 KNC One TV-Station RDS / Typhoon TV Tuner RDS", |
" 7145 SAA7145", |
" 7146 SAA7146", |
" 110a 0000 Fujitsu/Siemens DVB-C card rev1.5", |
" 110a ffff Fujitsu/Siemens DVB-C card rev1.5", |
" 1131 4f56 KNC1 DVB-S Budget", |
" 1131 4f60 Fujitsu-Siemens Activy DVB-S Budget Rev AL", |
" 1131 4f61 Activy DVB-S Budget Rev GR", |
" 1131 5f61 Activy DVB-T Budget", |
" 114b 2003 DVRaptor Video Edit/Capture Card", |
" 11bd 0006 DV500 Overlay", |
" 11bd 000a DV500 Overlay", |
" 11bd 000f DV500 Overlay", |
" 13c2 0000 Siemens/Technotrend/Hauppauge DVB card rev1.3 or rev1.5", |
" 13c2 0001 Technotrend/Hauppauge DVB card rev1.3 or rev1.6", |
" 13c2 0002 Technotrend/Hauppauge DVB card rev2.1", |
" 13c2 0003 Technotrend/Hauppauge DVB card rev2.1", |
" 13c2 0004 Technotrend/Hauppauge DVB card rev2.1", |
" 13c2 0006 Technotrend/Hauppauge DVB card rev1.3 or rev1.6", |
" 13c2 0008 Technotrend/Hauppauge DVB-T", |
" 13c2 000a Octal/Technotrend DVB-C for iTV", |
" 13c2 1003 Technotrend-Budget/Hauppauge WinTV-NOVA-S DVB card", |
" 13c2 1004 Technotrend-Budget/Hauppauge WinTV-NOVA-C DVB card", |
" 13c2 1005 Technotrend-Budget/Hauppauge WinTV-NOVA-T DVB card", |
" 13c2 100c Technotrend-Budget/Hauppauge WinTV-NOVA-CI DVB card", |
" 13c2 100f Technotrend-Budget/Hauppauge WinTV-NOVA-CI DVB card", |
" 13c2 1011 Technotrend-Budget/Hauppauge WinTV-NOVA-T DVB card", |
" 13c2 1013 SATELCO Multimedia DVB", |
" 13c2 1016 WinTV-NOVA-SE DVB card", |
" 13c2 1102 Technotrend/Hauppauge DVB card rev2.1", |
" 153b 1156 Terratec Cynergy 1200C", |
" 9730 SAA9730 Integrated Multimedia and Peripheral Controller", |
"1132 Mitel Corp.", |
"1133 Eicon Networks Corporation", |
" 7901 EiconCard S90", |
" 7902 EiconCard S90", |
" 7911 EiconCard S91", |
" 7912 EiconCard S91", |
" 7941 EiconCard S94", |
" 7942 EiconCard S94", |
" 7943 EiconCard S94", |
" 7944 EiconCard S94", |
" b921 EiconCard P92", |
" b922 EiconCard P92", |
" b923 EiconCard P92", |
" e001 Diva Pro 2.0 S/T", |
" e002 Diva 2.0 S/T PCI", |
" e003 Diva Pro 2.0 U", |
" e004 Diva 2.0 U PCI", |
" e005 Diva 2.01 S/T PCI", |
" e006 Diva CT S/T PCI", |
" e007 Diva CT U PCI", |
" e008 Diva CT Lite S/T PCI", |
" e009 Diva CT Lite U PCI", |
" e00a Diva ISDN+V.90 PCI", |
" e00b Diva 2.02 PCI S/T", |
" e00c Diva 2.02 PCI U", |
" e00d Diva ISDN Pro 3.0 PCI", |
" e00e Diva ISDN+CT S/T PCI Rev 2", |
" e010 Diva Server BRI-2M PCI", |
" 110a 0021 Fujitsu Siemens ISDN S0", |
" e011 Diva Server BRI S/T Rev 2", |
" e012 Diva Server 4BRI-8M PCI", |
" e013 Diva Server 4BRI Rev 2", |
" 1133 1300 Diva Server V-4BRI-8", |
" 1133 e013 Diva Server 4BRI-8M 2.0 PCI", |
" e014 Diva Server PRI-30M PCI", |
" e015 DIVA Server PRI Rev 2", |
" 1133 e015 Diva Server PRI 2.0 PCI", |
" e016 Diva Server Voice 4BRI PCI", |
" e017 Diva Server Voice 4BRI Rev 2", |
" 1133 e017 Diva Server Voice 4BRI-8M 2.0 PCI", |
" e018 Diva Server BRI-2M 2.0 PCI", |
" 1133 1800 Diva Server V-BRI-2", |
" 1133 e018 Diva Server BRI-2M 2.0 PCI", |
" e019 Diva Server Voice PRI Rev 2", |
" 1133 e019 Diva Server Voice PRI 2.0 PCI", |
" e01a Diva Server 2FX", |
" e01b Diva Server Voice BRI-2M 2.0 PCI", |
" 1133 e01b Diva Server Voice BRI-2M 2.0 PCI", |
" e01c Diva Server PRI Rev 3", |
" 1133 1c01 Diva Server PRI/E1/T1-8", |
" 1133 1c02 Diva Server PRI/T1-24", |
" 1133 1c03 Diva Server PRI/E1-30", |
" 1133 1c04 Diva Server PRI/E1/T1", |
" 1133 1c05 Diva Server V-PRI/T1-24", |
" 1133 1c06 Diva Server V-PRI/E1-30", |
" 1133 1c07 Diva Server PRI/E1/T1-8 Cornet NQ", |
" 1133 1c08 Diva Server PRI/T1-24 Cornet NQ", |
" 1133 1c09 Diva Server PRI/E1-30 Cornet NQ", |
" 1133 1c0a Diva Server PRI/E1/T1 Cornet NQ", |
" 1133 1c0b Diva Server V-PRI/T1-24 Cornet NQ", |
" 1133 1c0c Diva Server V-PRI/E1-30 Cornet NQ", |
" e01e Diva Server 2PRI", |
" e020 Diva Server 4PRI", |
" e022 Diva Server Analog-2P", |
" e024 Diva Server Analog-4P", |
" 1133 2400 Diva Server V-Analog-4P", |
" 1133 e024 Diva Server Analog-4P", |
" e028 Diva Server Analog-8P", |
" 1133 2800 Diva Server V-Analog-8P", |
" 1133 e028 Diva Server Analog-8P", |
" e02a Diva Server IPM-300", |
" e02c Diva Server IPM-600", |
"1134 Mercury Computer Systems", |
" 0001 Raceway Bridge", |
" 0002 Dual PCI to RapidIO Bridge", |
"1135 Fuji Xerox Co Ltd", |
" 0001 Printer controller", |
"1136 Momentum Data Systems", |
"1137 Cisco Systems Inc", |
"1138 Ziatech Corporation", |
" 8905 8905 [STD 32 Bridge]", |
"1139 Dynamic Pictures, Inc", |
" 0001 VGA Compatable 3D Graphics", |
"113a FWB Inc", |
"113b Network Computing Devices", |
"113c Cyclone Microsystems, Inc.", |
" 0000 PCI-9060 i960 Bridge", |
" 0001 PCI-SDK [PCI i960 Evaluation Platform]", |
" 0911 PCI-911 [i960Jx-based Intelligent I/O Controller]", |
" 0912 PCI-912 [i960CF-based Intelligent I/O Controller]", |
" 0913 PCI-913", |
" 0914 PCI-914 [I/O Controller w/ secondary PCI bus]", |
"113d Leading Edge Products Inc", |
"113e Sanyo Electric Co - Computer Engineering Dept", |
"113f Equinox Systems, Inc.", |
" 0808 SST-64P Adapter", |
" 1010 SST-128P Adapter", |
" 80c0 SST-16P DB Adapter", |
" 80c4 SST-16P RJ Adapter", |
" 80c8 SST-16P Adapter", |
" 8888 SST-4P Adapter", |
" 9090 SST-8P Adapter", |
"1140 Intervoice Inc", |
"1141 Crest Microsystem Inc", |
"1142 Alliance Semiconductor Corporation", |
" 3210 AP6410", |
" 6422 ProVideo 6422", |
" 6424 ProVideo 6424", |
" 6425 ProMotion AT25", |
" 643d ProMotion AT3D", |
"1143 NetPower, Inc", |
"1144 Cincinnati Milacron", |
" 0001 Noservo controller", |
"1145 Workbit Corporation", |
" 8007 NinjaSCSI-32 Workbit", |
" f007 NinjaSCSI-32 KME", |
" f010 NinjaSCSI-32 Workbit", |
" f012 NinjaSCSI-32 Logitec", |
" f013 NinjaSCSI-32 Logitec", |
" f015 NinjaSCSI-32 Melco", |
" f020 NinjaSCSI-32 Sony PCGA-DVD51", |
"1146 Force Computers", |
"1147 Interface Corp", |
"1148 SysKonnect", |
" 4000 FDDI Adapter", |
" 0e11 b03b Netelligent 100 FDDI DAS Fibre SC", |
" 0e11 b03c Netelligent 100 FDDI SAS Fibre SC", |
" 0e11 b03d Netelligent 100 FDDI DAS UTP", |
" 0e11 b03e Netelligent 100 FDDI SAS UTP", |
" 0e11 b03f Netelligent 100 FDDI SAS Fibre MIC", |
" 1148 5521 FDDI SK-5521 (SK-NET FDDI-UP)", |
" 1148 5522 FDDI SK-5522 (SK-NET FDDI-UP DAS)", |
" 1148 5541 FDDI SK-5541 (SK-NET FDDI-FP)", |
" 1148 5543 FDDI SK-5543 (SK-NET FDDI-LP)", |
" 1148 5544 FDDI SK-5544 (SK-NET FDDI-LP DAS)", |
" 1148 5821 FDDI SK-5821 (SK-NET FDDI-UP64)", |
" 1148 5822 FDDI SK-5822 (SK-NET FDDI-UP64 DAS)", |
" 1148 5841 FDDI SK-5841 (SK-NET FDDI-FP64)", |
" 1148 5843 FDDI SK-5843 (SK-NET FDDI-LP64)", |
" 1148 5844 FDDI SK-5844 (SK-NET FDDI-LP64 DAS)", |
" 4200 Token Ring adapter", |
" 4300 SK-9872 Gigabit Ethernet Server Adapter (SK-NET GE-ZX dual link)", |
" 1148 9821 SK-9821 Gigabit Ethernet Server Adapter (SK-NET GE-T)", |
" 1148 9822 SK-9822 Gigabit Ethernet Server Adapter (SK-NET GE-T dual link)", |
" 1148 9841 SK-9841 Gigabit Ethernet Server Adapter (SK-NET GE-LX)", |
" 1148 9842 SK-9842 Gigabit Ethernet Server Adapter (SK-NET GE-LX dual link)", |
" 1148 9843 SK-9843 Gigabit Ethernet Server Adapter (SK-NET GE-SX)", |
" 1148 9844 SK-9844 Gigabit Ethernet Server Adapter (SK-NET GE-SX dual link)", |
" 1148 9861 SK-9861 Gigabit Ethernet Server Adapter (SK-NET GE-SX Volition)", |
" 1148 9862 SK-9862 Gigabit Ethernet Server Adapter (SK-NET GE-SX Volition dual link)", |
" 1148 9871 SK-9871 Gigabit Ethernet Server Adapter (SK-NET GE-ZX)", |
" 1148 9872 SK-9872 Gigabit Ethernet Server Adapter (SK-NET GE-ZX dual link)", |
" 1259 2970 AT-2970SX Gigabit Ethernet Adapter", |
" 1259 2971 AT-2970LX Gigabit Ethernet Adapter", |
" 1259 2972 AT-2970TX Gigabit Ethernet Adapter", |
" 1259 2973 AT-2971SX Gigabit Ethernet Adapter", |
" 1259 2974 AT-2971T Gigabit Ethernet Adapter", |
" 1259 2975 AT-2970SX/2SC Gigabit Ethernet Adapter", |
" 1259 2976 AT-2970LX/2SC Gigabit Ethernet Adapter", |
" 1259 2977 AT-2970TX/2TX Gigabit Ethernet Adapter", |
" 4320 SK-9871 V2.0 Gigabit Ethernet 1000Base-ZX Adapter, PCI64, Fiber ZX/SC", |
" 1148 0121 Marvell RDK-8001 Adapter", |
" 1148 0221 Marvell RDK-8002 Adapter", |
" 1148 0321 Marvell RDK-8003 Adapter", |
" 1148 0421 Marvell RDK-8004 Adapter", |
" 1148 0621 Marvell RDK-8006 Adapter", |
" 1148 0721 Marvell RDK-8007 Adapter", |
" 1148 0821 Marvell RDK-8008 Adapter", |
" 1148 0921 Marvell RDK-8009 Adapter", |
" 1148 1121 Marvell RDK-8011 Adapter", |
" 1148 1221 Marvell RDK-8012 Adapter", |
" 1148 3221 SK-9521 V2.0 10/100/1000Base-T Adapter", |
" 1148 5021 SK-9821 V2.0 Gigabit Ethernet 10/100/1000Base-T Adapter", |
" 1148 5041 SK-9841 V2.0 Gigabit Ethernet 1000Base-LX Adapter", |
" 1148 5043 SK-9843 V2.0 Gigabit Ethernet 1000Base-SX Adapter", |
" 1148 5051 SK-9851 V2.0 Gigabit Ethernet 1000Base-SX Adapter", |
" 1148 5061 SK-9861 V2.0 Gigabit Ethernet 1000Base-SX Adapter", |
" 1148 5071 SK-9871 V2.0 Gigabit Ethernet 1000Base-ZX Adapter", |
" 1148 9521 SK-9521 10/100/1000Base-T Adapter", |
" 4400 SK-9Dxx Gigabit Ethernet Adapter", |
" 4500 SK-9Mxx Gigabit Ethernet Adapter", |
" 9000 SK-9S21 10/100/1000Base-T Server Adapter, PCI-X, Copper RJ-45", |
" 9843 [Fujitsu] Gigabit Ethernet", |
" 9e00 SK-9E21D 10/100/1000Base-T Adapter, Copper RJ-45", |
" 1148 2100 SK-9E21 Server Adapter", |
" 1148 21d0 SK-9E21D 10/100/1000Base-T Adapter", |
" 1148 2200 SK-9E22 Server Adapter", |
" 1148 8100 SK-9E81 Server Adapter", |
" 1148 8200 SK-9E82 Server Adapter", |
" 1148 9100 SK-9E91 Server Adapter", |
" 1148 9200 SK-9E92 Server Adapter", |
"1149 Win System Corporation", |
"114a VMIC", |
" 5579 VMIPCI-5579 (Reflective Memory Card)", |
" 5587 VMIPCI-5587 (Reflective Memory Card)", |
" 6504 VMIC PCI 7755 FPGA", |
" 7587 VMIVME-7587", |
"114b Canopus Co., Ltd", |
"114c Annabooks", |
"114d IC Corporation", |
"114e Nikon Systems Inc", |
"114f Digi International", |
" 0002 AccelePort EPC", |
" 0003 RightSwitch SE-6", |
" 0004 AccelePort Xem", |
" 0005 AccelePort Xr", |
" 0006 AccelePort Xr,C/X", |
" 0009 AccelePort Xr/J", |
" 000a AccelePort EPC/J", |
" 000c DataFirePRIme T1 (1-port)", |
" 000d SyncPort 2-Port (x.25/FR)", |
" 0011 AccelePort 8r EIA-232 (IBM)", |
" 0012 AccelePort 8r EIA-422", |
" 0014 AccelePort 8r EIA-422", |
" 0015 AccelePort Xem", |
" 0016 AccelePort EPC/X", |
" 0017 AccelePort C/X", |
" 001a DataFirePRIme E1 (1-port)", |
" 001b AccelePort C/X (IBM)", |
" 001d DataFire RAS T1/E1/PRI", |
" 114f 0050 DataFire RAS E1 Adapter", |
" 114f 0051 DataFire RAS Dual E1 Adapter", |
" 114f 0052 DataFire RAS T1 Adapter", |
" 114f 0053 DataFire RAS Dual T1 Adapter", |
" 0023 AccelePort RAS", |
" 0024 DataFire RAS B4 ST/U", |
" 114f 0030 DataFire RAS BRI U Adapter", |
" 114f 0031 DataFire RAS BRI S/T Adapter", |
" 0026 AccelePort 4r 920", |
" 0027 AccelePort Xr 920", |
" 0028 ClassicBoard 4", |
" 0029 ClassicBoard 8", |
" 0034 AccelePort 2r 920", |
" 0035 DataFire DSP T1/E1/PRI cPCI", |
" 0040 AccelePort Xp", |
" 0042 AccelePort 2p", |
" 0043 AccelePort 4p", |
" 0044 AccelePort 8p", |
" 0045 AccelePort 16p", |
" 004e AccelePort 32p", |
" 0070 Datafire Micro V IOM2 (Europe)", |
" 0071 Datafire Micro V (Europe)", |
" 0072 Datafire Micro V IOM2 (North America)", |
" 0073 Datafire Micro V (North America)", |
" 00b0 Digi Neo 4", |
" 00b1 Digi Neo 8", |
" 00c8 Digi Neo 2 DB9", |
" 00c9 Digi Neo 2 DB9 PRI", |
" 00ca Digi Neo 2 RJ45", |
" 00cb Digi Neo 2 RJ45 PRI", |
" 00d0 ClassicBoard 4 422", |
" 00d1 ClassicBoard 8 422", |
" 6001 Avanstar", |
"1150 Thinking Machines Corp", |
"1151 JAE Electronics Inc.", |
"1152 Megatek", |
"1153 Land Win Electronic Corp", |
"1154 Melco Inc", |
"1155 Pine Technology Ltd", |
"1156 Periscope Engineering", |
"1157 Avsys Corporation", |
"1158 Voarx R & D Inc", |
" 3011 Tokenet/vg 1001/10m anylan", |
" 9050 Lanfleet/Truevalue", |
" 9051 Lanfleet/Truevalue", |
"1159 Mutech Corp", |
" 0001 MV-1000", |
"115a Harlequin Ltd", |
"115b Parallax Graphics", |
"115c Photron Ltd.", |
"115d Xircom", |
" 0003 Cardbus Ethernet 10/100", |
" 1014 0181 10/100 EtherJet Cardbus Adapter", |
" 1014 1181 10/100 EtherJet Cardbus Adapter", |
" 1014 8181 10/100 EtherJet Cardbus Adapter", |
" 1014 9181 10/100 EtherJet Cardbus Adapter", |
" 115d 0181 Cardbus Ethernet 10/100", |
" 115d 0182 RealPort2 CardBus Ethernet 10/100 (R2BE-100)", |
" 115d 1181 Cardbus Ethernet 10/100", |
" 1179 0181 Cardbus Ethernet 10/100", |
" 8086 8181 EtherExpress PRO/100 Mobile CardBus 32 Adapter", |
" 8086 9181 EtherExpress PRO/100 Mobile CardBus 32 Adapter", |
" 0005 Cardbus Ethernet 10/100", |
" 1014 0182 10/100 EtherJet Cardbus Adapter", |
" 1014 1182 10/100 EtherJet Cardbus Adapter", |
" 115d 0182 Cardbus Ethernet 10/100", |
" 115d 1182 Cardbus Ethernet 10/100", |
" 0007 Cardbus Ethernet 10/100", |
" 1014 0182 10/100 EtherJet Cardbus Adapter", |
" 1014 1182 10/100 EtherJet Cardbus Adapter", |
" 115d 0182 Cardbus Ethernet 10/100", |
" 115d 1182 Cardbus Ethernet 10/100", |
" 000b Cardbus Ethernet 10/100", |
" 1014 0183 10/100 EtherJet Cardbus Adapter", |
" 115d 0183 Cardbus Ethernet 10/100", |
" 000c Mini-PCI V.90 56k Modem", |
" 000f Cardbus Ethernet 10/100", |
" 1014 0183 10/100 EtherJet Cardbus Adapter", |
" 115d 0183 Cardbus Ethernet 10/100", |
" 00d4 Mini-PCI K56Flex Modem", |
" 0101 Cardbus 56k modem", |
" 115d 1081 Cardbus 56k Modem", |
" 0103 Cardbus Ethernet + 56k Modem", |
" 1014 9181 Cardbus 56k Modem", |
" 1115 1181 Cardbus Ethernet 100 + 56k Modem", |
" 115d 1181 CBEM56G-100 Ethernet + 56k Modem", |
" 8086 9181 PRO/100 LAN + Modem56 CardBus", |
"115e Peer Protocols Inc", |
"115f Maxtor Corporation", |
"1160 Megasoft Inc", |
"1161 PFU Limited", |
"1162 OA Laboratory Co Ltd", |
"1163 Rendition", |
" 0001 Verite 1000", |
" 2000 Verite V2000/V2100/V2200", |
" 1092 2000 Stealth II S220", |
"1164 Advanced Peripherals Technologies", |
"1165 Imagraph Corporation", |
" 0001 Motion TPEG Recorder/Player with audio", |
"1166 Broadcom", |
" 0000 CMIC-LE", |
" 0005 CNB20-LE Host Bridge", |
" 0006 CNB20HE Host Bridge", |
" 0007 CNB20-LE Host Bridge", |
" 0008 CNB20HE Host Bridge", |
" 0009 CNB20LE Host Bridge", |
" 0010 CIOB30", |
" 0011 CMIC-HE", |
" 0012 CMIC-WS Host Bridge (GC-LE chipset)", |
" 0013 CNB20-HE Host Bridge", |
" 0014 CMIC-LE Host Bridge (GC-LE chipset)", |
" 0015 CMIC-GC Host Bridge", |
" 0016 CMIC-GC Host Bridge", |
" 0017 GCNB-LE Host Bridge", |
" 0036 HT1000 PCI/PCI-X bridge", |
" 0101 CIOB-X2 PCI-X I/O Bridge", |
" 0104 HT1000 PCI/PCI-X bridge", |
" 0110 CIOB-E I/O Bridge with Gigabit Ethernet", |
" 0130 HT1000 PCI-X bridge", |
" 0132 HT1000 PCI-Express bridge", |
" 0200 OSB4 South Bridge", |
" 0201 CSB5 South Bridge", |
" 4c53 1080 CT8 mainboard", |
" 0203 CSB6 South Bridge", |
" 1734 1012 Primergy RX300", |
" 0205 HT1000 Legacy South Bridge", |
" 0211 OSB4 IDE Controller", |
" 0212 CSB5 IDE Controller", |
" 4c53 1080 CT8 mainboard", |
" 0213 CSB6 RAID/IDE Controller", |
" 1028 c134 Poweredge SC600", |
" 1734 1012 Primergy RX300", |
" 0214 HT1000 Legacy IDE controller", |
" 0217 CSB6 IDE Controller", |
" 1028 4134 Poweredge SC600", |
" 0220 OSB4/CSB5 OHCI USB Controller", |
" 4c53 1080 CT8 mainboard", |
" 0221 CSB6 OHCI USB Controller", |
" 1734 1012 Primergy RX300", |
" 0223 HT1000 USB Controller", |
" 0225 CSB5 LPC bridge", |
" 0227 GCLE-2 Host Bridge", |
" 1734 1012 Primergy RX300", |
" 0230 CSB5 LPC bridge", |
" 4c53 1080 CT8 mainboard", |
" 0234 HT1000 LPC Bridge", |
" 0240 K2 SATA", |
" 0241 RAIDCore RC4000", |
" 0242 RAIDCore BC4000", |
" 024a BCM5785 (HT1000) SATA Native SATA Mode", |
" 024b BCM5785 (HT1000) PATA/IDE Mode", |
"1167 Mutoh Industries Inc", |
"1168 Thine Electronics Inc", |
"1169 Centre for Development of Advanced Computing", |
"116a Polaris Communications", |
" 6100 Bus/Tag Channel", |
" 6800 Escon Channel", |
" 7100 Bus/Tag Channel", |
" 7800 Escon Channel", |
"116b Connectware Inc", |
"116c Intelligent Resources Integrated Systems", |
"116d Martin-Marietta", |
"116e Electronics for Imaging", |
"116f Workstation Technology", |
"1170 Inventec Corporation", |
"1171 Loughborough Sound Images Plc", |
"1172 Altera Corporation", |
"1173 Adobe Systems, Inc", |
"1174 Bridgeport Machines", |
"1175 Mitron Computer Inc.", |
"1176 SBE Incorporated", |
"1177 Silicon Engineering", |
"1178 Alfa, Inc.", |
" afa1 Fast Ethernet Adapter", |
"1179 Toshiba America Info Systems", |
" 0102 Extended IDE Controller", |
" 0103 EX-IDE Type-B", |
" 0404 DVD Decoder card", |
" 0406 Tecra Video Capture device", |
" 0407 DVD Decoder card (Version 2)", |
" 0601 CPU to PCI bridge", |
" 1179 0001 Satellite Pro", |
" 0603 ToPIC95 PCI to CardBus Bridge for Notebooks", |
" 060a ToPIC95", |
" 1179 0001 Satellite Pro", |
" 060f ToPIC97", |
" 0617 ToPIC100 PCI to Cardbus Bridge with ZV Support", |
" 0618 CPU to PCI and PCI to ISA bridge", |
" 0701 FIR Port", |
" 0804 TC6371AF SmartMedia Controller", |
" 0805 SD TypA Controller", |
" 0d01 FIR Port Type-DO", |
" 1179 0001 FIR Port Type-DO", |
"117a A-Trend Technology", |
"117b L G Electronics, Inc.", |
"117c Atto Technology", |
" 0030 Ultra320 SCSI Host Adapter", |
" 117c 8013 ExpressPCI UL4D", |
" 117c 8014 ExpressPCI UL4S", |
"117d Becton & Dickinson", |
"117e T/R Systems", |
"117f Integrated Circuit Systems", |
"1180 Ricoh Co Ltd", |
" 0465 RL5c465", |
" 0466 RL5c466", |
" 0475 RL5c475", |
" 144d c006 vpr Matrix 170B4 CardBus bridge", |
" 0476 RL5c476 II", |
" 1014 0185 ThinkPad A/T/X Series", |
" 1028 0188 Inspiron 6000 laptop", |
" 1043 1967 V6800V", |
" 1043 1987 Asus A4K and Z81K notebooks, possibly others ( mid-2005 machines )", |
" 104d 80df Vaio PCG-FX403", |
" 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP", |
" 144d c00c P35 notebook", |
" 14ef 0220 PCD-RP-220S", |
" 17aa 201c Thinkpad X60s", |
" 0477 RL5c477", |
" 0478 RL5c478", |
" 1014 0184 ThinkPad A30p (2653-64G)", |
" 0511 R5C511", |
" 0522 R5C522 IEEE 1394 Controller", |
" 1014 01cf ThinkPad A30p (2653-64G)", |
" 1043 1967 V6800V", |
" 0551 R5C551 IEEE 1394 Controller", |
" 144d c006 vpr Matrix 170B4", |
" 0552 R5C552 IEEE 1394 Controller", |
" 1014 0511 ThinkPad A/T/X Series", |
" 1028 0188 Inspiron 6000 laptop", |
" 144d c00c P35 notebook", |
" 17aa 201e Thinkpad X60s", |
" 0554 R5C554", |
" 0575 R5C575 SD Bus Host Adapter", |
" 0576 R5C576 SD Bus Host Adapter", |
" 0592 R5C592 Memory Stick Bus Host Adapter", |
" 1043 1967 V6800V", |
" 144d c018 X20 IV", |
" 0811 R5C811", |
" 0822 R5C822 SD/SDIO/MMC/MS/MSPro Host Adapter", |
" 1014 0556 Thinkpad X40", |
" 1014 0598 Thinkpad Z60m", |
" 1028 0188 Inspiron 6000 laptop", |
" 1028 01a2 Inspiron 9200", |
" 1043 1967 ASUS V6800V", |
" 144d c018 X20 IV", |
" 17aa 201d Thinkpad X60s", |
" 0841 R5C841 CardBus/SD/SDIO/MMC/MS/MSPro/xD/IEEE1394", |
" 0852 xD-Picture Card Controller", |
" 1043 1967 V6800V", |
"1181 Telmatics International", |
"1183 Fujikura Ltd", |
"1184 Forks Inc", |
"1185 Dataworld International Ltd", |
"1186 D-Link System Inc", |
" 0100 DC21041", |
" 1002 DL10050 Sundance Ethernet", |
" 1186 1002 DFE-550TX", |
" 1186 1012 DFE-580TX", |
" 1025 AirPlus Xtreme G DWL-G650 Adapter", |
" 1026 AirXpert DWL-AG650 Wireless Cardbus Adapter", |
" 1043 AirXpert DWL-AG650 Wireless Cardbus Adapter", |
" 1300 RTL8139 Ethernet", |
" 1186 1300 DFE-538TX 10/100 Ethernet Adapter", |
" 1186 1301 DFE-530TX+ 10/100 Ethernet Adapter", |
" 1186 1303 DFE-528TX 10/100 Fast Ethernet PCI Adapter", |
" 1340 DFE-690TXD CardBus PC Card", |
" 1541 DFE-680TXD CardBus PC Card", |
" 1561 DRP-32TXD Cardbus PC Card", |
" 2027 AirPlus Xtreme G DWL-G520 Adapter", |
" 3203 AirPlus Xtreme G DWL-G520 Adapter", |
" 3300 DWL-510 2.4GHz Wireless PCI Adapter", |
" 3a03 AirPro DWL-A650 Wireless Cardbus Adapter(rev.B)", |
" 3a04 AirPro DWL-AB650 Multimode Wireless Cardbus Adapter", |
" 3a05 AirPro DWL-AB520 Multimode Wireless PCI Adapter", |
" 3a07 AirXpert DWL-AG650 Wireless Cardbus Adapter", |
" 3a08 AirXpert DWL-AG520 Wireless PCI Adapter", |
" 3a10 AirXpert DWL-AG650 Wireless Cardbus Adapter(rev.B)", |
" 3a11 AirXpert DWL-AG520 Wireless PCI Adapter(rev.B)", |
" 3a12 AirPlus DWL-G650 Wireless Cardbus Adapter(rev.C)", |
" 3a13 AirPlus DWL-G520 Wireless PCI Adapter(rev.B)", |
" 3a14 AirPremier DWL-AG530 Wireless PCI Adapter", |
" 3a63 AirXpert DWL-AG660 Wireless Cardbus Adapter", |
" 4000 DL2000-based Gigabit Ethernet", |
" 4300 DGE-528T Gigabit Ethernet Adapter", |
" 4b01 DGE-530T Gigabit Ethernet Adapter (rev 11)", |
" 4c00 Gigabit Ethernet Adapter", |
" 1186 4c00 DGE-530T Gigabit Ethernet Adapter", |
" 8400 D-Link DWL-650+ CardBus PC Card", |
"1187 Advanced Technology Laboratories, Inc.", |
"1188 Shima Seiki Manufacturing Ltd.", |
"1189 Matsushita Electronics Co Ltd", |
"118a Hilevel Technology", |
"118b Hypertec Pty Limited", |
"118c Corollary, Inc", |
" 0014 PCIB [C-bus II to PCI bus host bridge chip]", |
" 1117 Intel 8-way XEON Profusion Chipset [Cache Coherency Filter]", |
"118d BitFlow Inc", |
" 0001 Raptor-PCI framegrabber", |
" 0012 Model 12 Road Runner Frame Grabber", |
" 0014 Model 14 Road Runner Frame Grabber", |
" 0024 Model 24 Road Runner Frame Grabber", |
" 0044 Model 44 Road Runner Frame Grabber", |
" 0112 Model 12 Road Runner Frame Grabber", |
" 0114 Model 14 Road Runner Frame Grabber", |
" 0124 Model 24 Road Runner Frame Grabber", |
" 0144 Model 44 Road Runner Frame Grabber", |
" 0212 Model 12 Road Runner Frame Grabber", |
" 0214 Model 14 Road Runner Frame Grabber", |
" 0224 Model 24 Road Runner Frame Grabber", |
" 0244 Model 44 Road Runner Frame Grabber", |
" 0312 Model 12 Road Runner Frame Grabber", |
" 0314 Model 14 Road Runner Frame Grabber", |
" 0324 Model 24 Road Runner Frame Grabber", |
" 0344 Model 44 Road Runner Frame Grabber", |
"118e Hermstedt GmbH", |
"118f Green Logic", |
"1190 Tripace", |
" c731 TP-910/920/940 PCI Ultra(Wide) SCSI Adapter", |
"1191 Artop Electronic Corp", |
" 0003 SCSI Cache Host Adapter", |
" 0004 ATP8400", |
" 0005 ATP850UF", |
" 0006 ATP860 NO-BIOS", |
" 0007 ATP860", |
" 0008 ATP865 NO-ROM", |
" 0009 ATP865", |
" 8002 AEC6710 SCSI-2 Host Adapter", |
" 8010 AEC6712UW SCSI", |
" 8020 AEC6712U SCSI", |
" 8030 AEC6712S SCSI", |
" 8040 AEC6712D SCSI", |
" 8050 AEC6712SUW SCSI", |
" 8060 AEC6712 SCSI", |
" 8080 AEC67160 SCSI", |
" 8081 AEC67160S SCSI", |
" 808a AEC67162 2-ch. LVD SCSI", |
"1192 Densan Company Ltd", |
"1193 Zeitnet Inc.", |
" 0001 1221", |
" 0002 1225", |
"1194 Toucan Technology", |
"1195 Ratoc System Inc", |
"1196 Hytec Electronics Ltd", |
"1197 Gage Applied Sciences, Inc.", |
" 010c CompuScope 82G 8bit 2GS/s Analog Input Card", |
"1198 Lambda Systems Inc", |
"1199 Attachmate Corporation", |
"119a Mind Share, Inc.", |
"119b Omega Micro Inc.", |
" 1221 82C092G", |
"119c Information Technology Inst.", |
"119d Bug, Inc. Sapporo Japan", |
"119e Fujitsu Microelectronics Ltd.", |
" 0001 FireStream 155", |
" 0003 FireStream 50", |
"119f Bull HN Information Systems", |
"11a0 Convex Computer Corporation", |
"11a1 Hamamatsu Photonics K.K.", |
"11a2 Sierra Research and Technology", |
"11a3 Deuretzbacher GmbH & Co. Eng. KG", |
"11a4 Barco Graphics NV", |
"11a5 Microunity Systems Eng. Inc", |
"11a6 Pure Data Ltd.", |
"11a7 Power Computing Corp.", |
"11a8 Systech Corp.", |
"11a9 InnoSys Inc.", |
" 4240 AMCC S933Q Intelligent Serial Card", |
"11aa Actel", |
"11ab Marvell Technology Group Ltd.", |
" 0146 GT-64010/64010A System Controller", |
" 138f W8300 802.11 Adapter (rev 07)", |
" 1fa6 Marvell W8300 802.11 Adapter", |
" 1fa7 88W8310 and 88W8000G [Libertas] 802.11g client chipset", |
" 1faa 88w8335 [Libertas] 802.11b/g Wireless", |
" 1385 4e00 WG511 v2 54MBit/ Wireless PC-Card", |
" 4320 88E8001 Gigabit Ethernet Controller", |
" 1019 0f38 Marvell 88E8001 Gigabit Ethernet Controller (ECS)", |
" 1019 8001 Marvell 88E8001 Gigabit Ethernet Controller (ECS)", |
" 1043 173c Marvell 88E8001 Gigabit Ethernet Controller (Asus)", |
" 1043 811a Marvell 88E8001 Gigabit Ethernet Controller (Asus)", |
" 105b 0c19 Marvell 88E8001 Gigabit Ethernet Controller (Foxconn)", |
" 10b8 b452 EZ Card 1000 (SMC9452TXV.2)", |
" 11ab 0121 Marvell RDK-8001", |
" 11ab 0321 Marvell RDK-8003", |
" 11ab 1021 Marvell RDK-8010", |
" 11ab 4320 Marvell Yukon Gigabit Ethernet 10/100/1000Baset-T Constroller (Asus)", |
" 11ab 5021 Marvell Yukon Gigabit Ethernet 10/100/1000Base-T Controller (64 bit)", |
" 11ab 9521 Marvell Yukon Gigabit Ethernet 10/100/1000Base-T Controller (32 bit)", |
" 1458 e000 Marvell 88E8001 Gigabit Ethernet Controller (Gigabyte)", |
" 147b 1406 Marvell 88E8001 Gigabit Ethernet Controller (Abit)", |
" 15d4 0047 Marvell 88E8001 Gigabit Ethernet Controller (Iwill)", |
" 1695 9025 Marvell 88E8001 Gigabit Ethernet Controller (Epox)", |
" 17f2 1c03 Marvell 88E8001 Gigabit Ethernet Controller (Albatron)", |
" 270f 2803 Marvell 88E8001 Gigabit Ethernet Controller (Chaintech)", |
" 4340 88E8021 PCI-X IPMI Gigabit Ethernet Controller", |
" 4341 88E8022 PCI-X IPMI Gigabit Ethernet Controller", |
" 4342 88E8061 PCI-E IPMI Gigabit Ethernet Controller", |
" 4343 88E8062 PCI-E IPMI Gigabit Ethernet Controller", |
" 4344 88E8021 PCI-X IPMI Gigabit Ethernet Controller", |
" 4345 88E8022 PCI-X IPMI Gigabit Ethernet Controller", |
" 4346 88E8061 PCI-E IPMI Gigabit Ethernet Controller", |
" 4347 88E8062 PCI-E IPMI Gigabit Ethernet Controller", |
" 4350 88E8035 PCI-E Fast Ethernet Controller", |
" 1179 0001 Marvell 88E8035 Fast Ethernet Controller (Toshiba)", |
" 11ab 3521 Marvell RDK-8035", |
" 1854 000d Marvell 88E8035 Fast Ethernet Controller (LGE)", |
" 1854 000e Marvell 88E8035 Fast Ethernet Controller (LGE)", |
" 1854 000f Marvell 88E8035 Fast Ethernet Controller (LGE)", |
" 1854 0011 Marvell 88E8035 Fast Ethernet Controller (LGE)", |
" 1854 0012 Marvell 88E8035 Fast Ethernet Controller (LGE)", |
" 1854 0016 Marvell 88E8035 Fast Ethernet Controller (LGE)", |
" 1854 0017 Marvell 88E8035 Fast Ethernet Controller (LGE)", |
" 1854 0018 Marvell 88E8035 Fast Ethernet Controller (LGE)", |
" 1854 0019 Marvell 88E8035 Fast Ethernet Controller (LGE)", |
" 1854 001c Marvell 88E8035 Fast Ethernet Controller (LGE)", |
" 1854 001e Marvell 88E8035 Fast Ethernet Controller (LGE)", |
" 1854 0020 Marvell 88E8035 Fast Ethernet Controller (LGE)", |
" 4351 88E8036 PCI-E Fast Ethernet Controller", |
" 107b 4009 Marvell 88E8036 Fast Ethernet Controller (Wistron)", |
" 10f7 8338 Marvell 88E8036 Fast Ethernet Controller (Panasonic)", |
" 1179 0001 Marvell 88E8036 Fast Ethernet Controller (Toshiba)", |
" 1179 ff00 Marvell 88E8036 Fast Ethernet Controller (Compal)", |
" 1179 ff10 Marvell 88E8036 Fast Ethernet Controller (Inventec)", |
" 11ab 3621 Marvell RDK-8036", |
" 13d1 ac12 Abocom EFE3K - 10/100 Ethernet Expresscard", |
" 161f 203d Marvell 88E8036 Fast Ethernet Controller (Arima)", |
" 1854 000d Marvell 88E8036 Fast Ethernet Controller (LGE)", |
" 1854 000e Marvell 88E8036 Fast Ethernet Controller (LGE)", |
" 1854 000f Marvell 88E8036 Fast Ethernet Controller (LGE)", |
" 1854 0011 Marvell 88E8036 Fast Ethernet Controller (LGE)", |
" 1854 0012 Marvell 88E8036 Fast Ethernet Controller (LGE)", |
" 1854 0016 Marvell 88E8036 Fast Ethernet Controller (LGE)", |
" 1854 0017 Marvell 88E8036 Fast Ethernet Controller (LGE)", |
" 1854 0018 Marvell 88E8036 Fast Ethernet Controller (LGE)", |
" 1854 0019 Marvell 88E8036 Fast Ethernet Controller (LGE)", |
" 1854 001c Marvell 88E8036 Fast Ethernet Controller (LGE)", |
" 1854 001e Marvell 88E8036 Fast Ethernet Controller (LGE)", |
" 1854 0020 Marvell 88E8036 Fast Ethernet Controller (LGE)", |
" 4352 88E8038 PCI-E Fast Ethernet Controller", |
" 4360 88E8052 PCI-E ASF Gigabit Ethernet Controller", |
" 1043 8134 Marvell 88E8052 Gigabit Ethernet Controller (Asus)", |
" 107b 4009 Marvell 88E8052 Gigabit Ethernet Controller (Wistron)", |
" 11ab 5221 Marvell RDK-8052", |
" 1458 e000 Marvell 88E8052 Gigabit Ethernet Controller (Gigabyte)", |
" 1462 052c Marvell 88E8052 Gigabit Ethernet Controller (MSI)", |
" 1849 8052 Marvell 88E8052 Gigabit Ethernet Controller (ASRock)", |
" a0a0 0509 Marvell 88E8052 Gigabit Ethernet Controller (Aopen)", |
" 4361 88E8050 PCI-E ASF Gigabit Ethernet Controller", |
" 107b 3015 Marvell 88E8050 Gigabit Ethernet Controller (Gateway)", |
" 11ab 5021 Marvell 88E8050 Gigabit Ethernet Controller (Intel)", |
" 8086 3063 D925XCVLK mainboard", |
" 8086 3439 Marvell 88E8050 Gigabit Ethernet Controller (Intel)", |
" 4362 88E8053 PCI-E Gigabit Ethernet Controller", |
" 103c 2a0d Marvell 88E8053 Gigabit Ethernet Controller (Asus)", |
" 1043 8142 Marvell 88E8053 Gigabit Ethernet controller PCIe (Asus)", |
" 109f 3197 Marvell 88E8053 Gigabit Ethernet Controller (Trigem)", |
" 10f7 8338 Marvell 88E8053 Gigabit Ethernet Controller (Panasonic)", |
" 10fd a430 Marvell 88E8053 Gigabit Ethernet Controller (SOYO)", |
" 1179 0001 Marvell 88E8053 Gigabit Ethernet Controller (Toshiba)", |
" 1179 ff00 Marvell 88E8053 Gigabit Ethernet Controller (Compal)", |
" 1179 ff10 Marvell 88E8053 Gigabit Ethernet Controller (Inventec)", |
" 11ab 5321 Marvell RDK-8053", |
" 1297 c240 Marvell 88E8053 Gigabit Ethernet Controller (Shuttle)", |
" 1297 c241 Marvell 88E8053 Gigabit Ethernet Controller (Shuttle)", |
" 1297 c242 Marvell 88E8053 Gigabit Ethernet Controller (Shuttle)", |
" 1297 c243 Marvell 88E8053 Gigabit Ethernet Controller (Shuttle)", |
" 1297 c244 Marvell 88E8053 Gigabit Ethernet Controller (Shuttle)", |
" 13d1 ac11 EGE5K - Giga Ethernet Expresscard", |
" 1458 e000 Marvell 88E8053 Gigabit Ethernet Controller (Gigabyte)", |
" 1462 058c Marvell 88E8053 Gigabit Ethernet Controller (MSI)", |
" 14c0 0012 Marvell 88E8053 Gigabit Ethernet Controller (Compal)", |
" 1558 04a0 Marvell 88E8053 Gigabit Ethernet Controller (Clevo)", |
" 15bd 1003 Marvell 88E8053 Gigabit Ethernet Controller (DFI)", |
" 161f 203c Marvell 88E8053 Gigabit Ethernet Controller (Arima)", |
" 161f 203d Marvell 88E8053 Gigabit Ethernet Controller (Arima)", |
" 1695 9029 Marvell 88E8053 Gigabit Ethernet Controller (Epox)", |
" 17f2 2c08 Marvell 88E8053 Gigabit Ethernet Controller (Albatron)", |
" 17ff 0585 Marvell 88E8053 Gigabit Ethernet Controller (Quanta)", |
" 1849 8053 Marvell 88E8053 Gigabit Ethernet Controller (ASRock)", |
" 1854 000b Marvell 88E8053 Gigabit Ethernet Controller (LGE)", |
" 1854 000c Marvell 88E8053 Gigabit Ethernet Controller (LGE)", |
" 1854 0010 Marvell 88E8053 Gigabit Ethernet Controller (LGE)", |
" 1854 0013 Marvell 88E8053 Gigabit Ethernet Controller (LGE)", |
" 1854 0014 Marvell 88E8053 Gigabit Ethernet Controller (LGE)", |
" 1854 0015 Marvell 88E8053 Gigabit Ethernet Controller (LGE)", |
" 1854 001a Marvell 88E8053 Gigabit Ethernet Controller (LGE)", |
" 1854 001b Marvell 88E8053 Gigabit Ethernet Controller (LGE)", |
" 1854 001d Marvell 88E8053 Gigabit Ethernet Controller (LGE)", |
" 1854 001f Marvell 88E8053 Gigabit Ethernet Controller (LGE)", |
" 1854 0021 Marvell 88E8053 Gigabit Ethernet Controller (LGE)", |
" 1854 0022 Marvell 88E8053 Gigabit Ethernet Controller (LGE)", |
" 270f 2801 Marvell 88E8053 Gigabit Ethernet Controller (Chaintech)", |
" a0a0 0506 Marvell 88E8053 Gigabit Ethernet Controller (Aopen)", |
" 4363 88E8055 PCI-E Gigabit Ethernet Controller", |
" 4611 GT-64115 System Controller", |
" 4620 GT-64120/64120A/64121A System Controller", |
" 4801 GT-48001", |
" 5005 Belkin F5D5005 Gigabit Desktop Network PCI Card", |
" 5040 MV88SX5040 4-port SATA I PCI-X Controller", |
" 5041 MV88SX5041 4-port SATA I PCI-X Controller", |
" 5080 MV88SX5080 8-port SATA I PCI-X Controller", |
" 5081 MV88SX5081 8-port SATA I PCI-X Controller", |
" 6041 MV88SX6041 4-port SATA II PCI-X Controller", |
" 6081 MV88SX6081 8-port SATA II PCI-X Controller", |
" 6460 MV64360/64361/64362 System Controller", |
" 6480 MV64460/64461/64462 System Controller", |
" f003 GT-64010 Primary Image Piranha Image Generator", |
"11ac Canon Information Systems Research Aust.", |
"11ad Lite-On Communications Inc", |
" 0002 LNE100TX", |
" 11ad 0002 LNE100TX", |
" 11ad 0003 LNE100TX", |
" 11ad f003 LNE100TX", |
" 11ad ffff LNE100TX", |
" 1385 f004 FA310TX", |
" c115 LNE100TX [Linksys EtherFast 10/100]", |
" 11ad c001 LNE100TX [ver 2.0]", |
"11ae Aztech System Ltd", |
"11af Avid Technology Inc.", |
" 0001 Cinema", |
" ee40 Digidesign Audiomedia III", |
"11b0 V3 Semiconductor Inc.", |
" 0002 V300PSC", |
" 0292 V292PBC [Am29030/40 Bridge]", |
" 0960 V96xPBC", |
" c960 V96DPC", |
"11b1 Apricot Computers", |
"11b2 Eastman Kodak", |
"11b3 Barr Systems Inc.", |
"11b4 Leitch Technology International", |
"11b5 Radstone Technology Plc", |
"11b6 United Video Corp", |
"11b7 Motorola", |
"11b8 XPoint Technologies, Inc", |
" 0001 Quad PeerMaster", |
"11b9 Pathlight Technology Inc.", |
" c0ed SSA Controller", |
"11ba Videotron Corp", |
"11bb Pyramid Technology", |
"11bc Network Peripherals Inc", |
" 0001 NP-PCI", |
"11bd Pinnacle Systems Inc.", |
" 002e PCTV 40i", |
" bede AV/DV Studio Capture Card", |
"11be International Microcircuits Inc", |
"11bf Astrodesign, Inc.", |
"11c0 Hewlett Packard", |
"11c1 Agere Systems", |
" 0440 56k WinModem", |
" 1033 8015 LT WinModem 56k Data+Fax+Voice+Dsvd", |
" 1033 8047 LT WinModem 56k Data+Fax+Voice+Dsvd", |
" 1033 804f LT WinModem 56k Data+Fax+Voice+Dsvd", |
" 10cf 102c LB LT Modem V.90 56k", |
" 10cf 104a BIBLO LT Modem 56k", |
" 10cf 105f LB2 LT Modem V.90 56k", |
" 1179 0001 Internal V.90 Modem", |
" 11c1 0440 LT WinModem 56k Data+Fax+Voice+Dsvd", |
" 122d 4101 MDP7800-U Modem", |
" 122d 4102 MDP7800SP-U Modem", |
" 13e0 0040 LT WinModem 56k Data+Fax+Voice+Dsvd", |
" 13e0 0440 LT WinModem 56k Data+Fax+Voice+Dsvd", |
" 13e0 0441 LT WinModem 56k Data+Fax+Voice+Dsvd", |
" 13e0 0450 LT WinModem 56k Data+Fax+Voice+Dsvd", |
" 13e0 f100 LT WinModem 56k Data+Fax+Voice+Dsvd", |
" 13e0 f101 LT WinModem 56k Data+Fax+Voice+Dsvd", |
" 144d 2101 LT56PV Modem", |
" 149f 0440 LT WinModem 56k Data+Fax+Voice+Dsvd", |
" 0441 56k WinModem", |
" 1033 804d LT WinModem 56k Data+Fax", |
" 1033 8065 LT WinModem 56k Data+Fax", |
" 1092 0440 Supra 56i", |
" 1179 0001 Internal V.90 Modem", |
" 11c1 0440 LT WinModem 56k Data+Fax", |
" 11c1 0441 LT WinModem 56k Data+Fax", |
" 122d 4100 MDP7800-U Modem", |
" 13e0 0040 LT WinModem 56k Data+Fax", |
" 13e0 0100 LT WinModem 56k Data+Fax", |
" 13e0 0410 LT WinModem 56k Data+Fax", |
" 13e0 0420 TelePath Internet 56k WinModem", |
" 13e0 0440 LT WinModem 56k Data+Fax", |
" 13e0 0443 LT WinModem 56k Data+Fax", |
" 13e0 f102 LT WinModem 56k Data+Fax", |
" 1416 9804 CommWave 56k Modem", |
" 141d 0440 LT WinModem 56k Data+Fax", |
" 144f 0441 Lucent 56k V.90 DF Modem", |
" 144f 0449 Lucent 56k V.90 DF Modem", |
" 144f 110d Lucent Win Modem", |
" 1468 0441 Presario 56k V.90 DF Modem", |
" 1668 0440 Lucent Win Modem", |
" 0442 56k WinModem", |
" 11c1 0440 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd", |
" 11c1 0442 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd", |
" 13e0 0412 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd", |
" 13e0 0442 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd", |
" 13fc 2471 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd", |
" 144d 2104 LT56PT Modem", |
" 144f 1104 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd", |
" 149f 0440 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd", |
" 1668 0440 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd", |
" 0443 LT WinModem", |
" 0444 LT WinModem", |
" 0445 LT WinModem", |
" 8086 2203 PRO/100+ MiniPCI (probably an Ambit U98.003.C.00 combo card)", |
" 8086 2204 PRO/100+ MiniPCI on Armada E500", |
" 0446 LT WinModem", |
" 0447 LT WinModem", |
" 0448 WinModem 56k", |
" 1014 0131 Lucent Win Modem", |
" 1033 8066 LT WinModem 56k Data+Fax+Voice+Dsvd", |
" 13e0 0030 56k Voice Modem", |
" 13e0 0040 LT WinModem 56k Data+Fax+Voice+Dsvd", |
" 1668 2400 LT WinModem 56k (MiniPCI Ethernet+Modem)", |
" 0449 WinModem 56k", |
" 0e11 b14d 56k V.90 Modem", |
" 13e0 0020 LT WinModem 56k Data+Fax", |
" 13e0 0041 TelePath Internet 56k WinModem", |
" 1436 0440 Lucent Win Modem", |
" 144f 0449 Lucent 56k V.90 DFi Modem", |
" 1468 0410 IBM ThinkPad T23 (2647-4MG)", |
" 1468 0440 Lucent Win Modem", |
" 1468 0449 Presario 56k V.90 DFi Modem", |
" 044a F-1156IV WinModem (V90, 56KFlex)", |
" 10cf 1072 LB Global LT Modem", |
" 13e0 0012 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd", |
" 13e0 0042 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd", |
" 144f 1005 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd", |
" 044b LT WinModem", |
" 044c LT WinModem", |
" 044d LT WinModem", |
" 044e LT WinModem", |
" 044f V90 WildWire Modem", |
" 0450 LT WinModem", |
" 1033 80a8 Versa Note Vxi", |
" 144f 4005 Magnia SG20", |
" 1468 0450 Evo N600c", |
" 4005 144f LifeBook C Series", |
" 0451 LT WinModem", |
" 0452 LT WinModem", |
" 0453 LT WinModem", |
" 0454 LT WinModem", |
" 0455 LT WinModem", |
" 0456 LT WinModem", |
" 0457 LT WinModem", |
" 0458 LT WinModem", |
" 0459 LT WinModem", |
" 045a LT WinModem", |
" 045c LT WinModem", |
" 0461 V90 WildWire Modem", |
" 0462 V90 WildWire Modem", |
" 0480 Venus Modem (V90, 56KFlex)", |
" 048c V.92 56K WinModem", |
" 048f V.92 56k WinModem", |
" 5801 USB", |
" 5802 USS-312 USB Controller", |
" 5803 USS-344S USB Controller", |
" 5811 FW323", |
" 8086 524c D865PERL mainboard", |
" dead 0800 FireWire Host Bus Adapter", |
" 8110 T8110 H.100/H.110 TDM switch", |
" 12d9 000c E1/T1 PMXc cPCI carrier card", |
" ab10 WL60010 Wireless LAN MAC", |
" ab11 WL60040 Multimode Wireles LAN MAC", |
" 11c1 ab12 WaveLAN 11abg Cardbus card (Model 1102)", |
" 11c1 ab13 WaveLAN 11abg MiniPCI card (Model 0512)", |
" 11c1 ab15 WaveLAN 11abg Cardbus card (Model 1106)", |
" 11c1 ab16 WaveLAN 11abg MiniPCI card (Model 0516)", |
" ab20 ORiNOCO PCI Adapter", |
" ab21 Agere Wireless PCI Adapter", |
" ab30 Hermes2 Mini-PCI WaveLAN a/b/g", |
" 14cd 2012 Hermes2 Mini-PCI WaveLAN a/b/g", |
" ed00 ET-131x PCI-E Ethernet Controller", |
"11c2 Sand Microelectronics", |
"11c3 NEC Corporation", |
"11c4 Document Technologies, Inc", |
"11c5 Shiva Corporation", |
"11c6 Dainippon Screen Mfg. Co. Ltd", |
"11c7 D.C.M. Data Systems", |
"11c8 Dolphin Interconnect Solutions AS", |
" 0658 PSB32 SCI-Adapter D31x", |
" d665 PSB64 SCI-Adapter D32x", |
" d667 PSB66 SCI-Adapter D33x", |
"11c9 Magma", |
" 0010 16-line serial port w/- DMA", |
" 0011 4-line serial port w/- DMA", |
"11ca LSI Systems, Inc", |
"11cb Specialix Research Ltd.", |
" 2000 PCI_9050", |
" 11cb 0200 SX", |
" 11cb b008 I/O8+", |
" 4000 SUPI_1", |
" 8000 T225", |
"11cc Michels & Kleberhoff Computer GmbH", |
"11cd HAL Computer Systems, Inc.", |
"11ce Netaccess", |
"11cf Pioneer Electronic Corporation", |
"11d0 Lockheed Martin Federal Systems-Manassas", |
"11d1 Auravision", |
" 01f7 VxP524", |
"11d2 Intercom Inc.", |
"11d3 Trancell Systems Inc", |
"11d4 Analog Devices", |
" 1535 Blackfin BF535 processor", |
" 1805 SM56 PCI modem", |
" 1889 AD1889 sound chip", |
" 1986 AD1986A sound chip", |
" 5340 AD1881 sound chip", |
"11d5 Ikon Corporation", |
" 0115 10115", |
" 0117 10117", |
"11d6 Tekelec Telecom", |
"11d7 Trenton Technology, Inc.", |
"11d8 Image Technologies Development", |
"11d9 TEC Corporation", |
"11da Novell", |
"11db Sega Enterprises Ltd", |
"11dc Questra Corporation", |
"11dd Crosfield Electronics Limited", |
"11de Zoran Corporation", |
" 6057 ZR36057PQC Video cutting chipset", |
" 1031 7efe DC10 Plus", |
" 1031 fc00 MiroVIDEO DC50, Motion JPEG Capture/CODEC Board", |
" 12f8 8a02 Tekram Video Kit", |
" 13ca 4231 JPEG/TV Card", |
" 6120 ZR36120", |
" 1328 f001 Cinemaster C DVD Decoder", |
" 13c2 0000 MediaFocus Satellite TV Card", |
" 1de1 9fff Video Kit C210", |
"11df New Wave PDG", |
"11e0 Cray Communications A/S", |
"11e1 GEC Plessey Semi Inc.", |
"11e2 Samsung Information Systems America", |
"11e3 Quicklogic Corporation", |
" 0001 COM-ON-AIR Dosch&Amand DECT", |
" 5030 PC Watchdog", |
"11e4 Second Wave Inc", |
"11e5 IIX Consulting", |
"11e6 Mitsui-Zosen System Research", |
"11e7 Toshiba America, Elec. Company", |
"11e8 Digital Processing Systems Inc.", |
"11e9 Highwater Designs Ltd.", |
"11ea Elsag Bailey", |
"11eb Formation Inc.", |
"11ec Coreco Inc", |
"11ed Mediamatics", |
"11ee Dome Imaging Systems Inc", |
"11ef Nicolet Technologies B.V.", |
"11f0 Compu-Shack", |
" 4231 FDDI", |
" 4232 FASTline UTP Quattro", |
" 4233 FASTline FO", |
" 4234 FASTline UTP", |
" 4235 FASTline-II UTP", |
" 4236 FASTline-II FO", |
" 4731 GIGAline", |
"11f1 Symbios Logic Inc", |
"11f2 Picture Tel Japan K.K.", |
"11f3 Keithley Metrabyte", |
"11f4 Kinetic Systems Corporation", |
" 2915 CAMAC controller", |
"11f5 Computing Devices International", |
"11f6 Compex", |
" 0112 ENet100VG4", |
" 0113 FreedomLine 100", |
" 1401 ReadyLink 2000", |
" 2011 RL100-ATX 10/100", |
" 11f6 2011 RL100-ATX", |
" 2201 ReadyLink 100TX (Winbond W89C840)", |
" 11f6 2011 ReadyLink 100TX", |
" 9881 RL100TX Fast Ethernet", |
"11f7 Scientific Atlanta", |
"11f8 PMC-Sierra Inc.", |
" 7375 PM7375 [LASAR-155 ATM SAR]", |
"11f9 I-Cube Inc", |
"11fa Kasan Electronics Company, Ltd.", |
"11fb Datel Inc", |
"11fc Silicon Magic", |
"11fd High Street Consultants", |
"11fe Comtrol Corporation", |
" 0001 RocketPort 32 port w/external I/F", |
" 0002 RocketPort 8 port w/external I/F", |
" 0003 RocketPort 16 port w/external I/F", |
" 0004 RocketPort 4 port w/quad cable", |
" 0005 RocketPort 8 port w/octa cable", |
" 0006 RocketPort 8 port w/RJ11 connectors", |
" 0007 RocketPort 4 port w/RJ11 connectors", |
" 0008 RocketPort 8 port w/ DB78 SNI (Siemens) connector", |
" 0009 RocketPort 16 port w/ DB78 SNI (Siemens) connector", |
" 000a RocketPort Plus 4 port", |
" 000b RocketPort Plus 8 port", |
" 000c RocketModem 6 port", |
" 000d RocketModem 4-port", |
" 000e RocketPort Plus 2 port RS232", |
" 000f RocketPort Plus 2 port RS422", |
" 0801 RocketPort UPCI 32 port w/external I/F", |
" 0802 RocketPort UPCI 8 port w/external I/F", |
" 0803 RocketPort UPCI 16 port w/external I/F", |
" 0805 RocketPort UPCI 8 port w/octa cable", |
" 080c RocketModem III 8 port", |
" 080d RocketModem III 4 port", |
" 0812 RocketPort UPCI Plus 8 port RS422", |
" 0903 RocketPort Compact PCI 16 port w/external I/F", |
" 8015 RocketPort 4-port UART 16954", |
"11ff Scion Corporation", |
" 0003 AG-5", |
"1200 CSS Corporation", |
"1201 Vista Controls Corp", |
"1202 Network General Corp.", |
" 4300 Gigabit Ethernet Adapter", |
" 1202 9841 SK-9841 LX", |
" 1202 9842 SK-9841 LX dual link", |
" 1202 9843 SK-9843 SX", |
" 1202 9844 SK-9843 SX dual link", |
"1203 Bayer Corporation, Agfa Division", |
"1204 Lattice Semiconductor Corporation", |
"1205 Array Corporation", |
"1206 Amdahl Corporation", |
"1208 Parsytec GmbH", |
" 4853 HS-Link Device", |
"1209 SCI Systems Inc", |
"120a Synaptel", |
"120b Adaptive Solutions", |
"120c Technical Corp.", |
"120d Compression Labs, Inc.", |
"120e Cyclades Corporation", |
" 0100 Cyclom-Y below first megabyte", |
" 0101 Cyclom-Y above first megabyte", |
" 0102 Cyclom-4Y below first megabyte", |
" 0103 Cyclom-4Y above first megabyte", |
" 0104 Cyclom-8Y below first megabyte", |
" 0105 Cyclom-8Y above first megabyte", |
" 0200 Cyclades-Z below first megabyte", |
" 0201 Cyclades-Z above first megabyte", |
" 0300 PC300/RSV or /X21 (2 ports)", |
" 0301 PC300/RSV or /X21 (1 port)", |
" 0310 PC300/TE (2 ports)", |
" 0311 PC300/TE (1 port)", |
" 0320 PC300/TE-M (2 ports)", |
" 0321 PC300/TE-M (1 port)", |
" 0400 PC400", |
"120f Essential Communications", |
" 0001 Roadrunner serial HIPPI", |
"1210 Hyperparallel Technologies", |
"1211 Braintech Inc", |
"1212 Kingston Technology Corp.", |
"1213 Applied Intelligent Systems, Inc.", |
"1214 Performance Technologies, Inc.", |
"1215 Interware Co., Ltd", |
"1216 Purup Prepress A/S", |
"1217 O2 Micro, Inc.", |
" 6729 OZ6729", |
" 673a OZ6730", |
" 6832 OZ6832/6833 CardBus Controller", |
" 6836 OZ6836/6860 CardBus Controller", |
" 6872 OZ6812 CardBus Controller", |
" 6925 OZ6922 CardBus Controller", |
" 6933 OZ6933/711E1 CardBus/SmartCardBus Controller", |
" 1025 1016 Travelmate 612 TX", |
" 6972 OZ601/6912/711E0 CardBus/SmartCardBus Controller", |
" 1014 020c ThinkPad R30", |
" 1179 0001 Magnia Z310", |
" 7110 OZ711Mx 4-in-1 MemoryCardBus Accelerator", |
" 103c 088c NC8000 laptop", |
" 103c 0890 NC6000 laptop", |
" 1734 106c Amilo A1645", |
" 7112 OZ711EC1/M1 SmartCardBus/MemoryCardBus Controller", |
" 7113 OZ711EC1 SmartCardBus Controller", |
" 7114 OZ711M1/MC1 4-in-1 MemoryCardBus Controller", |
" 7134 OZ711MP1/MS1 MemoryCardBus Controller", |
" 71e2 OZ711E2 SmartCardBus Controller", |
" 7212 OZ711M2 4-in-1 MemoryCardBus Controller", |
" 7213 OZ6933E CardBus Controller", |
" 7223 OZ711M3/MC3 4-in-1 MemoryCardBus Controller", |
" 103c 088c NC8000 laptop", |
" 103c 0890 NC6000 laptop", |
" 7233 OZ711MP3/MS3 4-in-1 MemoryCardBus Controller", |
"1218 Hybricon Corp.", |
"1219 First Virtual Corporation", |
"121a 3Dfx Interactive, Inc.", |
" 0001 Voodoo", |
" 0002 Voodoo 2", |
" 0003 Voodoo Banshee", |
" 1092 0003 Monster Fusion", |
" 1092 4000 Monster Fusion", |
" 1092 4002 Monster Fusion", |
" 1092 4801 Monster Fusion AGP", |
" 1092 4803 Monster Fusion AGP", |
" 1092 8030 Monster Fusion", |
" 1092 8035 Monster Fusion AGP", |
" 10b0 0001 Dragon 4000", |
" 1102 1018 3D Blaster Banshee VE", |
" 121a 0001 Voodoo Banshee AGP", |
" 121a 0003 Voodoo Banshee AGP SGRAM", |
" 121a 0004 Voodoo Banshee", |
" 139c 0016 Raven", |
" 139c 0017 Raven", |
" 14af 0002 Maxi Gamer Phoenix", |
" 0004 Voodoo Banshee [Velocity 100]", |
" 0005 Voodoo 3", |
" 121a 0004 Voodoo3 AGP", |
" 121a 0030 Voodoo3 AGP", |
" 121a 0031 Voodoo3 AGP", |
" 121a 0034 Voodoo3 AGP", |
" 121a 0036 Voodoo3 2000 PCI", |
" 121a 0037 Voodoo3 AGP", |
" 121a 0038 Voodoo3 AGP", |
" 121a 003a Voodoo3 AGP", |
" 121a 0044 Voodoo3", |
" 121a 004b Velocity 100", |
" 121a 004c Velocity 200", |
" 121a 004d Voodoo3 AGP", |
" 121a 004e Voodoo3 AGP", |
" 121a 0051 Voodoo3 AGP", |
" 121a 0052 Voodoo3 AGP", |
" 121a 0057 Voodoo3 3000 PCI", |
" 121a 0060 Voodoo3 3500 TV (NTSC)", |
" 121a 0061 Voodoo3 3500 TV (PAL)", |
" 121a 0062 Voodoo3 3500 TV (SECAM)", |
" 0009 Voodoo 4 / Voodoo 5", |
" 121a 0003 Voodoo5 PCI 5500", |
" 121a 0009 Voodoo5 AGP 5500/6000", |
" 0057 Voodoo 3/3000 [Avenger]", |
"121b Advanced Telecommunications Modules", |
"121c Nippon Texaco., Ltd", |
"121d Lippert Automationstechnik GmbH", |
"121e CSPI", |
" 0201 Myrinet 2000 Scalable Cluster Interconnect", |
"121f Arcus Technology, Inc.", |
"1220 Ariel Corporation", |
" 1220 AMCC 5933 TMS320C80 DSP/Imaging board", |
"1221 Contec Co., Ltd", |
"1222 Ancor Communications, Inc.", |
"1223 Artesyn Communication Products", |
" 0003 PM/Link", |
" 0004 PM/T1", |
" 0005 PM/E1", |
" 0008 PM/SLS", |
" 0009 BajaSpan Resource Target", |
" 000a BajaSpan Section 0", |
" 000b BajaSpan Section 1", |
" 000c BajaSpan Section 2", |
" 000d BajaSpan Section 3", |
" 000e PM/PPC", |
"1224 Interactive Images", |
"1225 Power I/O, Inc.", |
"1227 Tech-Source", |
" 0006 Raptor GFX 8P", |
" 0023 Raptor GFX [1100T]", |
"1228 Norsk Elektro Optikk A/S", |
"1229 Data Kinesis Inc.", |
"122a Integrated Telecom", |
"122b LG Industrial Systems Co., Ltd", |
"122c Sican GmbH", |
"122d Aztech System Ltd", |
" 1206 368DSP", |
" 1400 Trident PCI288-Q3DII (NX)", |
" 50dc 3328 Audio", |
" 122d 0001 3328 Audio", |
" 80da 3328 Audio", |
" 122d 0001 3328 Audio", |
"122e Xyratex", |
"122f Andrew Corporation", |
"1230 Fishcamp Engineering", |
"1231 Woodward McCoach, Inc.", |
"1232 GPT Limited", |
"1233 Bus-Tech, Inc.", |
"1234 Technical Corp.", |
"1235 Risq Modular Systems, Inc.", |
"1236 Sigma Designs Corporation", |
" 0000 RealMagic64/GX", |
" 6401 REALmagic 64/GX (SD 6425)", |
"1237 Alta Technology Corporation", |
"1238 Adtran", |
"1239 3DO Company", |
"123a Visicom Laboratories, Inc.", |
"123b Seeq Technology, Inc.", |
"123c Century Systems, Inc.", |
"123d Engineering Design Team, Inc.", |
" 0000 EasyConnect 8/32", |
" 0002 EasyConnect 8/64", |
" 0003 EasyIO", |
"123e Simutech, Inc.", |
"123f C-Cube Microsystems", |
" 00e4 MPEG", |
" 8120 E4?", |
" 11bd 0006 DV500 E4", |
" 11bd 000a DV500 E4", |
" 11bd 000f DV500 E4", |
" 1809 0016 Emuzed MAUI-III PCI PVR FM TV", |
" 8888 Cinemaster C 3.0 DVD Decoder", |
" 1002 0001 Cinemaster C 3.0 DVD Decoder", |
" 1002 0002 Cinemaster C 3.0 DVD Decoder", |
" 1328 0001 Cinemaster C 3.0 DVD Decoder", |
"1240 Marathon Technologies Corp.", |
"1241 DSC Communications", |
"1242 JNI Corporation", |
" 1560 JNIC-1560 PCI-X Fibre Channel Controller", |
" 1242 6562 FCX2-6562 Dual Channel PCI-X Fibre Channel Adapter", |
" 1242 656a FCX-6562 PCI-X Fibre Channel Adapter", |
" 4643 FCI-1063 Fibre Channel Adapter", |
" 6562 FCX2-6562 Dual Channel PCI-X Fibre Channel Adapter", |
" 656a FCX-6562 PCI-X Fibre Channel Adapter", |
"1243 Delphax", |
"1244 AVM Audiovisuelles MKTG & Computer System GmbH", |
" 0700 B1 ISDN", |
" 0800 C4 ISDN", |
" 0a00 A1 ISDN [Fritz]", |
" 1244 0a00 FRITZ!Card ISDN Controller", |
" 0e00 Fritz!PCI v2.0 ISDN", |
" 1100 C2 ISDN", |
" 1200 T1 ISDN", |
" 2700 Fritz!Card DSL SL", |
" 2900 Fritz!Card DSL v2.0", |
"1245 A.P.D., S.A.", |
"1246 Dipix Technologies, Inc.", |
"1247 Xylon Research, Inc.", |
"1248 Central Data Corporation", |
"1249 Samsung Electronics Co., Ltd.", |
"124a AEG Electrocom GmbH", |
"124b SBS/Greenspring Modular I/O", |
" 0040 PCI-40A or cPCI-200 Quad IndustryPack carrier", |
" 124b 9080 PCI9080 Bridge", |
"124c Solitron Technologies, Inc.", |
"124d Stallion Technologies, Inc.", |
" 0000 EasyConnection 8/32", |
" 0002 EasyConnection 8/64", |
" 0003 EasyIO", |
" 0004 EasyConnection/RA", |
"124e Cylink", |
"124f Infortrend Technology, Inc.", |
" 0041 IFT-2000 Series RAID Controller", |
"1250 Hitachi Microcomputer System Ltd", |
"1251 VLSI Solutions Oy", |
"1253 Guzik Technical Enterprises", |
"1254 Linear Systems Ltd.", |
"1255 Optibase Ltd", |
" 1110 MPEG Forge", |
" 1210 MPEG Fusion", |
" 2110 VideoPlex", |
" 2120 VideoPlex CC", |
" 2130 VideoQuest", |
"1256 Perceptive Solutions, Inc.", |
" 4201 PCI-2220I", |
" 4401 PCI-2240I", |
" 5201 PCI-2000", |
"1257 Vertex Networks, Inc.", |
"1258 Gilbarco, Inc.", |
"1259 Allied Telesyn International", |
" 2560 AT-2560 Fast Ethernet Adapter (i82557B)", |
" a117 RTL81xx Fast Ethernet", |
" a120 21x4x DEC-Tulip compatible 10/100 Ethernet", |
"125a ABB Power Systems", |
"125b Asix Electronics Corporation", |
" 1400 ALFA GFC2204 Fast Ethernet", |
" 1186 1100 AX8814X Based PCI Fast Ethernet Adapter", |
"125c Aurora Technologies, Inc.", |
" 0101 Saturn 4520P", |
" 0640 Aries 16000P", |
"125d ESS Technology", |
" 0000 ES336H Fax Modem (Early Model)", |
" 1948 Solo?", |
" 1968 ES1968 Maestro 2", |
" 1028 0085 ES1968 Maestro-2 PCI", |
" 1033 8051 ES1968 Maestro-2 Audiodrive", |
" 1969 ES1969 Solo-1 Audiodrive", |
" 1014 0166 ES1969 SOLO-1 AudioDrive on IBM Aptiva Mainboard", |
" 125d 8888 Solo-1 Audio Adapter", |
" 153b 111b Terratec 128i PCI", |
" 1978 ES1978 Maestro 2E", |
" 0e11 b112 Armada M700/E500", |
" 1033 803c ES1978 Maestro-2E Audiodrive", |
" 1033 8058 ES1978 Maestro-2E Audiodrive", |
" 1092 4000 Monster Sound MX400", |
" 1179 0001 ES1978 Maestro-2E Audiodrive", |
" 1988 ES1988 Allegro-1", |
" 0e11 0098 Evo N600c", |
" 1092 4100 Sonic Impact S100", |
" 125d 1988 ESS Allegro-1 Audiodrive", |
" 1989 ESS Modem", |
" 125d 1989 ESS Modem", |
" 1998 ES1983S Maestro-3i PCI Audio Accelerator", |
" 1028 00b1 Latitude C600", |
" 1028 00e6 ES1983S Maestro-3i (Dell Inspiron 8100)", |
" 1999 ES1983S Maestro-3i PCI Modem Accelerator", |
" 199a ES1983S Maestro-3i PCI Audio Accelerator", |
" 199b ES1983S Maestro-3i PCI Modem Accelerator", |
" 2808 ES336H Fax Modem (Later Model)", |
" 2838 ES2838/2839 SuperLink Modem", |
" 2898 ES2898 Modem", |
" 125d 0424 ES56-PI Data Fax Modem", |
" 125d 0425 ES56T-PI Data Fax Modem", |
" 125d 0426 ES56V-PI Data Fax Modem", |
" 125d 0427 VW-PI Data Fax Modem", |
" 125d 0428 ES56ST-PI Data Fax Modem", |
" 125d 0429 ES56SV-PI Data Fax Modem", |
" 147a c001 ES56-PI Data Fax Modem", |
" 14fe 0428 ES56-PI Data Fax Modem", |
" 14fe 0429 ES56-PI Data Fax Modem", |
"125e Specialvideo Engineering SRL", |
"125f Concurrent Technologies, Inc.", |
"1260 Intersil Corporation", |
" 3872 Prism 2.5 Wavelan chipset", |
" 1468 0202 LAN-Express IEEE 802.11b Wireless LAN", |
" 3873 Prism 2.5 Wavelan chipset", |
" 1186 3501 DWL-520 Wireless PCI Adapter", |
" 1186 3700 DWL-520 Wireless PCI Adapter, Rev E1", |
" 1385 4105 MA311 802.11b wireless adapter", |
" 1668 0414 HWP01170-01 802.11b PCI Wireless Adapter", |
" 16a5 1601 AIR.mate PC-400 PCI Wireless LAN Adapter", |
" 1737 3874 WMP11 Wireless 802.11b PCI Adapter", |
" 8086 2513 Wireless 802.11b MiniPCI Adapter", |
" 3886 ISL3886 [Prism Javelin/Prism Xbow]", |
" 17cf 0037 XG-901 and clones Wireless Adapter", |
" 3890 ISL3890 [Prism GT/Prism Duette]/ISL3886 [Prism Javelin/Prism Xbow]", |
" 10b8 2802 SMC2802W Wireless PCI Adapter", |
" 10b8 2835 SMC2835W Wireless Cardbus Adapter", |
" 10b8 a835 SMC2835W V2 Wireless Cardbus Adapter", |
" 1113 4203 WN4201B", |
" 1113 ee03 SMC2802W V2 Wireless PCI Adapter [ISL3886]", |
" 1113 ee08 SMC2835W V3 EU Wireless Cardbus Adapter", |
" 1186 3202 DWL-G650 A1 Wireless Adapter", |
" 1259 c104 CG-WLCB54GT Wireless Adapter", |
" 1385 4800 WG511 Wireless Adapter", |
" 16a5 1605 ALLNET ALL0271 Wireless PCI Adapter", |
" 17cf 0014 XG-600 and clones Wireless Adapter", |
" 17cf 0020 XG-900 and clones Wireless Adapter", |
" 8130 HMP8130 NTSC/PAL Video Decoder", |
" 8131 HMP8131 NTSC/PAL Video Decoder", |
" ffff ISL3886IK", |
" 1260 0000 Senao 3054MP+ (J) mini-PCI WLAN 802.11g adapter", |
"1261 Matsushita-Kotobuki Electronics Industries, Ltd.", |
"1262 ES Computer Company, Ltd.", |
"1263 Sonic Solutions", |
"1264 Aval Nagasaki Corporation", |
"1265 Casio Computer Co., Ltd.", |
"1266 Microdyne Corporation", |
" 0001 NE10/100 Adapter (i82557B)", |
" 1910 NE2000Plus (RT8029) Ethernet Adapter", |
" 1266 1910 NE2000Plus Ethernet Adapter", |
"1267 S. A. Telecommunications", |
" 5352 PCR2101", |
" 5a4b Telsat Turbo", |
"1268 Tektronix", |
"1269 Thomson-CSF/TTM", |
"126a Lexmark International, Inc.", |
"126b Adax, Inc.", |
"126c Northern Telecom", |
" 1211 10/100BaseTX [RTL81xx]", |
" 126c 802.11b Wireless Ethernet Adapter", |
"126d Splash Technology, Inc.", |
"126e Sumitomo Metal Industries, Ltd.", |
"126f Silicon Motion, Inc.", |
" 0501 SM501 VoyagerGX Rev. AA", |
" 0510 SM501 VoyagerGX Rev. B", |
" 0710 SM710 LynxEM", |
" 0712 SM712 LynxEM+", |
" 0720 SM720 Lynx3DM", |
" 0730 SM731 Cougar3DR", |
" 0810 SM810 LynxE", |
" 0811 SM811 LynxE", |
" 0820 SM820 Lynx3D", |
" 0910 SM910", |
"1270 Olympus Optical Co., Ltd.", |
"1271 GW Instruments", |
"1272 Telematics International", |
"1273 Hughes Network Systems", |
" 0002 DirecPC", |
"1274 Ensoniq", |
" 1171 ES1373 [AudioPCI] (also Creative Labs CT5803)", |
" 1371 ES1371 [AudioPCI-97]", |
" 0e11 0024 AudioPCI on Motherboard Compaq Deskpro", |
" 0e11 b1a7 ES1371, ES1373 AudioPCI", |
" 1033 80ac ES1371, ES1373 AudioPCI", |
" 1042 1854 Tazer", |
" 107b 8054 Tabor2", |
" 1274 1371 Creative Sound Blaster AudioPCI64V, AudioPCI128", |
" 1274 8001 CT4751 board", |
" 1462 6470 ES1371, ES1373 AudioPCI On Motherboard MS-6147 1.1A", |
" 1462 6560 ES1371, ES1373 AudioPCI On Motherboard MS-6156 1.10", |
" 1462 6630 ES1371, ES1373 AudioPCI On Motherboard MS-6163BX 1.0A", |
" 1462 6631 ES1371, ES1373 AudioPCI On Motherboard MS-6163VIA 1.0A", |
" 1462 6632 ES1371, ES1373 AudioPCI On Motherboard MS-6163BX 2.0A", |
" 1462 6633 ES1371, ES1373 AudioPCI On Motherboard MS-6163VIA 2.0A", |
" 1462 6820 ES1371, ES1373 AudioPCI On Motherboard MS-6182 1.00", |
" 1462 6822 ES1371, ES1373 AudioPCI On Motherboard MS-6182 1.00A", |
" 1462 6830 ES1371, ES1373 AudioPCI On Motherboard MS-6183 1.00", |
" 1462 6880 ES1371, ES1373 AudioPCI On Motherboard MS-6188 1.00", |
" 1462 6900 ES1371, ES1373 AudioPCI On Motherboard MS-6190 1.00", |
" 1462 6910 ES1371, ES1373 AudioPCI On Motherboard MS-6191", |
" 1462 6930 ES1371, ES1373 AudioPCI On Motherboard MS-6193", |
" 1462 6990 ES1371, ES1373 AudioPCI On Motherboard MS-6199BX 2.0A", |
" 1462 6991 ES1371, ES1373 AudioPCI On Motherboard MS-6199VIA 2.0A", |
" 14a4 2077 ES1371, ES1373 AudioPCI On Motherboard KR639", |
" 14a4 2105 ES1371, ES1373 AudioPCI On Motherboard MR800", |
" 14a4 2107 ES1371, ES1373 AudioPCI On Motherboard MR801", |
" 14a4 2172 ES1371, ES1373 AudioPCI On Motherboard DR739", |
" 1509 9902 ES1371, ES1373 AudioPCI On Motherboard KW11", |
" 1509 9903 ES1371, ES1373 AudioPCI On Motherboard KW31", |
" 1509 9904 ES1371, ES1373 AudioPCI On Motherboard KA11", |
" 1509 9905 ES1371, ES1373 AudioPCI On Motherboard KC13", |
" 152d 8801 ES1371, ES1373 AudioPCI On Motherboard CP810E", |
" 152d 8802 ES1371, ES1373 AudioPCI On Motherboard CP810", |
" 152d 8803 ES1371, ES1373 AudioPCI On Motherboard P3810E", |
" 152d 8804 ES1371, ES1373 AudioPCI On Motherboard P3810-S", |
" 152d 8805 ES1371, ES1373 AudioPCI On Motherboard P3820-S", |
" 270f 2001 ES1371, ES1373 AudioPCI On Motherboard 6CTR", |
" 270f 2200 ES1371, ES1373 AudioPCI On Motherboard 6WTX", |
" 270f 3000 ES1371, ES1373 AudioPCI On Motherboard 6WSV", |
" 270f 3100 ES1371, ES1373 AudioPCI On Motherboard 6WIV2", |
" 270f 3102 ES1371, ES1373 AudioPCI On Motherboard 6WIV", |
" 270f 7060 ES1371, ES1373 AudioPCI On Motherboard 6ASA2", |
" 8086 4249 ES1371, ES1373 AudioPCI On Motherboard BI440ZX", |
" 8086 424c ES1371, ES1373 AudioPCI On Motherboard BL440ZX", |
" 8086 425a ES1371, ES1373 AudioPCI On Motherboard BZ440ZX", |
" 8086 4341 ES1371, ES1373 AudioPCI On Motherboard Cayman", |
" 8086 4343 ES1371, ES1373 AudioPCI On Motherboard Cape Cod", |
" 8086 4541 D815EEA Motherboard", |
" 8086 4649 ES1371, ES1373 AudioPCI On Motherboard Fire Island", |
" 8086 464a ES1371, ES1373 AudioPCI On Motherboard FJ440ZX", |
" 8086 4d4f ES1371, ES1373 AudioPCI On Motherboard Montreal", |
" 8086 4f43 ES1371, ES1373 AudioPCI On Motherboard OC440LX", |
" 8086 5243 ES1371, ES1373 AudioPCI On Motherboard RC440BX", |
" 8086 5352 ES1371, ES1373 AudioPCI On Motherboard SunRiver", |
" 8086 5643 ES1371, ES1373 AudioPCI On Motherboard Vancouver", |
" 8086 5753 ES1371, ES1373 AudioPCI On Motherboard WS440BX", |
" 5000 ES1370 [AudioPCI]", |
" 5880 5880 AudioPCI", |
" 1274 2000 Creative Sound Blaster AudioPCI128", |
" 1274 2003 Creative SoundBlaster AudioPCI 128", |
" 1274 5880 Creative Sound Blaster AudioPCI128", |
" 1274 8001 Sound Blaster 16PCI 4.1ch", |
" 1458 a000 5880 AudioPCI On Motherboard 6OXET", |
" 1462 6880 5880 AudioPCI On Motherboard MS-6188 1.00", |
" 270f 2001 5880 AudioPCI On Motherboard 6CTR", |
" 270f 2200 5880 AudioPCI On Motherboard 6WTX", |
" 270f 7040 5880 AudioPCI On Motherboard 6ATA4", |
"1275 Network Appliance Corporation", |
"1276 Switched Network Technologies, Inc.", |
"1277 Comstream", |
"1278 Transtech Parallel Systems Ltd.", |
" 0701 TPE3/TM3 PowerPC Node", |
" 0710 TPE5 PowerPC PCI board", |
"1279 Transmeta Corporation", |
" 0060 TM8000 Northbridge", |
" 0061 TM8000 AGP bridge", |
" 0295 Northbridge", |
" 0395 LongRun Northbridge", |
" 0396 SDRAM controller", |
" 0397 BIOS scratchpad", |
"127a Rockwell International", |
" 1002 HCF 56k Data/Fax Modem", |
" 1092 094c SupraExpress 56i PRO [Diamond SUP2380]", |
" 122d 4002 HPG / MDP3858-U", |
" 122d 4005 MDP3858-E", |
" 122d 4007 MDP3858-A/-NZ", |
" 122d 4012 MDP3858-SA", |
" 122d 4017 MDP3858-W", |
" 122d 4018 MDP3858-W", |
" 127a 1002 Rockwell 56K D/F HCF Modem", |
" 1003 HCF 56k Data/Fax Modem", |
" 0e11 b0bc 229-DF Zephyr", |
" 0e11 b114 229-DF Cheetah", |
" 1033 802b 229-DF", |
" 13df 1003 PCI56RX Modem", |
" 13e0 0117 IBM", |
" 13e0 0147 IBM F-1156IV+/R3 Spain V.90 Modem", |
" 13e0 0197 IBM", |
" 13e0 01c7 IBM F-1156IV+/R3 WW V.90 Modem", |
" 13e0 01f7 IBM", |
" 1436 1003 IBM", |
" 1436 1103 IBM 5614PM3G V.90 Modem", |
" 1436 1602 Compaq 229-DF Ducati", |
" 1004 HCF 56k Data/Fax/Voice Modem", |
" 1048 1500 MicroLink 56k Modem", |
" 10cf 1059 Fujitsu 229-DFRT", |
" 1005 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem", |
" 1005 127a AOpen FM56-P", |
" 1033 8029 229-DFSV", |
" 1033 8054 Modem", |
" 10cf 103c Fujitsu", |
" 10cf 1055 Fujitsu 229-DFSV", |
" 10cf 1056 Fujitsu 229-DFSV", |
" 122d 4003 MDP3858SP-U", |
" 122d 4006 Packard Bell MDP3858V-E", |
" 122d 4008 MDP3858SP-A/SP-NZ", |
" 122d 4009 MDP3858SP-E", |
" 122d 4010 MDP3858V-U", |
" 122d 4011 MDP3858SP-SA", |
" 122d 4013 MDP3858V-A/V-NZ", |
" 122d 4015 MDP3858SP-W", |
" 122d 4016 MDP3858V-W", |
" 122d 4019 MDP3858V-SA", |
" 13df 1005 PCI56RVP Modem", |
" 13e0 0187 IBM", |
" 13e0 01a7 IBM", |
" 13e0 01b7 IBM DF-1156IV+/R3 Spain V.90 Modem", |
" 13e0 01d7 IBM DF-1156IV+/R3 WW V.90 Modem", |
" 1436 1005 IBM", |
" 1436 1105 IBM", |
" 1437 1105 IBM 5614PS3G V.90 Modem", |
" 1022 HCF 56k Modem", |
" 1436 1303 M3-5614PM3G V.90 Modem", |
" 1023 HCF 56k Data/Fax Modem", |
" 122d 4020 Packard Bell MDP3858-WE", |
" 122d 4023 MDP3858-UE", |
" 13e0 0247 IBM F-1156IV+/R6 Spain V.90 Modem", |
" 13e0 0297 IBM", |
" 13e0 02c7 IBM F-1156IV+/R6 WW V.90 Modem", |
" 1436 1203 IBM", |
" 1436 1303 IBM", |
" 1024 HCF 56k Data/Fax/Voice Modem", |
" 1025 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem", |
" 10cf 106a Fujitsu 235-DFSV", |
" 122d 4021 Packard Bell MDP3858V-WE", |
" 122d 4022 MDP3858SP-WE", |
" 122d 4024 MDP3858V-UE", |
" 122d 4025 MDP3858SP-UE", |
" 1026 HCF 56k PCI Speakerphone Modem", |
" 1032 HCF 56k Modem", |
" 1033 HCF 56k Modem", |
" 1034 HCF 56k Modem", |
" 1035 HCF 56k PCI Speakerphone Modem", |
" 1036 HCF 56k Modem", |
" 1085 HCF 56k Volcano PCI Modem", |
" 2005 HCF 56k Data/Fax Modem", |
" 104d 8044 229-DFSV", |
" 104d 8045 229-DFSV", |
" 104d 8055 PBE/Aztech 235W-DFSV", |
" 104d 8056 235-DFSV", |
" 104d 805a Modem", |
" 104d 805f Modem", |
" 104d 8074 Modem", |
" 2013 HSF 56k Data/Fax Modem", |
" 1179 0001 Modem", |
" 1179 ff00 Modem", |
" 2014 HSF 56k Data/Fax/Voice Modem", |
" 10cf 1057 Fujitsu Citicorp III", |
" 122d 4050 MSP3880-U", |
" 122d 4055 MSP3880-W", |
" 2015 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem", |
" 10cf 1063 Fujitsu", |
" 10cf 1064 Fujitsu", |
" 1468 2015 Fujitsu", |
" 2016 HSF 56k Data/Fax/Voice/Spkp Modem", |
" 122d 4051 MSP3880V-W", |
" 122d 4052 MSP3880SP-W", |
" 122d 4054 MSP3880V-U", |
" 122d 4056 MSP3880SP-U", |
" 122d 4057 MSP3880SP-A", |
" 4311 Riptide HSF 56k PCI Modem", |
" 127a 4311 Ring Modular? Riptide HSF RT HP Dom", |
" 13e0 0210 HP-GVC", |
" 4320 Riptide PCI Audio Controller", |
" 1235 4320 Riptide PCI Audio Controller", |
" 4321 Riptide HCF 56k PCI Modem", |
" 1235 4321 Hewlett Packard DF", |
" 1235 4324 Hewlett Packard DF", |
" 13e0 0210 Hewlett Packard DF", |
" 144d 2321 Riptide", |
" 4322 Riptide PCI Game Controller", |
" 1235 4322 Riptide PCI Game Controller", |
" 8234 RapidFire 616X ATM155 Adapter", |
" 108d 0022 RapidFire 616X ATM155 Adapter", |
" 108d 0027 RapidFire 616X ATM155 Adapter", |
"127b Pixera Corporation", |
"127c Crosspoint Solutions, Inc.", |
"127d Vela Research", |
"127e Winnov, L.P.", |
"127f Fujifilm", |
"1280 Photoscript Group Ltd.", |
"1281 Yokogawa Electric Corporation", |
"1282 Davicom Semiconductor, Inc.", |
" 9009 Ethernet 100/10 MBit", |
" 9100 21x4x DEC-Tulip compatible 10/100 Ethernet", |
" 9102 21x4x DEC-Tulip compatible 10/100 Ethernet", |
" 9132 Ethernet 100/10 MBit", |
"1283 Integrated Technology Express, Inc.", |
" 673a IT8330G", |
" 8211 ITE 8211F Single Channel UDMA 133 (ASUS 8211 (ITE IT8212 ATA RAID Controller))", |
" 1043 8138 P5GD1-VW Mainboard", |
" 8212 IT/ITE8212 Dual channel ATA RAID controller (PCI version seems to be IT8212, embedded seems to be ITE8212)", |
" 1283 0001 IT/ITE8212 Dual channel ATA RAID controller", |
" 8330 IT8330G", |
" 8872 IT8874F PCI Dual Serial Port Controller", |
" 8888 IT8888F PCI to ISA Bridge with SMB", |
" 8889 IT8889F PCI to ISA Bridge", |
" e886 IT8330G", |
"1284 Sahara Networks, Inc.", |
"1285 Platform Technologies, Inc.", |
" 0100 AGOGO sound chip (aka ESS Maestro 1)", |
"1286 Mazet GmbH", |
"1287 M-Pact, Inc.", |
" 001e LS220D DVD Decoder", |
" 001f LS220C DVD Decoder", |
"1288 Timestep Corporation", |
"1289 AVC Technology, Inc.", |
"128a Asante Technologies, Inc.", |
"128b Transwitch Corporation", |
"128c Retix Corporation", |
"128d G2 Networks, Inc.", |
" 0021 ATM155 Adapter", |
"128e Hoontech Corporation/Samho Multi Tech Ltd.", |
" 0008 ST128 WSS/SB", |
" 0009 ST128 SAM9407", |
" 000a ST128 Game Port", |
" 000b ST128 MPU Port", |
" 000c ST128 Ctrl Port", |
"128f Tateno Dennou, Inc.", |
"1290 Sord Computer Corporation", |
"1291 NCS Computer Italia", |
"1292 Tritech Microelectronics Inc", |
"1293 Media Reality Technology", |
"1294 Rhetorex, Inc.", |
"1295 Imagenation Corporation", |
"1296 Kofax Image Products", |
"1297 Holco Enterprise Co, Ltd/Shuttle Computer", |
"1298 Spellcaster Telecommunications Inc.", |
"1299 Knowledge Technology Lab.", |
"129a VMetro, inc.", |
" 0615 PBT-615 PCI-X Bus Analyzer", |
"129b Image Access", |
"129c Jaycor", |
"129d Compcore Multimedia, Inc.", |
"129e Victor Company of Japan, Ltd.", |
"129f OEC Medical Systems, Inc.", |
"12a0 Allen-Bradley Company", |
"12a1 Simpact Associates, Inc.", |
"12a2 Newgen Systems Corporation", |
"12a3 Lucent Technologies", |
" 8105 T8105 H100 Digital Switch", |
"12a4 NTT Electronics Technology Company", |
"12a5 Vision Dynamics Ltd.", |
"12a6 Scalable Networks, Inc.", |
"12a7 AMO GmbH", |
"12a8 News Datacom", |
"12a9 Xiotech Corporation", |
"12aa SDL Communications, Inc.", |
"12ab Yuan Yuan Enterprise Co., Ltd.", |
" 0002 AU8830 [Vortex2] Based Sound Card With A3D Support", |
" 3000 MPG-200C PCI DVD Decoder Card", |
"12ac Measurex Corporation", |
"12ad Multidata GmbH", |
"12ae Alteon Networks Inc.", |
" 0001 AceNIC Gigabit Ethernet", |
" 1014 0104 Gigabit Ethernet-SX PCI Adapter", |
" 12ae 0001 Gigabit Ethernet-SX (Universal)", |
" 1410 0104 Gigabit Ethernet-SX PCI Adapter", |
" 0002 AceNIC Gigabit Ethernet (Copper)", |
" 10a9 8002 Acenic Gigabit Ethernet", |
" 12ae 0002 Gigabit Ethernet-T (3C986-T)", |
" 00fa Farallon PN9100-T Gigabit Ethernet", |
"12af TDK USA Corp", |
"12b0 Jorge Scientific Corp", |
"12b1 GammaLink", |
"12b2 General Signal Networks", |
"12b3 Inter-Face Co Ltd", |
"12b4 FutureTel Inc", |
"12b5 Granite Systems Inc.", |
"12b6 Natural Microsystems", |
"12b7 Cognex Modular Vision Systems Div. - Acumen Inc.", |
"12b8 Korg", |
"12b9 3Com Corp, Modem Division", |
" 1006 WinModem", |
" 12b9 005c USR 56k Internal Voice WinModem (Model 3472)", |
" 12b9 005e USR 56k Internal WinModem (Models 662975)", |
" 12b9 0062 USR 56k Internal Voice WinModem (Model 662978)", |
" 12b9 0068 USR 56k Internal Voice WinModem (Model 5690)", |
" 12b9 007a USR 56k Internal Voice WinModem (Model 662974)", |
" 12b9 007f USR 56k Internal WinModem (Models 5698, 5699)", |
" 12b9 0080 USR 56k Internal WinModem (Models 2975, 3528)", |
" 12b9 0081 USR 56k Internal Voice WinModem (Models 2974, 3529)", |
" 12b9 0091 USR 56k Internal Voice WinModem (Model 2978)", |
" 1007 USR 56k Internal WinModem", |
" 12b9 00a3 USR 56k Internal WinModem (Model 3595)", |
" 1008 56K FaxModem Model 5610", |
" 12b9 00a2 USR 56k Internal FAX Modem (Model 2977)", |
" 12b9 00aa USR 56k Internal Voice Modem (Model 2976)", |
" 12b9 00ab USR 56k Internal Voice Modem (Model 5609)", |
" 12b9 00ac USR 56k Internal Voice Modem (Model 3298)", |
" 12b9 00ad USR 56k Internal FAX Modem (Model 5610)", |
"12ba BittWare, Inc.", |
"12bb Nippon Unisoft Corporation", |
"12bc Array Microsystems", |
"12bd Computerm Corp.", |
"12be Anchor Chips Inc.", |
" 3041 AN3041Q CO-MEM", |
" 3042 AN3042Q CO-MEM Lite", |
" 12be 3042 Anchor Chips Lite Evaluation Board", |
"12bf Fujifilm Microdevices", |
"12c0 Infimed", |
"12c1 GMM Research Corp", |
"12c2 Mentec Limited", |
"12c3 Holtek Microelectronics Inc", |
" 0058 PCI NE2K Ethernet", |
" 5598 PCI NE2K Ethernet", |
"12c4 Connect Tech Inc", |
" 0001 Blue HEAT/PCI 8 (RS232/CL/RJ11)", |
" 0002 Blue HEAT/PCI 4 (RS232)", |
" 0003 Blue HEAT/PCI 2 (RS232)", |
" 0004 Blue HEAT/PCI 8 (UNIV, RS485)", |
" 0005 Blue HEAT/PCI 4+4/6+2 (UNIV, RS232/485)", |
" 0006 Blue HEAT/PCI 4 (OPTO, RS485)", |
" 0007 Blue HEAT/PCI 2+2 (RS232/485)", |
" 0008 Blue HEAT/PCI 2 (OPTO, Tx, RS485)", |
" 0009 Blue HEAT/PCI 2+6 (RS232/485)", |
" 000a Blue HEAT/PCI 8 (Tx, RS485)", |
" 000b Blue HEAT/PCI 4 (Tx, RS485)", |
" 000c Blue HEAT/PCI 2 (20 MHz, RS485)", |
" 000d Blue HEAT/PCI 2 PTM", |
" 0100 NT960/PCI", |
" 0201 cPCI Titan - 2 Port", |
" 0202 cPCI Titan - 4 Port", |
" 0300 CTI PCI UART 2 (RS232)", |
" 0301 CTI PCI UART 4 (RS232)", |
" 0302 CTI PCI UART 8 (RS232)", |
" 0310 CTI PCI UART 1+1 (RS232/485)", |
" 0311 CTI PCI UART 2+2 (RS232/485)", |
" 0312 CTI PCI UART 4+4 (RS232/485)", |
" 0320 CTI PCI UART 2", |
" 0321 CTI PCI UART 4", |
" 0322 CTI PCI UART 8", |
" 0330 CTI PCI UART 2 (RS485)", |
" 0331 CTI PCI UART 4 (RS485)", |
" 0332 CTI PCI UART 8 (RS485)", |
"12c5 Picture Elements Incorporated", |
" 007e Imaging/Scanning Subsystem Engine", |
" 007f Imaging/Scanning Subsystem Engine", |
" 0081 PCIVST [Grayscale Thresholding Engine]", |
" 0085 Video Simulator/Sender", |
" 0086 THR2 Multi-scale Thresholder", |
"12c6 Mitani Corporation", |
"12c7 Dialogic Corp", |
"12c8 G Force Co, Ltd", |
"12c9 Gigi Operations", |
"12ca Integrated Computing Engines", |
"12cb Antex Electronics Corporation", |
"12cc Pluto Technologies International", |
"12cd Aims Lab", |
"12ce Netspeed Inc.", |
"12cf Prophet Systems, Inc.", |
"12d0 GDE Systems, Inc.", |
"12d1 PSITech", |
"12d2 NVidia / SGS Thomson (Joint Venture)", |
" 0008 NV1", |
" 0009 DAC64", |
" 0018 Riva128", |
" 1048 0c10 VICTORY Erazor", |
" 107b 8030 STB Velocity 128", |
" 1092 0350 Viper V330", |
" 1092 1092 Viper V330", |
" 10b4 1b1b STB Velocity 128", |
" 10b4 1b1d STB Velocity 128", |
" 10b4 1b1e STB Velocity 128, PAL TV-Out", |
" 10b4 1b20 STB Velocity 128 Sapphire", |
" 10b4 1b21 STB Velocity 128", |
" 10b4 1b22 STB Velocity 128 AGP, NTSC TV-Out", |
" 10b4 1b23 STB Velocity 128 AGP, PAL TV-Out", |
" 10b4 1b27 STB Velocity 128 DVD", |
" 10b4 1b88 MVP Pro 128", |
" 10b4 222a STB Velocity 128 AGP", |
" 10b4 2230 STB Velocity 128", |
" 10b4 2232 STB Velocity 128", |
" 10b4 2235 STB Velocity 128 AGP", |
" 2a15 54a3 3DVision-SAGP / 3DexPlorer 3000", |
" 0019 Riva128ZX", |
" 0020 TNT", |
" 0028 TNT2", |
" 0029 UTNT2", |
" 002c VTNT2", |
" 00a0 ITNT2", |
"12d3 Vingmed Sound A/S", |
"12d4 Ulticom (Formerly DGM&S)", |
" 0200 T1 Card", |
"12d5 Equator Technologies Inc", |
" 0003 BSP16", |
" 1000 BSP15", |
"12d6 Analogic Corp", |
"12d7 Biotronic SRL", |
"12d8 Pericom Semiconductor", |
" 8150 PCI to PCI Bridge", |
"12d9 Aculab PLC", |
" 0002 PCI Prosody", |
" 0004 cPCI Prosody", |
" 0005 Aculab E1/T1 PCI card", |
" 1078 Prosody X class e1000 device", |
" 12d9 000d Prosody X PCI", |
"12da True Time Inc.", |
"12db Annapolis Micro Systems, Inc", |
"12dc Symicron Computer Communication Ltd.", |
"12dd Management Graphics", |
"12de Rainbow Technologies", |
" 0200 CryptoSwift CS200", |
"12df SBS Technologies Inc", |
"12e0 Chase Research", |
" 0010 ST16C654 Quad UART", |
" 0020 ST16C654 Quad UART", |
" 0030 ST16C654 Quad UART", |
"12e1 Nintendo Co, Ltd", |
"12e2 Datum Inc. Bancomm-Timing Division", |
"12e3 Imation Corp - Medical Imaging Systems", |
"12e4 Brooktrout Technology Inc", |
"12e5 Apex Semiconductor Inc", |
"12e6 Cirel Systems", |
"12e7 Sunsgroup Corporation", |
"12e8 Crisc Corp", |
"12e9 GE Spacenet", |
"12ea Zuken", |
"12eb Aureal Semiconductor", |
" 0001 Vortex 1", |
" 104d 8036 AU8820 Vortex Digital Audio Processor", |
" 1092 2000 Sonic Impact A3D", |
" 1092 2100 Sonic Impact A3D", |
" 1092 2110 Sonic Impact A3D", |
" 1092 2200 Sonic Impact A3D", |
" 122d 1002 AU8820 Vortex Digital Audio Processor", |
" 12eb 0001 AU8820 Vortex Digital Audio Processor", |
" 5053 3355 Montego", |
" 0002 Vortex 2", |
" 104d 8049 AU8830 Vortex 3D Digital Audio Processor", |
" 104d 807b AU8830 Vortex 3D Digital Audio Processor", |
" 1092 3000 Monster Sound II", |
" 1092 3001 Monster Sound II", |
" 1092 3002 Monster Sound II", |
" 1092 3003 Monster Sound II", |
" 1092 3004 Monster Sound II", |
" 12eb 0002 AU8830 Vortex 3D Digital Audio Processor", |
" 12eb 0088 AU8830 Vortex 3D Digital Audio Processor", |
" 144d 3510 AU8830 Vortex 3D Digital Audio Processor", |
" 5053 3356 Montego II", |
" 0003 AU8810 Vortex Digital Audio Processor", |
" 104d 8049 AU8810 Vortex Digital Audio Processor", |
" 104d 8077 AU8810 Vortex Digital Audio Processor", |
" 109f 1000 AU8810 Vortex Digital Audio Processor", |
" 12eb 0003 AU8810 Vortex Digital Audio Processor", |
" 1462 6780 AU8810 Vortex Digital Audio Processor", |
" 14a4 2073 AU8810 Vortex Digital Audio Processor", |
" 14a4 2091 AU8810 Vortex Digital Audio Processor", |
" 14a4 2104 AU8810 Vortex Digital Audio Processor", |
" 14a4 2106 AU8810 Vortex Digital Audio Processor", |
" 8803 Vortex 56k Software Modem", |
" 12eb 8803 Vortex 56k Software Modem", |
"12ec 3A International, Inc.", |
"12ed Optivision Inc.", |
"12ee Orange Micro", |
"12ef Vienna Systems", |
"12f0 Pentek", |
"12f1 Sorenson Vision Inc", |
"12f2 Gammagraphx, Inc.", |
"12f3 Radstone Technology", |
"12f4 Megatel", |
"12f5 Forks", |
"12f6 Dawson France", |
"12f7 Cognex", |
"12f8 Electronic Design GmbH", |
" 0002 VideoMaker", |
"12f9 Four Fold Ltd", |
"12fb Spectrum Signal Processing", |
" 0001 PMC-MAI", |
" 00f5 F5 Dakar", |
" 02ad PMC-2MAI", |
" 2adc ePMC-2ADC", |
" 3100 PRO-3100", |
" 3500 PRO-3500", |
" 4d4f Modena", |
" 8120 ePMC-8120", |
" da62 Daytona C6201 PCI (Hurricane)", |
" db62 Ingliston XBIF", |
" dc62 Ingliston PLX9054", |
" dd62 Ingliston JTAG/ISP", |
" eddc ePMC-MSDDC", |
" fa01 ePMC-FPGA", |
"12fc Capital Equipment Corp", |
"12fd I2S", |
"12fe ESD Electronic System Design GmbH", |
"12ff Lexicon", |
"1300 Harman International Industries Inc", |
"1302 Computer Sciences Corp", |
"1303 Innovative Integration", |
"1304 Juniper Networks", |
"1305 Netphone, Inc", |
"1306 Duet Technologies", |
"1307 Measurement Computing", |
" 0001 PCI-DAS1602/16", |
" 000b PCI-DIO48H", |
" 000c PCI-PDISO8", |
" 000d PCI-PDISO16", |
" 000f PCI-DAS1200", |
" 0010 PCI-DAS1602/12", |
" 0014 PCI-DIO24H", |
" 0015 PCI-DIO24H/CTR3", |
" 0016 PCI-DIO48H/CTR15", |
" 0017 PCI-DIO96H", |
" 0018 PCI-CTR05", |
" 0019 PCI-DAS1200/JR", |
" 001a PCI-DAS1001", |
" 001b PCI-DAS1002", |
" 001c PCI-DAS1602JR/16", |
" 001d PCI-DAS6402/16", |
" 001e PCI-DAS6402/12", |
" 001f PCI-DAS16/M1", |
" 0020 PCI-DDA02/12", |
" 0021 PCI-DDA04/12", |
" 0022 PCI-DDA08/12", |
" 0023 PCI-DDA02/16", |
" 0024 PCI-DDA04/16", |
" 0025 PCI-DDA08/16", |
" 0026 PCI-DAC04/12-HS", |
" 0027 PCI-DAC04/16-HS", |
" 0028 PCI-DIO24", |
" 0029 PCI-DAS08", |
" 002c PCI-INT32", |
" 0033 PCI-DUAL-AC5", |
" 0034 PCI-DAS-TC", |
" 0035 PCI-DAS64/M1/16", |
" 0036 PCI-DAS64/M2/16", |
" 0037 PCI-DAS64/M3/16", |
" 004c PCI-DAS1000", |
" 004d PCI-QUAD04", |
" 0052 PCI-DAS4020/12", |
" 0054 PCI-DIO96", |
" 005e PCI-DAS6025", |
"1308 Jato Technologies Inc.", |
" 0001 NetCelerator Adapter", |
" 1308 0001 NetCelerator Adapter", |
"1309 AB Semiconductor Ltd", |
"130a Mitsubishi Electric Microcomputer", |
"130b Colorgraphic Communications Corp", |
"130c Ambex Technologies, Inc", |
"130d Accelerix Inc", |
"130e Yamatake-Honeywell Co. Ltd", |
"130f Advanet Inc", |
"1310 Gespac", |
"1311 Videoserver, Inc", |
"1312 Acuity Imaging, Inc", |
"1313 Yaskawa Electric Co.", |
"1316 Teradyne Inc", |
"1317 Linksys", |
" 0981 21x4x DEC-Tulip compatible 10/100 Ethernet", |
" 0985 NC100 Network Everywhere Fast Ethernet 10/100", |
" 1734 100c Scenic N300 ADMtek AN983 10/100 Mbps PCI Adapter", |
" 1985 21x4x DEC-Tulip compatible 10/100 Ethernet", |
" 2850 HSP MicroModem 56", |
" 5120 ADMtek ADM5120 OpenGate System-on-Chip", |
" 8201 ADMtek ADM8211 802.11b Wireless Interface", |
" 10b8 2635 SMC2635W 802.11b (11Mbps) wireless lan pcmcia (cardbus) card", |
" 1317 8201 SMC2635W 802.11b (11mbps) wireless lan pcmcia (cardbus) card", |
" 8211 ADMtek ADM8211 802.11b Wireless Interface", |
" 9511 21x4x DEC-Tulip compatible 10/100 Ethernet", |
"1318 Packet Engines Inc.", |
" 0911 GNIC-II PCI Gigabit Ethernet [Hamachi]", |
"1319 Fortemedia, Inc", |
" 0801 Xwave QS3000A [FM801]", |
" 1319 1319 FM801 PCI Audio", |
" 0802 Xwave QS3000A [FM801 game port]", |
" 1319 1319 FM801 PCI Joystick", |
" 1000 FM801 PCI Audio", |
" 1001 FM801 PCI Joystick", |
"131a Finisar Corp.", |
"131c Nippon Electro-Sensory Devices Corp", |
"131d Sysmic, Inc.", |
"131e Xinex Networks Inc", |
"131f Siig Inc", |
" 1000 CyberSerial (1-port) 16550", |
" 1001 CyberSerial (1-port) 16650", |
" 1002 CyberSerial (1-port) 16850", |
" 1010 Duet 1S(16550)+1P", |
" 1011 Duet 1S(16650)+1P", |
" 1012 Duet 1S(16850)+1P", |
" 1020 CyberParallel (1-port)", |
" 1021 CyberParallel (2-port)", |
" 1030 CyberSerial (2-port) 16550", |
" 1031 CyberSerial (2-port) 16650", |
" 1032 CyberSerial (2-port) 16850", |
" 1034 Trio 2S(16550)+1P", |
" 1035 Trio 2S(16650)+1P", |
" 1036 Trio 2S(16850)+1P", |
" 1050 CyberSerial (4-port) 16550", |
" 1051 CyberSerial (4-port) 16650", |
" 1052 CyberSerial (4-port) 16850", |
" 2000 CyberSerial (1-port) 16550", |
" 2001 CyberSerial (1-port) 16650", |
" 2002 CyberSerial (1-port) 16850", |
" 2010 Duet 1S(16550)+1P", |
" 2011 Duet 1S(16650)+1P", |
" 2012 Duet 1S(16850)+1P", |
" 2020 CyberParallel (1-port)", |
" 2021 CyberParallel (2-port)", |
" 2030 CyberSerial (2-port) 16550", |
" 131f 2030 PCI Serial Card", |
" 2031 CyberSerial (2-port) 16650", |
" 2032 CyberSerial (2-port) 16850", |
" 2040 Trio 1S(16550)+2P", |
" 2041 Trio 1S(16650)+2P", |
" 2042 Trio 1S(16850)+2P", |
" 2050 CyberSerial (4-port) 16550", |
" 2051 CyberSerial (4-port) 16650", |
" 2052 CyberSerial (4-port) 16850", |
" 2060 Trio 2S(16550)+1P", |
" 2061 Trio 2S(16650)+1P", |
" 2062 Trio 2S(16850)+1P", |
" 2081 CyberSerial (8-port) ST16654", |
"1320 Crypto AG", |
"1321 Arcobel Graphics BV", |
"1322 MTT Co., Ltd", |
"1323 Dome Inc", |
"1324 Sphere Communications", |
"1325 Salix Technologies, Inc", |
"1326 Seachange international", |
"1327 Voss scientific", |
"1328 quadrant international", |
"1329 Productivity Enhancement", |
"132a Microcom Inc.", |
"132b Broadband Technologies", |
"132c Micrel Inc", |
"132d Integrated Silicon Solution, Inc.", |
"1330 MMC Networks", |
"1331 Radisys Corp.", |
" 0030 ENP-2611", |
" 8200 82600 Host Bridge", |
" 8201 82600 IDE", |
" 8202 82600 USB", |
" 8210 82600 PCI Bridge", |
"1332 Micro Memory", |
" 5415 MM-5415CN PCI Memory Module with Battery Backup", |
" 5425 MM-5425CN PCI 64/66 Memory Module with Battery Backup", |
" 6140 MM-6140D", |
"1334 Redcreek Communications, Inc", |
"1335 Videomail, Inc", |
"1337 Third Planet Publishing", |
"1338 BT Electronics", |
"133a Vtel Corp", |
"133b Softcom Microsystems", |
"133c Holontech Corp", |
"133d SS Technologies", |
"133e Virtual Computer Corp", |
"133f SCM Microsystems", |
"1340 Atalla Corp", |
"1341 Kyoto Microcomputer Co", |
"1342 Promax Systems Inc", |
"1343 Phylon Communications Inc", |
"1344 Crucial Technology", |
"1345 Arescom Inc", |
"1347 Odetics", |
"1349 Sumitomo Electric Industries, Ltd.", |
"134a DTC Technology Corp.", |
" 0001 Domex 536", |
" 0002 Domex DMX3194UP SCSI Adapter", |
"134b ARK Research Corp.", |
"134c Chori Joho System Co. Ltd", |
"134d PCTel Inc", |
" 2189 HSP56 MicroModem", |
" 2486 2304WT V.92 MDC Modem", |
" 7890 HSP MicroModem 56", |
" 134d 0001 PCT789 adapter", |
" 7891 HSP MicroModem 56", |
" 134d 0001 HSP MicroModem 56", |
" 7892 HSP MicroModem 56", |
" 7893 HSP MicroModem 56", |
" 7894 HSP MicroModem 56", |
" 7895 HSP MicroModem 56", |
" 7896 HSP MicroModem 56", |
" 7897 HSP MicroModem 56", |
"134e CSTI", |
"134f Algo System Co Ltd", |
"1350 Systec Co. Ltd", |
"1351 Sonix Inc", |
"1353 Thales Idatys", |
" 0002 Proserver", |
" 0003 PCI-FUT", |
" 0004 PCI-S0", |
" 0005 PCI-FUT-S0", |
"1354 Dwave System Inc", |
"1355 Kratos Analytical Ltd", |
"1356 The Logical Co", |
"1359 Prisa Networks", |
"135a Brain Boxes", |
"135b Giganet Inc", |
"135c Quatech Inc", |
" 0010 QSC-100", |
" 0020 DSC-100", |
" 0030 DSC-200/300", |
" 0040 QSC-200/300", |
" 0050 ESC-100D", |
" 0060 ESC-100M", |
" 00f0 MPAC-100 Syncronous Serial Card (Zilog 85230)", |
" 0170 QSCLP-100", |
" 0180 DSCLP-100", |
" 0190 SSCLP-100", |
" 01a0 QSCLP-200/300", |
" 01b0 DSCLP-200/300", |
" 01c0 SSCLP-200/300", |
"135d ABB Network Partner AB", |
"135e Sealevel Systems Inc", |
" 5101 Route 56.PCI - Multi-Protocol Serial Interface (Zilog Z16C32)", |
" 7101 Single Port RS-232/422/485/530", |
" 7201 Dual Port RS-232/422/485 Interface", |
" 7202 Dual Port RS-232 Interface", |
" 7401 Four Port RS-232 Interface", |
" 7402 Four Port RS-422/485 Interface", |
" 7801 Eight Port RS-232 Interface", |
" 7804 Eight Port RS-232/422/485 Interface", |
" 8001 8001 Digital I/O Adapter", |
"135f I-Data International A-S", |
"1360 Meinberg Funkuhren", |
" 0101 PCI32 DCF77 Radio Clock", |
" 0102 PCI509 DCF77 Radio Clock", |
" 0103 PCI510 DCF77 Radio Clock", |
" 0104 PCI511 DCF77 Radio Clock", |
" 0201 GPS167PCI GPS Receiver", |
" 0202 GPS168PCI GPS Receiver", |
" 0203 GPS169PCI GPS Receiver", |
" 0204 GPS170PCI GPS Receiver", |
" 0301 TCR510PCI IRIG Timecode Reader", |
" 0302 TCR167PCI IRIG Timecode Reader", |
"1361 Soliton Systems K.K.", |
"1362 Fujifacom Corporation", |
"1363 Phoenix Technology Ltd", |
"1364 ATM Communications Inc", |
"1365 Hypercope GmbH", |
"1366 Teijin Seiki Co. Ltd", |
"1367 Hitachi Zosen Corporation", |
"1368 Skyware Corporation", |
"1369 Digigram", |
"136a High Soft Tech", |
"136b Kawasaki Steel Corporation", |
" ff01 KL5A72002 Motion JPEG", |
"136c Adtek System Science Co Ltd", |
"136d Gigalabs Inc", |
"136f Applied Magic Inc", |
"1370 ATL Products", |
"1371 CNet Technology Inc", |
" 434e GigaCard Network Adapter", |
" 1371 434e N-Way PCI-Bus Giga-Card 1000/100/10Mbps(L)", |
"1373 Silicon Vision Inc", |
"1374 Silicom Ltd.", |
" 0024 Silicom Dual port Giga Ethernet BGE Bypass Server Adapter", |
" 0025 Silicom Quad port Giga Ethernet BGE Bypass Server Adapter", |
" 0026 Silicom Dual port Fiber Giga Ethernet 546 Bypass Server Adapter", |
" 0027 Silicom Dual port Fiber LX Giga Ethernet 546 Bypass Server Adapter", |
" 0029 Silicom Dual port Copper Giga Ethernet 546GB Bypass Server Adapter", |
" 002a Silicom Dual port Fiber Giga Ethernet 546 TAP/Bypass Server Adapter", |
" 002b Silicom Dual port Copper Fast Ethernet 546 TAP/Bypass Server Adapter (PXE2TBI)", |
" 002c Silicom Quad port Copper Giga Ethernet 546GB Bypass Server Adapter (PXG4BPI)", |
" 002d Silicom Quad port Fiber-SX Giga Ethernet 546GB Bypass Server Adapter (PXG4BPFI)", |
" 002e Silicom Quad port Fiber-LX Giga Ethernet 546GB Bypass Server Adapter (PXG4BPFI-LX)", |
" 002f Silicom Dual port Fiber-SX Giga Ethernet 546GB Low profile Bypass Server Adapter (PXG2BPFIL)", |
" 0030 Silicom Dual port Fiber-LX Giga Ethernet 546GB Low profile Bypass Server Adapter", |
" 0031 Silicom Quad port Copper Giga Ethernet PCI-E Bypass Server Adapter", |
" 0032 Silicom Dual port Copper Fast Ethernet 546 TAP/Bypass Server Adapter", |
" 0034 Silicom Dual port Copper Giga Ethernet PCI-E BGE Bypass Server Adapter", |
" 0035 Silicom Quad port Copper Giga Ethernet PCI-E BGE Bypass Server Adapter", |
" 0036 Silicom Dual port Fiber Giga Ethernet PCI-E BGE Bypass Server Adapter", |
" 0037 Silicom Quad port Copper Ethernet PCI-E Intel based Bypass Server Adapter", |
" 0038 Silicom Quad port Copper Ethernet PCI-E Intel based Bypass Server Adapter", |
" 0039 Silicom Dual port Fiber-SX Ethernet PCI-E Intel based Bypass Server Adapter", |
" 003a Silicom Dual port Fiber-LX Ethernet PCI-E Intel based Bypass Server Adapter", |
"1375 Argosystems Inc", |
"1376 LMC", |
"1377 Electronic Equipment Production & Distribution GmbH", |
"1378 Telemann Co. Ltd", |
"1379 Asahi Kasei Microsystems Co Ltd", |
"137a Mark of the Unicorn Inc", |
" 0001 PCI-324 Audiowire Interface", |
"137b PPT Vision", |
"137c Iwatsu Electric Co Ltd", |
"137d Dynachip Corporation", |
"137e Patriot Scientific Corporation", |
"137f Japan Satellite Systems Inc", |
"1380 Sanritz Automation Co Ltd", |
"1381 Brains Co. Ltd", |
"1382 Marian - Electronic & Software", |
" 0001 ARC88 audio recording card", |
" 2008 Prodif 96 Pro sound system", |
" 2048 Prodif Plus sound system", |
" 2088 Marc 8 Midi sound system", |
" 20c8 Marc A sound system", |
" 4008 Marc 2 sound system", |
" 4010 Marc 2 Pro sound system", |
" 4048 Marc 4 MIDI sound system", |
" 4088 Marc 4 Digi sound system", |
" 4248 Marc X sound system", |
" 4424 TRACE D4 Sound System", |
"1383 Controlnet Inc", |
"1384 Reality Simulation Systems Inc", |
"1385 Netgear", |
" 0013 WG311T 108 Mbps Wireless PCI Adapter", |
" 311a GA511 Gigabit Ethernet", |
" 4100 802.11b Wireless Adapter (MA301)", |
" 4105 MA311 802.11b wireless adapter", |
" 4251 WG111T 108 Mbps Wireless USB 2.0 Adapter", |
" 4400 WAG511 802.11a/b/g Dual Band Wireless PC Card", |
" 4600 WAG511 802.11a/b/g Dual Band Wireless PC Card", |
" 4601 WAG511 802.11a/b/g Dual Band Wireless PC Card", |
" 4610 WAG511 802.11a/b/g Dual Band Wireless PC Card", |
" 4800 WG511(v1) 54 Mbps Wireless PC Card", |
" 4900 WG311v1 54 Mbps Wireless PCI Adapter", |
" 4a00 WAG311 802.11a/g Wireless PCI Adapter", |
" 4b00 WG511T 108 Mbps Wireless PC Card", |
" 4c00 WG311v2 54 Mbps Wireless PCI Adapter", |
" 4d00 WG311T 108 Mbps Wireless PCI Adapter", |
" 4e00 WG511v2 54 Mbps Wireless PC Card", |
" 4f00 WG511U Double 108 Mbps Wireless PC Card", |
" 5200 GA511 Gigabit PC Card", |
" 620a GA620 Gigabit Ethernet", |
" 622a GA622", |
" 630a GA630 Gigabit Ethernet", |
" 6b00 WG311v3 54 Mbps Wireless PCI Adapter", |
" 6d00 WPNT511 RangeMax 240 Mbps Wireless PC Card", |
" f004 FA310TX", |
"1386 Video Domain Technologies", |
"1387 Systran Corp", |
"1388 Hitachi Information Technology Co Ltd", |
"1389 Applicom International", |
" 0001 PCI1500PFB [Intelligent fieldbus adaptor]", |
"138a Fusion Micromedia Corp", |
"138b Tokimec Inc", |
"138c Silicon Reality", |
"138d Future Techno Designs pte Ltd", |
"138e Basler GmbH", |
"138f Patapsco Designs Inc", |
"1390 Concept Development Inc", |
"1391 Development Concepts Inc", |
"1392 Medialight Inc", |
"1393 Moxa Technologies Co Ltd", |
" 1040 Smartio C104H/PCI", |
" 1141 Industrio CP-114", |
" 1680 Smartio C168H/PCI", |
" 2040 Intellio CP-204J", |
" 2180 Intellio C218 Turbo PCI", |
" 3200 Intellio C320 Turbo PCI", |
"1394 Level One Communications", |
" 0001 LXT1001 Gigabit Ethernet", |
" 1394 0001 NetCelerator Adapter", |
"1395 Ambicom Inc", |
"1396 Cipher Systems Inc", |
"1397 Cologne Chip Designs GmbH", |
" 08b4 ISDN network Controller [HFC-4S]", |
" 1397 b520 HFC-4S [IOB4ST]", |
" 1397 b540 HFC-4S [Swyx 4xS0 SX2 QuadBri]", |
" 16b8 ISDN network Controller [HFC-8S]", |
" 2bd0 ISDN network controller [HFC-PCI]", |
" 0675 1704 ISDN Adapter (PCI Bus, D, C)", |
" 0675 1708 ISDN Adapter (PCI Bus, D, C, ACPI)", |
" 1397 2bd0 ISDN Board", |
" e4bf 1000 CI1-1-Harp", |
"1398 Clarion co. Ltd", |
"1399 Rios systems Co Ltd", |
"139a Alacritech Inc", |
" 0001 Quad Port 10/100 Server Accelerator", |
" 0003 Single Port 10/100 Server Accelerator", |
" 0005 Single Port Gigabit Server Accelerator", |
"139b Mediasonic Multimedia Systems Ltd", |
"139c Quantum 3d Inc", |
"139d EPL limited", |
"139e Media4", |
"139f Aethra s.r.l.", |
"13a0 Crystal Group Inc", |
"13a1 Kawasaki Heavy Industries Ltd", |
"13a2 Ositech Communications Inc", |
"13a3 Hifn Inc.", |
" 0005 7751 Security Processor", |
" 0006 6500 Public Key Processor", |
" 0007 7811 Security Processor", |
" 0012 7951 Security Processor", |
" 0014 78XX Security Processor", |
" 0016 8065 Security Processor", |
" 0017 8165 Security Processor", |
" 0018 8154 Security Processor", |
" 001d 7956 Security Processor", |
" 0020 7955 Security Processor", |
" 0026 8155 Security Processor", |
"13a4 Rascom Inc", |
"13a5 Audio Digital Imaging Inc", |
"13a6 Videonics Inc", |
"13a7 Teles AG", |
"13a8 Exar Corp.", |
" 0152 XR17C/D152 Dual PCI UART", |
" 0154 XR17C154 Quad UART", |
" 0158 XR17C158 Octal UART", |
"13a9 Siemens Medical Systems, Ultrasound Group", |
"13aa Broadband Networks Inc", |
"13ab Arcom Control Systems Ltd", |
"13ac Motion Media Technology Ltd", |
"13ad Nexus Inc", |
"13ae ALD Technology Ltd", |
"13af T.Sqware", |
"13b0 Maxspeed Corp", |
"13b1 Tamura corporation", |
"13b2 Techno Chips Co. Ltd", |
"13b3 Lanart Corporation", |
"13b4 Wellbean Co Inc", |
"13b5 ARM", |
"13b6 Dlog GmbH", |
"13b7 Logic Devices Inc", |
"13b8 Nokia Telecommunications oy", |
"13b9 Elecom Co Ltd", |
"13ba Oxford Instruments", |
"13bb Sanyo Technosound Co Ltd", |
"13bc Bitran Corporation", |
"13bd Sharp corporation", |
"13be Miroku Jyoho Service Co. Ltd", |
"13bf Sharewave Inc", |
"13c0 Microgate Corporation", |
" 0010 SyncLink Adapter v1", |
" 0020 SyncLink SCC Adapter", |
" 0030 SyncLink Multiport Adapter", |
" 0210 SyncLink Adapter v2", |
"13c1 3ware Inc", |
" 1000 5xxx/6xxx-series PATA-RAID", |
" 1001 7xxx/8xxx-series PATA/SATA-RAID", |
" 13c1 1001 7xxx/8xxx-series PATA/SATA-RAID", |
" 1002 9xxx-series SATA-RAID", |
" 1003 9550SX SATA-RAID", |
"13c2 Technotrend Systemtechnik GmbH", |
" 000e Technotrend/Hauppauge DVB card rev2.3", |
"13c3 Janz Computer AG", |
"13c4 Phase Metrics", |
"13c5 Alphi Technology Corp", |
"13c6 Condor Engineering Inc", |
" 0520 CEI-520 A429 Card", |
" 0620 CEI-620 A429 Card", |
" 0820 CEI-820 A429 Card", |
"13c7 Blue Chip Technology Ltd", |
"13c8 Apptech Inc", |
"13c9 Eaton Corporation", |
"13ca Iomega Corporation", |
"13cb Yano Electric Co Ltd", |
"13cc Metheus Corporation", |
"13cd Compatible Systems Corporation", |
"13ce Cocom A/S", |
"13cf Studio Audio & Video Ltd", |
"13d0 Techsan Electronics Co Ltd", |
" 2103 B2C2 FlexCopII DVB chip / Technisat SkyStar2 DVB card", |
" 2200 B2C2 FlexCopIII DVB chip / Technisat SkyStar2 DVB card", |
"13d1 Abocom Systems Inc", |
" ab02 ADMtek Centaur-C rev 17 [D-Link DFE-680TX] CardBus Fast Ethernet Adapter", |
" ab03 21x4x DEC-Tulip compatible 10/100 Ethernet", |
" ab06 RTL8139 [FE2000VX] CardBus Fast Ethernet Attached Port Adapter", |
" ab08 21x4x DEC-Tulip compatible 10/100 Ethernet", |
"13d2 Shark Multimedia Inc", |
"13d3 IMC Networks", |
"13d4 Graphics Microsystems Inc", |
"13d5 Media 100 Inc", |
"13d6 K.I. Technology Co Ltd", |
"13d7 Toshiba Engineering Corporation", |
"13d8 Phobos corporation", |
"13d9 Apex PC Solutions Inc", |
"13da Intresource Systems pte Ltd", |
"13db Janich & Klass Computertechnik GmbH", |
"13dc Netboost Corporation", |
"13dd Multimedia Bundle Inc", |
"13de ABB Robotics Products AB", |
"13df E-Tech Inc", |
" 0001 PCI56RVP Modem", |
" 13df 0001 PCI56RVP Modem", |
"13e0 GVC Corporation", |
"13e1 Silicom Multimedia Systems Inc", |
"13e2 Dynamics Research Corporation", |
"13e3 Nest Inc", |
"13e4 Calculex Inc", |
"13e5 Telesoft Design Ltd", |
"13e6 Argosy research Inc", |
"13e7 NAC Incorporated", |
"13e8 Chip Express Corporation", |
"13e9 Intraserver Technology Inc", |
"13ea Dallas Semiconductor", |
"13eb Hauppauge Computer Works Inc", |
"13ec Zydacron Inc", |
" 000a NPC-RC01 Remote control receiver", |
"13ed Raytheion E-Systems", |
"13ee Hayes Microcomputer Products Inc", |
"13ef Coppercom Inc", |
"13f0 Sundance Technology Inc / IC Plus Corp", |
" 0200 IC Plus IP100A Integrated 10/100 Ethernet MAC + PHY", |
" 0201 ST201 Sundance Ethernet", |
" 1023 IC Plus IP1000 Family Gigabit Ethernet", |
"13f1 Oce' - Technologies B.V.", |
"13f2 Ford Microelectronics Inc", |
"13f3 Mcdata Corporation", |
"13f4 Troika Networks, Inc.", |
" 1401 Zentai Fibre Channel Adapter", |
"13f5 Kansai Electric Co. Ltd", |
"13f6 C-Media Electronics Inc", |
" 0011 CMI8738", |
" 0100 CM8338A", |
" 13f6 ffff CMI8338/C3DX PCI Audio Device", |
" 0101 CM8338B", |
" 13f6 0101 CMI8338-031 PCI Audio Device", |
" 0111 CM8738", |
" 1019 0970 P6STP-FL motherboard", |
" 1043 8035 CUSI-FX motherboard", |
" 1043 8077 CMI8738 6-channel audio controller", |
" 1043 80e2 CMI8738 6ch-MX", |
" 13f6 0111 CMI8738/C3DX PCI Audio Device", |
" 1681 a000 Gamesurround MUSE XL", |
" 0211 CM8738", |
"13f7 Wildfire Communications", |
"13f8 Ad Lib Multimedia Inc", |
"13f9 NTT Advanced Technology Corp.", |
"13fa Pentland Systems Ltd", |
"13fb Aydin Corp", |
"13fc Computer Peripherals International", |
"13fd Micro Science Inc", |
"13fe Advantech Co. Ltd", |
" 1240 PCI-1240 4-channel stepper motor controller card", |
" 1600 PCI-1612 4-port RS-232/422/485 PCI communication card", |
" 1733 PCI-1733 32-channel isolated digital input card", |
" 1752 PCI-1752", |
" 1754 PCI-1754", |
" 1756 PCI-1756", |
"13ff Silicon Spice Inc", |
"1400 Artx Inc", |
" 1401 9432 TX", |
"1401 CR-Systems A/S", |
"1402 Meilhaus Electronic GmbH", |
"1403 Ascor Inc", |
"1404 Fundamental Software Inc", |
"1405 Excalibur Systems Inc", |
"1406 Oce' Printing Systems GmbH", |
"1407 Lava Computer mfg Inc", |
" 0100 Lava Dual Serial", |
" 0101 Lava Quatro A", |
" 0102 Lava Quatro B", |
" 0110 Lava DSerial-PCI Port A", |
" 0111 Lava DSerial-PCI Port B", |
" 0120 Quattro-PCI A", |
" 0121 Quattro-PCI B", |
" 0180 Lava Octo A", |
" 0181 Lava Octo B", |
" 0200 Lava Port Plus", |
" 0201 Lava Quad A", |
" 0202 Lava Quad B", |
" 0220 Lava Quattro PCI Ports A/B", |
" 0221 Lava Quattro PCI Ports C/D", |
" 0500 Lava Single Serial", |
" 0600 Lava Port 650", |
" 8000 Lava Parallel", |
" 8001 Dual parallel port controller A", |
" 8002 Lava Dual Parallel port A", |
" 8003 Lava Dual Parallel port B", |
" 8800 BOCA Research IOPPAR", |
"1408 Aloka Co. Ltd", |
"1409 Timedia Technology Co Ltd", |
" 7168 PCI2S550 (Dual 16550 UART)", |
"140a DSP Research Inc", |
"140b Ramix Inc", |
"140c Elmic Systems Inc", |
"140d Matsushita Electric Works Ltd", |
"140e Goepel Electronic GmbH", |
"140f Salient Systems Corp", |
"1410 Midas lab Inc", |
"1411 Ikos Systems Inc", |
"1412 VIA Technologies Inc.", |
" 1712 ICE1712 [Envy24] PCI Multi-Channel I/O Controller", |
" 1412 1712 Hoontech ST Audio DSP 24", |
" 1412 d630 M-Audio Delta 1010", |
" 1412 d631 M-Audio Delta DiO", |
" 1412 d632 M-Audio Delta 66", |
" 1412 d633 M-Audio Delta 44", |
" 1412 d634 M-Audio Delta Audiophile", |
" 1412 d635 M-Audio Delta TDIF", |
" 1412 d637 M-Audio Delta RBUS", |
" 1412 d638 M-Audio Delta 410", |
" 1412 d63b M-Audio Delta 1010LT", |
" 1412 d63c Digigram VX442", |
" 1416 1712 Hoontech ST Audio DSP 24 Media 7.1", |
" 153b 1115 EWS88 MT", |
" 153b 1125 EWS88 MT (Master)", |
" 153b 112b EWS88 D", |
" 153b 112c EWS88 D (Master)", |
" 153b 1130 EWX 24/96", |
" 153b 1138 DMX 6fire 24/96", |
" 153b 1151 PHASE88", |
" 16ce 1040 Edirol DA-2496", |
" 1724 VT1720/24 [Envy24PT/HT] PCI Multi-Channel Audio Controller", |
" 1412 1724 Albatron PX865PE 7.1", |
" 1412 3630 M-Audio Revolution 7.1", |
" 1412 3631 M-Audio Revolution 5.1", |
" 153b 1145 Aureon 7.1 Space", |
" 153b 1147 Aureon 5.1 Sky", |
" 153b 1153 Aureon 7.1 Universe", |
" 270f f641 ZNF3-150", |
" 270f f645 ZNF3-250", |
"1413 Addonics", |
"1414 Microsoft Corporation", |
"1415 Oxford Semiconductor Ltd", |
" 8403 VScom 011H-EP1 1 port parallel adaptor", |
" 9501 OX16PCI954 (Quad 16950 UART) function 0", |
" 131f 2050 CyberPro (4-port)", |
" 131f 2051 CyberSerial 4S Plus", |
" 15ed 2000 MCCR Serial p0-3 of 8", |
" 15ed 2001 MCCR Serial p0-3 of 16", |
" 950a EXSYS EX-41092 Dual 16950 Serial adapter", |
" 950b OXCB950 Cardbus 16950 UART", |
" 9510 OX16PCI954 (Quad 16950 UART) function 1 (Disabled)", |
" 9511 OX16PCI954 (Quad 16950 UART) function 1", |
" 15ed 2000 MCCR Serial p4-7 of 8", |
" 15ed 2001 MCCR Serial p4-15 of 16", |
" 9521 OX16PCI952 (Dual 16950 UART)", |
" 9523 OX16PCI952 Integrated Parallel Port", |
"1416 Multiwave Innovation pte Ltd", |
"1417 Convergenet Technologies Inc", |
"1418 Kyushu electronics systems Inc", |
"1419 Excel Switching Corp", |
"141a Apache Micro Peripherals Inc", |
"141b Zoom Telephonics Inc", |
"141d Digitan Systems Inc", |
"141e Fanuc Ltd", |
"141f Visiontech Ltd", |
"1420 Psion Dacom plc", |
" 8002 Gold Card NetGlobal 56k+10/100Mb CardBus (Ethernet part)", |
" 8003 Gold Card NetGlobal 56k+10/100Mb CardBus (Modem part)", |
"1421 Ads Technologies Inc", |
"1422 Ygrec Systems Co Ltd", |
"1423 Custom Technology Corp.", |
"1424 Videoserver Connections", |
"1425 Chelsio Communications Inc", |
" 000b T210 Protocol Engine", |
"1426 Storage Technology Corp.", |
"1427 Better On-Line Solutions", |
"1428 Edec Co Ltd", |
"1429 Unex Technology Corp.", |
"142a Kingmax Technology Inc", |
"142b Radiolan", |
"142c Minton Optic Industry Co Ltd", |
"142d Pix stream Inc", |
"142e Vitec Multimedia", |
" 4020 VM2-2 [Video Maker 2] MPEG1/2 Encoder", |
" 4337 VM2-2-C7 [Video Maker 2 rev. C7] MPEG1/2 Encoder", |
"142f Radicom Research Inc", |
"1430 ITT Aerospace/Communications Division", |
"1431 Gilat Satellite Networks", |
"1432 Edimax Computer Co.", |
" 9130 RTL81xx Fast Ethernet", |
"1433 Eltec Elektronik GmbH", |
"1435 RTD Embedded Technologies, Inc.", |
"1436 CIS Technology Inc", |
"1437 Nissin Inc Co", |
"1438 Atmel-dream", |
"1439 Outsource Engineering & Mfg. Inc", |
"143a Stargate Solutions Inc", |
"143b Canon Research Center, America", |
"143c Amlogic Inc", |
"143d Tamarack Microelectronics Inc", |
"143e Jones Futurex Inc", |
"143f Lightwell Co Ltd - Zax Division", |
"1440 ALGOL Corp.", |
"1441 AGIE Ltd", |
"1442 Phoenix Contact GmbH & Co.", |
"1443 Unibrain S.A.", |
"1444 TRW", |
"1445 Logical DO Ltd", |
"1446 Graphin Co Ltd", |
"1447 AIM GmBH", |
"1448 Alesis Studio Electronics", |
"1449 TUT Systems Inc", |
"144a Adlink Technology", |
" 7296 PCI-7296", |
" 7432 PCI-7432", |
" 7433 PCI-7433", |
" 7434 PCI-7434", |
" 7841 PCI-7841", |
" 8133 PCI-8133", |
" 8164 PCI-8164", |
" 8554 PCI-8554", |
" 9111 PCI-9111", |
" 9113 PCI-9113", |
" 9114 PCI-9114", |
"144b Loronix Information Systems Inc", |
"144c Catalina Research Inc", |
"144d Samsung Electronics Co Ltd", |
" c00c P35 laptop", |
"144e OLITEC", |
"144f Askey Computer Corp.", |
"1450 Octave Communications Ind.", |
"1451 SP3D Chip Design GmBH", |
"1453 MYCOM Inc", |
"1454 Altiga Networks", |
"1455 Logic Plus Plus Inc", |
"1456 Advanced Hardware Architectures", |
"1457 Nuera Communications Inc", |
"1458 Giga-byte Technology", |
" 0c11 K8NS Pro Mainboard", |
" e911 GN-WIAG02", |
"1459 DOOIN Electronics", |
"145a Escalate Networks Inc", |
"145b PRAIM SRL", |
"145c Cryptek", |
"145d Gallant Computer Inc", |
"145e Aashima Technology B.V.", |
"145f Baldor Electric Company", |
" 0001 NextMove PCI", |
"1460 DYNARC INC", |
"1461 Avermedia Technologies Inc", |
" f436 AVerTV Hybrid+FM", |
"1462 Micro-Star International Co., Ltd.", |
" 5501 nVidia NV15DDR [GeForce2 Ti]", |
" 6819 Broadcom Corporation BCM4306 802.11b/g Wireless LAN Controller [MSI CB54G]", |
" 6825 PCI Card wireless 11g [PC54G]", |
" 6834 RaLink RT2500 802.11g [PC54G2]", |
" 7125 K8N motherboard", |
" 8725 NVIDIA NV25 [GeForce4 Ti 4600] VGA Adapter", |
" 9000 NVIDIA NV28 [GeForce4 Ti 4800] VGA Adapter", |
" 9110 GeFORCE FX5200", |
" 9119 NVIDIA NV31 [GeForce FX 5600XT] VGA Adapter", |
" 9123 NVIDIA NV31 [GeForce FX 5600] FX5600-VTDR128 [MS-8912]", |
" 9591 nVidia Corporation NV36 [GeForce FX 5700LE]", |
"1463 Fast Corporation", |
"1464 Interactive Circuits & Systems Ltd", |
"1465 GN NETTEST Telecom DIV.", |
"1466 Designpro Inc.", |
"1467 DIGICOM SPA", |
"1468 AMBIT Microsystem Corp.", |
"1469 Cleveland Motion Controls", |
"146a IFR", |
"146b Parascan Technologies Ltd", |
"146c Ruby Tech Corp.", |
" 1430 FE-1430TX Fast Ethernet PCI Adapter", |
"146d Tachyon, INC.", |
"146e Williams Electronics Games, Inc.", |
"146f Multi Dimensional Consulting Inc", |
"1470 Bay Networks", |
"1471 Integrated Telecom Express Inc", |
"1472 DAIKIN Industries, Ltd", |
"1473 ZAPEX Technologies Inc", |
"1474 Doug Carson & Associates", |
"1475 PICAZO Communications", |
"1476 MORTARA Instrument Inc", |
"1477 Net Insight", |
"1478 DIATREND Corporation", |
"1479 TORAY Industries Inc", |
"147a FORMOSA Industrial Computing", |
"147b ABIT Computer Corp.", |
"147c AWARE, Inc.", |
"147d Interworks Computer Products", |
"147e Matsushita Graphic Communication Systems, Inc.", |
"147f NIHON UNISYS, Ltd.", |
"1480 SCII Telecom", |
"1481 BIOPAC Systems Inc", |
"1482 ISYTEC - Integrierte Systemtechnik GmBH", |
"1483 LABWAY Corporation", |
"1484 Logic Corporation", |
"1485 ERMA - Electronic GmBH", |
"1486 L3 Communications Telemetry & Instrumentation", |
"1487 MARQUETTE Medical Systems", |
"1488 KONTRON Electronik GmBH", |
"1489 KYE Systems Corporation", |
"148a OPTO", |
"148b INNOMEDIALOGIC Inc.", |
"148c C.P. Technology Co. Ltd", |
"148d DIGICOM Systems, Inc.", |
" 1003 HCF 56k Data/Fax Modem", |
"148e OSI Plus Corporation", |
"148f Plant Equipment, Inc.", |
"1490 Stone Microsystems PTY Ltd.", |
"1491 ZEAL Corporation", |
"1492 Time Logic Corporation", |
"1493 MAKER Communications", |
"1494 WINTOP Technology, Inc.", |
"1495 TOKAI Communications Industry Co. Ltd", |
"1496 JOYTECH Computer Co., Ltd.", |
"1497 SMA Regelsysteme GmBH", |
" 1497 SMA Technologie AG", |
"1498 TEWS Datentechnik GmBH", |
" 0330 TPMC816 2 Channel CAN bus controller.", |
" 0385 TPMC901 Extended CAN bus with 2/4/6 CAN controller", |
" 21cd TCP461 CompactPCI 8 Channel Serial Interface RS232/RS422", |
" 30c8 TPCI200", |
"1499 EMTEC CO., Ltd", |
"149a ANDOR Technology Ltd", |
"149b SEIKO Instruments Inc", |
"149c OVISLINK Corp.", |
"149d NEWTEK Inc", |
" 0001 Video Toaster for PC", |
"149e Mapletree Networks Inc.", |
"149f LECTRON Co Ltd", |
"14a0 SOFTING GmBH", |
"14a1 Systembase Co Ltd", |
"14a2 Millennium Engineering Inc", |
"14a3 Maverick Networks", |
"14a4 GVC/BCM Advanced Research", |
"14a5 XIONICS Document Technologies Inc", |
"14a6 INOVA Computers GmBH & Co KG", |
"14a7 MYTHOS Systems Inc", |
"14a8 FEATRON Technologies Corporation", |
"14a9 HIVERTEC Inc", |
"14aa Advanced MOS Technology Inc", |
"14ab Mentor Graphics Corp.", |
"14ac Novaweb Technologies Inc", |
"14ad Time Space Radio AB", |
"14ae CTI, Inc", |
"14af Guillemot Corporation", |
" 7102 3D Prophet II MX", |
"14b0 BST Communication Technology Ltd", |
"14b1 Nextcom K.K.", |
"14b2 ENNOVATE Networks Inc", |
"14b3 XPEED Inc", |
" 0000 DSL NIC", |
"14b4 PHILIPS Business Electronics B.V.", |
"14b5 Creamware GmBH", |
" 0200 Scope", |
" 0300 Pulsar", |
" 0400 PulsarSRB", |
" 0600 Pulsar2", |
" 0800 DSP-Board", |
" 0900 DSP-Board", |
" 0a00 DSP-Board", |
" 0b00 DSP-Board", |
"14b6 Quantum Data Corp.", |
"14b7 PROXIM Inc", |
" 0001 Symphony 4110", |
"14b8 Techsoft Technology Co Ltd", |
"14b9 AIRONET Wireless Communications", |
" 0001 PC4800", |
" 0340 PC4800", |
" 0350 PC4800", |
" 4500 PC4500", |
" 4800 Cisco Aironet 340 802.11b Wireless LAN Adapter/Aironet PC4800", |
" a504 Cisco Aironet Wireless 802.11b", |
" a505 Cisco Aironet CB20a 802.11a Wireless LAN Adapter", |
" a506 Cisco Aironet Mini PCI b/g", |
"14ba INTERNIX Inc.", |
"14bb SEMTECH Corporation", |
"14bc Globespan Semiconductor Inc.", |
"14bd CARDIO Control N.V.", |
"14be L3 Communications", |
"14bf SPIDER Communications Inc.", |
"14c0 COMPAL Electronics Inc", |
"14c1 MYRICOM Inc.", |
" 0008 Myri-10G Dual-Protocol Interconnect", |
" 8043 Myrinet 2000 Scalable Cluster Interconnect", |
"14c2 DTK Computer", |
"14c3 MEDIATEK Corp.", |
"14c4 IWASAKI Information Systems Co Ltd", |
"14c5 Automation Products AB", |
"14c6 Data Race Inc", |
"14c7 Modular Technology Holdings Ltd", |
"14c8 Turbocomm Tech. Inc.", |
"14c9 ODIN Telesystems Inc", |
"14ca PE Logic Corp.", |
"14cb Billionton Systems Inc", |
"14cc NAKAYO Telecommunications Inc", |
"14cd Universal Scientific Ind.", |
"14ce Whistle Communications", |
"14cf TEK Microsystems Inc.", |
"14d0 Ericsson Axe R & D", |
"14d1 Computer Hi-Tech Co Ltd", |
"14d2 Titan Electronics Inc", |
" 8001 VScom 010L 1 port parallel adaptor", |
" 8002 VScom 020L 2 port parallel adaptor", |
" 8010 VScom 100L 1 port serial adaptor", |
" 8011 VScom 110L 1 port serial and 1 port parallel adaptor", |
" 8020 VScom 200L 1 port serial adaptor", |
" 8021 VScom 210L 2 port serial and 1 port parallel adaptor", |
" 8040 VScom 400L 4 port serial adaptor", |
" 8080 VScom 800L 8 port serial adaptor", |
" a000 VScom 010H 1 port parallel adaptor", |
" a001 VScom 100H 1 port serial adaptor", |
" a003 VScom 400H 4 port serial adaptor", |
" a004 VScom 400HF1 4 port serial adaptor", |
" a005 VScom 200H 2 port serial adaptor", |
" e001 VScom 010HV2 1 port parallel adaptor", |
" e010 VScom 100HV2 1 port serial adaptor", |
" e020 VScom 200HV2 2 port serial adaptor", |
"14d3 CIRTECH (UK) Ltd", |
"14d4 Panacom Technology Corp", |
"14d5 Nitsuko Corporation", |
"14d6 Accusys Inc", |
"14d7 Hirakawa Hewtech Corp", |
"14d8 HOPF Elektronik GmBH", |
"14d9 Alliance Semiconductor Corporation", |
" 0010 AP1011/SP1011 HyperTransport-PCI Bridge [Sturgeon]", |
" 9000 AS90L10204/10208 HyperTransport to PCI-X Bridge", |
"14da National Aerospace Laboratories", |
"14db AFAVLAB Technology Inc", |
" 2120 TK9902", |
" 2182 AFAVLAB Technology Inc. 8-port serial card", |
"14dc Amplicon Liveline Ltd", |
" 0000 PCI230", |
" 0001 PCI242", |
" 0002 PCI244", |
" 0003 PCI247", |
" 0004 PCI248", |
" 0005 PCI249", |
" 0006 PCI260", |
" 0007 PCI224", |
" 0008 PCI234", |
" 0009 PCI236", |
" 000a PCI272", |
" 000b PCI215", |
"14dd Boulder Design Labs Inc", |
"14de Applied Integration Corporation", |
"14df ASIC Communications Corp", |
"14e1 INVERTEX", |
"14e2 INFOLIBRIA", |
"14e3 AMTELCO", |
"14e4 Broadcom Corporation", |
" 0800 Sentry5 Chipcommon I/O Controller", |
" 0804 Sentry5 PCI Bridge", |
" 0805 Sentry5 MIPS32 CPU", |
" 0806 Sentry5 Ethernet Controller", |
" 080b Sentry5 Crypto Accelerator", |
" 080f Sentry5 DDR/SDR RAM Controller", |
" 0811 Sentry5 External Interface Core", |
" 0816 BCM3302 Sentry5 MIPS32 CPU", |
" 1600 NetXtreme BCM5752 Gigabit Ethernet PCI Express", |
" 1601 NetXtreme BCM5752M Gigabit Ethernet PCI Express", |
" 1644 NetXtreme BCM5700 Gigabit Ethernet", |
" 1014 0277 Broadcom Vigil B5700 1000Base-T", |
" 1028 00d1 Broadcom BCM5700", |
" 1028 0106 Broadcom BCM5700", |
" 1028 0109 Broadcom BCM5700 1000Base-T", |
" 1028 010a Broadcom BCM5700 1000BaseTX", |
" 10b7 1000 3C996-T 1000Base-T", |
" 10b7 1001 3C996B-T 1000Base-T", |
" 10b7 1002 3C996C-T 1000Base-T", |
" 10b7 1003 3C997-T 1000Base-T Dual Port", |
" 10b7 1004 3C996-SX 1000Base-SX", |
" 10b7 1005 3C997-SX 1000Base-SX Dual Port", |
" 10b7 1008 3C942 Gigabit LOM (31X31)", |
" 14e4 0002 NetXtreme 1000Base-SX", |
" 14e4 0003 NetXtreme 1000Base-SX", |
" 14e4 0004 NetXtreme 1000Base-T", |
" 14e4 1028 NetXtreme 1000BaseTX", |
" 14e4 1644 BCM5700 1000Base-T", |
" 1645 NetXtreme BCM5701 Gigabit Ethernet", |
" 0e11 007c NC7770 Gigabit Server Adapter (PCI-X, 10/100/1000-T)", |
" 0e11 007d NC6770 Gigabit Server Adapter (PCI-X, 1000-SX)", |
" 0e11 0085 NC7780 Gigabit Server Adapter (embedded, WOL)", |
" 0e11 0099 NC7780 Gigabit Server Adapter (embedded, WOL)", |
" 0e11 009a NC7770 Gigabit Server Adapter (PCI-X, 10/100/1000-T)", |
" 0e11 00c1 NC6770 Gigabit Server Adapter (PCI-X, 1000-SX)", |
" 1028 0121 Broadcom BCM5701 1000Base-T", |
" 103c 128a 1000Base-T (PCI) [A7061A]", |
" 103c 128b 1000Base-SX (PCI) [A7073A]", |
" 103c 12a4 Core Lan 1000Base-T", |
" 103c 12c1 IOX Core Lan 1000Base-T [A7109AX]", |
" 103c 1300 Core LAN/SCSI Combo [A6794A]", |
" 10a9 8010 IO9/IO10 Gigabit Ethernet (Copper)", |
" 10a9 8011 Gigabit Ethernet (Copper)", |
" 10a9 8012 Gigabit Ethernet (Fiber)", |
" 10b7 1004 3C996-SX 1000Base-SX", |
" 10b7 1006 3C996B-T 1000Base-T", |
" 10b7 1007 3C1000-T 1000Base-T", |
" 10b7 1008 3C940-BR01 1000Base-T", |
" 14e4 0001 BCM5701 1000Base-T", |
" 14e4 0005 BCM5701 1000Base-T", |
" 14e4 0006 BCM5701 1000Base-T", |
" 14e4 0007 BCM5701 1000Base-SX", |
" 14e4 0008 BCM5701 1000Base-T", |
" 14e4 8008 BCM5701 1000Base-T", |
" 1646 NetXtreme BCM5702 Gigabit Ethernet", |
" 0e11 00bb NC7760 1000BaseTX", |
" 1028 0126 Broadcom BCM5702 1000BaseTX", |
" 14e4 8009 BCM5702 1000BaseTX", |
" 1647 NetXtreme BCM5703 Gigabit Ethernet", |
" 0e11 0099 NC7780 1000BaseTX", |
" 0e11 009a NC7770 1000BaseTX", |
" 10a9 8010 SGI IO9 Gigabit Ethernet (Copper)", |
" 14e4 0009 BCM5703 1000BaseTX", |
" 14e4 000a BCM5703 1000BaseSX", |
" 14e4 000b BCM5703 1000BaseTX", |
" 14e4 8009 BCM5703 1000BaseTX", |
" 14e4 800a BCM5703 1000BaseTX", |
" 1648 NetXtreme BCM5704 Gigabit Ethernet", |
" 0e11 00cf NC7772 Gigabit Server Adapter (PCI-X, 10,100,1000-T)", |
" 0e11 00d0 NC7782 Gigabit Server Adapter (PCI-X, 10,100,1000-T)", |
" 0e11 00d1 NC7783 Gigabit Server Adapter (PCI-X, 10,100,1000-T)", |
" 10b7 2000 3C998-T Dual Port 10/100/1000 PCI-X", |
" 10b7 3000 3C999-T Quad Port 10/100/1000 PCI-X", |
" 1166 1648 NetXtreme CIOB-E 1000Base-T", |
" 1734 100b Primergy RX300", |
" 164a NetXtreme II BCM5706 Gigabit Ethernet", |
" 103c 3101 NC370T MultifuNCtion Gigabit Server Adapter", |
" 164c NetXtreme II BCM5708 Gigabit Ethernet", |
" 164d NetXtreme BCM5702FE Gigabit Ethernet", |
" 1653 NetXtreme BCM5705 Gigabit Ethernet", |
" 0e11 00e3 NC7761 Gigabit Server Adapter", |
" 1654 NetXtreme BCM5705_2 Gigabit Ethernet", |
" 0e11 00e3 NC7761 Gigabit Server Adapter", |
" 103c 3100 NC1020 HP ProLiant Gigabit Server Adapter 32 PCI", |
" 103c 3226 NC150T 4-port Gigabit Combo Switch & Adapter", |
" 1659 NetXtreme BCM5721 Gigabit Ethernet PCI Express", |
" 1014 02c6 eServer xSeries server mainboard", |
" 103c 7031 NC320T PCIe Gigabit Server Adapter", |
" 103c 7032 NC320i PCIe Gigabit Server Adapter", |
" 1734 1061 Primergy RX300 S2", |
" 165d NetXtreme BCM5705M Gigabit Ethernet", |
" 1028 865d Latitude D400", |
" 165e NetXtreme BCM5705M_2 Gigabit Ethernet", |
" 103c 088c NC8000 laptop", |
" 103c 0890 NC6000 laptop", |
" 103c 099c NX6110/NC6120", |
" 1668 NetXtreme BCM5714 Gigabit Ethernet", |
" 103c 7039 NC324i PCIe Dual Port Gigabit Server Adapter", |
" 1669 NetXtreme 5714S Gigabit Ethernet", |
" 166a NetXtreme BCM5780 Gigabit Ethernet", |
" 166b NetXtreme BCM5780S Gigabit Ethernet", |
" 166e 570x 10/100 Integrated Controller", |
" 1672 NetXtreme BCM5754M Gigabit Ethernet PCI Express", |
" 1673 NetXtreme BCM5755M Gigabit Ethernet PCI Express", |
" 1677 NetXtreme BCM5751 Gigabit Ethernet PCI Express", |
" 1028 0179 Optiplex GX280", |
" 1028 0182 Latitude D610", |
" 1028 0187 Precision M70", |
" 1028 01ad Optiplex GX620", |
" 103c 3006 DC7100 SFF(DX878AV)", |
" 1734 105d Scenic W620", |
" 1678 NetXtreme BCM5715 Gigabit Ethernet", |
" 1679 NetXtreme 5715S Gigabit Ethernet", |
" 103c 703c NC326i PCIe Dual Port Gigabit Server Adapter", |
" 167a NetXtreme BCM5754 Gigabit Ethernet PCI Express", |
" 167b NetXtreme BCM5755 Gigabit Ethernet PCI Express", |
" 167d NetXtreme BCM5751M Gigabit Ethernet PCI Express", |
" 167e NetXtreme BCM5751F Fast Ethernet PCI Express", |
" 1693 NetLink BCM5787M Gigabit Ethernet PCI Express", |
" 1696 NetXtreme BCM5782 Gigabit Ethernet", |
" 103c 12bc HP d530 CMT (DG746A)", |
" 14e4 000d NetXtreme BCM5782 1000Base-T", |
" 169b NetLink BCM5787 Gigabit Ethernet PCI Express", |
" 169c NetXtreme BCM5788 Gigabit Ethernet", |
" 103c 308b MX6125", |
" 169d NetLink BCM5789 Gigabit Ethernet PCI Express", |
" 16a6 NetXtreme BCM5702X Gigabit Ethernet", |
" 0e11 00bb NC7760 Gigabit Server Adapter (PCI-X, 10/100/1000-T)", |
" 1028 0126 BCM5702 1000Base-T", |
" 14e4 000c BCM5702 1000Base-T", |
" 14e4 8009 BCM5702 1000Base-T", |
" 16a7 NetXtreme BCM5703X Gigabit Ethernet", |
" 0e11 00ca NC7771 Gigabit Server Adapter (PCI-X, 10,100,1000-T)", |
" 0e11 00cb NC7781 Gigabit Server Adapter (PCI-X, 10,100,1000-T)", |
" 14e4 0009 NetXtreme BCM5703 1000Base-T", |
" 14e4 000a NetXtreme BCM5703 1000Base-SX", |
" 14e4 000b NetXtreme BCM5703 1000Base-T", |
" 14e4 800a NetXtreme BCM5703 1000Base-T", |
" 16a8 NetXtreme BCM5704S Gigabit Ethernet", |
" 10b7 2001 3C998-SX Dual Port 1000-SX PCI-X", |
" 16aa NetXtreme II BCM5706S Gigabit Ethernet", |
" 103c 3102 NC370F MultifuNCtion Gigabit Server Adapter", |
" 16ac NetXtreme II BCM5708S Gigabit Ethernet", |
" 16c6 NetXtreme BCM5702A3 Gigabit Ethernet", |
" 10b7 1100 3C1000B-T 10/100/1000 PCI", |
" 14e4 000c BCM5702 1000Base-T", |
" 14e4 8009 BCM5702 1000Base-T", |
" 16c7 NetXtreme BCM5703 Gigabit Ethernet", |
" 0e11 00ca NC7771 Gigabit Server Adapter (PCI-X, 10,100,1000-T)", |
" 0e11 00cb NC7781 Gigabit Server Adapter (PCI-X, 10,100,1000-T)", |
" 103c 12c3 Combo FC/GigE-SX [A9782A]", |
" 103c 12ca Combo FC/GigE-T [A9784A]", |
" 14e4 0009 NetXtreme BCM5703 1000Base-T", |
" 14e4 000a NetXtreme BCM5703 1000Base-SX", |
" 16dd NetLink BCM5781 Gigabit Ethernet PCI Express", |
" 16f7 NetXtreme BCM5753 Gigabit Ethernet PCI Express", |
" 16fd NetXtreme BCM5753M Gigabit Ethernet PCI Express", |
" 16fe NetXtreme BCM5753F Fast Ethernet PCI Express", |
" 170c BCM4401-B0 100Base-TX", |
" 1028 0188 Inspiron 6000 laptop", |
" 1028 0196 Inspiron 5160", |
" 103c 099c NX6110/NC6120", |
" 170d NetXtreme BCM5901 100Base-TX", |
" 1014 0545 ThinkPad R40e (2684-HVG) builtin ethernet controller", |
" 170e NetXtreme BCM5901 100Base-TX", |
" 3352 BCM3352", |
" 3360 BCM3360", |
" 4210 BCM4210 iLine10 HomePNA 2.0", |
" 4211 BCM4211 iLine10 HomePNA 2.0 + V.90 56k modem", |
" 4212 BCM4212 v.90 56k modem", |
" 4301 BCM4303 802.11b Wireless LAN Controller", |
" 1028 0407 TrueMobile 1180 Onboard WLAN", |
" 1043 0120 WL-103b Wireless LAN PC Card", |
" 4305 BCM4307 V.90 56k Modem", |
" 4306 BCM4307 Ethernet Controller", |
" 4307 BCM4307 802.11b Wireless LAN Controller", |
" 4310 BCM4310 Chipcommon I/OController", |
" 4312 BCM4310 UART", |
" 4313 BCM4310 Ethernet Controller", |
" 4315 BCM4310 USB Controller", |
" 4318 BCM4318 [AirForce One 54g] 802.11g Wireless LAN Controller", |
" 103c 1356 MX6125", |
" 1043 120f A6U notebook embedded card", |
" 1468 0311 Aspire 3022WLMi, 5024WLMi", |
" 1468 0312 TravelMate 2410", |
" 14e4 0449 Gateway 7510GX", |
" 14e4 4318 WPC54G version 3 [Wireless-G Notebook Adapter] 802.11g Wireless Lan Controller", |
" 16ec 0119 U.S.Robotics Wireless MAXg PC Card", |
" 1737 0048 WPC54G-EU version 3 [Wireless-G Notebook Adapter]", |
" 4319 Dell Wireless 1470 DualBand WLAN", |
" 4320 BCM4306 802.11b/g Wireless LAN Controller", |
" 1028 0001 TrueMobile 1300 WLAN Mini-PCI Card", |
" 1028 0003 Wireless 1350 WLAN Mini-PCI Card", |
" 103c 12f4 NX9500 Built-in Wireless", |
" 103c 12fa Presario R3000 802.11b/g", |
" 1043 100f WL-100G", |
" 1057 7025 WN825G", |
" 106b 004e AirPort Extreme", |
" 1154 0330 Buffalo WLI2-PCI-G54S High Speed Mode Wireless Desktop Adapter", |
" 144f 7050 eMachines M6805 802.11g Built-in Wireless", |
" 14e4 4320 Linksys WMP54G PCI", |
" 1737 4320 WPC54G", |
" 1799 7001 Belkin F5D7001 High-Speed Mode Wireless G Network Card", |
" 1799 7010 Belkin F5D7010 54g Wireless Network card", |
" 185f 1220 TravelMate 290E WLAN Mini-PCI Card", |
" 4321 BCM4306 802.11a Wireless LAN Controller", |
" 4322 BCM4306 UART", |
" 4324 BCM4309 802.11a/b/g", |
" 1028 0001 Truemobile 1400", |
" 1028 0003 Truemobile 1450 MiniPCI", |
" 4325 BCM43xG 802.11b/g", |
" 1414 0003 Wireless Notebook Adapter MN-720", |
" 1414 0004 Wireless PCI Adapter MN-730", |
" 4326 BCM4307 Chipcommon I/O Controller?", |
" 4401 BCM4401 100Base-T", |
" 1043 80a8 A7V8X motherboard", |
" 4402 BCM4402 Integrated 10/100BaseT", |
" 4403 BCM4402 V.90 56k Modem", |
" 4410 BCM4413 iLine32 HomePNA 2.0", |
" 4411 BCM4413 V.90 56k modem", |
" 4412 BCM4412 10/100BaseT", |
" 4430 BCM44xx CardBus iLine32 HomePNA 2.0", |
" 4432 BCM4432 CardBus 10/100BaseT", |
" 4610 BCM4610 Sentry5 PCI to SB Bridge", |
" 4611 BCM4610 Sentry5 iLine32 HomePNA 1.0", |
" 4612 BCM4610 Sentry5 V.90 56k Modem", |
" 4613 BCM4610 Sentry5 Ethernet Controller", |
" 4614 BCM4610 Sentry5 External Interface", |
" 4615 BCM4610 Sentry5 USB Controller", |
" 4704 BCM4704 PCI to SB Bridge", |
" 4705 BCM4704 Sentry5 802.11b Wireless LAN Controller", |
" 4706 BCM4704 Sentry5 Ethernet Controller", |
" 4707 BCM4704 Sentry5 USB Controller", |
" 4708 BCM4704 Crypto Accelerator", |
" 4710 BCM4710 Sentry5 PCI to SB Bridge", |
" 4711 BCM47xx Sentry5 iLine32 HomePNA 2.0", |
" 4712 BCM47xx V.92 56k modem", |
" 4713 Sentry5 Ethernet Controller", |
" 4714 BCM47xx Sentry5 External Interface", |
" 4715 Sentry5 USB Controller", |
" 4716 BCM47xx Sentry5 USB Host Controller", |
" 4717 BCM47xx Sentry5 USB Device Controller", |
" 4718 Sentry5 Crypto Accelerator", |
" 4719 BCM47xx/53xx RoboSwitch Core", |
" 4720 BCM4712 MIPS CPU", |
" 5365 BCM5365P Sentry5 Host Bridge", |
" 5600 BCM5600 StrataSwitch 24+2 Ethernet Switch Controller", |
" 5605 BCM5605 StrataSwitch 24+2 Ethernet Switch Controller", |
" 5615 BCM5615 StrataSwitch 24+2 Ethernet Switch Controller", |
" 5625 BCM5625 StrataSwitch 24+2 Ethernet Switch Controller", |
" 5645 BCM5645 StrataSwitch 24+2 Ethernet Switch Controller", |
" 5670 BCM5670 8-Port 10GE Ethernet Switch Fabric", |
" 5680 BCM5680 G-Switch 8 Port Gigabit Ethernet Switch Controller", |
" 5690 BCM5690 12-port Multi-Layer Gigabit Ethernet Switch", |
" 5691 BCM5691 GE/10GE 8+2 Gigabit Ethernet Switch Controller", |
" 5692 BCM5692 12-port Multi-Layer Gigabit Ethernet Switch", |
" 5820 BCM5820 Crypto Accelerator", |
" 5821 BCM5821 Crypto Accelerator", |
" 5822 BCM5822 Crypto Accelerator", |
" 5823 BCM5823 Crypto Accelerator", |
" 5824 BCM5824 Crypto Accelerator", |
" 5840 BCM5840 Crypto Accelerator", |
" 5841 BCM5841 Crypto Accelerator", |
" 5850 BCM5850 Crypto Accelerator", |
"14e5 Pixelfusion Ltd", |
"14e6 SHINING Technology Inc", |
"14e7 3CX", |
"14e8 RAYCER Inc", |
"14e9 GARNETS System CO Ltd", |
"14ea Planex Communications, Inc", |
" ab06 FNW-3603-TX CardBus Fast Ethernet", |
" ab07 RTL81xx RealTek Ethernet", |
" ab08 FNW-3602-TX CardBus Fast Ethernet", |
"14eb SEIKO EPSON Corp", |
"14ec ACQIRIS", |
"14ed DATAKINETICS Ltd", |
"14ee MASPRO KENKOH Corp", |
"14ef CARRY Computer ENG. CO Ltd", |
"14f0 CANON RESEACH CENTRE FRANCE", |
"14f1 Conexant", |
" 1002 HCF 56k Modem", |
" 1003 HCF 56k Modem", |
" 1004 HCF 56k Modem", |
" 1005 HCF 56k Modem", |
" 1006 HCF 56k Modem", |
" 1022 HCF 56k Modem", |
" 1023 HCF 56k Modem", |
" 1024 HCF 56k Modem", |
" 1025 HCF 56k Modem", |
" 1026 HCF 56k Modem", |
" 1032 HCF 56k Modem", |
" 1033 HCF 56k Data/Fax Modem", |
" 1033 8077 NEC", |
" 122d 4027 Dell Zeus - MDP3880-W(B) Data Fax Modem", |
" 122d 4030 Dell Mercury - MDP3880-U(B) Data Fax Modem", |
" 122d 4034 Dell Thor - MDP3880-W(U) Data Fax Modem", |
" 13e0 020d Dell Copper", |
" 13e0 020e Dell Silver", |
" 13e0 0261 IBM", |
" 13e0 0290 Compaq Goldwing", |
" 13e0 02a0 IBM", |
" 13e0 02b0 IBM", |
" 13e0 02c0 Compaq Scooter", |
" 13e0 02d0 IBM", |
" 144f 1500 IBM P85-DF (1)", |
" 144f 1501 IBM P85-DF (2)", |
" 144f 150a IBM P85-DF (3)", |
" 144f 150b IBM P85-DF Low Profile (1)", |
" 144f 1510 IBM P85-DF Low Profile (2)", |
" 1034 HCF 56k Data/Fax/Voice Modem", |
" 1035 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem", |
" 10cf 1098 Fujitsu P85-DFSV", |
" 1036 HCF 56k Data/Fax/Voice/Spkp Modem", |
" 104d 8067 HCF 56k Modem", |
" 122d 4029 MDP3880SP-W", |
" 122d 4031 MDP3880SP-U", |
" 13e0 0209 Dell Titanium", |
" 13e0 020a Dell Graphite", |
" 13e0 0260 Gateway Red Owl", |
" 13e0 0270 Gateway White Horse", |
" 1052 HCF 56k Data/Fax Modem (Worldwide)", |
" 1053 HCF 56k Data/Fax Modem (Worldwide)", |
" 1054 HCF 56k Data/Fax/Voice Modem (Worldwide)", |
" 1055 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem (Worldwide)", |
" 1056 HCF 56k Data/Fax/Voice/Spkp Modem (Worldwide)", |
" 1057 HCF 56k Data/Fax/Voice/Spkp Modem (Worldwide)", |
" 1059 HCF 56k Data/Fax/Voice Modem (Worldwide)", |
" 1063 HCF 56k Data/Fax Modem", |
" 1064 HCF 56k Data/Fax/Voice Modem", |
" 1065 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem", |
" 1066 HCF 56k Data/Fax/Voice/Spkp Modem", |
" 122d 4033 Dell Athena - MDP3900V-U", |
" 1085 HCF V90 56k Data/Fax/Voice/Spkp PCI Modem", |
" 1433 HCF 56k Data/Fax Modem", |
" 1434 HCF 56k Data/Fax/Voice Modem", |
" 1435 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem", |
" 1436 HCF 56k Data/Fax Modem", |
" 1453 HCF 56k Data/Fax Modem", |
" 13e0 0240 IBM", |
" 13e0 0250 IBM", |
" 144f 1502 IBM P95-DF (1)", |
" 144f 1503 IBM P95-DF (2)", |
" 1454 HCF 56k Data/Fax/Voice Modem", |
" 1455 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem", |
" 1456 HCF 56k Data/Fax/Voice/Spkp Modem", |
" 122d 4035 Dell Europa - MDP3900V-W", |
" 122d 4302 Dell MP3930V-W(C) MiniPCI", |
" 1610 ADSL AccessRunner PCI Arbitration Device", |
" 1611 AccessRunner PCI ADSL Interface Device", |
" 1620 AccessRunner V2 PCI ADSL Arbitration Device", |
" 1621 AccessRunner V2 PCI ADSL Interface Device", |
" 1622 AccessRunner V2 PCI ADSL Yukon WAN Adapter", |
" 1803 HCF 56k Modem", |
" 0e11 0023 623-LAN Grizzly", |
" 0e11 0043 623-LAN Yogi", |
" 1811 Conextant MiniPCI Network Adapter", |
" 1815 HCF 56k Modem", |
" 0e11 0022 Grizzly", |
" 0e11 0042 Yogi", |
" 2003 HSF 56k Data/Fax Modem", |
" 2004 HSF 56k Data/Fax/Voice Modem", |
" 2005 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem", |
" 2006 HSF 56k Data/Fax/Voice/Spkp Modem", |
" 2013 HSF 56k Data/Fax Modem", |
" 0e11 b195 Bear", |
" 0e11 b196 Seminole 1", |
" 0e11 b1be Seminole 2", |
" 1025 8013 Acer", |
" 1033 809d NEC", |
" 1033 80bc NEC", |
" 155d 6793 HP", |
" 155d 8850 E Machines", |
" 2014 HSF 56k Data/Fax/Voice Modem", |
" 2015 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem", |
" 2016 HSF 56k Data/Fax/Voice/Spkp Modem", |
" 2043 HSF 56k Data/Fax Modem (WorldW SmartDAA)", |
" 2044 HSF 56k Data/Fax/Voice Modem (WorldW SmartDAA)", |
" 2045 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem (WorldW SmartDAA)", |
" 14f1 2045 Generic SoftK56", |
" 2046 HSF 56k Data/Fax/Voice/Spkp Modem (WorldW SmartDAA)", |
" 2063 HSF 56k Data/Fax Modem (SmartDAA)", |
" 2064 HSF 56k Data/Fax/Voice Modem (SmartDAA)", |
" 2065 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem (SmartDAA)", |
" 2066 HSF 56k Data/Fax/Voice/Spkp Modem (SmartDAA)", |
" 2093 HSF 56k Modem", |
" 155d 2f07 Legend", |
" 2143 HSF 56k Data/Fax/Cell Modem (Mob WorldW SmartDAA)", |
" 2144 HSF 56k Data/Fax/Voice/Cell Modem (Mob WorldW SmartDAA)", |
" 2145 HSF 56k Data/Fax/Voice/Spkp (w/HS)/Cell Modem (Mob WorldW SmartDAA)", |
" 2146 HSF 56k Data/Fax/Voice/Spkp/Cell Modem (Mob WorldW SmartDAA)", |
" 2163 HSF 56k Data/Fax/Cell Modem (Mob SmartDAA)", |
" 2164 HSF 56k Data/Fax/Voice/Cell Modem (Mob SmartDAA)", |
" 2165 HSF 56k Data/Fax/Voice/Spkp (w/HS)/Cell Modem (Mob SmartDAA)", |
" 2166 HSF 56k Data/Fax/Voice/Spkp/Cell Modem (Mob SmartDAA)", |
" 2343 HSF 56k Data/Fax CardBus Modem (Mob WorldW SmartDAA)", |
" 2344 HSF 56k Data/Fax/Voice CardBus Modem (Mob WorldW SmartDAA)", |
" 2345 HSF 56k Data/Fax/Voice/Spkp (w/HS) CardBus Modem (Mob WorldW SmartDAA)", |
" 2346 HSF 56k Data/Fax/Voice/Spkp CardBus Modem (Mob WorldW SmartDAA)", |
" 2363 HSF 56k Data/Fax CardBus Modem (Mob SmartDAA)", |
" 2364 HSF 56k Data/Fax/Voice CardBus Modem (Mob SmartDAA)", |
" 2365 HSF 56k Data/Fax/Voice/Spkp (w/HS) CardBus Modem (Mob SmartDAA)", |
" 2366 HSF 56k Data/Fax/Voice/Spkp CardBus Modem (Mob SmartDAA)", |
" 2443 HSF 56k Data/Fax Modem (Mob WorldW SmartDAA)", |
" 104d 8075 Modem", |
" 104d 8083 Modem", |
" 104d 8097 Modem", |
" 2444 HSF 56k Data/Fax/Voice Modem (Mob WorldW SmartDAA)", |
" 2445 HSF 56k Data/Fax/Voice/Spkp (w/HS) Modem (Mob WorldW SmartDAA)", |
" 2446 HSF 56k Data/Fax/Voice/Spkp Modem (Mob WorldW SmartDAA)", |
" 2463 HSF 56k Data/Fax Modem (Mob SmartDAA)", |
" 2464 HSF 56k Data/Fax/Voice Modem (Mob SmartDAA)", |
" 2465 HSF 56k Data/Fax/Voice/Spkp (w/HS) Modem (Mob SmartDAA)", |
" 2466 HSF 56k Data/Fax/Voice/Spkp Modem (Mob SmartDAA)", |
" 2bfa HDAudio Soft Data Fax Modem with SmartCP", |
" 2f00 HSF 56k HSFi Modem", |
" 13e0 8d84 IBM HSFi V.90", |
" 13e0 8d85 Compaq Stinger", |
" 14f1 2004 Dynalink 56PMi", |
" 2f02 HSF 56k HSFi Data/Fax", |
" 2f11 HSF 56k HSFi Modem", |
" 2f20 HSF 56k Data/Fax Modem", |
" 8234 RS8234 ATM SAR Controller [ServiceSAR Plus]", |
" 8800 CX23880/1/2/3 PCI Video and Audio Decoder", |
" 0070 2801 Hauppauge WinTV 28xxx (Roslyn) models", |
" 0070 3401 Hauppauge WinTV 34xxx models", |
" 0070 9001 Nova-T DVB-T", |
" 0070 9200 Nova-SE2 DVB-S", |
" 0070 9202 Nova-S-Plus DVB-S", |
" 0070 9402 WinTV-HVR1100 DVB-T/Hybrid", |
" 0070 9802 WinTV-HVR1100 DVB-T/Hybrid (Low Profile)", |
" 1002 00f8 ATI TV Wonder Pro", |
" 1002 a101 HDTV Wonder", |
" 1043 4823 ASUS PVR-416", |
" 107d 6613 Leadtek Winfast 2000XP Expert", |
" 107d 6620 Leadtek Winfast DV2000", |
" 107d 663c Leadtek PVR 2000", |
" 107d 665f WinFast DTV1000-T", |
" 10fc d003 IODATA GV-VCP3/PCI", |
" 10fc d035 IODATA GV/BCTV7E", |
" 1421 0334 Instant TV DVB-T PCI", |
" 1461 000a AVerTV 303 (M126)", |
" 1461 000b AverTV Studio 303 (M126)", |
" 1461 8011 UltraTV Media Center PCI 550", |
" 1462 8606 MSI TV-@nywhere Master", |
" 14c7 0107 GDI Black Gold", |
" 14f1 0187 Conexant DVB-T reference design", |
" 14f1 0342 Digital-Logic MICROSPACE Entertainment Center (MEC)", |
" 153b 1166 Cinergy 1400 DVB-T", |
" 1540 2580 Provideo PV259", |
" 1554 4811 PixelView", |
" 1554 4813 Club 3D ZAP1000 MCE Edition", |
" 17de 08a1 KWorld/VStream XPert DVB-T with cx22702", |
" 17de 08a6 KWorld/VStream XPert DVB-T", |
" 17de 08b2 KWorld DVB-S 100", |
" 17de a8a6 digitalnow DNTV Live! DVB-T", |
" 1822 0025 digitalnow DNTV Live! DVB-T Pro", |
" 18ac d500 FusionHDTV 5 Gold", |
" 18ac d810 FusionHDTV 3 Gold-Q", |
" 18ac d820 FusionHDTV 3 Gold-T", |
" 18ac db00 FusionHDTV DVB-T1", |
" 18ac db11 FusionHDTV DVB-T Plus", |
" 18ac db50 FusionHDTV DVB-T Dual Digital", |
" 7063 3000 pcHDTV HD3000 HDTV", |
" 8801 CX23880/1/2/3 PCI Video and Audio Decoder [Audio Port]", |
" 0070 2801 Hauppauge WinTV 28xxx (Roslyn) models", |
" 8802 CX23880/1/2/3 PCI Video and Audio Decoder [MPEG Port]", |
" 0070 2801 Hauppauge WinTV 28xxx (Roslyn) models", |
" 0070 9002 Nova-T DVB-T Model 909", |
" 1043 4823 ASUS PVR-416", |
" 107d 663c Leadtek PVR 2000", |
" 14f1 0187 Conexant DVB-T reference design", |
" 17de 08a1 XPert DVB-T PCI BDA DVBT 23880 Transport Stream Capture", |
" 17de 08a6 KWorld/VStream XPert DVB-T", |
" 18ac d500 DViCO FusionHDTV5 Gold", |
" 18ac d810 DViCO FusionHDTV3 Gold-Q", |
" 18ac d820 DViCO FusionHDTV3 Gold-T", |
" 18ac db00 DVICO FusionHDTV DVB-T1", |
" 18ac db10 DVICO FusionHDTV DVB-T Plus", |
" 7063 3000 pcHDTV HD3000 HDTV", |
" 8804 CX23880/1/2/3 PCI Video and Audio Decoder [IR Port]", |
" 0070 9002 Nova-T DVB-T Model 909", |
" 8811 CX23880/1/2/3 PCI Video and Audio Decoder [Audio Port]", |
" 0070 3401 Hauppauge WinTV 34xxx models", |
" 1462 8606 MSI TV-@nywhere Master", |
" 18ac d500 DViCO FusionHDTV5 Gold", |
" 18ac d810 DViCO FusionHDTV3 Gold-Q", |
" 18ac d820 DViCO FusionHDTV3 Gold-T", |
" 18ac db00 DVICO FusionHDTV DVB-T1", |
"14f2 MOBILITY Electronics", |
" 0120 EV1000 bridge", |
" 0121 EV1000 Parallel port", |
" 0122 EV1000 Serial port", |
" 0123 EV1000 Keyboard controller", |
" 0124 EV1000 Mouse controller", |
"14f3 BroadLogic", |
" 2030 2030 DVB-S Satellite Reciever", |
" 2050 2050 DVB-T Terrestrial (Cable) Reciever", |
" 2060 2060 ATSC Terrestrial (Cable) Reciever", |
"14f4 TOKYO Electronic Industry CO Ltd", |
"14f5 SOPAC Ltd", |
"14f6 COYOTE Technologies LLC", |
"14f7 WOLF Technology Inc", |
"14f8 AUDIOCODES Inc", |
" 2077 TP-240 dual span E1 VoIP PCI card", |
"14f9 AG COMMUNICATIONS", |
"14fa WANDEL & GOLTERMANN", |
"14fb TRANSAS MARINE (UK) Ltd", |
"14fc Quadrics Ltd", |
" 0000 QsNet Elan3 Network Adapter", |
" 0001 QsNetII Elan4 Network Adapter", |
" 0002 QsNetIII Elan5 Network Adapter", |
"14fd JAPAN Computer Industry Inc", |
"14fe ARCHTEK TELECOM Corp", |
"14ff TWINHEAD INTERNATIONAL Corp", |
"1500 DELTA Electronics, Inc", |
" 1360 RTL81xx RealTek Ethernet", |
"1501 BANKSOFT CANADA Ltd", |
"1502 MITSUBISHI ELECTRIC LOGISTICS SUPPORT Co Ltd", |
"1503 KAWASAKI LSI USA Inc", |
"1504 KAISER Electronics", |
"1505 ITA INGENIEURBURO FUR TESTAUFGABEN GmbH", |
"1506 CHAMELEON Systems Inc", |
"1507 Motorola ?? / HTEC", |
" 0001 MPC105 [Eagle]", |
" 0002 MPC106 [Grackle]", |
" 0003 MPC8240 [Kahlua]", |
" 0100 MC145575 [HFC-PCI]", |
" 0431 KTI829c 100VG", |
" 4801 Raven", |
" 4802 Falcon", |
" 4803 Hawk", |
" 4806 CPX8216", |
"1508 HONDA CONNECTORS/MHOTRONICS Inc", |
"1509 FIRST INTERNATIONAL Computer Inc", |
"150a FORVUS RESEARCH Inc", |
"150b YAMASHITA Systems Corp", |
"150c KYOPAL CO Ltd", |
"150d WARPSPPED Inc", |
"150e C-PORT Corp", |
"150f INTEC GmbH", |
"1510 BEHAVIOR TECH Computer Corp", |
"1511 CENTILLIUM Technology Corp", |
"1512 ROSUN Technologies Inc", |
"1513 Raychem", |
"1514 TFL LAN Inc", |
"1515 Advent design", |
"1516 MYSON Technology Inc", |
" 0800 MTD-8xx 100/10M Ethernet PCI Adapter", |
" 0803 SURECOM EP-320X-S 100/10M Ethernet PCI Adapter", |
" 1320 10bd SURECOM EP-320X-S 100/10M Ethernet PCI Adapter", |
" 0891 MTD-8xx 100/10M Ethernet PCI Adapter", |
"1517 ECHOTEK Corp", |
"1518 PEP MODULAR Computers GmbH", |
"1519 TELEFON AKTIEBOLAGET LM Ericsson", |
"151a Globetek", |
" 1002 PCI-1002", |
" 1004 PCI-1004", |
" 1008 PCI-1008", |
"151b COMBOX Ltd", |
"151c DIGITAL AUDIO LABS Inc", |
" 0003 Prodif T 2496", |
" 4000 Prodif 88", |
"151d Fujitsu Computer Products Of America", |
"151e MATRIX Corp", |
"151f TOPIC SEMICONDUCTOR Corp", |
" 0000 TP560 Data/Fax/Voice 56k modem", |
"1520 CHAPLET System Inc", |
"1521 BELL Corp", |
"1522 MainPine Ltd", |
" 0100 PCI <-> IOBus Bridge", |
" 1522 0200 RockForceDUO 2 Port V.92/V.44 Data/Fax/Voice Modem", |
" 1522 0300 RockForceQUATRO 4 Port V.92/V.44 Data/Fax/Voice Modem", |
" 1522 0400 RockForceDUO+ 2 Port V.92/V.44 Data/Fax/Voice Modem", |
" 1522 0500 RockForceQUATRO+ 4 Port V.92/V.44 Data/Fax/Voice Modem", |
" 1522 0600 RockForce+ 2 Port V.90 Data/Fax/Voice Modem", |
" 1522 0700 RockForce+ 4 Port V.90 Data/Fax/Voice Modem", |
" 1522 0800 RockForceOCTO+ 8 Port V.92/V.44 Data/Fax/Voice Modem", |
" 1522 0c00 RockForceDUO+ 2 Port V.92/V.44 Data, V.34 Super-G3 Fax, Voice Modem", |
" 1522 0d00 RockForceQUATRO+ 4 Port V.92/V.44 Data, V.34 Super-G3 Fax, Voice Modem", |
" 1522 1d00 RockForceOCTO+ 8 Port V.92/V.44 Data, V.34 Super-G3 Fax, Voice Modem", |
" 1522 2000 RockForceD1 1 Port V.90 Data Modem", |
" 1522 2100 RockForceF1 1 Port V.34 Super-G3 Fax Modem", |
" 1522 2200 RockForceD2 2 Port V.90 Data Modem", |
" 1522 2300 RockForceF2 2 Port V.34 Super-G3 Fax Modem", |
" 1522 2400 RockForceD4 4 Port V.90 Data Modem", |
" 1522 2500 RockForceF4 4 Port V.34 Super-G3 Fax Modem", |
" 1522 2600 RockForceD8 8 Port V.90 Data Modem", |
" 1522 2700 RockForceF8 8 Port V.34 Super-G3 Fax Modem", |
"1523 MUSIC Semiconductors", |
"1524 ENE Technology Inc", |
" 0510 CB710 Memory Card Reader Controller", |
" 103c 006a NX9500", |
" 0520 FLASH memory: ENE Technology Inc:", |
" 0530 ENE PCI Memory Stick Card Reader Controller", |
" 0550 ENE PCI Secure Digital Card Reader Controller", |
" 0610 PCI Smart Card Reader Controller", |
" 1211 CB1211 Cardbus Controller", |
" 1225 CB1225 Cardbus Controller", |
" 1410 CB1410 Cardbus Controller", |
" 1025 003c CL50 motherboard", |
" 1025 005a TravelMate 290", |
" 1411 CB-710/2/4 Cardbus Controller", |
" 103c 006a NX9500", |
" 1412 CB-712/4 Cardbus Controller", |
" 1420 CB1420 Cardbus Controller", |
" 1421 CB-720/2/4 Cardbus Controller", |
" 1422 CB-722/4 Cardbus Controller", |
"1525 IMPACT Technologies", |
"1526 ISS, Inc", |
"1527 SOLECTRON", |
"1528 ACKSYS", |
"1529 AMERICAN MICROSystems Inc", |
"152a QUICKTURN DESIGN Systems", |
"152b FLYTECH Technology CO Ltd", |
"152c MACRAIGOR Systems LLC", |
"152d QUANTA Computer Inc", |
"152e MELEC Inc", |
"152f PHILIPS - CRYPTO", |
"1530 ACQIS Technology Inc", |
"1531 CHRYON Corp", |
"1532 ECHELON Corp", |
" 0020 LonWorks PCLTA-20 PCI LonTalk Adapter", |
"1533 BALTIMORE", |
"1534 ROAD Corp", |
"1535 EVERGREEN Technologies Inc", |
"1537 DATALEX COMMUNCATIONS", |
"1538 ARALION Inc", |
" 0303 ARS106S Ultra ATA 133/100/66 Host Controller", |
"1539 ATELIER INFORMATIQUES et ELECTRONIQUE ETUDES S.A.", |
"153a ONO SOKKI", |
"153b TERRATEC Electronic GmbH", |
" 1144 Aureon 5.1", |
" 1147 Aureon 5.1 Sky", |
" 1158 Philips Semiconductors SAA7134 (rev 01) [Terratec Cinergy 600 TV]", |
"153c ANTAL Electronic", |
"153d FILANET Corp", |
"153e TECHWELL Inc", |
"153f MIPS Technologies, Inc.", |
" 0001 SOC-it 101 System Controller", |
"1540 PROVIDEO MULTIMEDIA Co Ltd", |
"1541 MACHONE Communications", |
"1542 Concurrent Computer Corporation", |
"1543 SILICON Laboratories", |
" 3052 Intel 537 [Winmodem]", |
" 4c22 Si3036 MC'97 DAA", |
"1544 DCM DATA Systems", |
"1545 VISIONTEK", |
"1546 IOI Technology Corp", |
"1547 MITUTOYO Corp", |
"1548 JET PROPULSION Laboratory", |
"1549 INTERCONNECT Systems Solutions", |
"154a MAX Technologies Inc", |
"154b COMPUTEX Co Ltd", |
"154c VISUAL Technology Inc", |
"154d PAN INTERNATIONAL Industrial Corp", |
"154e SERVOTEST Ltd", |
"154f STRATABEAM Technology", |
"1550 OPEN NETWORK Co Ltd", |
"1551 SMART Electronic DEVELOPMENT GmBH", |
"1552 RACAL AIRTECH Ltd", |
"1553 CHICONY Electronics Co Ltd", |
"1554 PROLINK Microsystems Corp", |
"1555 GESYTEC GmBH", |
"1556 PLD APPLICATIONS", |
"1557 MEDIASTAR Co Ltd", |
"1558 CLEVO/KAPOK Computer", |
"1559 SI LOGIC Ltd", |
"155a INNOMEDIA Inc", |
"155b PROTAC INTERNATIONAL Corp", |
"155c Cemax-Icon Inc", |
"155d Mac System Co Ltd", |
"155e LP Elektronik GmbH", |
"155f Perle Systems Ltd", |
"1560 Terayon Communications Systems", |
"1561 Viewgraphics Inc", |
"1562 Symbol Technologies", |
"1563 A-Trend Technology Co Ltd", |
"1564 Yamakatsu Electronics Industry Co Ltd", |
"1565 Biostar Microtech Int'l Corp", |
"1566 Ardent Technologies Inc", |
"1567 Jungsoft", |
"1568 DDK Electronics Inc", |
"1569 Palit Microsystems Inc.", |
"156a Avtec Systems", |
"156b 2wire Inc", |
"156c Vidac Electronics GmbH", |
"156d Alpha-Top Corp", |
"156e Alfa Inc", |
"156f M-Systems Flash Disk Pioneers Ltd", |
"1570 Lecroy Corp", |
"1571 Contemporary Controls", |
" a001 CCSI PCI20-485 ARCnet", |
" a002 CCSI PCI20-485D ARCnet", |
" a003 CCSI PCI20-485X ARCnet", |
" a004 CCSI PCI20-CXB ARCnet", |
" a005 CCSI PCI20-CXS ARCnet", |
" a006 CCSI PCI20-FOG-SMA ARCnet", |
" a007 CCSI PCI20-FOG-ST ARCnet", |
" a008 CCSI PCI20-TB5 ARCnet", |
" a009 CCSI PCI20-5-485 5Mbit ARCnet", |
" a00a CCSI PCI20-5-485D 5Mbit ARCnet", |
" a00b CCSI PCI20-5-485X 5Mbit ARCnet", |
" a00c CCSI PCI20-5-FOG-ST 5Mbit ARCnet", |
" a00d CCSI PCI20-5-FOG-SMA 5Mbit ARCnet", |
" a201 CCSI PCI22-485 10Mbit ARCnet", |
" a202 CCSI PCI22-485D 10Mbit ARCnet", |
" a203 CCSI PCI22-485X 10Mbit ARCnet", |
" a204 CCSI PCI22-CHB 10Mbit ARCnet", |
" a205 CCSI PCI22-FOG_ST 10Mbit ARCnet", |
" a206 CCSI PCI22-THB 10Mbit ARCnet", |
"1572 Otis Elevator Company", |
"1573 Lattice - Vantis", |
"1574 Fairchild Semiconductor", |
"1575 Voltaire Advanced Data Security Ltd", |
"1576 Viewcast COM", |
"1578 HITT", |
" 5615 VPMK3 [Video Processor Mk III]", |
"1579 Dual Technology Corp", |
"157a Japan Elecronics Ind Inc", |
"157b Star Multimedia Corp", |
"157c Eurosoft (UK)", |
" 8001 Fix2000 PCI Y2K Compliance Card", |
"157d Gemflex Networks", |
"157e Transition Networks", |
"157f PX Instruments Technology Ltd", |
"1580 Primex Aerospace Co", |
"1581 SEH Computertechnik GmbH", |
"1582 Cytec Corp", |
"1583 Inet Technologies Inc", |
"1584 Uniwill Computer Corp", |
"1585 Logitron", |
"1586 Lancast Inc", |
"1587 Konica Corp", |
"1588 Solidum Systems Corp", |
"1589 Atlantek Microsystems Pty Ltd", |
"158a Digalog Systems Inc", |
"158b Allied Data Technologies", |
"158c Hitachi Semiconductor & Devices Sales Co Ltd", |
"158d Point Multimedia Systems", |
"158e Lara Technology Inc", |
"158f Ditect Coop", |
"1590 3pardata Inc", |
"1591 ARN", |
"1592 Syba Tech Ltd", |
" 0781 Multi-IO Card", |
" 0782 Parallel Port Card 2xEPP", |
" 0783 Multi-IO Card", |
" 0785 Multi-IO Card", |
" 0786 Multi-IO Card", |
" 0787 Multi-IO Card", |
" 0788 Multi-IO Card", |
" 078a Multi-IO Card", |
"1593 Bops Inc", |
"1594 Netgame Ltd", |
"1595 Diva Systems Corp", |
"1596 Folsom Research Inc", |
"1597 Memec Design Services", |
"1598 Granite Microsystems", |
"1599 Delta Electronics Inc", |
"159a General Instrument", |
"159b Faraday Technology Corp", |
"159c Stratus Computer Systems", |
"159d Ningbo Harrison Electronics Co Ltd", |
"159e A-Max Technology Co Ltd", |
"159f Galea Network Security", |
"15a0 Compumaster SRL", |
"15a1 Geocast Network Systems", |
"15a2 Catalyst Enterprises Inc", |
" 0001 TA700 PCI Bus Analyzer/Exerciser", |
"15a3 Italtel", |
"15a4 X-Net OY", |
"15a5 Toyota Macs Inc", |
"15a6 Sunlight Ultrasound Technologies Ltd", |
"15a7 SSE Telecom Inc", |
"15a8 Shanghai Communications Technologies Center", |
"15aa Moreton Bay", |
"15ab Bluesteel Networks Inc", |
"15ac North Atlantic Instruments", |
"15ad VMware Inc", |
" 0405 [VMware SVGA II] PCI Display Adapter", |
" 0710 Virtual SVGA", |
" 0720 VMware High-Speed Virtual NIC [vmxnet]", |
"15ae Amersham Pharmacia Biotech", |
"15b0 Zoltrix International Ltd", |
"15b1 Source Technology Inc", |
"15b2 Mosaid Technologies Inc", |
"15b3 Mellanox Technologies", |
" 5274 MT21108 InfiniBridge", |
" 5a44 MT23108 InfiniHost", |
" 5a45 MT23108 [Infinihost HCA Flash Recovery]", |
" 5a46 MT23108 PCI Bridge", |
" 5e8d MT25204 [InfiniHost III Lx HCA Flash Recovery]", |
" 6274 MT25204 [InfiniHost III Lx HCA]", |
" 6278 MT25208 InfiniHost III Ex (Tavor compatibility mode)", |
" 6279 MT25208 [InfiniHost III Ex HCA Flash Recovery]", |
" 6282 MT25208 InfiniHost III Ex", |
"15b4 CCI/TRIAD", |
"15b5 Cimetrics Inc", |
"15b6 Texas Memory Systems Inc", |
"15b7 Sandisk Corp", |
"15b8 ADDI-DATA GmbH", |
"15b9 Maestro Digital Communications", |
"15ba Impacct Technology Corp", |
"15bb Portwell Inc", |
"15bc Agilent Technologies", |
" 1100 E8001-66442 PCI Express CIC", |
" 2922 64 Bit, 133MHz PCI-X Exerciser & Protocol Checker", |
" 2928 64 Bit, 66MHz PCI Exerciser & Analyzer", |
" 2929 64 Bit, 133MHz PCI-X Analyzer & Exerciser", |
"15bd DFI Inc", |
"15be Sola Electronics", |
"15bf High Tech Computer Corp (HTC)", |
"15c0 BVM Ltd", |
"15c1 Quantel", |
"15c2 Newer Technology Inc", |
"15c3 Taiwan Mycomp Co Ltd", |
"15c4 EVSX Inc", |
"15c5 Procomp Informatics Ltd", |
" 8010 1394b - 1394 Firewire 3-Port Host Adapter Card", |
"15c6 Technical University of Budapest", |
"15c7 Tateyama System Laboratory Co Ltd", |
" 0349 Tateyama C-PCI PLC/NC card Rev.01A", |
"15c8 Penta Media Co Ltd", |
"15c9 Serome Technology Inc", |
"15ca Bitboys OY", |
"15cb AG Electronics Ltd", |
"15cc Hotrail Inc", |
"15cd Dreamtech Co Ltd", |
"15ce Genrad Inc", |
"15cf Hilscher GmbH", |
"15d1 Infineon Technologies AG", |
"15d2 FIC (First International Computer Inc)", |
"15d3 NDS Technologies Israel Ltd", |
"15d4 Iwill Corp", |
"15d5 Tatung Co", |
"15d6 Entridia Corp", |
"15d7 Rockwell-Collins Inc", |
"15d8 Cybernetics Technology Co Ltd", |
"15d9 Super Micro Computer Inc", |
"15da Cyberfirm Inc", |
"15db Applied Computing Systems Inc", |
"15dc Litronic Inc", |
" 0001 Argus 300 PCI Cryptography Module", |
"15dd Sigmatel Inc", |
"15de Malleable Technologies Inc", |
"15df Infinilink Corp", |
"15e0 Cacheflow Inc", |
"15e1 Voice Technologies Group Inc", |
"15e2 Quicknet Technologies Inc", |
"15e3 Networth Technologies Inc", |
"15e4 VSN Systemen BV", |
"15e5 Valley technologies Inc", |
"15e6 Agere Inc", |
"15e7 Get Engineering Corp", |
"15e8 National Datacomm Corp", |
" 0130 Wireless PCI Card", |
"15e9 Pacific Digital Corp", |
" 1841 ADMA-100 DiscStaQ ATA Controller", |
"15ea Tokyo Denshi Sekei K.K.", |
"15eb Drsearch GmbH", |
"15ec Beckhoff GmbH", |
" 3101 FC3101 Profibus DP 1 Channel PCI", |
" 5102 FC5102", |
"15ed Macrolink Inc", |
"15ee In Win Development Inc", |
"15ef Intelligent Paradigm Inc", |
"15f0 B-Tree Systems Inc", |
"15f1 Times N Systems Inc", |
"15f2 Diagnostic Instruments Inc", |
"15f3 Digitmedia Corp", |
"15f4 Valuesoft", |
"15f5 Power Micro Research", |
"15f6 Extreme Packet Device Inc", |
"15f7 Banctec", |
"15f8 Koga Electronics Co", |
"15f9 Zenith Electronics Corp", |
"15fa J.P. Axzam Corp", |
"15fb Zilog Inc", |
"15fc Techsan Electronics Co Ltd", |
"15fd N-CUBED.NET", |
"15fe Kinpo Electronics Inc", |
"15ff Fastpoint Technologies Inc", |
"1600 Northrop Grumman - Canada Ltd", |
"1601 Tenta Technology", |
"1602 Prosys-tec Inc", |
"1603 Nokia Wireless Communications", |
"1604 Central System Research Co Ltd", |
"1605 Pairgain Technologies", |
"1606 Europop AG", |
"1607 Lava Semiconductor Manufacturing Inc", |
"1608 Automated Wagering International", |
"1609 Scimetric Instruments Inc", |
"1612 Telesynergy Research Inc.", |
"1619 FarSite Communications Ltd", |
" 0400 FarSync T2P (2 port X.21/V.35/V.24)", |
" 0440 FarSync T4P (4 port X.21/V.35/V.24)", |
" 0610 FarSync T1U (1 port X.21/V.35/V.24)", |
" 0620 FarSync T2U (2 port X.21/V.35/V.24)", |
" 0640 FarSync T4U (4 port X.21/V.35/V.24)", |
" 1610 FarSync TE1 (T1,E1)", |
" 2610 FarSync DSL-S1 (SHDSL)", |
"161f Rioworks", |
"1626 TDK Semiconductor Corp.", |
" 8410 RTL81xx Fast Ethernet", |
"1629 Kongsberg Spacetec AS", |
" 1003 Format synchronizer v3.0", |
" 2002 Fast Universal Data Output", |
"1637 Linksys", |
" 3874 Linksys 802.11b WMP11 PCI Wireless card", |
"1638 Standard Microsystems Corp [SMC]", |
" 1100 SMC2602W EZConnect / Addtron AWA-100 / Eumitcom PCI WL11000", |
"163c Smart Link Ltd.", |
" 3052 SmartLink SmartPCI562 56K Modem", |
" 5449 SmartPCI561 Modem", |
"1657 Brocade Communications Systems, Inc.", |
"165a Epix Inc", |
" c100 PIXCI(R) CL1 Camera Link Video Capture Board [custom QL5232]", |
" d200 PIXCI(R) D2X Digital Video Capture Board [custom QL5232]", |
" d300 PIXCI(R) D3X Digital Video Capture Board [custom QL5232]", |
"165d Hsing Tech. Enterprise Co., Ltd.", |
"165f Linux Media Labs, LLC", |
" 1020 LMLM4 MPEG-4 encoder", |
"1661 Worldspace Corp.", |
"1668 Actiontec Electronics Inc", |
" 0100 Mini-PCI bridge", |
"166d Broadcom Corporation", |
" 0001 SiByte BCM1125/1125H/1250 System-on-a-Chip PCI", |
" 0002 SiByte BCM1125H/1250 System-on-a-Chip HyperTransport", |
"1677 Bernecker + Rainer", |
" 104e 5LS172.6 B&R Dual CAN Interface Card", |
" 12d7 5LS172.61 B&R Dual CAN Interface Card", |
"167b ZyDAS Technology Corp.", |
" 2102 ZyDAS ZD1202", |
" 187e 3406 ZyAIR B-122 CardBus 11Mbs Wireless LAN Card", |
"1681 Hercules", |
" 0010 Hercules 3d Prophet II Ultra 64MB (350 MHz NV15BR core)", |
"1682 XFX Pine Group Inc.", |
"1688 CastleNet Technology Inc.", |
" 1170 WLAN 802.11b card", |
"168c Atheros Communications, Inc.", |
" 0007 AR5000 802.11a Wireless Adapter", |
" 0011 AR5210 802.11a NIC", |
" 0012 AR5211 802.11ab NIC", |
" 0013 AR5212 802.11abg NIC", |
" 1113 d301 Philips CPWNA100 Wireless CardBus adapter", |
" 1186 3202 D-link DWL-G650 (Rev B3,B5) Wireless cardbus adapter", |
" 1186 3203 DWL-G520 Wireless PCI Adapter", |
" 1186 3a12 D-Link AirPlus DWL-G650 Wireless Cardbus Adapter(rev.C)", |
" 1186 3a13 D-Link AirPlus DWL-G520 Wireless PCI Adapter(rev.B)", |
" 1186 3a14 D-Link AirPremier DWL-AG530 Wireless PCI Adapter", |
" 1186 3a17 D-Link AirPremier DWL-G680 Wireless Cardbus Adapter", |
" 1186 3a18 D-Link AirPremier DWL-G550 Wireless PCI Adapter", |
" 1186 3a63 D-Link AirPremier DWL-AG660 Wireless Cardbus Adapter", |
" 1186 3a94 C54C Wireless 801.11g cardbus", |
" 1186 3ab0 Allnet ALL0281 Wireless PCI Card", |
" 1385 4d00 Netgear WG311T Wireless PCI Adapter", |
" 1458 e911 Gigabyte GN-WIAG02", |
" 14b7 0a60 8482-WD ORiNOCO 11a/b/g Wireless PCI Adapter", |
" 168c 0013 AirPlus XtremeG DWL-G650 Wireless PCMCIA Adapter", |
" 168c 1025 DWL-G650B2 Wireless CardBus Adapter", |
" 168c 1027 Netgate NL-3054CB ARIES b/g CardBus Adapter", |
" 168c 2026 Netgate 5354MP ARIES a(108Mb turbo)/b/g MiniPCI Adapter", |
" 168c 2041 Netgate 5354MP Plus ARIES2 b/g MiniPCI Adapter", |
" 168c 2042 Netgate 5354MP Plus ARIES2 a/b/g MiniPCI Adapter", |
" 16ab 7302 Trust Speedshare Turbo Pro Wireless PCI Adapter", |
" 185f 2012 Wistron NeWeb WLAN a+b+g model CB9", |
" 001a AR5005G 802.11abg NIC", |
" 1113 ee20 SMC Wireless CardBus Adapter 802.11g (SMCWCB-G EU)", |
" 1113 ee24 SMC Wireless PCI Card WPCI-G", |
" 1186 3a15 D-Link AirPlus G DWL-G630 Wireless Cardbus Adapter(rev.D)", |
" 1186 3a16 D-Link AirPlus G DWL-G510 Wireless PCI Adapter(rev.B)", |
" 1186 3a23 D-Link AirPlus G DWL-G520+A Wireless PCI Adapter", |
" 1186 3a24 D-Link AirPlus G DWL-G650+A Wireless Cardbus Adapter", |
" 168c 1052 TP-Link TL-WN510G Wireless CardBus Adapter", |
" 001b AR5006X 802.11abg NIC", |
" 1186 3a19 D-Link AirPremier AG DWL-AG660 Wireless Cardbus Adapter", |
" 1186 3a22 D-Link AirPremier AG DWL-AG530 Wireless PCI Adapter", |
" 168c 2062 EnGenius EMP-8602 (400mw)", |
" 168c 2063 EnGenius EMP-8602 (400mw)", |
" 0020 AR5005VL 802.11bg Wireless NIC", |
" 1014 AR5212 802.11abg NIC", |
"1695 EPoX Computer Co., Ltd.", |
"169c Netcell Corporation", |
" 0044 Revolution Storage Processing Card", |
"16a5 Tekram Technology Co.,Ltd.", |
"16ab Global Sun Technology Inc", |
" 1100 GL24110P", |
" 1101 PLX9052 PCMCIA-to-PCI Wireless LAN", |
" 1102 PCMCIA-to-PCI Wireless Network Bridge", |
" 8501 WL-8305 Wireless LAN PCI Adapter", |
"16ae Safenet Inc", |
" 1141 SafeXcel-1141", |
"16af SparkLAN Communications, Inc.", |
"16b4 Aspex Semiconductor Ltd", |
"16b8 Sonnet Technologies, Inc.", |
"16be Creatix Polymedia GmbH", |
"16c6 Micrel-Kendin", |
" 8695 Centaur KS8695 ARM processor", |
"16c8 Octasic Inc.", |
"16c9 EONIC B.V. The Netherlands", |
"16ca CENATEK Inc", |
" 0001 Rocket Drive DL", |
"16cd Densitron Technologies", |
"16ce Roland Corp.", |
"16d5 Acromag, Inc.", |
" 4d4e PMC482, APC482, AcPC482 Counter Timer Board", |
"16df PIKA Technologies Inc.", |
"16e3 European Space Agency", |
" 1e0f LEON2FT Processor", |
"16ec U.S. Robotics", |
" 00ff USR997900 10/100 Mbps PCI Network Card", |
" 0116 USR997902 10/100/1000 Mbps PCI Network Card", |
" 3685 Wireless Access PCI Adapter Model 022415", |
"16ed Sycron N. V.", |
" 1001 UMIO communication card", |
"16f3 Jetway Information Co., Ltd.", |
"16f4 Vweb Corp", |
" 8000 VW2010", |
"16f6 VideoTele.com, Inc.", |
"1702 Internet Machines Corporation (IMC)", |
"1705 Digital First, Inc.", |
"170b NetOctave", |
" 0100 NSP2000-SSL crypto accelerator", |
"170c YottaYotta Inc.", |
"1725 Vitesse Semiconductor", |
" 7174 VSC7174 PCI/PCI-X Serial ATA Host Bus Controller", |
"172a Accelerated Encryption", |
" 13c8 AEP SureWare Runner 1000V3", |
"1734 Fujitsu Siemens Computer GmbH", |
" 1078 Amilo Pro v2010", |
"1737 Linksys", |
" 0013 WMP54G Wireless Pci Card", |
" 0015 WMP54GS Wireless Pci Card", |
" 1032 Gigabit Network Adapter", |
" 1737 0015 EG1032 v2 Instant Gigabit Network Adapter", |
" 1737 0024 EG1032 v3 Instant Gigabit Network Adapter", |
" 1064 Gigabit Network Adapter", |
" 1737 0016 EG1064 v2 Instant Gigabit Network Adapter", |
" ab08 21x4x DEC-Tulip compatible 10/100 Ethernet", |
" ab09 21x4x DEC-Tulip compatible 10/100 Ethernet", |
"173b Altima (nee Broadcom)", |
" 03e8 AC1000 Gigabit Ethernet", |
" 03e9 AC1001 Gigabit Ethernet", |
" 03ea AC9100 Gigabit Ethernet", |
" 173b 0001 AC1002", |
" 03eb AC1003 Gigabit Ethernet", |
"1743 Peppercon AG", |
" 8139 ROL/F-100 Fast Ethernet Adapter with ROL", |
"1749 RLX Technologies", |
"174b PC Partner Limited", |
"174d WellX Telecom SA", |
"175c AudioScience Inc", |
"175e Sanera Systems, Inc.", |
"1775 SBS Technologies", |
"1787 Hightech Information System Ltd.", |
"1796 Research Centre Juelich", |
" 0001 SIS1100 [Gigabit link]", |
" 0002 HOTlink", |
" 0003 Counter Timer", |
" 0004 CAMAC Controller", |
" 0005 PROFIBUS", |
" 0006 AMCC HOTlink", |
"1797 JumpTec h, GMBH", |
"1799 Belkin", |
" 6001 Wireless PCI Card - F5D6001", |
" 6020 Wireless PCMCIA Card - F5D6020", |
" 6060 Wireless PDA Card - F5D6060", |
" 7000 Wireless PCI Card - F5D7000", |
" 7010 BCM4306 802.11b/g Wireless Lan Controller F5D7010", |
"179c Data Patterns", |
" 0557 DP-PCI-557 [PCI 1553B]", |
" 0566 DP-PCI-566 [Intelligent PCI 1553B]", |
" 5031 DP-CPCI-5031-Synchro Module", |
" 5121 DP-CPCI-5121-IP Carrier", |
" 5211 DP-CPCI-5211-IP Carrier", |
" 5679 AGE Display Module", |
"17a0 Genesys Logic, Inc", |
" 8033 GL880S USB 1.1 controller", |
" 8034 GL880S USB 2.0 controller", |
"17aa Lenovo", |
"17af Hightech Information System Ltd.", |
"17b3 Hawking Technologies", |
" ab08 PN672TX 10/100 Ethernet", |
"17b4 Indra Networks, Inc.", |
" 0011 WebEnhance 100 GZIP Compression Card", |
"17c0 Wistron Corp.", |
"17c2 Newisys, Inc.", |
"17cb Airgo Networks Inc", |
"17cc NetChip Technology, Inc", |
" 2280 USB 2.0", |
"17cf Z-Com, Inc.", |
"17d3 Areca Technology Corp.", |
" 1110 ARC-1110 4-Port PCI-X to SATA RAID Controller", |
" 1120 ARC-1120 8-Port PCI-X to SATA RAID Controller", |
" 1130 ARC-1130 12-Port PCI-X to SATA RAID Controller", |
" 1160 ARC-1160 16-Port PCI-X to SATA RAID Controller", |
" 1210 ARC-1210 4-Port PCI-Express to SATA RAID Controller", |
" 1220 ARC-1220 8-Port PCI-Express to SATA RAID Controller", |
" 1230 ARC-1230 12-Port PCI-Express to SATA RAID Controller", |
" 1260 ARC-1260 16-Port PCI-Express to SATA RAID Controller", |
"17d5 S2io Inc.", |
" 5831 Xframe 10 Gigabit Ethernet PCI-X", |
" 103c 12d5 HP PCI-X 133MHz 10GbE SR Fiber", |
" 5832 Xframe II 10Gbps Ethernet", |
"17de KWorld Computer Co. Ltd.", |
"17ee Connect Components Ltd", |
"17f2 Albatron Corp.", |
"17fe Linksys, A Division of Cisco Systems", |
" 2120 WMP11v4 802.11b PCI card", |
" 2220 [AirConn] INPROCOMM IPN 2220 Wireless LAN Adapter (rev 01)", |
" 17fe 2220 WPC54G ver. 4", |
"17ff Benq Corporation", |
"1809 Lumanate, Inc.", |
"1813 Ambient Technologies Inc", |
" 4000 HaM controllerless modem", |
" 16be 0001 V9x HAM Data Fax Modem", |
" 4100 HaM plus Data Fax Modem", |
" 16be 0002 V9x HAM 1394", |
"1814 RaLink", |
" 0101 Wireless PCI Adapter RT2400 / RT2460", |
" 1043 0127 WiFi-b add-on Card", |
" 1462 6828 PC11B2 (MS-6828) Wireless 11b PCI Card", |
" 0200 RT2500 802.11g PCI [PC54G2]", |
" 0201 RT2500 802.11g Cardbus/mini-PCI", |
" 1043 130f WL-130g", |
" 1371 001e CWC-854 Wireless-G CardBus Adapter", |
" 1371 001f CWM-854 Wireless-G Mini PCI Adapter", |
" 1371 0020 CWP-854 Wireless-G PCI Adapter", |
" 1458 e381 GN-WMKG 802.11b/g Wireless CardBus Adapter", |
" 1458 e931 GN-WIKG 802.11b/g mini-PCI Adapter", |
" 1462 6835 Wireless 11G CardBus CB54G2", |
" 1737 0032 WMP54G 2.0 PCI Adapter", |
" 1799 700a F5D7000 Wireless G Desktop Network Card", |
" 1799 701a F5D7010 Wireless G Notebook Network Card", |
" 185f 22a0 CN-WF513 Wireless Cardbus Adapter", |
" 0301 RT2561/RT61 802.11g PCI", |
" 1186 3c08 DWL-G630 Rev E", |
" 1186 3c09 DWL-G510 Rev C", |
" 0302 RT2561/RT61 rev B 802.11g", |
" 1186 3c08 DWL-G630 Rev E", |
" 1186 3c09 DWL-G510 Rev C", |
" 0401 Ralink RT2600 802.11 MIMO", |
"1820 InfiniCon Systems Inc.", |
"1822 Twinhan Technology Co. Ltd", |
" 4e35 Mantis DTV PCI Bridge Controller [Ver 1.0]", |
"182d SiteCom Europe BV", |
" 3069 ISDN PCI DC-105V2", |
" 9790 WL-121 Wireless Network Adapter 100g+ [Ver.3]", |
"1830 Credence Systems Corporation", |
"183b MikroM GmbH", |
" 08a7 MVC100 DVI", |
" 08a8 MVC101 SDI", |
" 08a9 MVC102 DVI+Audio", |
"1849 ASRock Incorporation", |
"1851 Microtune, Inc.", |
"1852 Anritsu Corp.", |
"1853 SMSC Automotive Infotainment System Group", |
"1854 LG Electronics, Inc.", |
"185b Compro Technology, Inc.", |
"185f Wistron NeWeb Corp.", |
"1864 SilverBack", |
" 2110 ISNAP 2110", |
"1867 Topspin Communications", |
" 5a44 MT23108 InfiniHost HCA", |
" 5a45 MT23108 InfiniHost HCA flash recovery", |
" 5a46 MT23108 InfiniHost HCA bridge", |
" 6278 MT25208 InfiniHost III Ex (Tavor compatibility mode)", |
" 6282 MT25208 InfiniHost III Ex", |
"187e ZyXEL Communication Corporation", |
" 3403 ZyAir G-110 802.11g", |
" 340e M-302 802.11g XtremeMIMO", |
"1888 Varisys Ltd", |
" 0301 VMFX1 FPGA PMC module", |
" 0601 VSM2 dual PMC carrier", |
" 0710 VS14x series PowerPC PCI board", |
" 0720 VS24x series PowerPC PCI board", |
"188a Ample Communications, Inc", |
"1890 Egenera, Inc.", |
"1894 KNC One", |
"1896 B&B Electronics Manufacturing Company, Inc.", |
"18a1 Astute Networks Inc.", |
"18ac DViCO Corporation", |
" d500 FusionHDTV 5", |
" d810 FusionHDTV 3 Gold", |
" d820 FusionHDTV 3 Gold-T", |
"18b8 Ammasso", |
" b001 AMSO 1100 iWARP/RDMA Gigabit Ethernet Coprocessor", |
"18bc Info-Tek Corp.", |
"18c3 Micronas Semiconductor Holding AG", |
"18c8 Cray Inc", |
"18c9 ARVOO Engineering BV", |
"18ca XGI - Xabre Graphics Inc", |
" 0020 Volari Z7", |
" 0040 Volari V3XT/V5/V8", |
"18d2 Sitecom", |
" 3069 DC-105v2 ISDN controller", |
"18dd Artimi Inc", |
" 4c6f Artimi RTMI-100 UWB adapter", |
"18e6 MPL AG", |
" 0001 OSCI [Octal Serial Communication Interface]", |
"18ec Cesnet, z.s.p.o.", |
" c006 COMBO6", |
" 18ec d001 COMBO-4MTX", |
" 18ec d002 COMBO-4SFP", |
" 18ec d003 COMBO-4SFPRO", |
" 18ec d004 COMBO-2XFP", |
" c045 COMBO6E", |
" c050 COMBO-PTM", |
" c058 COMBO6X", |
" 18ec d001 COMBO-4MTX", |
" 18ec d002 COMBO-4SFP", |
" 18ec d003 COMBO-4SFPRO", |
" 18ec d004 COMBO-2XFP", |
"18f7 Commtech, Inc.", |
" 0001 Fastcom ESCC-PCI-335", |
" 0002 Fastcom 422/4-PCI-335", |
" 0004 Fastcom 422/2-PCI-335", |
" 0005 Fastcom IGESCC-PCI-ISO/1", |
" 000a Fastcom 232/4-PCI-335", |
"18fb Resilience Corporation", |
"1904 Hangzhou Silan Microelectronics Co., Ltd.", |
"1923 Sangoma Technologies Corp.", |
" 0100 A104d QUAD T1/E1 AFT card", |
" 0400 A104u Quad T1/E1 AFT", |
"1924 Level 5 Networks Inc.", |
"192e TransDimension", |
"1931 Option N.V.", |
" 000c Qualcomm MSM6275 UMTS chip", |
"1942 ClearSpeed Technology plc", |
" e511 CSX600 Advance Accelerator Board", |
"1957 Freescale Semiconductor Inc", |
" 0080 MPC8349E", |
" 0081 MPC8349", |
" 0082 MPC8347E TBGA", |
" 0083 MPC8347 TBGA", |
" 0084 MPC8347E PBGA", |
" 0085 MPC8347 PBGA", |
" 0086 MPC8343E", |
" 0087 MPC8343", |
"1958 Faster Technology, LLC.", |
"1966 Orad Hi-Tec Systems", |
" 1975 DVG64 family", |
"196a Sensory Networks Inc.", |
" 0101 NodalCore C-1000 Content Classification Accelerator", |
" 0102 NodalCore C-2000 Content Classification Accelerator", |
"197b JMicron Technologies, Inc.", |
" 2360 JMicron 20360/20363 AHCI Controller", |
" 2361 JMB361 AHCI/IDE", |
" 2363 JMicron 20360/20363 AHCI Controller", |
" 2365 JMB365 AHCI/IDE", |
" 2366 JMB366 AHCI/IDE", |
"1989 Montilio Inc.", |
" 0001 RapidFile Bridge", |
" 8001 RapidFile", |
"1993 Innominate Security Technologies AG", |
"199a Pulse-LINK, Inc.", |
"19a8 DAQDATA GmbH", |
"19ac Kasten Chase Applied Research", |
" 0001 ACA2400 Crypto Accelerator", |
"19ae Progeny Systems Corporation", |
" 0520 4135 HFT Interface Controller", |
"19d4 Quixant Limited", |
"19e2 Vector Informatik GmbH", |
"1a03 ASPEED Technology, Inc.", |
" 2000 AST2000", |
"1a08 Sierra semiconductor", |
" 0000 SC15064", |
"1a1d GFaI e.V.", |
"1a29 Fortinet, Inc.", |
"1b13 Jaton Corp", |
"1c1c Symphony", |
" 0001 82C101", |
"1d44 DPT", |
" a400 PM2x24/PM3224", |
"1de1 Tekram Technology Co.,Ltd.", |
" 0391 TRM-S1040", |
" 2020 DC-390", |
" 690c 690c", |
" dc29 DC290", |
"1fc0 Tumsan Oy", |
" 0300 E2200 Dual E1/Rawpipe Card", |
"1fc1 PathScale, Inc", |
" 000d InfiniPath HT-400", |
" 0010 InfiniPath PE-800", |
"1fce Cognio Inc.", |
" 0001 Spectrum Analyzer PC Card (SAgE)", |
"2000 Smart Link Ltd.", |
"2001 Temporal Research Ltd", |
"2003 Smart Link Ltd.", |
"2004 Smart Link Ltd.", |
"21c3 21st Century Computer Corp.", |
"22b8 Motorola, Inc.", |
"2348 Racore", |
" 2010 8142 100VG/AnyLAN", |
"2646 Kingston Technologies", |
"270b Xantel Corporation", |
"270f Chaintech Computer Co. Ltd", |
"2711 AVID Technology Inc.", |
"2a15 3D Vision(???)", |
"3000 Hansol Electronics Inc.", |
"3142 Post Impression Systems.", |
"3388 Hint Corp", |
" 0013 HiNT HC4 PCI to ISDN bridge, Multimedia audio controller", |
" 0014 HiNT HC4 PCI to ISDN bridge, Network controller", |
" 0020 HB6 Universal PCI-PCI bridge (transparent mode)", |
" 0021 HB6 Universal PCI-PCI bridge (non-transparent mode)", |
" 4c53 1050 CT7 mainboard", |
" 4c53 1080 CT8 mainboard", |
" 4c53 1090 Cx9 mainboard", |
" 4c53 10a0 CA3/CR3 mainboard", |
" 4c53 3010 PPCI mezzanine (32-bit PMC)", |
" 4c53 3011 PPCI mezzanine (64-bit PMC)", |
" 4c53 4000 PMCCARR1 carrier board", |
" 0022 HiNT HB4 PCI-PCI Bridge (PCI6150)", |
" 0026 HB2 PCI-PCI Bridge", |
" 101a E.Band [AudioTrak Inca88]", |
" 101b E.Band [AudioTrak Inca88]", |
" 8011 VXPro II Chipset", |
" 3388 8011 VXPro II Chipset CPU to PCI Bridge", |
" 8012 VXPro II Chipset", |
" 3388 8012 VXPro II Chipset PCI to ISA Bridge", |
" 8013 VXPro II IDE", |
" 3388 8013 VXPro II Chipset EIDE Controller", |
"3411 Quantum Designs (H.K.) Inc", |
"3513 ARCOM Control Systems Ltd", |
"3842 eVga.com. Corp.", |
" c370 e-GeFORCE 6600 256 DDR PCI-e", |
"38ef 4Links", |
"3d3d 3DLabs", |
" 0001 GLINT 300SX", |
" 0002 GLINT 500TX", |
" 0000 0000 GLoria L", |
" 0003 GLINT Delta", |
" 0000 0000 GLoria XL", |
" 0004 Permedia", |
" 0005 Permedia", |
" 0006 GLINT MX", |
" 0000 0000 GLoria XL", |
" 1048 0a42 GLoria XXL", |
" 0007 3D Extreme", |
" 0008 GLINT Gamma G1", |
" 1048 0a42 GLoria XXL", |
" 0009 Permedia II 2D+3D", |
" 1040 0011 AccelStar II", |
" 1048 0a42 GLoria XXL", |
" 13e9 1000 6221L-4U", |
" 3d3d 0100 AccelStar II 3D Accelerator", |
" 3d3d 0111 Permedia 3:16", |
" 3d3d 0114 Santa Ana", |
" 3d3d 0116 Oxygen GVX1", |
" 3d3d 0119 Scirocco", |
" 3d3d 0120 Santa Ana PCL", |
" 3d3d 0125 Oxygen VX1", |
" 3d3d 0127 Permedia3 Create!", |
" 000a GLINT R3", |
" 3d3d 0121 Oxygen VX1", |
" 000c GLINT R3 [Oxygen VX1]", |
" 3d3d 0144 Oxygen VX1-4X AGP [Permedia 4]", |
" 000d GLint R4 rev A", |
" 0011 GLint R4 rev B", |
" 0012 GLint R5 rev A", |
" 0013 GLint R5 rev B", |
" 0020 VP10 visual processor", |
" 0022 VP10 visual processor", |
" 0024 VP9 visual processor", |
" 0100 Permedia II 2D+3D", |
" 07a1 Wildcat III 6210", |
" 07a2 Sun XVR-500 Graphics Accelerator", |
" 07a3 Wildcat IV 7210", |
" 1004 Permedia", |
" 3d04 Permedia", |
" ffff Glint VGA", |
"4005 Avance Logic Inc.", |
" 0300 ALS300 PCI Audio Device", |
" 0308 ALS300+ PCI Audio Device", |
" 0309 PCI Input Controller", |
" 1064 ALG-2064", |
" 2064 ALG-2064i", |
" 2128 ALG-2364A GUI Accelerator", |
" 2301 ALG-2301", |
" 2302 ALG-2302", |
" 2303 AVG-2302 GUI Accelerator", |
" 2364 ALG-2364A", |
" 2464 ALG-2464", |
" 2501 ALG-2564A/25128A", |
" 4000 ALS4000 Audio Chipset", |
" 4005 4000 ALS4000 Audio Chipset", |
" 4710 ALC200/200P", |
"4033 Addtron Technology Co, Inc.", |
" 1360 RTL8139 Ethernet", |
"4143 Digital Equipment Corp", |
"4144 Alpha Data", |
" 0044 ADM-XRCIIPro", |
"416c Aladdin Knowledge Systems", |
" 0100 AladdinCARD", |
" 0200 CPC", |
"4321 Tata Power Strategic Electronics Division", |
"4444 Internext Compression Inc", |
" 0016 iTVC16 (CX23416) MPEG-2 Encoder", |
" 0070 0003 WinTV PVR 250", |
" 0070 0009 WinTV PVR 150", |
" 0070 0801 WinTV PVR 150", |
" 0070 0807 WinTV PVR 150", |
" 0070 4001 WinTV PVR 250", |
" 0070 4009 WinTV PVR 250", |
" 0070 4801 WinTV PVR 250", |
" 0070 4803 WinTV PVR 250", |
" 0070 8003 WinTV PVR 150", |
" 0070 8801 WinTV PVR 150", |
" 0070 c801 WinTV PVR 150", |
" 0070 e807 WinTV PVR 500 (1st unit)", |
" 0070 e817 WinTV PVR 500 (2nd unit)", |
" 0070 ff92 WiNTV PVR-550", |
" 0270 0801 WinTV PVR 150", |
" 12ab fff3 MPG600", |
" 12ab ffff MPG600", |
" 9005 0092 VideOh! AVC-2010", |
" 9005 0093 VideOh! AVC-2410", |
" 0803 iTVC15 MPEG-2 Encoder", |
" 0070 4000 WinTV PVR-350", |
" 0070 4001 WinTV PVR-250", |
" 0070 4800 WinTV PVR-350 (V1)", |
" 12ab 0000 MPG160", |
" 1461 a3ce M179", |
" 1461 a3cf M179", |
"4468 Bridgeport machines", |
"4594 Cogetec Informatique Inc", |
"45fb Baldor Electric Company", |
"4680 Umax Computer Corp", |
"4843 Hercules Computer Technology Inc", |
"4916 RedCreek Communications Inc", |
" 1960 RedCreek PCI adapter", |
"4943 Growth Networks", |
"494f ACCES I/O Products, Inc.", |
" 10e8 LPCI-COM-8SM", |
"4978 Axil Computer Inc", |
"4a14 NetVin", |
" 5000 NV5000SC", |
" 4a14 5000 RT8029-Based Ethernet Adapter", |
"4b10 Buslogic Inc.", |
"4c48 LUNG HWA Electronics", |
"4c53 SBS Technologies", |
" 0000 PLUSTEST device", |
" 4c53 3000 PLUSTEST card (PC104+)", |
" 4c53 3001 PLUSTEST card (PMC)", |
" 0001 PLUSTEST-MM device", |
" 4c53 3002 PLUSTEST-MM card (PMC)", |
"4ca1 Seanix Technology Inc", |
"4d51 MediaQ Inc.", |
" 0200 MQ-200", |
"4d54 Microtechnica Co Ltd", |
"4ddc ILC Data Device Corp", |
" 0100 DD-42924I5-300 (ARINC 429 Data Bus)", |
" 0801 BU-65570I1 MIL-STD-1553 Test and Simulation", |
" 0802 BU-65570I2 MIL-STD-1553 Test and Simulation", |
" 0811 BU-65572I1 MIL-STD-1553 Test and Simulation", |
" 0812 BU-65572I2 MIL-STD-1553 Test and Simulation", |
" 0881 BU-65570T1 MIL-STD-1553 Test and Simulation", |
" 0882 BU-65570T2 MIL-STD-1553 Test and Simulation", |
" 0891 BU-65572T1 MIL-STD-1553 Test and Simulation", |
" 0892 BU-65572T2 MIL-STD-1553 Test and Simulation", |
" 0901 BU-65565C1 MIL-STD-1553 Data Bus", |
" 0902 BU-65565C2 MIL-STD-1553 Data Bus", |
" 0903 BU-65565C3 MIL-STD-1553 Data Bus", |
" 0904 BU-65565C4 MIL-STD-1553 Data Bus", |
" 0b01 BU-65569I1 MIL-STD-1553 Data Bus", |
" 0b02 BU-65569I2 MIL-STD-1553 Data Bus", |
" 0b03 BU-65569I3 MIL-STD-1553 Data Bus", |
" 0b04 BU-65569I4 MIL-STD-1553 Data Bus", |
"5046 GemTek Technology Corporation", |
" 1001 PCI Radio", |
"5053 Voyetra Technologies", |
" 2010 Daytona Audio Adapter", |
"5136 S S Technologies", |
"5143 Qualcomm Inc", |
"5145 Ensoniq (Old)", |
" 3031 Concert AudioPCI", |
"5168 Animation Technologies Inc.", |
" 0300 FlyDVB-S", |
" 0301 FlyDVB-T", |
"5301 Alliance Semiconductor Corp.", |
" 0001 ProMotion aT3D", |
"5333 S3 Inc.", |
" 0551 Plato/PX (system)", |
" 5631 86c325 [ViRGE]", |
" 8800 86c866 [Vision 866]", |
" 8801 86c964 [Vision 964]", |
" 8810 86c764_0 [Trio 32 vers 0]", |
" 8811 86c764/765 [Trio32/64/64V+]", |
" 8812 86cM65 [Aurora64V+]", |
" 8813 86c764_3 [Trio 32/64 vers 3]", |
" 8814 86c767 [Trio 64UV+]", |
" 8815 86cM65 [Aurora 128]", |
" 883d 86c988 [ViRGE/VX]", |
" 8870 FireGL", |
" 8880 86c868 [Vision 868 VRAM] vers 0", |
" 8881 86c868 [Vision 868 VRAM] vers 1", |
" 8882 86c868 [Vision 868 VRAM] vers 2", |
" 8883 86c868 [Vision 868 VRAM] vers 3", |
" 88b0 86c928 [Vision 928 VRAM] vers 0", |
" 88b1 86c928 [Vision 928 VRAM] vers 1", |
" 88b2 86c928 [Vision 928 VRAM] vers 2", |
" 88b3 86c928 [Vision 928 VRAM] vers 3", |
" 88c0 86c864 [Vision 864 DRAM] vers 0", |
" 88c1 86c864 [Vision 864 DRAM] vers 1", |
" 88c2 86c864 [Vision 864-P DRAM] vers 2", |
" 88c3 86c864 [Vision 864-P DRAM] vers 3", |
" 88d0 86c964 [Vision 964 VRAM] vers 0", |
" 88d1 86c964 [Vision 964 VRAM] vers 1", |
" 88d2 86c964 [Vision 964-P VRAM] vers 2", |
" 88d3 86c964 [Vision 964-P VRAM] vers 3", |
" 88f0 86c968 [Vision 968 VRAM] rev 0", |
" 88f1 86c968 [Vision 968 VRAM] rev 1", |
" 88f2 86c968 [Vision 968 VRAM] rev 2", |
" 88f3 86c968 [Vision 968 VRAM] rev 3", |
" 8900 86c755 [Trio 64V2/DX]", |
" 5333 8900 86C775 Trio64V2/DX", |
" 8901 86c775/86c785 [Trio 64V2/DX or /GX]", |
" 5333 8901 86C775 Trio64V2/DX, 86C785 Trio64V2/GX", |
" 8902 Plato/PX", |
" 8903 Trio 3D business multimedia", |
" 8904 Trio 64 3D", |
" 1014 00db Integrated Trio3D", |
" 5333 8904 86C365 Trio3D AGP", |
" 8905 Trio 64V+ family", |
" 8906 Trio 64V+ family", |
" 8907 Trio 64V+ family", |
" 8908 Trio 64V+ family", |
" 8909 Trio 64V+ family", |
" 890a Trio 64V+ family", |
" 890b Trio 64V+ family", |
" 890c Trio 64V+ family", |
" 890d Trio 64V+ family", |
" 890e Trio 64V+ family", |
" 890f Trio 64V+ family", |
" 8a01 ViRGE/DX or /GX", |
" 0e11 b032 ViRGE/GX", |
" 10b4 1617 Nitro 3D", |
" 10b4 1717 Nitro 3D", |
" 5333 8a01 ViRGE/DX", |
" 8a10 ViRGE/GX2", |
" 1092 8a10 Stealth 3D 4000", |
" 8a13 86c368 [Trio 3D/2X]", |
" 5333 8a13 Trio3D/2X", |
" 8a20 86c794 [Savage 3D]", |
" 5333 8a20 86C391 Savage3D", |
" 8a21 86c390 [Savage 3D/MV]", |
" 5333 8a21 86C390 Savage3D/MV", |
" 8a22 Savage 4", |
" 1033 8068 Savage 4", |
" 1033 8069 Savage 4", |
" 1033 8110 Savage 4 LT", |
" 105d 0018 SR9 8Mb SDRAM", |
" 105d 002a SR9 Pro 16Mb SDRAM", |
" 105d 003a SR9 Pro 32Mb SDRAM", |
" 105d 092f SR9 Pro+ 16Mb SGRAM", |
" 1092 4207 Stealth III S540", |
" 1092 4800 Stealth III S540", |
" 1092 4807 SpeedStar A90", |
" 1092 4808 Stealth III S540", |
" 1092 4809 Stealth III S540", |
" 1092 480e Stealth III S540", |
" 1092 4904 Stealth III S520", |
" 1092 4905 SpeedStar A200", |
" 1092 4a09 Stealth III S540", |
" 1092 4a0b Stealth III S540 Xtreme", |
" 1092 4a0f Stealth III S540", |
" 1092 4e01 Stealth III S540", |
" 1102 101d 3d Blaster Savage 4", |
" 1102 101e 3d Blaster Savage 4", |
" 5333 8100 86C394-397 Savage4 SDRAM 100", |
" 5333 8110 86C394-397 Savage4 SDRAM 110", |
" 5333 8125 86C394-397 Savage4 SDRAM 125", |
" 5333 8143 86C394-397 Savage4 SDRAM 143", |
" 5333 8a22 86C394-397 Savage4", |
" 5333 8a2e 86C394-397 Savage4 32bit", |
" 5333 9125 86C394-397 Savage4 SGRAM 125", |
" 5333 9143 86C394-397 Savage4 SGRAM 143", |
" 8a23 Savage 4", |
" 8a25 ProSavage PM133", |
" 8a26 ProSavage KM133", |
" 8c00 ViRGE/M3", |
" 8c01 ViRGE/MX", |
" 1179 0001 ViRGE/MX", |
" 8c02 ViRGE/MX+", |
" 8c03 ViRGE/MX+MV", |
" 8c10 86C270-294 Savage/MX-MV", |
" 8c11 82C270-294 Savage/MX", |
" 8c12 86C270-294 Savage/IX-MV", |
" 1014 017f Thinkpad T20/T22", |
" 1179 0001 86C584 SuperSavage/IXC Toshiba", |
" 8c13 86C270-294 Savage/IX", |
" 1179 0001 Magnia Z310", |
" 8c22 SuperSavage MX/128", |
" 8c24 SuperSavage MX/64", |
" 8c26 SuperSavage MX/64C", |
" 8c2a SuperSavage IX/128 SDR", |
" 8c2b SuperSavage IX/128 DDR", |
" 8c2c SuperSavage IX/64 SDR", |
" 8c2d SuperSavage IX/64 DDR", |
" 8c2e SuperSavage IX/C SDR", |
" 1014 01fc ThinkPad T23 (2647-4MG)", |
" 8c2f SuperSavage IX/C DDR", |
" 8d01 86C380 [ProSavageDDR K4M266]", |
" 8d02 VT8636A [ProSavage KN133] AGP4X VGA Controller (TwisterK)", |
" 8d03 VT8751 [ProSavageDDR P4M266]", |
" 8d04 VT8375 [ProSavage8 KM266/KL266]", |
" 9102 86C410 Savage 2000", |
" 1092 5932 Viper II Z200", |
" 1092 5934 Viper II Z200", |
" 1092 5952 Viper II Z200", |
" 1092 5954 Viper II Z200", |
" 1092 5a35 Viper II Z200", |
" 1092 5a37 Viper II Z200", |
" 1092 5a55 Viper II Z200", |
" 1092 5a57 Viper II Z200", |
" ca00 SonicVibes", |
"544c Teralogic Inc", |
" 0350 TL880-based HDTV/ATSC tuner", |
"5455 Technische University Berlin", |
" 4458 S5933", |
"5519 Cnet Technologies, Inc.", |
"5544 Dunord Technologies", |
" 0001 I-30xx Scanner Interface", |
"5555 Genroco, Inc", |
" 0003 TURBOstor HFP-832 [HiPPI NIC]", |
"5654 VoiceTronix Pty Ltd", |
" 3132 OpenSwitch12", |
"5700 Netpower", |
"5851 Exacq Technologies", |
"6356 UltraStor", |
"6374 c't Magazin fuer Computertechnik", |
" 6773 GPPCI", |
"6409 Logitec Corp.", |
"6666 Decision Computer International Co.", |
" 0001 PCCOM4", |
" 0002 PCCOM8", |
" 0004 PCCOM2", |
" 0101 PCI 8255/8254 I/O Card", |
"7063 pcHDTV", |
" 2000 HD-2000", |
" 3000 HD-3000", |
"7604 O.N. Electronic Co Ltd.", |
"7bde MIDAC Corporation", |
"7fed PowerTV", |
"8008 Quancom Electronic GmbH", |
" 0010 WDOG1 [PCI-Watchdog 1]", |
" 0011 PWDOG2 [PCI-Watchdog 2]", |
"807d Asustek Computer, Inc.", |
"8086 Intel Corporation", |
" 0007 82379AB", |
" 0008 Extended Express System Support Controller", |
" 0039 21145 Fast Ethernet", |
" 0122 82437FX", |
" 0309 80303 I/O Processor PCI-to-PCI Bridge", |
" 030d 80312 I/O Companion Chip PCI-to-PCI Bridge", |
" 0326 6700/6702PXH I/OxAPIC Interrupt Controller A", |
" 0327 6700PXH I/OxAPIC Interrupt Controller B", |
" 0329 6700PXH PCI Express-to-PCI Bridge A", |
" 032a 6700PXH PCI Express-to-PCI Bridge B", |
" 032c 6702PXH PCI Express-to-PCI Bridge A", |
" 0330 80332 [Dobson] I/O processor (A-Segment Bridge)", |
" 0331 80332 [Dobson] I/O processor (A-Segment IOAPIC)", |
" 0332 80332 [Dobson] I/O processor (B-Segment Bridge)", |
" 0333 80332 [Dobson] I/O processor (B-Segment IOAPIC)", |
" 0334 80332 [Dobson] I/O processor (ATU)", |
" 0335 80331 [Lindsay] I/O processor (PCI-X Bridge)", |
" 0336 80331 [Lindsay] I/O processor (ATU)", |
" 0340 41210 [Lanai] Serial to Parallel PCI Bridge (A-Segment Bridge)", |
" 0341 41210 [Lanai] Serial to Parallel PCI Bridge (B-Segment Bridge)", |
" 0370 80333 Segment-A PCI Express-to-PCI Express Bridge", |
" 0371 80333 A-Bus IOAPIC", |
" 0372 80333 Segment-B PCI Express-to-PCI Express Bridge", |
" 0373 80333 B-Bus IOAPIC", |
" 0374 80333 Address Translation Unit", |
" 0482 82375EB/SB PCI to EISA Bridge", |
" 0483 82424TX/ZX [Saturn] CPU to PCI bridge", |
" 0484 82378ZB/IB, 82379AB (SIO, SIO.A) PCI to ISA Bridge", |
" 0486 82425EX/ZX [Aries] PCIset with ISA bridge", |
" 04a3 82434LX/NX [Mercury/Neptune] Processor to PCI bridge", |
" 04d0 82437FX [Triton FX]", |
" 0500 E8870 Processor bus control", |
" 0501 E8870 Memory controller", |
" 0502 E8870 Scalability Port 0", |
" 0503 E8870 Scalability Port 1", |
" 0510 E8870IO Hub Interface Port 0 registers (8-bit compatibility port)", |
" 0511 E8870IO Hub Interface Port 1 registers", |
" 0512 E8870IO Hub Interface Port 2 registers", |
" 0513 E8870IO Hub Interface Port 3 registers", |
" 0514 E8870IO Hub Interface Port 4 registers", |
" 0515 E8870IO General SIOH registers", |
" 0516 E8870IO RAS registers", |
" 0530 E8870SP Scalability Port 0 registers", |
" 0531 E8870SP Scalability Port 1 registers", |
" 0532 E8870SP Scalability Port 2 registers", |
" 0533 E8870SP Scalability Port 3 registers", |
" 0534 E8870SP Scalability Port 4 registers", |
" 0535 E8870SP Scalability Port 5 registers", |
" 0536 E8870SP Interleave registers 0 and 1", |
" 0537 E8870SP Interleave registers 2 and 3", |
" 0600 RAID Controller", |
" 8086 01af SRCZCR", |
" 8086 01c1 ICP Vortex GDT8546RZ", |
" 8086 01f7 SCRU32", |
" 061f 80303 I/O Processor", |
" 0960 80960RP [i960 RP Microprocessor/Bridge]", |
" 0962 80960RM [i960RM Bridge]", |
" 0964 80960RP [i960 RP Microprocessor/Bridge]", |
" 1000 82542 Gigabit Ethernet Controller", |
" 0e11 b0df NC1632 Gigabit Ethernet Adapter (1000-SX)", |
" 0e11 b0e0 NC1633 Gigabit Ethernet Adapter (1000-LX)", |
" 0e11 b123 NC1634 Gigabit Ethernet Adapter (1000-SX)", |
" 1014 0119 Netfinity Gigabit Ethernet SX Adapter", |
" 8086 1000 PRO/1000 Gigabit Server Adapter", |
" 1001 82543GC Gigabit Ethernet Controller (Fiber)", |
" 0e11 004a NC6136 Gigabit Server Adapter", |
" 1014 01ea Netfinity Gigabit Ethernet SX Adapter", |
" 8086 1002 PRO/1000 F Server Adapter", |
" 8086 1003 PRO/1000 F Server Adapter", |
" 1002 Pro 100 LAN+Modem 56 Cardbus II", |
" 8086 200e Pro 100 LAN+Modem 56 Cardbus II", |
" 8086 2013 Pro 100 SR Mobile Combo Adapter", |
" 8086 2017 Pro 100 S Combo Mobile Adapter", |
" 1004 82543GC Gigabit Ethernet Controller (Copper)", |
" 0e11 0049 NC7132 Gigabit Upgrade Module", |
" 0e11 b1a4 NC7131 Gigabit Server Adapter", |
" 1014 10f2 Gigabit Ethernet Server Adapter", |
" 8086 1004 PRO/1000 T Server Adapter", |
" 8086 2004 PRO/1000 T Server Adapter", |
" 1008 82544EI Gigabit Ethernet Controller (Copper)", |
" 1014 0269 iSeries 1000/100/10 Ethernet Adapter", |
" 1028 011c PRO/1000 XT Network Connection", |
" 8086 1107 PRO/1000 XT Server Adapter", |
" 8086 2107 PRO/1000 XT Server Adapter", |
" 8086 2110 PRO/1000 XT Server Adapter", |
" 8086 3108 PRO/1000 XT Network Connection", |
" 1009 82544EI Gigabit Ethernet Controller (Fiber)", |
" 1014 0268 iSeries Gigabit Ethernet Adapter", |
" 8086 1109 PRO/1000 XF Server Adapter", |
" 8086 2109 PRO/1000 XF Server Adapter", |
" 100a 82540EM Gigabit Ethernet Controller", |
" 100c 82544GC Gigabit Ethernet Controller (Copper)", |
" 8086 1112 PRO/1000 T Desktop Adapter", |
" 8086 2112 PRO/1000 T Desktop Adapter", |
" 100d 82544GC Gigabit Ethernet Controller (LOM)", |
" 1028 0123 PRO/1000 XT Network Connection", |
" 1079 891f 82544GC Based Network Connection", |
" 4c53 1080 CT8 mainboard", |
" 8086 110d 82544GC Based Network Connection", |
" 100e 82540EM Gigabit Ethernet Controller", |
" 1014 0265 PRO/1000 MT Network Connection", |
" 1014 0267 PRO/1000 MT Network Connection", |
" 1014 026a PRO/1000 MT Network Connection", |
" 1024 0134 Poweredge SC600", |
" 1028 002e Optiplex GX260", |
" 1028 0151 PRO/1000 MT Network Connection", |
" 107b 8920 PRO/1000 MT Desktop Adapter", |
" 8086 001e PRO/1000 MT Desktop Adapter", |
" 8086 002e PRO/1000 MT Desktop Adapter", |
" 8086 1376 PRO/1000 GT Desktop Adapter", |
" 8086 1476 PRO/1000 GT Desktop Adapter", |
" 100f 82545EM Gigabit Ethernet Controller (Copper)", |
" 1014 0269 iSeries 1000/100/10 Ethernet Adapter", |
" 1014 028e PRO/1000 MT Network Connection", |
" 8086 1000 PRO/1000 MT Network Connection", |
" 8086 1001 PRO/1000 MT Server Adapter", |
" 1010 82546EB Gigabit Ethernet Controller (Copper)", |
" 0e11 00db NC7170 Gigabit Server Adapter", |
" 1014 027c PRO/1000 MT Dual Port Network Adapter", |
" 18fb 7872 RESlink-X", |
" 1fc1 0026 Niagara 2260 Bypass Card", |
" 4c53 1080 CT8 mainboard", |
" 4c53 10a0 CA3/CR3 mainboard", |
" 8086 1011 PRO/1000 MT Dual Port Server Adapter", |
" 8086 1012 Primergy RX300", |
" 8086 101a PRO/1000 MT Dual Port Network Adapter", |
" 8086 3424 SE7501HG2 Mainboard", |
" 1011 82545EM Gigabit Ethernet Controller (Fiber)", |
" 1014 0268 iSeries Gigabit Ethernet Adapter", |
" 8086 1002 PRO/1000 MF Server Adapter", |
" 8086 1003 PRO/1000 MF Server Adapter (LX)", |
" 1012 82546EB Gigabit Ethernet Controller (Fiber)", |
" 0e11 00dc NC6170 Gigabit Server Adapter", |
" 8086 1012 PRO/1000 MF Dual Port Server Adapter", |
" 1013 82541EI Gigabit Ethernet Controller (Copper)", |
" 8086 0013 PRO/1000 MT Network Connection", |
" 8086 1013 IBM ThinkCentre Network Card", |
" 8086 1113 PRO/1000 MT Desktop Adapter", |
" 1014 82541ER Gigabit Ethernet Controller", |
" 1015 82540EM Gigabit Ethernet Controller (LOM)", |
" 1016 82540EP Gigabit Ethernet Controller (LOM)", |
" 1014 052c PRO/1000 MT Mobile Connection", |
" 1179 0001 PRO/1000 MT Mobile Connection", |
" 8086 1016 PRO/1000 MT Mobile Connection", |
" 1017 82540EP Gigabit Ethernet Controller (LOM)", |
" 8086 1017 PR0/1000 MT Desktop Connection", |
" 1018 82541EI Gigabit Ethernet Controller", |
" 8086 1018 PRO/1000 MT Desktop Adapter", |
" 1019 82547EI Gigabit Ethernet Controller (LOM)", |
" 1458 1019 GA-8IPE1000 Pro2 motherboard (865PE)", |
" 1458 e000 Intel Gigabit Ethernet (Kenai II)", |
" 8086 1019 PRO/1000 CT Desktop Connection", |
" 8086 301f D865PERL mainboard", |
" 8086 302c Intel 82865G Mainboard (D865GBF)", |
" 8086 3427 S875WP1-E mainboard", |
" 101a 82547EI Gigabit Ethernet Controller (Mobile)", |
" 101d 82546EB Gigabit Ethernet Controller", |
" 8086 1000 PRO/1000 MT Quad Port Server Adapter", |
" 101e 82540EP Gigabit Ethernet Controller (Mobile)", |
" 1014 0549 PRO/1000 MT Mobile Connection", |
" 1179 0001 PRO/1000 MT Mobile Connection", |
" 8086 101e PRO/1000 MT Mobile Connection", |
" 1026 82545GM Gigabit Ethernet Controller", |
" 1028 0169 Precision 470", |
" 8086 1000 PRO/1000 MT Server Connection", |
" 8086 1001 PRO/1000 MT Server Adapter", |
" 8086 1002 PRO/1000 MT Server Adapter", |
" 8086 1026 PRO/1000 MT Server Connection", |
" 1027 82545GM Gigabit Ethernet Controller", |
" 103c 3103 NC310F PCI-X Gigabit Server Adapter", |
" 8086 1001 PRO/1000 MF Server Adapter(LX)", |
" 8086 1002 PRO/1000 MF Server Adapter(LX)", |
" 8086 1003 PRO/1000 MF Server Adapter(LX)", |
" 8086 1027 PRO/1000 MF Server Adapter", |
" 1028 82545GM Gigabit Ethernet Controller", |
" 8086 1028 PRO/1000 MB Server Adapter", |
" 1029 82559 Ethernet Controller", |
" 1030 82559 InBusiness 10/100", |
" 1031 82801CAM (ICH3) PRO/100 VE (LOM) Ethernet Controller", |
" 1014 0209 ThinkPad A/T/X Series", |
" 104d 80e7 Vaio PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP", |
" 104d 813c Vaio PCG-GRV616G", |
" 107b 5350 EtherExpress PRO/100 VE", |
" 1179 0001 EtherExpress PRO/100 VE", |
" 144d c000 EtherExpress PRO/100 VE", |
" 144d c001 EtherExpress PRO/100 VE", |
" 144d c003 EtherExpress PRO/100 VE", |
" 144d c006 vpr Matrix 170B4", |
" 1032 82801CAM (ICH3) PRO/100 VE Ethernet Controller", |
" 1033 82801CAM (ICH3) PRO/100 VM (LOM) Ethernet Controller", |
" 1034 82801CAM (ICH3) PRO/100 VM Ethernet Controller", |
" 1035 82801CAM (ICH3)/82562EH (LOM) Ethernet Controller", |
" 1036 82801CAM (ICH3) 82562EH Ethernet Controller", |
" 1037 82801CAM (ICH3) Chipset Ethernet Controller", |
" 1038 82801CAM (ICH3) PRO/100 VM (KM) Ethernet Controller", |
" 0e11 0098 Evo N600c", |
" 1039 82801DB PRO/100 VE (LOM) Ethernet Controller", |
" 1014 0267 NetVista A30p", |
" 103a 82801DB PRO/100 VE (CNR) Ethernet Controller", |
" 103b 82801DB PRO/100 VM (LOM) Ethernet Controller", |
" 103c 82801DB PRO/100 VM (CNR) Ethernet Controller", |
" 103d 82801DB PRO/100 VE (MOB) Ethernet Controller", |
" 103e 82801DB PRO/100 VM (MOB) Ethernet Controller", |
" 1040 536EP Data Fax Modem", |
" 16be 1040 V.9X DSP Data Fax Modem", |
" 1043 PRO/Wireless LAN 2100 3B Mini PCI Adapter", |
" 8086 2527 MIM2000/Centrino", |
" 1048 PRO/10GbE LR Server Adapter", |
" 8086 a01f PRO/10GbE LR Server Adapter", |
" 8086 a11f PRO/10GbE LR Server Adapter", |
" 104b Ethernet Controller", |
" 1050 82562EZ 10/100 Ethernet Controller", |
" 1462 728c 865PE Neo2 (MS-6728)", |
" 1462 758c MS-6758 (875P Neo)", |
" 8086 3020 D865PERL mainboard", |
" 8086 302f Desktop Board D865GBF", |
" 8086 3427 S875WP1-E mainboard", |
" 1051 82801EB/ER (ICH5/ICH5R) integrated LAN Controller", |
" 1052 PRO/100 VM Network Connection", |
" 1053 PRO/100 VM Network Connection", |
" 1059 82551QM Ethernet Controller", |
" 105e 82571EB Gigabit Ethernet Controller", |
" 1775 6003 Telum GE-QT", |
" 105f 82571EB Gigabit Ethernet Controller", |
" 1060 82571EB Gigabit Ethernet Controller", |
" 1064 82562ET/EZ/GT/GZ - PRO/100 VE (LOM) Ethernet Controller", |
" 1043 80f8 P5GD1-VW Mainboard", |
" 1065 82562ET/EZ/GT/GZ - PRO/100 VE Ethernet Controller", |
" 1066 82562 EM/EX/GX - PRO/100 VM (LOM) Ethernet Controller", |
" 1067 82562 EM/EX/GX - PRO/100 VM Ethernet Controller", |
" 1068 82562ET/EZ/GT/GZ - PRO/100 VE (LOM) Ethernet Controller Mobile", |
" 1069 82562EM/EX/GX - PRO/100 VM (LOM) Ethernet Controller Mobile", |
" 106a 82562G - PRO/100 VE (LOM) Ethernet Controller", |
" 106b 82562G - PRO/100 VE Ethernet Controller Mobile", |
" 1075 82547GI Gigabit Ethernet Controller", |
" 1028 0165 PowerEdge 750", |
" 8086 0075 PRO/1000 CT Network Connection", |
" 8086 1075 PRO/1000 CT Network Connection", |
" 1076 82541GI/PI Gigabit Ethernet Controller", |
" 1028 0165 PowerEdge 750", |
" 1028 019a PowerEdge SC1425", |
" 8086 0076 PRO/1000 MT Network Connection", |
" 8086 1076 PRO/1000 MT Network Connection", |
" 8086 1176 PRO/1000 MT Desktop Adapter", |
" 8086 1276 PRO/1000 MT Desktop Adapter", |
" 1077 82541GI Gigabit Ethernet Controller", |
" 1179 0001 PRO/1000 MT Mobile Connection", |
" 8086 0077 PRO/1000 MT Mobile Connection", |
" 8086 1077 PRO/1000 MT Mobile Connection", |
" 1078 82541EI Gigabit Ethernet Controller", |
" 8086 1078 PRO/1000 MT Network Connection", |
" 1079 82546GB Gigabit Ethernet Controller", |
" 103c 12a6 HP Dual Port 1000Base-T [A9900A]", |
" 103c 12cf HP Core Dual Port 1000Base-T [AB352A]", |
" 1fc1 0027 Niagara 2261 Failover NIC", |
" 4c53 1090 Cx9 / Vx9 mainboard", |
" 4c53 10b0 CL9 mainboard", |
" 8086 0079 PRO/1000 MT Dual Port Network Connection", |
" 8086 1079 PRO/1000 MT Dual Port Network Connection", |
" 8086 1179 PRO/1000 MT Dual Port Network Connection", |
" 8086 117a PRO/1000 MT Dual Port Server Adapter", |
" 107a 82546GB Gigabit Ethernet Controller", |
" 103c 12a8 HP Dual Port 1000base-SX [A9899A]", |
" 8086 107a PRO/1000 MF Dual Port Server Adapter", |
" 8086 127a PRO/1000 MF Dual Port Server Adapter", |
" 107b 82546GB Gigabit Ethernet Controller", |
" 8086 007b PRO/1000 MB Dual Port Server Connection", |
" 8086 107b PRO/1000 MB Dual Port Server Connection", |
" 107c 82541PI Gigabit Ethernet Controller", |
" 107d 82572EI Gigabit Ethernet Controller", |
" 107e 82572EI Gigabit Ethernet Controller", |
" 107f 82572EI Gigabit Ethernet Controller", |
" 1080 FA82537EP 56K V.92 Data/Fax Modem PCI", |
" 1081 Enterprise Southbridge LAN Copper", |
" 1082 Enterprise Southbridge LAN fiber", |
" 1083 Enterprise Southbridge LAN SERDES", |
" 1084 Enterprise Southbridge IDE Redirection", |
" 1085 Enterprise Southbridge Serial Port Redirection", |
" 1086 Enterprise Southbridge IPMI/KCS0", |
" 1087 Enterprise Southbridge UHCI Redirection", |
" 1089 Enterprise Southbridge BT", |
" 108a 82546EB Gigabit Ethernet Controller", |
" 108b 82573V Gigabit Ethernet Controller (Copper)", |
" 108c 82573E Gigabit Ethernet Controller (Copper)", |
" 108e 82573E KCS (Active Management)", |
" 108f Intel(R) Active Management Technology - SOL", |
" 1092 Intel(R) PRO/100 VE Network Connection", |
" 1096 PRO/1000 EB Network Connection with I/O Acceleration", |
" 1097 Enterprise Southbridge DPT LAN fiber", |
" 1098 PRO/1000 EB Backplane Connection with I/O Acceleration", |
" 1099 82546GB Quad Port Server Adapter", |
" 109a 82573L Gigabit Ethernet Controller", |
" 17aa 207e Thinkpad X60s", |
" 109b 82546GB PRO/1000 GF Quad Port Server Adapter", |
" 10a0 82571EB PRO/1000 AT Quad Port Bypass Adapter", |
" 10a1 82571EB PRO/1000 AF Quad Port Bypass Adapter", |
" 10b0 82573L PRO/1000 PL Network Connection", |
" 10b2 82573V PRO/1000 PM Network Connection", |
" 10b3 82573E PRO/1000 PM Network Connection", |
" 10b4 82573L PRO/1000 PL Network Connection", |
" 10b5 82546GB PRO/1000 GT Quad Port Server Adapter", |
" 103c 3109 NC340T PCI-X Quad-port Gigabit Server Adapter", |
" 1107 PRO/1000 MF Server Adapter (LX)", |
" 1130 82815 815 Chipset Host Bridge and Memory Controller Hub", |
" 1025 1016 Travelmate 612 TX", |
" 1043 8027 TUSL2-C Mainboard", |
" 104d 80df Vaio PCG-FX403", |
" 8086 4532 D815EEA2 mainboard", |
" 8086 4557 D815EGEW Mainboard", |
" 1131 82815 815 Chipset AGP Bridge", |
" 1132 82815 CGC [Chipset Graphics Controller]", |
" 1025 1016 Travelmate 612 TX", |
" 104d 80df Vaio PCG-FX403", |
" 8086 4532 D815EEA2 Mainboard", |
" 8086 4541 D815EEA Motherboard", |
" 8086 4557 D815EGEW Mainboard", |
" 1161 82806AA PCI64 Hub Advanced Programmable Interrupt Controller", |
" 8086 1161 82806AA PCI64 Hub APIC", |
" 1162 Xscale 80200 Big Endian Companion Chip", |
" 1200 Intel IXP1200 Network Processor", |
" 172a 0000 AEP SSL Accelerator", |
" 1209 8255xER/82551IT Fast Ethernet Controller", |
" 4c53 1050 CT7 mainboard", |
" 4c53 1051 CE7 mainboard", |
" 4c53 1070 PC6 mainboard", |
" 1221 82092AA PCI to PCMCIA Bridge", |
" 1222 82092AA IDE Controller", |
" 1223 SAA7116", |
" 1225 82452KX/GX [Orion]", |
" 1226 82596 PRO/10 PCI", |
" 1227 82865 EtherExpress PRO/100A", |
" 1228 82556 EtherExpress PRO/100 Smart", |
" 1229 82557/8/9 [Ethernet Pro 100]", |
" 0e11 3001 82559 Fast Ethernet LOM with Alert on LAN*", |
" 0e11 3002 82559 Fast Ethernet LOM with Alert on LAN*", |
" 0e11 3003 82559 Fast Ethernet LOM with Alert on LAN*", |
" 0e11 3004 82559 Fast Ethernet LOM with Alert on LAN*", |
" 0e11 3005 82559 Fast Ethernet LOM with Alert on LAN*", |
" 0e11 3006 82559 Fast Ethernet LOM with Alert on LAN*", |
" 0e11 3007 82559 Fast Ethernet LOM with Alert on LAN*", |
" 0e11 b01e NC3120 Fast Ethernet NIC", |
" 0e11 b01f NC3122 Fast Ethernet NIC (dual port)", |
" 0e11 b02f NC1120 Ethernet NIC", |
" 0e11 b04a Netelligent 10/100TX NIC with Wake on LAN", |
" 0e11 b0c6 NC3161 Fast Ethernet NIC (embedded, WOL)", |
" 0e11 b0c7 NC3160 Fast Ethernet NIC (embedded)", |
" 0e11 b0d7 NC3121 Fast Ethernet NIC (WOL)", |
" 0e11 b0dd NC3131 Fast Ethernet NIC (dual port)", |
" 0e11 b0de NC3132 Fast Ethernet Module (dual port)", |
" 0e11 b0e1 NC3133 Fast Ethernet Module (100-FX)", |
" 0e11 b134 NC3163 Fast Ethernet NIC (embedded, WOL)", |
" 0e11 b13c NC3162 Fast Ethernet NIC (embedded)", |
" 0e11 b144 NC3123 Fast Ethernet NIC (WOL)", |
" 0e11 b163 NC3134 Fast Ethernet NIC (dual port)", |
" 0e11 b164 NC3135 Fast Ethernet Upgrade Module (dual port)", |
" 0e11 b1a4 NC7131 Gigabit Server Adapter", |
" 1014 005c 82558B Ethernet Pro 10/100", |
" 1014 01bc 82559 Fast Ethernet LAN On Motherboard", |
" 1014 01f1 10/100 Ethernet Server Adapter", |
" 1014 01f2 10/100 Ethernet Server Adapter", |
" 1014 0207 Ethernet Pro/100 S", |
" 1014 0232 10/100 Dual Port Server Adapter", |
" 1014 023a ThinkPad R30", |
" 1014 105c Netfinity 10/100", |
" 1014 2205 ThinkPad A22p", |
" 1014 305c 10/100 EtherJet Management Adapter", |
" 1014 405c 10/100 EtherJet Adapter with Alert on LAN", |
" 1014 505c 10/100 EtherJet Secure Management Adapter", |
" 1014 605c 10/100 EtherJet Secure Management Adapter", |
" 1014 705c 10/100 Netfinity 10/100 Ethernet Security Adapter", |
" 1014 805c 10/100 Netfinity 10/100 Ethernet Security Adapter", |
" 1028 009b PowerEdge 2500/2550", |
" 1028 00ce PowerEdge 1400", |
" 1033 8000 PC-9821X-B06", |
" 1033 8016 PK-UG-X006", |
" 1033 801f PK-UG-X006", |
" 1033 8026 PK-UG-X006", |
" 1033 8063 82559-based Fast Ethernet Adapter", |
" 1033 8064 82559-based Fast Ethernet Adapter", |
" 103c 10c0 NetServer 10/100TX", |
" 103c 10c3 NetServer 10/100TX", |
" 103c 10ca NetServer 10/100TX", |
" 103c 10cb NetServer 10/100TX", |
" 103c 10e3 NetServer 10/100TX", |
" 103c 10e4 NetServer 10/100TX", |
" 103c 1200 NetServer 10/100TX", |
" 108e 10cf EtherExpress PRO/100(B)", |
" 10c3 1100 SmartEther100 SC1100", |
" 10cf 1115 8255x-based Ethernet Adapter (10/100)", |
" 10cf 1143 8255x-based Ethernet Adapter (10/100)", |
" 110a 008b 82551QM Fast Ethernet Multifuction PCI/CardBus Controller", |
" 1179 0001 8255x-based Ethernet Adapter (10/100)", |
" 1179 0002 PCI FastEther LAN on Docker", |
" 1179 0003 8255x-based Fast Ethernet", |
" 1259 2560 AT-2560 100", |
" 1259 2561 AT-2560 100 FX Ethernet Adapter", |
" 1266 0001 NE10/100 Adapter", |
" 13e9 1000 6221L-4U", |
" 144d 2501 SEM-2000 MiniPCI LAN Adapter", |
" 144d 2502 SEM-2100IL MiniPCI LAN Adapter", |
" 1668 1100 EtherExpress PRO/100B (TX) (MiniPCI Ethernet+Modem)", |
" 4c53 1080 CT8 mainboard", |
" 4c53 10e0 PSL09 PrPMC", |
" 8086 0001 EtherExpress PRO/100B (TX)", |
" 8086 0002 EtherExpress PRO/100B (T4)", |
" 8086 0003 EtherExpress PRO/10+", |
" 8086 0004 EtherExpress PRO/100 WfM", |
" 8086 0005 82557 10/100", |
" 8086 0006 82557 10/100 with Wake on LAN", |
" 8086 0007 82558 10/100 Adapter", |
" 8086 0008 82558 10/100 with Wake on LAN", |
" 8086 000a EtherExpress PRO/100+ Management Adapter", |
" 8086 000b EtherExpress PRO/100+", |
" 8086 000c EtherExpress PRO/100+ Management Adapter", |
" 8086 000d EtherExpress PRO/100+ Alert On LAN II* Adapter", |
" 8086 000e EtherExpress PRO/100+ Management Adapter with Alert On LAN*", |
" 8086 000f EtherExpress PRO/100 Desktop Adapter", |
" 8086 0010 EtherExpress PRO/100 S Management Adapter", |
" 8086 0011 EtherExpress PRO/100 S Management Adapter", |
" 8086 0012 EtherExpress PRO/100 S Advanced Management Adapter (D)", |
" 8086 0013 EtherExpress PRO/100 S Advanced Management Adapter (E)", |
" 8086 0030 EtherExpress PRO/100 Management Adapter with Alert On LAN* GC", |
" 8086 0031 EtherExpress PRO/100 Desktop Adapter", |
" 8086 0040 EtherExpress PRO/100 S Desktop Adapter", |
" 8086 0041 EtherExpress PRO/100 S Desktop Adapter", |
" 8086 0042 EtherExpress PRO/100 Desktop Adapter", |
" 8086 0050 EtherExpress PRO/100 S Desktop Adapter", |
" 8086 1009 EtherExpress PRO/100+ Server Adapter", |
" 8086 100c EtherExpress PRO/100+ Server Adapter (PILA8470B)", |
" 8086 1012 EtherExpress PRO/100 S Server Adapter (D)", |
" 8086 1013 EtherExpress PRO/100 S Server Adapter (E)", |
" 8086 1015 EtherExpress PRO/100 S Dual Port Server Adapter", |
" 8086 1017 EtherExpress PRO/100+ Dual Port Server Adapter", |
" 8086 1030 EtherExpress PRO/100+ Management Adapter with Alert On LAN* G Server", |
" 8086 1040 EtherExpress PRO/100 S Server Adapter", |
" 8086 1041 EtherExpress PRO/100 S Server Adapter", |
" 8086 1042 EtherExpress PRO/100 Server Adapter", |
" 8086 1050 EtherExpress PRO/100 S Server Adapter", |
" 8086 1051 EtherExpress PRO/100 Server Adapter", |
" 8086 1052 EtherExpress PRO/100 Server Adapter", |
" 8086 10f0 EtherExpress PRO/100+ Dual Port Adapter", |
" 8086 2009 EtherExpress PRO/100 S Mobile Adapter", |
" 8086 200d EtherExpress PRO/100 Cardbus", |
" 8086 200e EtherExpress PRO/100 LAN+V90 Cardbus Modem", |
" 8086 200f EtherExpress PRO/100 SR Mobile Adapter", |
" 8086 2010 EtherExpress PRO/100 S Mobile Combo Adapter", |
" 8086 2013 EtherExpress PRO/100 SR Mobile Combo Adapter", |
" 8086 2016 EtherExpress PRO/100 S Mobile Adapter", |
" 8086 2017 EtherExpress PRO/100 S Combo Mobile Adapter", |
" 8086 2018 EtherExpress PRO/100 SR Mobile Adapter", |
" 8086 2019 EtherExpress PRO/100 SR Combo Mobile Adapter", |
" 8086 2101 EtherExpress PRO/100 P Mobile Adapter", |
" 8086 2102 EtherExpress PRO/100 SP Mobile Adapter", |
" 8086 2103 EtherExpress PRO/100 SP Mobile Adapter", |
" 8086 2104 EtherExpress PRO/100 SP Mobile Adapter", |
" 8086 2105 EtherExpress PRO/100 SP Mobile Adapter", |
" 8086 2106 EtherExpress PRO/100 P Mobile Adapter", |
" 8086 2107 EtherExpress PRO/100 Network Connection", |
" 8086 2108 EtherExpress PRO/100 Network Connection", |
" 8086 2200 EtherExpress PRO/100 P Mobile Combo Adapter", |
" 8086 2201 EtherExpress PRO/100 P Mobile Combo Adapter", |
" 8086 2202 EtherExpress PRO/100 SP Mobile Combo Adapter", |
" 8086 2203 EtherExpress PRO/100+ MiniPCI", |
" 8086 2204 EtherExpress PRO/100+ MiniPCI", |
" 8086 2205 EtherExpress PRO/100 SP Mobile Combo Adapter", |
" 8086 2206 EtherExpress PRO/100 SP Mobile Combo Adapter", |
" 8086 2207 EtherExpress PRO/100 SP Mobile Combo Adapter", |
" 8086 2208 EtherExpress PRO/100 P Mobile Combo Adapter", |
" 8086 2402 EtherExpress PRO/100+ MiniPCI", |
" 8086 2407 EtherExpress PRO/100+ MiniPCI", |
" 8086 2408 EtherExpress PRO/100+ MiniPCI", |
" 8086 2409 EtherExpress PRO/100+ MiniPCI", |
" 8086 240f EtherExpress PRO/100+ MiniPCI", |
" 8086 2410 EtherExpress PRO/100+ MiniPCI", |
" 8086 2411 EtherExpress PRO/100+ MiniPCI", |
" 8086 2412 EtherExpress PRO/100+ MiniPCI", |
" 8086 2413 EtherExpress PRO/100+ MiniPCI", |
" 8086 3000 82559 Fast Ethernet LAN on Motherboard", |
" 8086 3001 82559 Fast Ethernet LOM with Basic Alert on LAN*", |
" 8086 3002 82559 Fast Ethernet LOM with Alert on LAN II*", |
" 8086 3006 EtherExpress PRO/100 S Network Connection", |
" 8086 3007 EtherExpress PRO/100 S Network Connection", |
" 8086 3008 EtherExpress PRO/100 Network Connection", |
" 8086 3010 EtherExpress PRO/100 S Network Connection", |
" 8086 3011 EtherExpress PRO/100 S Network Connection", |
" 8086 3012 EtherExpress PRO/100 Network Connection", |
" 8086 3411 SDS2 Mainboard", |
" 122d 430FX - 82437FX TSC [Triton I]", |
" 122e 82371FB PIIX ISA [Triton I]", |
" 1230 82371FB PIIX IDE [Triton I]", |
" 1231 DSVD Modem", |
" 1234 430MX - 82371MX Mobile PCI I/O IDE Xcelerator (MPIIX)", |
" 1235 430MX - 82437MX Mob. System Ctrlr (MTSC) & 82438MX Data Path (MTDP)", |
" 1237 440FX - 82441FX PMC [Natoma]", |
" 1239 82371FB PIIX IDE Interface", |
" 123b 82380PB PCI to PCI Docking Bridge", |
" 123c 82380AB (MISA) Mobile PCI-to-ISA Bridge", |
" 123d 683053 Programmable Interrupt Device", |
" 123e 82466GX (IHPC) Integrated Hot-Plug Controller", |
" 123f 82466GX Integrated Hot-Plug Controller (IHPC)", |
" 1240 82752 (752) AGP Graphics Accelerator", |
" 124b 82380FB (MPCI2) Mobile Docking Controller", |
" 1250 430HX - 82439HX TXC [Triton II]", |
" 1360 82806AA PCI64 Hub PCI Bridge", |
" 1361 82806AA PCI64 Hub Controller (HRes)", |
" 8086 1361 82806AA PCI64 Hub Controller (HRes)", |
" 8086 8000 82806AA PCI64 Hub Controller (HRes)", |
" 1460 82870P2 P64H2 Hub PCI Bridge", |
" 1461 82870P2 P64H2 I/OxAPIC", |
" 15d9 3480 P4DP6", |
" 4c53 1090 Cx9/Vx9 mainboard", |
" 1462 82870P2 P64H2 Hot Plug Controller", |
" 1960 80960RP [i960RP Microprocessor]", |
" 101e 0431 MegaRAID 431 RAID Controller", |
" 101e 0438 MegaRAID 438 Ultra2 LVD RAID Controller", |
" 101e 0466 MegaRAID 466 Express Plus RAID Controller", |
" 101e 0467 MegaRAID 467 Enterprise 1500 RAID Controller", |
" 101e 0490 MegaRAID 490 Express 300 RAID Controller", |
" 101e 0762 MegaRAID 762 Express RAID Controller", |
" 101e 09a0 PowerEdge Expandable RAID Controller 2/SC", |
" 1028 0467 PowerEdge Expandable RAID Controller 2/DC", |
" 1028 1111 PowerEdge Expandable RAID Controller 2/SC", |
" 103c 03a2 MegaRAID", |
" 103c 10c6 MegaRAID 438, HP NetRAID-3Si", |
" 103c 10c7 MegaRAID T5, Integrated HP NetRAID", |
" 103c 10cc MegaRAID, Integrated HP NetRAID", |
" 103c 10cd HP NetRAID-1Si", |
" 105a 0000 SuperTrak", |
" 105a 2168 SuperTrak Pro", |
" 105a 5168 SuperTrak66/100", |
" 1111 1111 MegaRAID 466, PowerEdge Expandable RAID Controller 2/SC", |
" 1111 1112 PowerEdge Expandable RAID Controller 2/SC", |
" 113c 03a2 MegaRAID", |
" e4bf 1010 CG1-RADIO", |
" e4bf 1020 CU2-QUARTET", |
" e4bf 1040 CU1-CHORUS", |
" e4bf 3100 CX1-BAND", |
" 1962 80960RM [i960RM Microprocessor]", |
" 105a 0000 SuperTrak SX6000 I2O CPU", |
" 1a21 82840 840 (Carmel) Chipset Host Bridge (Hub A)", |
" 1a23 82840 840 (Carmel) Chipset AGP Bridge", |
" 1a24 82840 840 (Carmel) Chipset PCI Bridge (Hub B)", |
" 1a30 82845 845 (Brookdale) Chipset Host Bridge", |
" 1028 010e Optiplex GX240", |
" 1a31 82845 845 (Brookdale) Chipset AGP Bridge", |
" 1a38 Server DMA Engine", |
" 1a48 PRO/10GbE SR Server Adapter", |
" 2410 82801AA ISA Bridge (LPC)", |
" 2411 82801AA IDE", |
" 2412 82801AA USB", |
" 2413 82801AA SMBus", |
" 2415 82801AA AC'97 Audio", |
" 1028 0095 Precision Workstation 220 Integrated Digital Audio", |
" 110a 0051 Activy 2xx", |
" 11d4 0040 SoundMAX Integrated Digital Audio", |
" 11d4 0048 SoundMAX Integrated Digital Audio", |
" 11d4 5340 SoundMAX Integrated Digital Audio", |
" 1734 1025 Activy 3xx", |
" 2416 82801AA AC'97 Modem", |
" 2418 82801AA PCI Bridge", |
" 2420 82801AB ISA Bridge (LPC)", |
" 2421 82801AB IDE", |
" 2422 82801AB USB", |
" 2423 82801AB SMBus", |
" 2425 82801AB AC'97 Audio", |
" 11d4 0040 SoundMAX Integrated Digital Audio", |
" 11d4 0048 SoundMAX Integrated Digital Audio", |
" 2426 82801AB AC'97 Modem", |
" 2428 82801AB PCI Bridge", |
" 2440 82801BA ISA Bridge (LPC)", |
" 2442 82801BA/BAM USB (Hub #1)", |
" 1014 01c6 Netvista A40/A40p", |
" 1025 1016 Travelmate 612 TX", |
" 1028 010e Optiplex GX240", |
" 1043 8027 TUSL2-C Mainboard", |
" 104d 80df Vaio PCG-FX403", |
" 147b 0507 TH7II-RAID", |
" 8086 4532 D815EEA2 mainboard", |
" 8086 4557 D815EGEW Mainboard", |
" 2443 82801BA/BAM SMBus", |
" 1014 01c6 Netvista A40/A40p", |
" 1025 1016 Travelmate 612 TX", |
" 1028 010e Optiplex GX240", |
" 1043 8027 TUSL2-C Mainboard", |
" 104d 80df Vaio PCG-FX403", |
" 147b 0507 TH7II-RAID", |
" 8086 4532 D815EEA2 mainboard", |
" 8086 4557 D815EGEW Mainboard", |
" 2444 82801BA/BAM USB (Hub #2)", |
" 1025 1016 Travelmate 612 TX", |
" 1028 010e Optiplex GX240", |
" 1043 8027 TUSL2-C Mainboard", |
" 104d 80df Vaio PCG-FX403", |
" 147b 0507 TH7II-RAID", |
" 8086 4532 D815EEA2 mainboard", |
" 2445 82801BA/BAM AC'97 Audio", |
" 0e11 0088 Evo D500", |
" 1014 01c6 Netvista A40/A40p", |
" 1025 1016 Travelmate 612 TX", |
" 104d 80df Vaio PCG-FX403", |
" 1462 3370 STAC9721 AC", |
" 147b 0507 TH7II-RAID", |
" 8086 4557 D815EGEW Mainboard", |
" 2446 82801BA/BAM AC'97 Modem", |
" 1025 1016 Travelmate 612 TX", |
" 104d 80df Vaio PCG-FX403", |
" 2448 82801 Mobile PCI Bridge", |
" 103c 099c NX6110/NC6120", |
" 1734 1055 Amilo M1420", |
" 2449 82801BA/BAM/CA/CAM Ethernet Controller", |
" 0e11 0012 EtherExpress PRO/100 VM", |
" 0e11 0091 EtherExpress PRO/100 VE", |
" 1014 01ce EtherExpress PRO/100 VE", |
" 1014 01dc EtherExpress PRO/100 VE", |
" 1014 01eb EtherExpress PRO/100 VE", |
" 1014 01ec EtherExpress PRO/100 VE", |
" 1014 0202 EtherExpress PRO/100 VE", |
" 1014 0205 EtherExpress PRO/100 VE", |
" 1014 0217 EtherExpress PRO/100 VE", |
" 1014 0234 EtherExpress PRO/100 VE", |
" 1014 023d EtherExpress PRO/100 VE", |
" 1014 0244 EtherExpress PRO/100 VE", |
" 1014 0245 EtherExpress PRO/100 VE", |
" 1014 0265 PRO/100 VE Desktop Connection", |
" 1014 0267 PRO/100 VE Desktop Connection", |
" 1014 026a PRO/100 VE Desktop Connection", |
" 109f 315d EtherExpress PRO/100 VE", |
" 109f 3181 EtherExpress PRO/100 VE", |
" 1179 ff01 PRO/100 VE Network Connection", |
" 1186 7801 EtherExpress PRO/100 VE", |
" 144d 2602 HomePNA 1M CNR", |
" 8086 3010 EtherExpress PRO/100 VE", |
" 8086 3011 EtherExpress PRO/100 VM", |
" 8086 3012 82562EH based Phoneline", |
" 8086 3013 EtherExpress PRO/100 VE", |
" 8086 3014 EtherExpress PRO/100 VM", |
" 8086 3015 82562EH based Phoneline", |
" 8086 3016 EtherExpress PRO/100 P Mobile Combo", |
" 8086 3017 EtherExpress PRO/100 P Mobile", |
" 8086 3018 EtherExpress PRO/100", |
" 244a 82801BAM IDE U100", |
" 1025 1016 Travelmate 612TX", |
" 104d 80df Vaio PCG-FX403", |
" 244b 82801BA IDE U100", |
" 1014 01c6 Netvista A40/A40p", |
" 1028 010e Optiplex GX240", |
" 1043 8027 TUSL2-C Mainboard", |
" 147b 0507 TH7II-RAID", |
" 8086 4532 D815EEA2 mainboard", |
" 8086 4557 D815EGEW Mainboard", |
" 244c 82801BAM ISA Bridge (LPC)", |
" 244e 82801 PCI Bridge", |
" 1014 0267 NetVista A30p", |
" 2450 82801E ISA Bridge (LPC)", |
" 2452 82801E USB", |
" 2453 82801E SMBus", |
" 2459 82801E Ethernet Controller 0", |
" 245b 82801E IDE U100", |
" 245d 82801E Ethernet Controller 1", |
" 245e 82801E PCI Bridge", |
" 2480 82801CA LPC Interface Controller", |
" 2482 82801CA/CAM USB (Hub #1)", |
" 0e11 0030 Evo N600c", |
" 1014 0220 ThinkPad A/T/X Series", |
" 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP", |
" 15d9 3480 P4DP6", |
" 8086 1958 vpr Matrix 170B4", |
" 8086 3424 SE7501HG2 Mainboard", |
" 8086 4541 Latitude C640", |
" 2483 82801CA/CAM SMBus Controller", |
" 1014 0220 ThinkPad A/T/X Series", |
" 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP", |
" 15d9 3480 P4DP6", |
" 8086 1958 vpr Matrix 170B4", |
" 2484 82801CA/CAM USB (Hub #2)", |
" 0e11 0030 Evo N600c", |
" 1014 0220 ThinkPad A/T/X Series", |
" 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP", |
" 15d9 3480 P4DP6", |
" 8086 1958 vpr Matrix 170B4", |
" 2485 82801CA/CAM AC'97 Audio Controller", |
" 1013 5959 Crystal WMD Audio Codec", |
" 1014 0222 ThinkPad T23 (2647-4MG) or A30/A30p (2652/2653)", |
" 1014 0508 ThinkPad T30", |
" 1014 051c ThinkPad A/T/X Series", |
" 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP", |
" 144d c006 vpr Matrix 170B4", |
" 2486 82801CA/CAM AC'97 Modem Controller", |
" 1014 0223 ThinkPad A/T/X Series", |
" 1014 0503 ThinkPad R31 2656BBG", |
" 1014 051a ThinkPad A/T/X Series", |
" 101f 1025 620 Series", |
" 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP", |
" 134d 4c21 Dell Inspiron 2100 internal modem", |
" 144d 2115 vpr Matrix 170B4 internal modem", |
" 14f1 5421 MD56ORD V.92 MDC Modem", |
" 2487 82801CA/CAM USB (Hub #3)", |
" 0e11 0030 Evo N600c", |
" 1014 0220 ThinkPad A/T/X Series", |
" 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP", |
" 15d9 3480 P4DP6", |
" 8086 1958 vpr Matrix 170B4", |
" 248a 82801CAM IDE U100", |
" 0e11 0030 Evo N600c", |
" 1014 0220 ThinkPad A/T/X Series", |
" 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP", |
" 8086 1958 vpr Matrix 170B4", |
" 8086 4541 Latitude C640", |
" 248b 82801CA Ultra ATA Storage Controller", |
" 15d9 3480 P4DP6", |
" 248c 82801CAM ISA Bridge (LPC)", |
" 24c0 82801DB/DBL (ICH4/ICH4-L) LPC Interface Bridge", |
" 1014 0267 NetVista A30p", |
" 1462 5800 845PE Max (MS-6580)", |
" 24c1 82801DBL (ICH4-L) IDE Controller", |
" 24c2 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #1", |
" 1014 0267 NetVista A30p", |
" 1025 005a TravelMate 290", |
" 1028 0126 Optiplex GX260", |
" 1028 0163 Latitude D505", |
" 1028 0196 Inspiron 5160", |
" 103c 088c NC8000 laptop", |
" 103c 0890 NC6000 laptop", |
" 1071 8160 MIM2000", |
" 1462 5800 845PE Max (MS-6580)", |
" 1509 2990 Averatec 5110H laptop", |
" 1734 1004 D1451 Mainboard (SCENIC N300, i845GV)", |
" 1734 1055 Amilo M1420", |
" 4c53 1090 Cx9 / Vx9 mainboard", |
" 8086 4541 Latitude D400", |
" 24c3 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) SMBus Controller", |
" 1014 0267 NetVista A30p", |
" 1025 005a TravelMate 290", |
" 1028 0126 Optiplex GX260", |
" 103c 088c NC8000 laptop", |
" 103c 0890 NC6000 laptop", |
" 1071 8160 MIM2000", |
" 1458 24c2 GA-8PE667 Ultra", |
" 1462 5800 845PE Max (MS-6580)", |
" 1734 1004 D1451 Mainboard (SCENIC N300, i845GV)", |
" 1734 1055 Amilo M1420", |
" 4c53 1090 Cx9 / Vx9 mainboard", |
" 24c4 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #2", |
" 1014 0267 NetVista A30p", |
" 1025 005a TravelMate 290", |
" 1028 0126 Optiplex GX260", |
" 1028 0163 Latitude D505", |
" 1028 0196 Inspiron 5160", |
" 103c 088c NC8000 laptop", |
" 103c 0890 NC6000 laptop", |
" 1071 8160 MIM2000", |
" 1462 5800 845PE Max (MS-6580)", |
" 1509 2990 Averatec 5110H", |
" 1734 1004 D1451 Mainboard (SCENIC N300, i845GV)", |
" 4c53 1090 Cx9 / Vx9 mainboard", |
" 8086 4541 Latitude D400", |
" 24c5 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) AC'97 Audio Controller", |
" 0e11 00b8 Analog Devices Inc. codec [SoundMAX]", |
" 1014 0267 NetVista A30p", |
" 1025 005a TravelMate 290", |
" 1028 0139 Latitude D400", |
" 1028 0163 Latitude D505", |
" 1028 0196 Inspiron 5160", |
" 103c 088c NC8000 laptop", |
" 103c 0890 NC6000 laptop", |
" 1071 8160 MIM2000", |
" 1458 a002 GA-8PE667 Ultra", |
" 1462 5800 845PE Max (MS-6580)", |
" 1734 1005 D1451 (SCENIC N300, i845GV) Sigmatel STAC9750T", |
" 1734 1055 Amilo M1420", |
" 24c6 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) AC'97 Modem Controller", |
" 1025 003c Aspire 2001WLCi (Compal CL50 motherboard) implementation", |
" 1025 005a TravelMate 290", |
" 1028 0196 Inspiron 5160", |
" 103c 088c NC8000 laptop", |
" 103c 0890 NC6000 laptop", |
" 1071 8160 MIM2000", |
" 24c7 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #3", |
" 1014 0267 NetVista A30p", |
" 1025 005a TravelMate 290", |
" 1028 0126 Optiplex GX260", |
" 1028 0163 Latitude D505", |
" 1028 0196 Inspiron 5160", |
" 103c 088c NC8000 laptop", |
" 103c 0890 NC6000 laptop", |
" 1071 8160 MIM2000", |
" 1462 5800 845PE Max (MS-6580)", |
" 1509 2990 Averatec 5110H", |
" 1734 1004 D1451 Mainboard (SCENIC N300, i845GV)", |
" 4c53 1090 Cx9 / Vx9 mainboard", |
" 8086 4541 Latitude D400", |
" 24ca 82801DBM (ICH4-M) IDE Controller", |
" 1025 005a TravelMate 290", |
" 1028 0163 Latitude D505", |
" 1028 0196 Inspiron 5160", |
" 103c 088c NC8000 laptop", |
" 103c 0890 NC6000 laptop", |
" 1071 8160 MIM2000", |
" 1734 1055 Amilo M1420", |
" 8086 4541 Latitude D400", |
" 24cb 82801DB (ICH4) IDE Controller", |
" 1014 0267 NetVista A30p", |
" 1028 0126 Optiplex GX260", |
" 1458 24c2 GA-8PE667 Ultra", |
" 1462 5800 845PE Max (MS-6580)", |
" 1734 1004 D1451 Mainboard (SCENIC N300, i845GV)", |
" 4c53 1090 Cx9 / Vx9 mainboard", |
" 24cc 82801DBM (ICH4-M) LPC Interface Bridge", |
" 1734 1055 Amilo M1420", |
" 24cd 82801DB/DBM (ICH4/ICH4-M) USB2 EHCI Controller", |
" 1014 0267 NetVista A30p", |
" 1025 005a TravelMate 290", |
" 1028 011d Latitude D600", |
" 1028 0126 Optiplex GX260", |
" 1028 0139 Latitude D400", |
" 1028 0163 Latitude D505", |
" 1028 0196 Inspiron 5160", |
" 103c 088c NC8000 laptop", |
" 103c 0890 NC6000 laptop", |
" 1071 8160 MIM2000", |
" 1462 3981 845PE Max (MS-6580)", |
" 1509 1968 Averatec 5110H", |
" 1734 1004 D1451 Mainboard (SCENIC N300, i845GV)", |
" 1734 1055 Amilo M1420", |
" 4c53 1090 Cx9 / Vx9 mainboard", |
" 24d0 82801EB/ER (ICH5/ICH5R) LPC Interface Bridge", |
" 24d1 82801EB (ICH5) SATA Controller", |
" 1028 0169 Precision 470", |
" 1028 019a PowerEdge SC1425", |
" 103c 12bc d530 CMT (DG746A)", |
" 1043 80a6 P4P800 SE Mainboard", |
" 1458 24d1 GA-8IPE1000 Pro2 motherboard (865PE)", |
" 1462 7280 865PE Neo2 (MS-6728)", |
" 15d9 4580 P4SCE Mainboard", |
" 8086 3427 S875WP1-E mainboard", |
" 8086 4246 Desktop Board D865GBF", |
" 8086 524c D865PERL mainboard", |
" 24d2 82801EB/ER (ICH5/ICH5R) USB UHCI Controller #1", |
" 1014 02ed xSeries server mainboard", |
" 1028 0169 Precision 470", |
" 1028 0183 PowerEdge 1800", |
" 1028 019a PowerEdge SC1425", |
" 103c 006a NX9500", |
" 103c 12bc d530 CMT (DG746A)", |
" 1043 80a6 P5P800-MX Mainboard", |
" 1458 24d2 GA-8IPE1000/8KNXP motherboard", |
" 1462 7280 865PE Neo2 (MS-6728)", |
" 15d9 4580 P4SCE Mainboard", |
" 1734 101c Primergy RX300 S2", |
" 8086 3427 S875WP1-E mainboard", |
" 8086 4246 Desktop Board D865GBF", |
" 8086 524c D865PERL mainboard", |
" 24d3 82801EB/ER (ICH5/ICH5R) SMBus Controller", |
" 1014 02ed xSeries server mainboard", |
" 1028 0156 Precision 360", |
" 1028 0169 Precision 470", |
" 1043 80a6 P4P800 Mainboard", |
" 1458 24d2 GA-8IPE1000 Pro2 motherboard (865PE)", |
" 1462 7280 865PE Neo2 (MS-6728)", |
" 15d9 4580 P4SCE Mainboard", |
" 1734 101c Primergy RX300 S2", |
" 8086 3427 S875WP1-E mainboard", |
" 8086 4246 Desktop Board D865GBF", |
" 8086 524c D865PERL mainboard", |
" 24d4 82801EB/ER (ICH5/ICH5R) USB UHCI Controller #2", |
" 1014 02ed xSeries server mainboard", |
" 1028 0169 Precision 470", |
" 1028 0183 PowerEdge 1800", |
" 1028 019a PowerEdge SC1425", |
" 103c 006a NX9500", |
" 103c 12bc d530 CMT (DG746A)", |
" 1043 80a6 P5P800-MX Mainboard", |
" 1458 24d2 GA-8IPE1000 Pro2 motherboard (865PE)", |
" 1462 7280 865PE Neo2 (MS-6728)", |
" 15d9 4580 P4SCE Mainboard", |
" 1734 101c Primergy RX300 S2", |
" 8086 3427 S875WP1-E mainboard", |
" 8086 4246 Desktop Board D865GBF", |
" 8086 524c D865PERL mainboard", |
" 24d5 82801EB/ER (ICH5/ICH5R) AC'97 Audio Controller", |
" 1028 0169 Precision 470", |
" 103c 006a NX9500", |
" 103c 12bc d330 uT", |
" 1043 80f3 P4P800 Mainboard", |
" 1043 810f P5P800-MX Mainboard", |
" 1458 a002 GA-8IPE1000/8KNXP motherboard", |
" 1462 0080 65PE Neo2-V (MS-6788) mainboard", |
" 1462 7280 865PE Neo2 (MS-6728)", |
" 8086 a000 D865PERL mainboard", |
" 8086 e000 D865PERL mainboard", |
" 8086 e001 Desktop Board D865GBF", |
" 24d6 82801EB/ER (ICH5/ICH5R) AC'97 Modem Controller", |
" 103c 006a NX9500", |
" 24d7 82801EB/ER (ICH5/ICH5R) USB UHCI Controller #3", |
" 1014 02ed xSeries server mainboard", |
" 1028 0169 Precision 470", |
" 1028 0183 PowerEdge 1800", |
" 103c 006a NX9500", |
" 103c 12bc d530 CMT (DG746A)", |
" 1043 80a6 P5P800-MX Mainboard", |
" 1458 24d2 GA-8IPE1000 Pro2 motherboard (865PE)", |
" 1462 7280 865PE Neo2 (MS-6728)", |
" 15d9 4580 P4SCE Mainboard", |
" 1734 101c Primergy RX300 S2", |
" 8086 3427 S875WP1-E mainboard", |
" 8086 4246 Desktop Board D865GBF", |
" 8086 524c D865PERL mainboard", |
" 24db 82801EB/ER (ICH5/ICH5R) IDE Controller", |
" 1014 02ed xSeries server mainboard", |
" 1028 0169 Precision 470", |
" 1028 019a PowerEdge SC1425", |
" 103c 006a NX9500", |
" 103c 12bc d530 CMT (DG746A)", |
" 1043 80a6 P5P800-MX Mainboard", |
" 1458 24d2 GA-8IPE1000 Pro2 motherboard (865PE)", |
" 1462 7280 865PE Neo2 (MS-6728)", |
" 1462 7580 MSI 875P", |
" 15d9 4580 P4SCE Mainboard", |
" 1734 101c Primergy RX300 S2", |
" 8086 24db P4C800 Mainboard", |
" 8086 3427 S875WP1-E mainboard", |
" 8086 4246 Desktop Board D865GBF", |
" 8086 524c D865PERL mainboard", |
" 24dc 82801EB (ICH5) LPC Interface Bridge", |
" 24dd 82801EB/ER (ICH5/ICH5R) USB2 EHCI Controller", |
" 1014 02ed xSeries server mainboard", |
" 1028 0169 Precision 470", |
" 1028 0183 PowerEdge 1800", |
" 1028 019a PowerEdge SC1425", |
" 103c 006a NX9500", |
" 103c 12bc d530 CMT (DG746A)", |
" 1043 80a6 P5P800-MX Mainboard", |
" 1458 5006 GA-8IPE1000 Pro2 motherboard (865PE)", |
" 1462 7280 865PE Neo2 (MS-6728)", |
" 8086 3427 S875WP1-E mainboard", |
" 8086 4246 Desktop Board D865GBF", |
" 8086 524c D865PERL mainboard", |
" 24de 82801EB/ER (ICH5/ICH5R) USB UHCI Controller #4", |
" 1014 02ed xSeries server mainboard", |
" 1028 0169 Precision 470", |
" 1043 80a6 P5P800-MX Mainboard", |
" 1458 24d2 GA-8IPE1000 Pro2 motherboard (865PE)", |
" 1462 7280 865PE Neo2 (MS-6728)", |
" 15d9 4580 P4SCE Mainboard", |
" 1734 101c Primergy RX300 S2", |
" 8086 3427 S875WP1-E mainboard", |
" 8086 4246 Desktop Board D865GBF", |
" 8086 524c D865PERL mainboard", |
" 24df 82801ER (ICH5R) SATA Controller", |
" 2500 82820 820 (Camino) Chipset Host Bridge (MCH)", |
" 1028 0095 Precision Workstation 220 Chipset", |
" 1043 801c P3C-2000 system chipset", |
" 2501 82820 820 (Camino) Chipset Host Bridge (MCH)", |
" 1043 801c P3C-2000 system chipset", |
" 250b 82820 820 (Camino) Chipset Host Bridge", |
" 250f 82820 820 (Camino) Chipset AGP Bridge", |
" 2520 82805AA MTH Memory Translator Hub", |
" 2521 82804AA MRH-S Memory Repeater Hub for SDRAM", |
" 2530 82850 850 (Tehama) Chipset Host Bridge (MCH)", |
" 147b 0507 TH7II-RAID", |
" 2531 82860 860 (Wombat) Chipset Host Bridge (MCH)", |
" 2532 82850 850 (Tehama) Chipset AGP Bridge", |
" 2533 82860 860 (Wombat) Chipset AGP Bridge", |
" 2534 82860 860 (Wombat) Chipset PCI Bridge", |
" 2540 E7500 Memory Controller Hub", |
" 15d9 3480 P4DP6", |
" 2541 E7500/E7501 Host RASUM Controller", |
" 15d9 3480 P4DP6", |
" 4c53 1090 Cx9 / Vx9 mainboard", |
" 8086 3424 SE7501HG2 Mainboard", |
" 2543 E7500/E7501 Hub Interface B PCI-to-PCI Bridge", |
" 2544 E7500/E7501 Hub Interface B RASUM Controller", |
" 4c53 1090 Cx9 / Vx9 mainboard", |
" 2545 E7500/E7501 Hub Interface C PCI-to-PCI Bridge", |
" 2546 E7500/E7501 Hub Interface C RASUM Controller", |
" 2547 E7500/E7501 Hub Interface D PCI-to-PCI Bridge", |
" 2548 E7500/E7501 Hub Interface D RASUM Controller", |
" 254c E7501 Memory Controller Hub", |
" 4c53 1090 Cx9 / Vx9 mainboard", |
" 8086 3424 SE7501HG2 Mainboard", |
" 2550 E7505 Memory Controller Hub", |
" 2551 E7505/E7205 Series RAS Controller", |
" 2552 E7505/E7205 PCI-to-AGP Bridge", |
" 2553 E7505 Hub Interface B PCI-to-PCI Bridge", |
" 2554 E7505 Hub Interface B PCI-to-PCI Bridge RAS Controller", |
" 255d E7205 Memory Controller Hub", |
" 2560 82845G/GL[Brookdale-G]/GE/PE DRAM Controller/Host-Hub Interface", |
" 1028 0126 Optiplex GX260", |
" 1458 2560 GA-8PE667 Ultra", |
" 1462 5800 845PE Max (MS-6580)", |
" 2561 82845G/GL[Brookdale-G]/GE/PE Host-to-AGP Bridge", |
" 2562 82845G/GL[Brookdale-G]/GE Chipset Integrated Graphics Device", |
" 0e11 00b9 Evo D510 SFF", |
" 1014 0267 NetVista A30p", |
" 1734 1004 D1451 Mainboard (SCENIC N300, i845GV)", |
" 2570 82865G/PE/P DRAM Controller/Host-Hub Interface", |
" 103c 006a NX9500", |
" 1043 80f2 P5P800-MX Mainboard", |
" 1458 2570 GA-8IPE1000 Pro2 motherboard (865PE)", |
" 2571 82865G/PE/P PCI to AGP Controller", |
" 2572 82865G Integrated Graphics Controller", |
" 1028 019d Dimension 3000", |
" 103c 12bc D530 sff(dc578av)", |
" 1043 80a5 P5P800-MX Mainboard", |
" 8086 4246 Desktop Board D865GBF", |
" 2573 82865G/PE/P PCI to CSA Bridge", |
" 2576 82865G/PE/P Processor to I/O Memory Interface", |
" 2578 82875P/E7210 Memory Controller Hub", |
" 1458 2578 GA-8KNXP motherboard (875P)", |
" 1462 7580 MS-6758 (875P Neo)", |
" 15d9 4580 P4SCE Motherboard", |
" 2579 82875P Processor to AGP Controller", |
" 257b 82875P/E7210 Processor to PCI to CSA Bridge", |
" 257e 82875P/E7210 Processor to I/O Memory Interface", |
" 2580 915G/P/GV/GL/PL/910GL Express Memory Controller Hub", |
" 1458 2580 GA-8I915ME-G Mainboard", |
" 1462 7028 915P/G Neo2", |
" 1734 105b Scenic W620", |
" 2581 915G/P/GV/GL/PL/910GL Express PCI Express Root Port", |
" 2582 82915G/GV/910GL Express Chipset Family Graphics Controller", |
" 1028 1079 Optiplex GX280", |
" 103c 3006 DC7100 SFF(DX878AV)", |
" 1043 2582 P5GD1-VW Mainboard", |
" 1458 2582 GA-8I915ME-G Mainboard", |
" 1734 105b Scenic W620", |
" 2584 925X/XE Express Memory Controller Hub", |
" 2585 925X/XE Express PCI Express Root Port", |
" 2588 E7220/E7221 Memory Controller Hub", |
" 2589 E7220/E7221 PCI Express Root Port", |
" 258a E7221 Integrated Graphics Controller", |
" 2590 Mobile 915GM/PM/GMS/910GML Express Processor to DRAM Controller", |
" 1028 0182 Dell Latidude C610", |
" 103c 099c NX6110/NC6120", |
" a304 81b7 Vaio VGN-S3XP", |
" 2591 Mobile 915GM/PM Express PCI Express Root Port", |
" 2592 Mobile 915GM/GMS/910GML Express Graphics Controller", |
" 103c 099c NX6110/NC6120", |
" 103c 308a NC6220", |
" 1043 1881 GMA 900 915GM Integrated Graphics", |
" 25a1 6300ESB LPC Interface Controller", |
" 25a2 6300ESB PATA Storage Controller", |
" 4c53 10b0 CL9 mainboard", |
" 4c53 10e0 PSL09 PrPMC", |
" 25a3 6300ESB SATA Storage Controller", |
" 4c53 10b0 CL9 mainboard", |
" 4c53 10d0 Telum ASLP10 Processor AMC", |
" 4c53 10e0 PSL09 PrPMC", |
" 25a4 6300ESB SMBus Controller", |
" 4c53 10b0 CL9 mainboard", |
" 4c53 10d0 Telum ASLP10 Processor AMC", |
" 4c53 10e0 PSL09 PrPMC", |
" 25a6 6300ESB AC'97 Audio Controller", |
" 4c53 10b0 CL9 mainboard", |
" 25a7 6300ESB AC'97 Modem Controller", |
" 25a9 6300ESB USB Universal Host Controller", |
" 4c53 10b0 CL9 mainboard", |
" 4c53 10d0 Telum ASLP10 Processor AMC", |
" 4c53 10e0 PSL09 PrPMC", |
" 25aa 6300ESB USB Universal Host Controller", |
" 4c53 10b0 CL9 mainboard", |
" 4c53 10e0 PSL09 PrPMC", |
" 25ab 6300ESB Watchdog Timer", |
" 4c53 10b0 CL9 mainboard", |
" 4c53 10d0 Telum ASLP10 Processor AMC", |
" 4c53 10e0 PSL09 PrPMC", |
" 25ac 6300ESB I/O Advanced Programmable Interrupt Controller", |
" 4c53 10b0 CL9 mainboard", |
" 4c53 10d0 Telum ASLP10 Processor AMC", |
" 4c53 10e0 PSL09 PrPMC", |
" 25ad 6300ESB USB2 Enhanced Host Controller", |
" 4c53 10b0 CL9 mainboard", |
" 4c53 10d0 Telum ASLP10 Processor AMC", |
" 4c53 10e0 PSL09 PrPMC", |
" 25ae 6300ESB 64-bit PCI-X Bridge", |
" 25b0 6300ESB SATA RAID Controller", |
" 4c53 10d0 Telum ASLP10 Processor AMC", |
" 4c53 10e0 PSL09 PrPMC", |
" 25c0 Workstation Memory Controller Hub", |
" 25d0 Server Memory Controller Hub", |
" 25d4 Server Memory Contoller Hub", |
" 25d8 Server Memory Controller Hub", |
" 25e2 Server PCI Express x4 Port 2", |
" 25e3 Server PCI Express x4 Port 3", |
" 25e4 Server PCI Express x4 Port 4", |
" 25e5 Server PCI Express x4 Port 5", |
" 25e6 Server PCI Express x4 Port 6", |
" 25e7 Server PCI Express x4 Port 7", |
" 25e8 Server AMB Memory Mapped Registers", |
" 25f0 Server Error Reporting Registers", |
" 25f1 Reserved Registers", |
" 25f3 Reserved Registers", |
" 25f5 Server FBD Registers", |
" 25f6 Server FBD Registers", |
" 25f7 Server PCI Express x8 Port 2-3", |
" 25f8 Server PCI Express x8 Port 4-5", |
" 25f9 Server PCI Express x8 Port 6-7", |
" 25fa Server PCI Express x16 Port 4-7", |
" 2600 E8500/E8501 Hub Interface 1.5", |
" 2601 E8500/E8501 PCI Express x4 Port D", |
" 2602 E8500/E8501 PCI Express x4 Port C0", |
" 2603 E8500/E8501 PCI Express x4 Port C1", |
" 2604 E8500/E8501 PCI Express x4 Port B0", |
" 2605 E8500/E8501 PCI Express x4 Port B1", |
" 2606 E8500/E8501 PCI Express x4 Port A0", |
" 2607 E8500/E8501 PCI Express x4 Port A1", |
" 2608 E8500/E8501 PCI Express x8 Port C", |
" 2609 E8500/E8501 PCI Express x8 Port B", |
" 260a E8500/E8501 PCI Express x8 Port A", |
" 260c E8500/E8501 IMI Registers", |
" 2610 E8500/E8501 Front Side Bus, Boot, and Interrupt Registers", |
" 2611 E8500/E8501 Address Mapping Registers", |
" 2612 E8500/E8501 RAS Registers", |
" 2613 E8500/E8501 Reserved Registers", |
" 2614 E8500/E8501 Reserved Registers", |
" 2615 E8500/E8501 Miscellaneous Registers", |
" 2617 E8500/E8501 Reserved Registers", |
" 2618 E8500/E8501 Reserved Registers", |
" 2619 E8500/E8501 Reserved Registers", |
" 261a E8500/E8501 Reserved Registers", |
" 261b E8500/E8501 Reserved Registers", |
" 261c E8500/E8501 Reserved Registers", |
" 261d E8500/E8501 Reserved Registers", |
" 261e E8500/E8501 Reserved Registers", |
" 2620 E8500/E8501 eXternal Memory Bridge", |
" 2621 E8500/E8501 XMB Miscellaneous Registers", |
" 2622 E8500/E8501 XMB Memory Interleaving Registers", |
" 2623 E8500/E8501 XMB DDR Initialization and Calibration", |
" 2624 E8500/E8501 XMB Reserved Registers", |
" 2625 E8500/E8501 XMB Reserved Registers", |
" 2626 E8500/E8501 XMB Reserved Registers", |
" 2627 E8500/E8501 XMB Reserved Registers", |
" 2640 82801FB/FR (ICH6/ICH6R) LPC Interface Bridge", |
" 1462 7028 915P/G Neo2", |
" 1734 105c Scenic W620", |
" 2641 82801FBM (ICH6M) LPC Interface Bridge", |
" 103c 099c NX6110/NC6120", |
" 2642 82801FW/FRW (ICH6W/ICH6RW) LPC Interface Bridge", |
" 2651 82801FB/FW (ICH6/ICH6W) SATA Controller", |
" 1028 0179 Optiplex GX280", |
" 1043 2601 P5GD1-VW Mainboard", |
" 1734 105c Scenic W620", |
" 8086 4147 D915GAG Motherboard", |
" 2652 82801FR/FRW (ICH6R/ICH6RW) SATA Controller", |
" 1462 7028 915P/G Neo2", |
" 2653 82801FBM (ICH6M) SATA Controller", |
" 2658 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #1", |
" 1028 0179 Optiplex GX280", |
" 103c 099c NX6110/NC6120", |
" 1043 80a6 P5GD1-VW Mainboard", |
" 1458 2558 GA-8I915ME-G Mainboard", |
" 1462 7028 915P/G Neo2", |
" 1734 105c Scenic W620", |
" 2659 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #2", |
" 1028 0179 Optiplex GX280", |
" 103c 099c NX6110/NC6120", |
" 1043 80a6 P5GD1-VW Mainboard", |
" 1458 2659 GA-8I915ME-G Mainboard", |
" 1462 7028 915P/G Neo2", |
" 1734 105c Scenic W620", |
" 265a 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #3", |
" 1028 0179 Optiplex GX280", |
" 103c 099c NX6110/NC6120", |
" 1043 80a6 P5GD1-VW Mainboard", |
" 1458 265a GA-8I915ME-G Mainboard", |
" 1462 7028 915P/G Neo2", |
" 1734 105c Scenic W620", |
" 265b 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #4", |
" 1028 0179 Optiplex GX280", |
" 103c 099c NX6110/NC6120", |
" 1043 80a6 P5GD1-VW Mainboard", |
" 1458 265a GA-8I915ME-G Mainboard", |
" 1462 7028 915P/G Neo2", |
" 1734 105c Scenic W620", |
" 265c 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB2 EHCI Controller", |
" 1028 0179 Optiplex GX280", |
" 103c 099c NX6110/NC6120", |
" 1043 80a6 P5GD1-VW Mainboard", |
" 1458 5006 GA-8I915ME-G Mainboard", |
" 1462 7028 915P/G Neo2", |
" 1734 105c Scenic W620", |
" 2660 82801FB/FBM/FR/FW/FRW (ICH6 Family) PCI Express Port 1", |
" 103c 099c NX6110/NC6120", |
" 2662 82801FB/FBM/FR/FW/FRW (ICH6 Family) PCI Express Port 2", |
" 2664 82801FB/FBM/FR/FW/FRW (ICH6 Family) PCI Express Port 3", |
" 2666 82801FB/FBM/FR/FW/FRW (ICH6 Family) PCI Express Port 4", |
" 2668 82801FB/FBM/FR/FW/FRW (ICH6 Family) High Definition Audio Controller", |
" 1043 814e P5GD1-VW Mainboard", |
" 266a 82801FB/FBM/FR/FW/FRW (ICH6 Family) SMBus Controller", |
" 1028 0179 Optiplex GX280", |
" 1043 80a6 P5GD1-VW Mainboard", |
" 1458 266a GA-8I915ME-G Mainboard", |
" 1462 7028 915P/G Neo2", |
" 1734 105c Scenic W620", |
" 266c 82801FB/FBM/FR/FW/FRW (ICH6 Family) LAN Controller", |
" 266d 82801FB/FBM/FR/FW/FRW (ICH6 Family) AC'97 Modem Controller", |
" 1025 006a Conexant AC'97 CoDec (in Acer TravelMate 2410 serie laptop)", |
" 103c 099c NX6110/NC6120", |
" 266e 82801FB/FBM/FR/FW/FRW (ICH6 Family) AC'97 Audio Controller", |
" 1025 006a Realtek ALC 655 codec (in Acer TravelMate 2410 serie laptop)", |
" 1028 0179 Optiplex GX280", |
" 1028 0182 Latitude D610 Laptop", |
" 1028 0188 Inspiron 6000 laptop", |
" 103c 0944 Compaq NC6220", |
" 103c 099c NX6110/NC6120", |
" 103c 3006 DC7100 SFF(DX878AV)", |
" 1458 a002 GA-8I915ME-G Mainboard", |
" 152d 0745 Packard Bell A8550 Laptop", |
" 1734 105a Scenic W620", |
" 266f 82801FB/FBM/FR/FW/FRW (ICH6 Family) IDE Controller", |
" 103c 099c NX6110/NC6120", |
" 1043 80a6 P5GD1-VW Mainboard", |
" 1458 266f GA-8I915ME-G Mainboard", |
" 1462 7028 915P/G Neo2", |
" 1734 105c Scenic W620", |
" 2670 Enterprise Southbridge LPC", |
" 2680 Enterprise Southbridge SATA IDE", |
" 2681 Enterprise Southbridge SATA AHCI", |
" 2682 Enterprise Southbridge SATA RAID", |
" 2683 Enterprise Southbridge SATA RAID", |
" 2688 Enterprise Southbridge UHCI USB #1", |
" 2689 Enterprise Southbridge UHCI USB #2", |
" 268a Enterprise Southbridge UHCI USB #3", |
" 268b Enterprise Southbridge UHCI USB #4", |
" 268c Enterprise Southbridge EHCI USB", |
" 2690 Enterprise Southbridge PCI Express Root Port 1", |
" 2692 Enterprise Southbridge PCI Express Root Port 2", |
" 2694 Enterprise Southbridge PCI Express Root Port 3", |
" 2696 Enterprise Southbridge PCI Express Root Port 4", |
" 2698 Enterprise Southbridge AC '97 Audio", |
" 2699 Enterprise Southbridge AC '97 Modem", |
" 269a Enterprise Southbridge High Definition Audio", |
" 269b Enterprise Southbridge SMBus", |
" 269e Enterprise Southbridge PATA", |
" 2770 945G/GZ/P/PL Express Memory Controller Hub", |
" 8086 544e DeskTop Board D945GTP", |
" 2771 945G/GZ/P/PL Express PCI Express Root Port", |
" 2772 945G/GZ Express Integrated Graphics Controller", |
" 8086 544e DeskTop Board D945GTP", |
" 2774 955X Express Memory Controller Hub", |
" 2775 955X Express PCI Express Root Port", |
" 2776 945G/GZ Express Integrated Graphics Controller", |
" 2778 E7230 Memory Controller Hub", |
" 2779 E7230 PCI Express Root Port", |
" 277a 975X Express PCI Express Root Port", |
" 277c 975X Express Memory Controller Hub", |
" 277d 975X Express PCI Express Root Port", |
" 2782 82915G Express Chipset Family Graphics Controller", |
" 1043 2582 P5GD1-VW Mainboard", |
" 1734 105b Scenic W620", |
" 2792 Mobile 915GM/GMS/910GML Express Graphics Controller", |
" 103c 099c NX6110/NC6120", |
" 1043 1881 GMA 900 915GM Integrated Graphics", |
" 27a0 Mobile 945GM/PM/GMS/940GML and 945GT Express Memory Controller Hub", |
" 27a1 Mobile 945GM/PM/GMS/940GML and 945GT Express PCI Express Root Port", |
" 27a2 Mobile 945GM/GMS/940GML Express Integrated Graphics Controller", |
" 27a6 Mobile 945GM/GMS/940GML Express Integrated Graphics Controller", |
" 27b0 82801GH (ICH7DH) LPC Interface Bridge", |
" 27b8 82801GB/GR (ICH7 Family) LPC Interface Bridge", |
" 8086 544e DeskTop Board D945GTP", |
" 27b9 82801GBM (ICH7-M) LPC Interface Bridge", |
" 27bd 82801GHM (ICH7-M DH) LPC Interface Bridge", |
" 27c0 82801GB/GR/GH (ICH7 Family) Serial ATA Storage Controller IDE", |
" 8086 544e DeskTop Board D945GTP", |
" 27c1 82801GR/GH (ICH7 Family) Serial ATA Storage Controller AHCI", |
" 27c3 82801GR/GH (ICH7 Family) Serial ATA Storage Controller RAID", |
" 27c4 82801GBM/GHM (ICH7 Family) Serial ATA Storage Controller IDE", |
" 27c5 82801GBM/GHM (ICH7 Family) Serial ATA Storage Controller AHCI", |
" 27c6 82801GHM (ICH7-M DH) Serial ATA Storage Controller RAID", |
" 27c8 82801G (ICH7 Family) USB UHCI #1", |
" 8086 544e DeskTop Board D945GTP", |
" 27c9 82801G (ICH7 Family) USB UHCI #2", |
" 8086 544e DeskTop Board D945GTP", |
" 27ca 82801G (ICH7 Family) USB UHCI #3", |
" 8086 544e DeskTop Board D945GTP", |
" 27cb 82801G (ICH7 Family) USB UHCI #4", |
" 8086 544e DeskTop Board D945GTP", |
" 27cc 82801G (ICH7 Family) USB2 EHCI Controller", |
" 8086 544e DeskTop Board D945GTP", |
" 27d0 82801G (ICH7 Family) PCI Express Port 1", |
" 27d2 82801G (ICH7 Family) PCI Express Port 2", |
" 27d4 82801G (ICH7 Family) PCI Express Port 3", |
" 27d6 82801G (ICH7 Family) PCI Express Port 4", |
" 27d8 82801G (ICH7 Family) High Definition Audio Controller", |
" 27da 82801G (ICH7 Family) SMBus Controller", |
" 8086 544e DeskTop Board D945GTP", |
" 27dc 82801G (ICH7 Family) LAN Controller", |
" 8086 308d DeskTop Board D945GTP", |
" 27dd 82801G (ICH7 Family) AC'97 Modem Controller", |
" 27de 82801G (ICH7 Family) AC'97 Audio Controller", |
" 27df 82801G (ICH7 Family) IDE Controller", |
" 8086 544e DeskTop Board D945GTP", |
" 27e0 82801GR/GH/GHM (ICH7 Family) PCI Express Port 5", |
" 27e2 82801GR/GH/GHM (ICH7 Family) PCI Express Port 6", |
" 2810 LPC Interface Controller", |
" 2811 Mobile LPC Interface Controller", |
" 2812 LPC Interface Controller", |
" 2814 LPC Interface Controller", |
" 2815 Mobile LPC Interface Controller", |
" 2820 SATA Controller 1 IDE", |
" 2821 SATA Controller AHCI", |
" 2822 SATA Controller RAID", |
" 2824 SATA Controller AHCI", |
" 2825 SATA Controller 2 IDE", |
" 2828 Mobile SATA Controller IDE", |
" 2829 Mobile SATA Controller AHCI", |
" 282a Mobile SATA Controller RAID", |
" 2830 USB UHCI Controller #1", |
" 2831 USB UHCI Controller #2", |
" 2832 USB UHCI Controller #3", |
" 2834 USB UHCI Controller #4", |
" 2835 USB UHCI Controller #5", |
" 2836 USB2 EHCI Controller #1", |
" 283a USB2 EHCI Controller #2", |
" 283e SMBus Controller", |
" 283f PCI Express Port 1", |
" 2841 PCI Express Port 2", |
" 2843 PCI Express Port 3", |
" 2845 PCI Express Port 4", |
" 2847 PCI Express Port 5", |
" 2849 PCI Express Port 6", |
" 284b HD Audio Controller", |
" 284f Thermal Subsystem", |
" 2850 Mobile IDE Controller", |
" 2970 Memory Controller Hub", |
" 2971 PCI Express Root Port", |
" 2972 Integrated Graphics Controller", |
" 2973 Integrated Graphics Controller", |
" 2974 HECI Controller", |
" 2976 PT IDER Controller", |
" 2977 KT Controller", |
" 2990 Memory Controller Hub", |
" 2991 PCI Express Root Port", |
" 2992 Integrated Graphics Controller", |
" 2993 Integrated Graphics Controller", |
" 2994 HECI Controller", |
" 2995 HECI Controller", |
" 2996 PT IDER Controller", |
" 2997 KT Controller", |
" 29a0 Memory Controller Hub", |
" 29a1 PCI Express Root Port", |
" 29a2 Integrated Graphics Controller", |
" 29a3 Integrated Graphics Controller", |
" 29a4 HECI Controller", |
" 29a5 HECI Controller", |
" 29a6 PT IDER Controller", |
" 29a7 KT Controller", |
" 2a00 Mobile Memory Controller Hub", |
" 2a01 Mobile PCI Express Root Port", |
" 2a02 Mobile Integrated Graphics Controller", |
" 2a03 Mobile Integrated Graphics Controller", |
" 3092 Integrated RAID", |
" 3200 GD31244 PCI-X SATA HBA", |
" 3340 82855PM Processor to I/O Controller", |
" 1025 005a TravelMate 290", |
" 103c 088c NC8000 laptop", |
" 103c 0890 NC6000 laptop", |
" 3341 82855PM Processor to AGP Controller", |
" 3500 Enterprise Southbridge PCI Express Upstream Port", |
" 3501 Enterprise Southbridge PCI Express Upstream Port", |
" 3504 Enterprise Southbridge IOxAPIC", |
" 3505 Enterprise Southbridge IOxAPIC", |
" 350c Enterprise Southbridge PCI Express to PCI-X Bridge", |
" 350d Enterprise Southbridge PCI Express to PCI-X Bridge", |
" 3510 Enterprise Southbridge PCI Express Downstream Port E1", |
" 3511 Enterprise Southbridge PCI Express Downstream Port E1", |
" 3514 Enterprise Southbridge PCI Express Downstream Port E2", |
" 3515 Enterprise Southbridge PCI Express Downstream Port E2", |
" 3518 Enterprise Southbridge PCI Express Downstream Port E3", |
" 3519 Enterprise Southbridge PCI Express Downstream Port E3", |
" 3575 82830 830 Chipset Host Bridge", |
" 0e11 0030 Evo N600c", |
" 1014 021d ThinkPad A/T/X Series", |
" 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP", |
" 3576 82830 830 Chipset AGP Bridge", |
" 3577 82830 CGC [Chipset Graphics Controller]", |
" 1014 0513 ThinkPad A/T/X Series", |
" 3578 82830 830 Chipset Host Bridge", |
" 3580 82852/82855 GM/GME/PM/GMV Processor to I/O Controller", |
" 1028 0139 Latitude D400", |
" 1028 0163 Latitude D505", |
" 1028 0196 Inspiron 5160", |
" 1734 1055 Amilo M1420", |
" 4c53 10b0 CL9 mainboard", |
" 4c53 10e0 PSL09 PrPMC", |
" 3581 82852/82855 GM/GME/PM/GMV Processor to AGP Controller", |
" 1734 1055 Amilo M1420", |
" 3582 82852/855GM Integrated Graphics Device", |
" 1028 0139 Latitude D400", |
" 1028 0163 Latitude D505", |
" 4c53 10b0 CL9 mainboard", |
" 4c53 10e0 PSL09 PrPMC", |
" 3584 82852/82855 GM/GME/PM/GMV Processor to I/O Controller", |
" 1028 0139 Latitude D400", |
" 1028 0163 Latitude D505", |
" 1028 0196 Inspiron 5160", |
" 1734 1055 Amilo M1420", |
" 4c53 10b0 CL9 mainboard", |
" 4c53 10e0 PSL09 PrPMC", |
" 3585 82852/82855 GM/GME/PM/GMV Processor to I/O Controller", |
" 1028 0139 Latitude D400", |
" 1028 0163 Latitude D505", |
" 1028 0196 Inspiron 5160", |
" 1734 1055 Amilo M1420", |
" 4c53 10b0 CL9 mainboard", |
" 4c53 10e0 PSL09 PrPMC", |
" 3590 E7520 Memory Controller Hub", |
" 1028 019a PowerEdge SC1425", |
" 1734 103e Primergy RX300 S2", |
" 4c53 10d0 Telum ASLP10 Processor AMC", |
" 3591 E7525/E7520 Error Reporting Registers", |
" 1028 0169 Precision 470", |
" 4c53 10d0 Telum ASLP10 Processor AMC", |
" 3592 E7320 Memory Controller Hub", |
" 3593 E7320 Error Reporting Registers", |
" 3594 E7520 DMA Controller", |
" 4c53 10d0 Telum ASLP10 Processor AMC", |
" 3595 E7525/E7520/E7320 PCI Express Port A", |
" 3596 E7525/E7520/E7320 PCI Express Port A1", |
" 3597 E7525/E7520 PCI Express Port B", |
" 3598 E7520 PCI Express Port B1", |
" 3599 E7520 PCI Express Port C", |
" 359a E7520 PCI Express Port C1", |
" 359b E7525/E7520/E7320 Extended Configuration Registers", |
" 359e E7525 Memory Controller Hub", |
" 1028 0169 Precision 470", |
" 4220 PRO/Wireless 2200BG Network Connection", |
" 4222 PRO/Wireless 3945ABG Network Connection", |
" 8086 1005 PRO/Wireless 3945BG Network Connection", |
" 8086 1034 PRO/Wireless 3945BG Network Connection", |
" 8086 1044 PRO/Wireless 3945BG Network Connection", |
" 4223 PRO/Wireless 2915ABG Network Connection", |
" 1351 103c Compaq NC6220", |
" 4224 PRO/Wireless 2915ABG Network Connection", |
" 4227 PRO/Wireless 3945ABG Network Connection", |
" 8086 1011 Thinkpad X60s", |
" 8086 1014 PRO/Wireless 3945BG Network Connection", |
" 5200 EtherExpress PRO/100 Intelligent Server", |
" 5201 EtherExpress PRO/100 Intelligent Server", |
" 8086 0001 EtherExpress PRO/100 Server Ethernet Adapter", |
" 530d 80310 IOP [IO Processor]", |
" 7000 82371SB PIIX3 ISA [Natoma/Triton II]", |
" 7010 82371SB PIIX3 IDE [Natoma/Triton II]", |
" 7020 82371SB PIIX3 USB [Natoma/Triton II]", |
" 7030 430VX - 82437VX TVX [Triton VX]", |
" 7050 Intercast Video Capture Card", |
" 7051 PB 642365-003 (Business Video Conferencing Card)", |
" 7100 430TX - 82439TX MTXC", |
" 7110 82371AB/EB/MB PIIX4 ISA", |
" 15ad 1976 virtualHW v3", |
" 7111 82371AB/EB/MB PIIX4 IDE", |
" 15ad 1976 virtualHW v3", |
" 7112 82371AB/EB/MB PIIX4 USB", |
" 15ad 1976 virtualHW v3", |
" 7113 82371AB/EB/MB PIIX4 ACPI", |
" 15ad 1976 virtualHW v3", |
" 7120 82810 GMCH [Graphics Memory Controller Hub]", |
" 4c53 1040 CL7 mainboard", |
" 4c53 1060 PC7 mainboard", |
" 7121 82810 CGC [Chipset Graphics Controller]", |
" 4c53 1040 CL7 mainboard", |
" 4c53 1060 PC7 mainboard", |
" 8086 4341 Cayman (CA810) Mainboard", |
" 7122 82810 DC-100 GMCH [Graphics Memory Controller Hub]", |
" 7123 82810 DC-100 CGC [Chipset Graphics Controller]", |
" 7124 82810E DC-133 GMCH [Graphics Memory Controller Hub]", |
" 7125 82810E DC-133 CGC [Chipset Graphics Controller]", |
" 7126 82810 DC-133 System and Graphics Controller", |
" 7128 82810-M DC-100 System and Graphics Controller", |
" 712a 82810-M DC-133 System and Graphics Controller", |
" 7180 440LX/EX - 82443LX/EX Host bridge", |
" 7181 440LX/EX - 82443LX/EX AGP bridge", |
" 7190 440BX/ZX/DX - 82443BX/ZX/DX Host bridge", |
" 0e11 0500 Armada 1750 Laptop System Chipset", |
" 0e11 b110 Armada M700/E500", |
" 1028 008e PowerEdge 1300 mainboard", |
" 1179 0001 Toshiba Tecra 8100 Laptop System Chipset", |
" 15ad 1976 virtualHW v3", |
" 4c53 1050 CT7 mainboard", |
" 4c53 1051 CE7 mainboard", |
" 7191 440BX/ZX/DX - 82443BX/ZX/DX AGP bridge", |
" 1028 008e PowerEdge 1300 mainboard", |
" 7192 440BX/ZX/DX - 82443BX/ZX/DX Host bridge (AGP disabled)", |
" 0e11 0460 Armada 1700 Laptop System Chipset", |
" 4c53 1000 CC7/CR7/CP7/VC7/VP7/VR7 mainboard", |
" 7194 82440MX Host Bridge", |
" 1033 0000 Versa Note Vxi", |
" 4c53 10a0 CA3/CR3 mainboard", |
" 7195 82440MX AC'97 Audio Controller", |
" 1033 80cc Versa Note VXi", |
" 10cf 1099 QSound_SigmaTel Stac97 PCI Audio", |
" 11d4 0040 SoundMAX Integrated Digital Audio", |
" 11d4 0048 SoundMAX Integrated Digital Audio", |
" 7196 82440MX AC'97 Modem Controller", |
" 7198 82440MX ISA Bridge", |
" 7199 82440MX EIDE Controller", |
" 719a 82440MX USB Universal Host Controller", |
" 719b 82440MX Power Management Controller", |
" 71a0 440GX - 82443GX Host bridge", |
" 4c53 1050 CT7 mainboard", |
" 4c53 1051 CE7 mainboard", |
" 71a1 440GX - 82443GX AGP bridge", |
" 71a2 440GX - 82443GX Host bridge (AGP disabled)", |
" 4c53 1000 CC7/CR7/CP7/VC7/VP7/VR7 mainboard", |
" 7600 82372FB PIIX5 ISA", |
" 7601 82372FB PIIX5 IDE", |
" 7602 82372FB PIIX5 USB", |
" 7603 82372FB PIIX5 SMBus", |
" 7800 82740 (i740) AGP Graphics Accelerator", |
" 003d 0008 Starfighter AGP", |
" 003d 000b Starfighter AGP", |
" 1092 0100 Stealth II G460", |
" 10b4 201a Lightspeed 740", |
" 10b4 202f Lightspeed 740", |
" 8086 0000 Terminator 2x/i", |
" 8086 0100 Intel740 Graphics Accelerator", |
" 84c4 450KX/GX [Orion] - 82454KX/GX PCI bridge", |
" 84c5 450KX/GX [Orion] - 82453KX/GX Memory controller", |
" 84ca 450NX - 82451NX Memory & I/O Controller", |
" 84cb 450NX - 82454NX/84460GX PCI Expander Bridge", |
" 84e0 460GX - 84460GX System Address Controller (SAC)", |
" 84e1 460GX - 84460GX System Data Controller (SDC)", |
" 84e2 460GX - 84460GX AGP Bridge (GXB function 2)", |
" 84e3 460GX - 84460GX Memory Address Controller (MAC)", |
" 84e4 460GX - 84460GX Memory Data Controller (MDC)", |
" 84e6 460GX - 82466GX Wide and fast PCI eXpander Bridge (WXB)", |
" 84ea 460GX - 84460GX AGP Bridge (GXB function 1)", |
" 8500 IXP4XX Intel Network Processor (IXP420/421/422/425/IXC1100)", |
" 1993 0ded mGuard-PCI AV#2", |
" 1993 0dee mGuard-PCI AV#1", |
" 1993 0def mGuard-PCI AV#0", |
" 9000 IXP2000 Family Network Processor", |
" 9001 IXP2400 Network Processor", |
" 9002 IXP2300 Network Processor", |
" 9004 IXP2800 Network Processor", |
" 9621 Integrated RAID", |
" 9622 Integrated RAID", |
" 9641 Integrated RAID", |
" 96a1 Integrated RAID", |
" b152 21152 PCI-to-PCI Bridge", |
" b154 21154 PCI-to-PCI Bridge", |
" b555 21555 Non transparent PCI-to-PCI Bridge", |
" 12d9 000a PCI VoIP Gateway", |
" 4c53 1050 CT7 mainboard", |
" 4c53 1051 CE7 mainboard", |
" e4bf 1000 CC8-1-BLUES", |
"8401 TRENDware International Inc.", |
"8800 Trigem Computer Inc.", |
" 2008 Video assistent component", |
"8866 T-Square Design Inc.", |
"8888 Silicon Magic", |
"8912 TRX", |
"8c4a Winbond", |
" 1980 W89C940 misprogrammed [ne2k]", |
"8e0e Computone Corporation", |
"8e2e KTI", |
" 3000 ET32P2", |
"9004 Adaptec", |
" 0078 AHA-2940U_CN", |
" 1078 AIC-7810", |
" 1160 AIC-1160 [Family Fibre Channel Adapter]", |
" 2178 AIC-7821", |
" 3860 AHA-2930CU", |
" 3b78 AHA-4844W/4844UW", |
" 5075 AIC-755x", |
" 5078 AHA-7850", |
" 9004 7850 AHA-2904/Integrated AIC-7850", |
" 5175 AIC-755x", |
" 5178 AIC-7851", |
" 5275 AIC-755x", |
" 5278 AIC-7852", |
" 5375 AIC-755x", |
" 5378 AIC-7850", |
" 5475 AIC-755x", |
" 5478 AIC-7850", |
" 5575 AVA-2930", |
" 5578 AIC-7855", |
" 5647 ANA-7711 TCP Offload Engine", |
" 9004 7710 ANA-7711F TCP Offload Engine - Optical", |
" 9004 7711 ANA-7711LP TCP Offload Engine - Copper", |
" 5675 AIC-755x", |
" 5678 AIC-7856", |
" 5775 AIC-755x", |
" 5778 AIC-7850", |
" 5800 AIC-5800", |
" 5900 ANA-5910/5930/5940 ATM155 & 25 LAN Adapter", |
" 5905 ANA-5910A/5930A/5940A ATM Adapter", |
" 6038 AIC-3860", |
" 6075 AIC-1480 / APA-1480", |
" 9004 7560 AIC-1480 / APA-1480 Cardbus", |
" 6078 AIC-7860", |
" 6178 AIC-7861", |
" 9004 7861 AHA-2940AU Single", |
" 6278 AIC-7860", |
" 6378 AIC-7860", |
" 6478 AIC-786x", |
" 6578 AIC-786x", |
" 6678 AIC-786x", |
" 6778 AIC-786x", |
" 6915 ANA620xx/ANA69011A", |
" 9004 0008 ANA69011A/TX 10/100", |
" 9004 0009 ANA69011A/TX 10/100", |
" 9004 0010 ANA62022 2-port 10/100", |
" 9004 0018 ANA62044 4-port 10/100", |
" 9004 0019 ANA62044 4-port 10/100", |
" 9004 0020 ANA62022 2-port 10/100", |
" 9004 0028 ANA69011A/TX 10/100", |
" 9004 8008 ANA69011A/TX 64 bit 10/100", |
" 9004 8009 ANA69011A/TX 64 bit 10/100", |
" 9004 8010 ANA62022 2-port 64 bit 10/100", |
" 9004 8018 ANA62044 4-port 64 bit 10/100", |
" 9004 8019 ANA62044 4-port 64 bit 10/100", |
" 9004 8020 ANA62022 2-port 64 bit 10/100", |
" 9004 8028 ANA69011A/TX 64 bit 10/100", |
" 7078 AHA-294x / AIC-7870", |
" 7178 AHA-2940/2940W / AIC-7871", |
" 7278 AHA-3940/3940W / AIC-7872", |
" 7378 AHA-3985 / AIC-7873", |
" 7478 AHA-2944/2944W / AIC-7874", |
" 7578 AHA-3944/3944W / AIC-7875", |
" 7678 AHA-4944W/UW / AIC-7876", |
" 7710 ANA-7711F Network Accelerator Card (NAC) - Optical", |
" 7711 ANA-7711C Network Accelerator Card (NAC) - Copper", |
" 7778 AIC-787x", |
" 7810 AIC-7810", |
" 7815 AIC-7815 RAID+Memory Controller IC", |
" 9004 7815 ARO-1130U2 RAID Controller", |
" 9004 7840 AIC-7815 RAID+Memory Controller IC", |
" 7850 AIC-7850", |
" 7855 AHA-2930", |
" 7860 AIC-7860", |
" 7870 AIC-7870", |
" 7871 AHA-2940", |
" 7872 AHA-3940", |
" 7873 AHA-3980", |
" 7874 AHA-2944", |
" 7880 AIC-7880P", |
" 7890 AIC-7890", |
" 7891 AIC-789x", |
" 7892 AIC-789x", |
" 7893 AIC-789x", |
" 7894 AIC-789x", |
" 7895 AHA-2940U/UW / AHA-39xx / AIC-7895", |
" 9004 7890 AHA-2940U/2940UW Dual AHA-394xAU/AUW/AUWD AIC-7895B", |
" 9004 7891 AHA-2940U/2940UW Dual", |
" 9004 7892 AHA-3940AU/AUW/AUWD/UWD", |
" 9004 7894 AHA-3944AUWD", |
" 9004 7895 AHA-2940U/2940UW Dual AHA-394xAU/AUW/AUWD AIC-7895B", |
" 9004 7896 AHA-2940U/2940UW Dual AHA-394xAU/AUW/AUWD AIC-7895B", |
" 9004 7897 AHA-2940U/2940UW Dual AHA-394xAU/AUW/AUWD AIC-7895B", |
" 7896 AIC-789x", |
" 7897 AIC-789x", |
" 8078 AIC-7880U", |
" 9004 7880 AIC-7880P Ultra/Ultra Wide SCSI Chipset", |
" 8178 AHA-2940U/UW/D / AIC-7881U", |
" 9004 7881 AHA-2940UW SCSI Host Adapter", |
" 8278 AHA-3940U/UW/UWD / AIC-7882U", |
" 8378 AHA-3940U/UW / AIC-7883U", |
" 8478 AHA-2944UW / AIC-7884U", |
" 8578 AHA-3944U/UWD / AIC-7885", |
" 8678 AHA-4944UW / AIC-7886", |
" 8778 AHA-2940UW Pro / AIC-788x", |
" 9004 7887 2940UW Pro Ultra-Wide SCSI Controller", |
" 8878 AHA-2930UW / AIC-7888", |
" 9004 7888 AHA-2930UW SCSI Controller", |
" 8b78 ABA-1030", |
" ec78 AHA-4944W/UW", |
"9005 Adaptec", |
" 0010 AHA-2940U2/U2W", |
" 9005 2180 AHA-2940U2 SCSI Controller", |
" 9005 8100 AHA-2940U2B SCSI Controller", |
" 9005 a100 AHA-2940U2B SCSI Controller", |
" 9005 a180 AHA-2940U2W SCSI Controller", |
" 9005 e100 AHA-2950U2B SCSI Controller", |
" 0011 AHA-2930U2", |
" 0013 78902", |
" 9005 0003 AAA-131U2 Array1000 1 Channel RAID Controller", |
" 9005 000f AIC7890_ARO", |
" 001f AHA-2940U2/U2W / 7890/7891", |
" 9005 000f 2940U2W SCSI Controller", |
" 9005 a180 2940U2W SCSI Controller", |
" 0020 AIC-7890", |
" 002f AIC-7890", |
" 0030 AIC-7890", |
" 003f AIC-7890", |
" 0050 AHA-3940U2x/395U2x", |
" 9005 f500 AHA-3950U2B", |
" 9005 ffff AHA-3950U2B", |
" 0051 AHA-3950U2D", |
" 9005 b500 AHA-3950U2D", |
" 0053 AIC-7896 SCSI Controller", |
" 9005 ffff AIC-7896 SCSI Controller mainboard implementation", |
" 005f AIC-7896U2/7897U2", |
" 0080 AIC-7892A U160/m", |
" 0e11 e2a0 Compaq 64-Bit/66MHz Wide Ultra3 SCSI Adapter", |
" 9005 6220 AHA-29160C", |
" 9005 62a0 29160N Ultra160 SCSI Controller", |
" 9005 e220 29160LP Low Profile Ultra160 SCSI Controller", |
" 9005 e2a0 29160 Ultra160 SCSI Controller", |
" 0081 AIC-7892B U160/m", |
" 9005 62a1 19160 Ultra160 SCSI Controller", |
" 0083 AIC-7892D U160/m", |
" 008f AIC-7892P U160/m", |
" 1179 0001 Magnia Z310", |
" 15d9 9005 Onboard SCSI Host Adapter", |
" 00c0 AHA-3960D / AIC-7899A U160/m", |
" 0e11 f620 Compaq 64-Bit/66MHz Dual Channel Wide Ultra3 SCSI Adapter", |
" 9005 f620 AHA-3960D U160/m", |
" 00c1 AIC-7899B U160/m", |
" 00c3 AIC-7899D U160/m", |
" 00c5 RAID subsystem HBA", |
" 1028 00c5 PowerEdge 2400,2500,2550,4400", |
" 00cf AIC-7899P U160/m", |
" 1028 00ce PowerEdge 1400", |
" 1028 00d1 PowerEdge 2550", |
" 1028 00d9 PowerEdge 2500", |
" 10f1 2462 Thunder K7 S2462", |
" 15d9 9005 Onboard SCSI Host Adapter", |
" 8086 3411 SDS2 Mainboard", |
" 0241 Serial ATA II RAID 1420SA", |
" 0250 ServeRAID Controller", |
" 1014 0279 ServeRAID-xx", |
" 1014 028c ServeRAID-xx", |
" 0279 ServeRAID 6M", |
" 0283 AAC-RAID", |
" 9005 0283 Catapult", |
" 0284 AAC-RAID", |
" 9005 0284 Tomcat", |
" 0285 AAC-RAID", |
" 0e11 0295 SATA 6Ch (Bearcat)", |
" 1014 02f2 ServeRAID 8i", |
" 1028 0287 PowerEdge Expandable RAID Controller 320/DC", |
" 1028 0291 CERC SATA RAID 2 PCI SATA 6ch (DellCorsair)", |
" 103c 3227 AAR-2610SA", |
" 17aa 0286 Legend S220 (Legend Crusader)", |
" 17aa 0287 Legend S230 (Legend Vulcan)", |
" 9005 0285 2200S (Vulcan)", |
" 9005 0286 2120S (Crusader)", |
" 9005 0287 2200S (Vulcan-2m)", |
" 9005 0288 3230S (Harrier)", |
" 9005 0289 3240S (Tornado)", |
" 9005 028a ASR-2020ZCR", |
" 9005 028b ASR-2025ZCR (Terminator)", |
" 9005 028e ASR-2020SA (Skyhawk)", |
" 9005 028f ASR-2025SA", |
" 9005 0290 AAR-2410SA PCI SATA 4ch (Jaguar II)", |
" 9005 0292 AAR-2810SA PCI SATA 8ch (Corsair-8)", |
" 9005 0293 AAR-21610SA PCI SATA 16ch (Corsair-16)", |
" 9005 0294 ESD SO-DIMM PCI-X SATA ZCR (Prowler)", |
" 9005 0296 ASR-2240S", |
" 9005 0297 ASR-4005SAS", |
" 9005 0298 ASR-4000SAS", |
" 9005 0299 ASR-4800SAS", |
" 9005 029a 4805SAS", |
" 0286 AAC-RAID (Rocket)", |
" 1014 9540 ServeRAID 8k/8k-l4", |
" 1014 9580 ServeRAID 8k/8k-l8", |
" 9005 028c ASR-2230S + ASR-2230SLP PCI-X (Lancer)", |
" 9005 028d ASR-2130S", |
" 9005 029b ASR-2820SA", |
" 9005 029c ASR-2620SA", |
" 9005 029d ASR-2420SA", |
" 9005 029e ICP ICP9024R0", |
" 9005 029f ICP ICP9014R0", |
" 9005 02a0 ICP ICP9047MA", |
" 9005 02a1 ICP ICP9087MA", |
" 9005 02a2 3800SAS", |
" 9005 02a3 ICP ICP5445AU", |
" 9005 02a4 ICP ICP5085LI", |
" 9005 02a5 ICP ICP5085BR", |
" 9005 02a6 ICP9067MA", |
" 9005 02a7 AAR-2830SA", |
" 9005 02a8 AAR-2430SA", |
" 9005 02a9 ICP5087AU", |
" 9005 02aa ICP5047AU", |
" 9005 0800 Callisto", |
" 0500 Obsidian chipset SCSI controller", |
" 1014 02c1 PCI-X DDR 3Gb SAS Adapter (572A/572C)", |
" 1014 02c2 PCI-X DDR 3Gb SAS RAID Adapter (572B/572D)", |
" 0503 Scamp chipset SCSI controller", |
" 1014 02bf Quad Channel PCI-X DDR U320 SCSI RAID Adapter (571E)", |
" 1014 02d5 Quad Channel PCI-X DDR U320 SCSI RAID Adapter (571F)", |
" 0910 AUA-3100B", |
" 091e AUA-3100B", |
" 8000 ASC-29320A U320", |
" 800f AIC-7901 U320", |
" 8010 ASC-39320 U320", |
" 8011 ASC-39320D", |
" 0e11 00ac ASC-39320D U320", |
" 9005 0041 ASC-39320D U320", |
" 8012 ASC-29320 U320", |
" 8013 ASC-29320B U320", |
" 8014 ASC-29320LP U320", |
" 8015 ASC-39320B U320", |
" 8016 ASC-39320A U320", |
" 8017 ASC-29320ALP U320", |
" 801c ASC-39320D U320", |
" 801d AIC-7902B U320", |
" 801e AIC-7901A U320", |
" 801f AIC-7902 U320", |
" 1734 1011 Primergy RX300", |
" 8080 ASC-29320A U320 w/HostRAID", |
" 808f AIC-7901 U320 w/HostRAID", |
" 8090 ASC-39320 U320 w/HostRAID", |
" 8091 ASC-39320D U320 w/HostRAID", |
" 8092 ASC-29320 U320 w/HostRAID", |
" 8093 ASC-29320B U320 w/HostRAID", |
" 8094 ASC-29320LP U320 w/HostRAID", |
" 8095 ASC-39320(B) U320 w/HostRAID", |
" 8096 ASC-39320A U320 w/HostRAID", |
" 8097 ASC-29320ALP U320 w/HostRAID", |
" 809c ASC-39320D(B) U320 w/HostRAID", |
" 809d AIC-7902(B) U320 w/HostRAID", |
" 809e AIC-7901A U320 w/HostRAID", |
" 809f AIC-7902 U320 w/HostRAID", |
"907f Atronics", |
" 2015 IDE-2015PL", |
"919a Gigapixel Corp", |
"9412 Holtek", |
" 6565 6565", |
"9699 Omni Media Technology Inc", |
" 6565 6565", |
"9710 NetMos Technology", |
" 7780 USB IRDA-port", |
" 9805 PCI 1 port parallel adapter", |
" 9815 PCI 9815 Multi-I/O Controller", |
" 1000 0020 2P0S (2 port parallel adaptor)", |
" 9835 PCI 9835 Multi-I/O Controller", |
" 1000 0002 2S (16C550 UART)", |
" 1000 0012 1P2S", |
" 9845 PCI 9845 Multi-I/O Controller", |
" 1000 0004 0P4S (4 port 16550A serial card)", |
" 1000 0006 0P6S (6 port 16550a serial card)", |
" 9855 PCI 9855 Multi-I/O Controller", |
" 1000 0014 1P4S", |
"9902 Stargen Inc.", |
" 0001 SG2010 PCI over Starfabric Bridge", |
" 0002 SG2010 PCI to Starfabric Gateway", |
" 0003 SG1010 Starfabric Switch and PCI Bridge", |
"a0a0 AOPEN Inc.", |
"a0f1 UNISYS Corporation", |
"a200 NEC Corporation", |
"a259 Hewlett Packard", |
"a25b Hewlett Packard GmbH PL24-MKT", |
"a304 Sony", |
"a727 3Com Corporation", |
" 0013 3CRPAG175 Wireless PC Card", |
"aa42 Scitex Digital Video", |
"ac1e Digital Receiver Technology Inc", |
"ac3d Actuality Systems", |
"aecb Adrienne Electronics Corporation", |
" 6250 VITC/LTC Timecode Reader card [PCI-VLTC/RDR]", |
"affe Sirrix AG security technologies", |
" dead Sirrix.PCI4S0 4-port ISDN S0 interface", |
"b1b3 Shiva Europe Limited", |
"bd11 Pinnacle Systems, Inc. (Wrong ID)", |
"c001 TSI Telsys", |
"c0a9 Micron/Crucial Technology", |
"c0de Motorola", |
"c0fe Motion Engineering, Inc.", |
"ca50 Varian Australia Pty Ltd", |
"cafe Chrysalis-ITS", |
" 0003 Luna K3 Hardware Security Module", |
"cccc Catapult Communications", |
"cddd Tyzx, Inc.", |
" 0101 DeepSea 1 High Speed Stereo Vision Frame Grabber", |
" 0200 DeepSea 2 High Speed Stereo Vision Frame Grabber", |
"d161 Digium, Inc.", |
" 0205 Wildcard TE205P", |
" 0210 Wildcard TE210P", |
" 0405 Wildcard TE405P Quad-Span togglable E1/T1/J1 card 5.0v", |
" 0406 Wildcard TE406P Quad-Span togglable E1/T1/J1 echo cancellation card 5.0v", |
" 0410 Wildcard TE410P Quad-Span togglable E1/T1/J1 card 3.3v", |
" 0411 Wildcard TE411P Quad-Span togglable E1/T1/J1 echo cancellation card 3.3v", |
" 2400 Wildcard TDM2400P", |
"d4d4 Dy4 Systems Inc", |
" 0601 PCI Mezzanine Card", |
"d531 I+ME ACTIA GmbH", |
"d84d Exsys", |
"dead Indigita Corporation", |
"deaf Middle Digital Inc.", |
" 9050 PC Weasel Virtual VGA", |
" 9051 PC Weasel Serial Port", |
" 9052 PC Weasel Watchdog Timer", |
"e000 Winbond", |
" e000 W89C940", |
"e159 Tiger Jet Network Inc.", |
" 0001 Tiger3XX Modem/ISDN interface", |
" 0059 0001 128k ISDN-S/T Adapter", |
" 0059 0003 128k ISDN-U Adapter", |
" 00a7 0001 TELES.S0/PCI 2.x ISDN Adapter", |
" 8086 0003 Digium X100P/X101P analogue PSTN FXO interface", |
" 0002 Tiger100APC ISDN chipset", |
"e4bf EKF Elektronik GmbH", |
"e55e Essence Technology, Inc.", |
"ea01 Eagle Technology", |
" 000a PCI-773 Temperature Card", |
" 0032 PCI-730 & PC104P-30 Card", |
" 003e PCI-762 Opto-Isolator Card", |
" 0041 PCI-763 Reed Relay Card", |
" 0043 PCI-769 Opto-Isolator Reed Relay Combo Card", |
" 0046 PCI-766 Analog Output Card", |
" 0052 PCI-703 Analog I/O Card", |
" 0800 PCI-800 Digital I/O Card", |
"ea60 RME", |
" 9896 Digi32", |
" 9897 Digi32 Pro", |
" 9898 Digi32/8", |
"eabb Aashima Technology B.V.", |
"eace Endace Measurement Systems, Ltd", |
" 3100 DAG 3.10 OC-3/OC-12", |
" 3200 DAG 3.2x OC-3/OC-12", |
" 320e DAG 3.2E Fast Ethernet", |
" 340e DAG 3.4E Fast Ethernet", |
" 341e DAG 3.41E Fast Ethernet", |
" 3500 DAG 3.5 OC-3/OC-12", |
" 351c DAG 3.5ECM Fast Ethernet", |
" 4100 DAG 4.10 OC-48", |
" 4110 DAG 4.11 OC-48", |
" 4220 DAG 4.2 OC-48", |
" 422e DAG 4.2E Dual Gigabit Ethernet", |
"ec80 Belkin Corporation", |
" ec00 F5D6000", |
"ecc0 Echo Digital Audio Corporation", |
"edd8 ARK Logic Inc", |
" a091 1000PV [Stingray]", |
" a099 2000PV [Stingray]", |
" a0a1 2000MT", |
" a0a9 2000MI", |
"f1d0 AJA Video", |
" c0fe Xena HS/HD-R", |
" c0ff Kona/Xena 2", |
" cafe Kona SD", |
" cfee Xena LS/SD-22-DA/SD-DA", |
" dcaf Kona HD", |
" dfee Xena HD-DA", |
" efac Xena SD-MM/SD-22-MM", |
" facd Xena HD-MM", |
"fa57 Interagon AS", |
" 0001 PMC [Pattern Matching Chip]", |
"fab7 Fabric7 Systems, Inc.", |
"febd Ultraview Corp.", |
"feda Broadcom Inc", |
" a0fa BCM4210 iLine10 HomePNA 2.0", |
" a10e BCM4230 iLine10 HomePNA 2.0", |
"fede Fedetec Inc.", |
" 0003 TABIC PCI v3", |
"fffd XenSource, Inc.", |
" 0101 PCI Event Channel Controller", |
"fffe VMWare Inc", |
" 0405 Virtual SVGA 4.0", |
" 0710 Virtual SVGA", |
"ffff Illegal Vendor ID", |
"C 00 Unclassified device", |
" 00 Non-VGA unclassified device", |
" 01 VGA compatible unclassified device", |
"C 01 Mass storage controller", |
" 00 SCSI storage controller", |
" 01 IDE interface", |
" 02 Floppy disk controller", |
" 03 IPI bus controller", |
" 04 RAID bus controller", |
" 05 ATA controller", |
" 20 ADMA single stepping", |
" 40 ADMA continuous operation", |
" 06 SATA controller", |
" 00 Vendor specific", |
" 01 AHCI 1.0", |
" 07 Serial Attached SCSI controller", |
" 80 Mass storage controller", |
"C 02 Network controller", |
" 00 Ethernet controller", |
" 01 Token ring network controller", |
" 02 FDDI network controller", |
" 03 ATM network controller", |
" 04 ISDN controller", |
" 80 Network controller", |
"C 03 Display controller", |
" 00 VGA compatible controller", |
" 00 VGA", |
" 01 8514", |
" 01 XGA compatible controller", |
" 02 3D controller", |
" 80 Display controller", |
"C 04 Multimedia controller", |
" 00 Multimedia video controller", |
" 01 Multimedia audio controller", |
" 02 Computer telephony device", |
" 03 Audio device", |
" 80 Multimedia controller", |
"C 05 Memory controller", |
" 00 RAM memory", |
" 01 FLASH memory", |
" 80 Memory controller", |
"C 06 Bridge", |
" 00 Host bridge", |
" 01 ISA bridge", |
" 02 EISA bridge", |
" 03 MicroChannel bridge", |
" 04 PCI bridge", |
" 00 Normal decode", |
" 01 Subtractive decode", |
" 05 PCMCIA bridge", |
" 06 NuBus bridge", |
" 07 CardBus bridge", |
" 08 RACEway bridge", |
" 00 Transparent mode", |
" 01 Endpoint mode", |
" 09 Semi-transparent PCI-to-PCI bridge", |
" 40 Primary bus towards host CPU", |
" 80 Secondary bus towards host CPU", |
" 0a InfiniBand to PCI host bridge", |
" 80 Bridge", |
"C 07 Communication controller", |
" 00 Serial controller", |
" 00 8250", |
" 01 16450", |
" 02 16550", |
" 03 16650", |
" 04 16750", |
" 05 16850", |
" 06 16950", |
" 01 Parallel controller", |
" 00 SPP", |
" 01 BiDir", |
" 02 ECP", |
" 03 IEEE1284", |
" fe IEEE1284 Target", |
" 02 Multiport serial controller", |
" 03 Modem", |
" 00 Generic", |
" 01 Hayes/16450", |
" 02 Hayes/16550", |
" 03 Hayes/16650", |
" 04 Hayes/16750", |
" 80 Communication controller", |
"C 08 Generic system peripheral", |
" 00 PIC", |
" 00 8259", |
" 01 ISA PIC", |
" 02 EISA PIC", |
" 10 IO-APIC", |
" 20 IO(X)-APIC", |
" 01 DMA controller", |
" 00 8237", |
" 01 ISA DMA", |
" 02 EISA DMA", |
" 02 Timer", |
" 00 8254", |
" 01 ISA Timer", |
" 02 EISA Timers", |
" 03 RTC", |
" 00 Generic", |
" 01 ISA RTC", |
" 04 PCI Hot-plug controller", |
" 80 System peripheral", |
"C 09 Input device controller", |
" 00 Keyboard controller", |
" 01 Digitizer Pen", |
" 02 Mouse controller", |
" 03 Scanner controller", |
" 04 Gameport controller", |
" 00 Generic", |
" 10 Extended", |
" 80 Input device controller", |
"C 0a Docking station", |
" 00 Generic Docking Station", |
" 80 Docking Station", |
"C 0b Processor", |
" 00 386", |
" 01 486", |
" 02 Pentium", |
" 10 Alpha", |
" 20 Power PC", |
" 30 MIPS", |
" 40 Co-processor", |
"C 0c Serial bus controller", |
" 00 FireWire (IEEE 1394)", |
" 00 Generic", |
" 10 OHCI", |
" 01 ACCESS Bus", |
" 02 SSA", |
" 03 USB Controller", |
" 00 UHCI", |
" 10 OHCI", |
" 20 EHCI", |
" 80 Unspecified", |
" fe USB Device", |
" 04 Fibre Channel", |
" 05 SMBus", |
" 06 InfiniBand", |
"C 0d Wireless controller", |
" 00 IRDA controller", |
" 01 Consumer IR controller", |
" 10 RF controller", |
" 80 Wireless controller", |
"C 0e Intelligent controller", |
" 00 I2O", |
"C 0f Satellite communications controller", |
" 00 Satellite TV controller", |
" 01 Satellite audio communication controller", |
" 03 Satellite voice communication controller", |
" 04 Satellite data communication controller", |
"C 10 Encryption controller", |
" 00 Network and computing encryption device", |
" 10 Entertainment encryption device", |
" 80 Encryption controller", |
"C 11 Signal processing controller", |
" 00 DPIO module", |
" 01 Performance counters", |
" 10 Communication synchronizer", |
" 80 Signal processing controller", |
"" |
}; |
/tags/0.3.0/uspace/srv/pci/Makefile |
---|
0,0 → 1,78 |
# |
# Copyright (c) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
## Setup toolchain |
# |
LIBC_PREFIX = ../../lib/libc |
SOFTINT_PREFIX = ../../lib/softint |
include $(LIBC_PREFIX)/Makefile.toolchain |
LIBS = libpci/libpci.a $(LIBC_PREFIX)/libc.a |
## Sources |
# |
OUTPUT = pci |
SOURCES = \ |
pci.c |
OBJECTS := $(addsuffix .o,$(basename $(SOURCES))) |
.PHONY: all clean depend disasm |
all: $(OUTPUT) disasm |
-include Makefile.depend |
clean: |
-rm -f $(OUTPUT) $(OUTPUT).map $(OUTPUT).disasm Makefile.depend |
$(MAKE) -C libpci clean |
depend: |
$(CC) $(DEFS) $(CFLAGS) -M $(SOURCES) > Makefile.depend |
$(OUTPUT): $(OBJECTS) $(LIBS) |
$(MAKE) -C libpci |
$(LD) -T $(LIBC_PREFIX)/arch/$(ARCH)/_link.ld $(OBJECTS) $(LIBS) $(LFLAGS) -o $@ -Map $(OUTPUT).map |
disasm: |
$(OBJDUMP) -d $(OUTPUT) >$(OUTPUT).disasm |
%.o: %.S |
$(CC) $(DEFS) $(AFLAGS) $(CFLAGS) -D__ASM__ -c $< -o $@ |
%.o: %.s |
$(AS) $(AFLAGS) $< -o $@ |
%.o: %.c |
$(CC) $(DEFS) $(CFLAGS) -c $< -o $@ |
libpci/libpci.a: |
$(MAKE) -C libpci |
/tags/0.3.0/uspace/srv/pci/COPYING |
---|
0,0 → 1,340 |
GNU GENERAL PUBLIC LICENSE |
Version 2, June 1991 |
Copyright (C) 1989, 1991 Free Software Foundation, Inc. |
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
Everyone is permitted to copy and distribute verbatim copies |
of this license document, but changing it is not allowed. |
Preamble |
The licenses for most software are designed to take away your |
freedom to share and change it. By contrast, the GNU General Public |
License is intended to guarantee your freedom to share and change free |
software--to make sure the software is free for all its users. This |
General Public License applies to most of the Free Software |
Foundation's software and to any other program whose authors commit to |
using it. (Some other Free Software Foundation software is covered by |
the GNU Library General Public License instead.) You can apply it to |
your programs, too. |
When we speak of free software, we are referring to freedom, not |
price. Our General Public Licenses are designed to make sure that you |
have the freedom to distribute copies of free software (and charge for |
this service if you wish), that you receive source code or can get it |
if you want it, that you can change the software or use pieces of it |
in new free programs; and that you know you can do these things. |
To protect your rights, we need to make restrictions that forbid |
anyone to deny you these rights or to ask you to surrender the rights. |
These restrictions translate to certain responsibilities for you if you |
distribute copies of the software, or if you modify it. |
For example, if you distribute copies of such a program, whether |
gratis or for a fee, you must give the recipients all the rights that |
you have. You must make sure that they, too, receive or can get the |
source code. And you must show them these terms so they know their |
rights. |
We protect your rights with two steps: (1) copyright the software, and |
(2) offer you this license which gives you legal permission to copy, |
distribute and/or modify the software. |
Also, for each author's protection and ours, we want to make certain |
that everyone understands that there is no warranty for this free |
software. If the software is modified by someone else and passed on, we |
want its recipients to know that what they have is not the original, so |
that any problems introduced by others will not reflect on the original |
authors' reputations. |
Finally, any free program is threatened constantly by software |
patents. We wish to avoid the danger that redistributors of a free |
program will individually obtain patent licenses, in effect making the |
program proprietary. To prevent this, we have made it clear that any |
patent must be licensed for everyone's free use or not licensed at all. |
The precise terms and conditions for copying, distribution and |
modification follow. |
GNU GENERAL PUBLIC LICENSE |
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION |
0. This License applies to any program or other work which contains |
a notice placed by the copyright holder saying it may be distributed |
under the terms of this General Public License. The "Program", below, |
refers to any such program or work, and a "work based on the Program" |
means either the Program or any derivative work under copyright law: |
that is to say, a work containing the Program or a portion of it, |
either verbatim or with modifications and/or translated into another |
language. (Hereinafter, translation is included without limitation in |
the term "modification".) Each licensee is addressed as "you". |
Activities other than copying, distribution and modification are not |
covered by this License; they are outside its scope. The act of |
running the Program is not restricted, and the output from the Program |
is covered only if its contents constitute a work based on the |
Program (independent of having been made by running the Program). |
Whether that is true depends on what the Program does. |
1. You may copy and distribute verbatim copies of the Program's |
source code as you receive it, in any medium, provided that you |
conspicuously and appropriately publish on each copy an appropriate |
copyright notice and disclaimer of warranty; keep intact all the |
notices that refer to this License and to the absence of any warranty; |
and give any other recipients of the Program a copy of this License |
along with the Program. |
You may charge a fee for the physical act of transferring a copy, and |
you may at your option offer warranty protection in exchange for a fee. |
2. You may modify your copy or copies of the Program or any portion |
of it, thus forming a work based on the Program, and copy and |
distribute such modifications or work under the terms of Section 1 |
above, provided that you also meet all of these conditions: |
a) You must cause the modified files to carry prominent notices |
stating that you changed the files and the date of any change. |
b) You must cause any work that you distribute or publish, that in |
whole or in part contains or is derived from the Program or any |
part thereof, to be licensed as a whole at no charge to all third |
parties under the terms of this License. |
c) If the modified program normally reads commands interactively |
when run, you must cause it, when started running for such |
interactive use in the most ordinary way, to print or display an |
announcement including an appropriate copyright notice and a |
notice that there is no warranty (or else, saying that you provide |
a warranty) and that users may redistribute the program under |
these conditions, and telling the user how to view a copy of this |
License. (Exception: if the Program itself is interactive but |
does not normally print such an announcement, your work based on |
the Program is not required to print an announcement.) |
These requirements apply to the modified work as a whole. If |
identifiable sections of that work are not derived from the Program, |
and can be reasonably considered independent and separate works in |
themselves, then this License, and its terms, do not apply to those |
sections when you distribute them as separate works. But when you |
distribute the same sections as part of a whole which is a work based |
on the Program, the distribution of the whole must be on the terms of |
this License, whose permissions for other licensees extend to the |
entire whole, and thus to each and every part regardless of who wrote it. |
Thus, it is not the intent of this section to claim rights or contest |
your rights to work written entirely by you; rather, the intent is to |
exercise the right to control the distribution of derivative or |
collective works based on the Program. |
In addition, mere aggregation of another work not based on the Program |
with the Program (or with a work based on the Program) on a volume of |
a storage or distribution medium does not bring the other work under |
the scope of this License. |
3. You may copy and distribute the Program (or a work based on it, |
under Section 2) in object code or executable form under the terms of |
Sections 1 and 2 above provided that you also do one of the following: |
a) Accompany it with the complete corresponding machine-readable |
source code, which must be distributed under the terms of Sections |
1 and 2 above on a medium customarily used for software interchange; or, |
b) Accompany it with a written offer, valid for at least three |
years, to give any third party, for a charge no more than your |
cost of physically performing source distribution, a complete |
machine-readable copy of the corresponding source code, to be |
distributed under the terms of Sections 1 and 2 above on a medium |
customarily used for software interchange; or, |
c) Accompany it with the information you received as to the offer |
to distribute corresponding source code. (This alternative is |
allowed only for noncommercial distribution and only if you |
received the program in object code or executable form with such |
an offer, in accord with Subsection b above.) |
The source code for a work means the preferred form of the work for |
making modifications to it. For an executable work, complete source |
code means all the source code for all modules it contains, plus any |
associated interface definition files, plus the scripts used to |
control compilation and installation of the executable. However, as a |
special exception, the source code distributed need not include |
anything that is normally distributed (in either source or binary |
form) with the major components (compiler, kernel, and so on) of the |
operating system on which the executable runs, unless that component |
itself accompanies the executable. |
If distribution of executable or object code is made by offering |
access to copy from a designated place, then offering equivalent |
access to copy the source code from the same place counts as |
distribution of the source code, even though third parties are not |
compelled to copy the source along with the object code. |
4. You may not copy, modify, sublicense, or distribute the Program |
except as expressly provided under this License. Any attempt |
otherwise to copy, modify, sublicense or distribute the Program is |
void, and will automatically terminate your rights under this License. |
However, parties who have received copies, or rights, from you under |
this License will not have their licenses terminated so long as such |
parties remain in full compliance. |
5. You are not required to accept this License, since you have not |
signed it. However, nothing else grants you permission to modify or |
distribute the Program or its derivative works. These actions are |
prohibited by law if you do not accept this License. Therefore, by |
modifying or distributing the Program (or any work based on the |
Program), you indicate your acceptance of this License to do so, and |
all its terms and conditions for copying, distributing or modifying |
the Program or works based on it. |
6. Each time you redistribute the Program (or any work based on the |
Program), the recipient automatically receives a license from the |
original licensor to copy, distribute or modify the Program subject to |
these terms and conditions. You may not impose any further |
restrictions on the recipients' exercise of the rights granted herein. |
You are not responsible for enforcing compliance by third parties to |
this License. |
7. If, as a consequence of a court judgment or allegation of patent |
infringement or for any other reason (not limited to patent issues), |
conditions are imposed on you (whether by court order, agreement or |
otherwise) that contradict the conditions of this License, they do not |
excuse you from the conditions of this License. If you cannot |
distribute so as to satisfy simultaneously your obligations under this |
License and any other pertinent obligations, then as a consequence you |
may not distribute the Program at all. For example, if a patent |
license would not permit royalty-free redistribution of the Program by |
all those who receive copies directly or indirectly through you, then |
the only way you could satisfy both it and this License would be to |
refrain entirely from distribution of the Program. |
If any portion of this section is held invalid or unenforceable under |
any particular circumstance, the balance of the section is intended to |
apply and the section as a whole is intended to apply in other |
circumstances. |
It is not the purpose of this section to induce you to infringe any |
patents or other property right claims or to contest validity of any |
such claims; this section has the sole purpose of protecting the |
integrity of the free software distribution system, which is |
implemented by public license practices. Many people have made |
generous contributions to the wide range of software distributed |
through that system in reliance on consistent application of that |
system; it is up to the author/donor to decide if he or she is willing |
to distribute software through any other system and a licensee cannot |
impose that choice. |
This section is intended to make thoroughly clear what is believed to |
be a consequence of the rest of this License. |
8. If the distribution and/or use of the Program is restricted in |
certain countries either by patents or by copyrighted interfaces, the |
original copyright holder who places the Program under this License |
may add an explicit geographical distribution limitation excluding |
those countries, so that distribution is permitted only in or among |
countries not thus excluded. In such case, this License incorporates |
the limitation as if written in the body of this License. |
9. The Free Software Foundation may publish revised and/or new versions |
of the General Public License from time to time. Such new versions will |
be similar in spirit to the present version, but may differ in detail to |
address new problems or concerns. |
Each version is given a distinguishing version number. If the Program |
specifies a version number of this License which applies to it and "any |
later version", you have the option of following the terms and conditions |
either of that version or of any later version published by the Free |
Software Foundation. If the Program does not specify a version number of |
this License, you may choose any version ever published by the Free Software |
Foundation. |
10. If you wish to incorporate parts of the Program into other free |
programs whose distribution conditions are different, write to the author |
to ask for permission. For software which is copyrighted by the Free |
Software Foundation, write to the Free Software Foundation; we sometimes |
make exceptions for this. Our decision will be guided by the two goals |
of preserving the free status of all derivatives of our free software and |
of promoting the sharing and reuse of software generally. |
NO WARRANTY |
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY |
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN |
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES |
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED |
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS |
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE |
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, |
REPAIR OR CORRECTION. |
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING |
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR |
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, |
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING |
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED |
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY |
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER |
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE |
POSSIBILITY OF SUCH DAMAGES. |
END OF TERMS AND CONDITIONS |
How to Apply These Terms to Your New Programs |
If you develop a new program, and you want it to be of the greatest |
possible use to the public, the best way to achieve this is to make it |
free software which everyone can redistribute and change under these terms. |
To do so, attach the following notices to the program. It is safest |
to attach them to the start of each source file to most effectively |
convey the exclusion of warranty; and each file should have at least |
the "copyright" line and a pointer to where the full notice is found. |
<one line to give the program's name and a brief idea of what it does.> |
Copyright (C) <year> <name of author> |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 2 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
Also add information on how to contact you by electronic and paper mail. |
If the program is interactive, make it output a short notice like this |
when it starts in an interactive mode: |
Gnomovision version 69, Copyright (C) year name of author |
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. |
This is free software, and you are welcome to redistribute it |
under certain conditions; type `show c' for details. |
The hypothetical commands `show w' and `show c' should show the appropriate |
parts of the General Public License. Of course, the commands you use may |
be called something other than `show w' and `show c'; they could even be |
mouse-clicks or menu items--whatever suits your program. |
You should also get your employer (if you work as a programmer) or your |
school, if any, to sign a "copyright disclaimer" for the program, if |
necessary. Here is a sample; alter the names: |
Yoyodyne, Inc., hereby disclaims all copyright interest in the program |
`Gnomovision' (which makes passes at compilers) written by James Hacker. |
<signature of Ty Coon>, 1 April 1989 |
Ty Coon, President of Vice |
This General Public License does not permit incorporating your program into |
proprietary programs. If your program is a subroutine library, you may |
consider it more useful to permit linking proprietary applications with the |
library. If this is what you want to do, use the GNU Library General |
Public License instead of this License. |
/tags/0.3.0/uspace/srv/pci/update-ids |
---|
0,0 → 1,16 |
#! /bin/bash |
wget http://pciids.sourceforge.net/v2.2/pci.ids |
cat >pci_ids.h <<EOF |
/* DO NOT EDIT, THIS FILE IS AUTOMATICALLY GENERATED */ |
char *pci_ids[] = { |
EOF |
cat pci.ids | grep -v '^#.*' | grep -v '^$' | tr \" \' | sed -n 's/\(.*\)/"\1",/p' >>pci_ids.h |
cat >>pci_ids.h <<EOF |
"" |
}; |
EOF |
Property changes: |
Added: svn:executable |
+* |
\ No newline at end of property |
/tags/0.3.0/uspace/app/tester/vfs/vfs1.c |
---|
0,0 → 1,128 |
/* |
* Copyright (c) 2008 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#include <errno.h> |
#include <stdio.h> |
#include <stdlib.h> |
#include <string.h> |
#include <vfs/vfs.h> |
#include <unistd.h> |
#include <fcntl.h> |
#include <dirent.h> |
#include <sys/types.h> |
#include <sys/stat.h> |
#include "../tester.h" |
char text[] = "O xein', angellein Lakedaimoniois hoti teide " |
"keimetha tois keinon rhemasi peithomenoi."; |
char *test_vfs1(bool quiet) |
{ |
if (mount("tmpfs", "/", "nulldev0") != EOK) |
return "mount() failed.\n"; |
if (!quiet) |
printf("mounted tmpfs on /.\n"); |
if (mkdir("/mydir", 0) != 0) |
return "mkdir() failed.\n"; |
if (!quiet) |
printf("created directory /mydir\n"); |
int fd0 = open("/mydir/myfile", O_CREAT); |
if (fd0 < 0) |
return "open() failed.\n"; |
if (!quiet) |
printf("created file /mydir/myfile, fd=%d\n", fd0); |
ssize_t cnt; |
size_t size = sizeof(text); |
cnt = write(fd0, text, size); |
if (cnt < 0) |
return "write() failed.\n"; |
if (!quiet) |
printf("written %d bytes, fd=%d\n", cnt, fd0); |
if (lseek(fd0, 0, SEEK_SET) != 0) |
return "lseek() failed.\n"; |
if (!quiet) |
printf("sought to position 0, fd=%d\n", fd0); |
char buf[10]; |
cnt = read(fd0, buf, sizeof(buf)); |
if (cnt < 0) |
return "read() failed.\n"; |
if (!quiet) |
printf("read %d bytes: \"%.*s\", fd=%d\n", cnt, cnt, buf, fd0); |
close(fd0); |
DIR *dirp; |
struct dirent *dp; |
if (!quiet) |
printf("scanning the root directory...\n"); |
dirp = opendir("/"); |
if (!dirp) |
return "opendir() failed\n"; |
while ((dp = readdir(dirp))) |
printf("discovered node %s in /\n", dp->d_name); |
closedir(dirp); |
if (rename("/mydir/myfile", "/mydir/yourfile")) |
return "rename() failed.\n"; |
if (!quiet) |
printf("renamed /mydir/myfile to /mydir/yourfile\n"); |
if (unlink("/mydir/yourfile")) |
return "unlink() failed.\n"; |
if (!quiet) |
printf("unlinked file /mydir/yourfile\n"); |
if (rmdir("/mydir")) |
return "rmdir() failed.\n"; |
if (!quiet) |
printf("removed directory /mydir\n"); |
if (!quiet) |
printf("scanning the root directory...\n"); |
dirp = opendir("/"); |
if (!dirp) |
return "opendir() failed\n"; |
while ((dp = readdir(dirp))) |
printf("discovered node %s in /\n", dp->d_name); |
closedir(dirp); |
return NULL; |
} |
/tags/0.3.0/uspace/app/tester/vfs/vfs1.def |
---|
0,0 → 1,6 |
{ |
"vfs1", |
"VFS test", |
&test_vfs1, |
true |
}, |
/tags/0.3.0/uspace/app/tester/devmap/devmap1.c |
---|
0,0 → 1,324 |
/* |
* Copyright (c) 2007 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#include <stdio.h> |
#include <unistd.h> |
#include <ipc/ipc.h> |
#include <ipc/services.h> |
#include <async.h> |
#include <errno.h> |
#include <../../../srv/devmap/devmap.h> |
#include "../tester.h" |
#include <time.h> |
#define TEST_DEVICE1 "TestDevice1" |
#define TEST_DEVICE2 "TestDevice2" |
/** Handle requests from clients |
* |
*/ |
static void driver_client_connection(ipc_callid_t iid, ipc_call_t *icall) |
{ |
ipc_callid_t callid; |
ipc_call_t call; |
int retval; |
printf("connected: method=%u arg1=%u, arg2=%u arg3=%u.\n", |
IPC_GET_METHOD(*icall), IPC_GET_ARG1(*icall), IPC_GET_ARG2(*icall), |
IPC_GET_ARG3(*icall)); |
printf("driver_client_connection.\n"); |
ipc_answer_0(iid, EOK); |
/* Ignore parameters, the connection is already opened */ |
while (1) { |
callid = async_get_call(&call); |
retval = EOK; |
printf("method=%u arg1=%u, arg2=%u arg3=%u.\n", |
IPC_GET_METHOD(call), IPC_GET_ARG1(call), |
IPC_GET_ARG2(call), IPC_GET_ARG3(call)); |
switch (IPC_GET_METHOD(call)) { |
case IPC_M_PHONE_HUNGUP: |
/* TODO: Handle hangup */ |
return; |
default: |
printf("Unknown device method %u.\n", |
IPC_GET_METHOD(call)); |
retval = ENOENT; |
} |
ipc_answer_0(callid, retval); |
} |
return; |
} |
static int device_client_fibril(void *arg) |
{ |
int handle; |
int device_phone; |
handle = (int)arg; |
device_phone = ipc_connect_me_to(PHONE_NS, SERVICE_DEVMAP, |
DEVMAP_CONNECT_TO_DEVICE, handle); |
if (device_phone < 0) { |
printf("Failed to connect to devmap as client (handle = %u).\n", |
handle); |
return -1; |
} |
/* |
* device_phone = (int) IPC_GET_ARG5(answer); |
*/ |
printf("Connected to device.\n"); |
ipc_call_sync_1_0(device_phone, 1024, 1025); |
/* |
* ipc_hangup(device_phone); |
*/ |
ipc_hangup(device_phone); |
return EOK; |
} |
/** Communication test with device. |
* @param handle handle to tested instance. |
*/ |
static int device_client(int handle) |
{ |
/* fid_t fid; |
ipc_call_t call; |
ipc_callid_t callid; |
fid = fibril_create(device_client_fibril, (void *)handle); |
fibril_add_ready(fid); |
*/ |
return EOK; |
} |
/** |
* |
*/ |
static int driver_register(char *name) |
{ |
ipcarg_t retval; |
aid_t req; |
ipc_call_t answer; |
int phone; |
ipcarg_t callback_phonehash; |
phone = ipc_connect_me_to(PHONE_NS, SERVICE_DEVMAP, DEVMAP_DRIVER, 0); |
while (phone < 0) { |
usleep(100000); |
phone = ipc_connect_me_to(PHONE_NS, SERVICE_DEVMAP, |
DEVMAP_DRIVER, 0); |
} |
req = async_send_2(phone, DEVMAP_DRIVER_REGISTER, 0, 0, &answer); |
retval = ipc_data_write_start(phone, (char *)name, strlen(name) + 1); |
if (retval != EOK) { |
async_wait_for(req, NULL); |
return -1; |
} |
async_set_client_connection(driver_client_connection); |
ipc_connect_to_me(phone, 0, 0, 0, &callback_phonehash); |
/* |
if (NULL == async_new_connection(callback_phonehash, 0, NULL, |
driver_client_connection)) { |
printf("Failed to create new fibril.\n"); |
async_wait_for(req, NULL); |
return -1; |
} |
*/ |
async_wait_for(req, &retval); |
printf("Driver '%s' registered.\n", name); |
return phone; |
} |
static int device_get_handle(int driver_phone, char *name, int *handle) |
{ |
ipcarg_t retval; |
aid_t req; |
ipc_call_t answer; |
req = async_send_2(driver_phone, DEVMAP_DEVICE_GET_HANDLE, 0, 0, |
&answer); |
retval = ipc_data_write_start(driver_phone, name, strlen(name) + 1); |
if (retval != EOK) { |
printf("Failed to send device name '%s'.\n", name); |
async_wait_for(req, NULL); |
return retval; |
} |
async_wait_for(req, &retval); |
if (NULL != handle) { |
*handle = -1; |
} |
if (EOK == retval) { |
if (NULL != handle) { |
*handle = (int) IPC_GET_ARG1(answer); |
} |
printf("Device '%s' has handle %u.\n", name, |
(int) IPC_GET_ARG1(answer)); |
} else { |
printf("Failed to get handle for device '%s'.\n", name); |
} |
return retval; |
} |
/** Register new device. |
* @param driver_phone |
* @param name Device name. |
* @param handle Output variable. Handle to the created instance of device. |
*/ |
static int device_register(int driver_phone, char *name, int *handle) |
{ |
ipcarg_t retval; |
aid_t req; |
ipc_call_t answer; |
req = async_send_2(driver_phone, DEVMAP_DEVICE_REGISTER, 0, 0, &answer); |
retval = ipc_data_write_start(driver_phone, (char *)name, |
strlen(name) + 1); |
if (retval != EOK) { |
printf("Failed to send device name '%s'.\n", name); |
async_wait_for(req, NULL); |
return retval; |
} |
async_wait_for(req, &retval); |
if (NULL != handle) { |
*handle = -1; |
} |
if (EOK == retval) { |
if (NULL != handle) { |
*handle = (int) IPC_GET_ARG1(answer); |
} |
printf("Device registered with handle %u.\n", |
(int) IPC_GET_ARG1(answer)); |
} |
return retval; |
} |
/** Test DevMap from the driver's point of view. |
* |
* |
*/ |
char * test_devmap1(bool quiet) |
{ |
int driver_phone; |
int dev1_handle; |
int dev2_handle; |
int dev3_handle; |
int handle; |
/* Register new driver */ |
driver_phone = driver_register("TestDriver"); |
if (driver_phone < 0) { |
return "Error: Cannot register driver.\n"; |
} |
/* Register new device dev1*/ |
if (EOK != device_register(driver_phone, TEST_DEVICE1, &dev1_handle)) { |
ipc_hangup(driver_phone); |
return "Error: cannot register device.\n"; |
} |
/* Get handle for dev2 (Should fail unless device is already |
* registered by someone else) |
*/ |
if (EOK == device_get_handle(driver_phone, TEST_DEVICE2, &handle)) { |
ipc_hangup(driver_phone); |
return "Error: got handle for dev2 before it was registered.\n"; |
} |
/* Register new device dev2*/ |
if (EOK != device_register(driver_phone, TEST_DEVICE2, &dev2_handle)) { |
ipc_hangup(driver_phone); |
return "Error: cannot register device dev2.\n"; |
} |
/* Register again device dev1 */ |
if (EOK == device_register(driver_phone, TEST_DEVICE1, &dev3_handle)) { |
return "Error: dev1 registered twice.\n"; |
} |
/* Get handle for dev1*/ |
if (EOK != device_get_handle(driver_phone, TEST_DEVICE1, &handle)) { |
ipc_hangup(driver_phone); |
return "Error: cannot get handle for 'DEVMAP_DEVICE1'.\n"; |
} |
if (handle != dev1_handle) { |
ipc_hangup(driver_phone); |
return "Error: cannot get handle for 'DEVMAP_DEVICE1'.\n"; |
} |
if (EOK != device_client(dev1_handle)) { |
ipc_hangup(driver_phone); |
return "Error: failed client test for 'DEVMAP_DEVICE1'.\n"; |
} |
/* TODO: */ |
ipc_hangup(driver_phone); |
return NULL; |
} |
char *test_devmap2(bool quiet) |
{ |
/*TODO: Full automatic test */ |
return NULL; |
} |
char *test_devmap3(bool quiet) |
{ |
/* TODO: allow user to call test functions in random order */ |
return NULL; |
} |
/tags/0.3.0/uspace/app/tester/devmap/devmap1.def |
---|
0,0 → 1,6 |
{ |
"devmap1", |
"DevMap test", |
&test_devmap1, |
true |
}, |
/tags/0.3.0/uspace/app/tester/tester.c |
---|
0,0 → 1,123 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* Copyright (c) 2007 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup tester User space Tester |
* @brief User space testing infrastructure. |
* @{ |
*/ |
/** |
* @file |
*/ |
#include <unistd.h> |
#include <stdio.h> |
#include "tester.h" |
int myservice = 0; |
int phones[MAX_PHONES]; |
int connections[MAX_CONNECTIONS]; |
ipc_callid_t callids[MAX_CONNECTIONS]; |
test_t tests[] = { |
#include "thread/thread1.def" |
#include "print/print1.def" |
#include "fault/fault1.def" |
#include "fault/fault2.def" |
#include "ipc/register.def" |
#include "ipc/connect.def" |
#include "ipc/send_async.def" |
#include "ipc/send_sync.def" |
#include "ipc/answer.def" |
#include "ipc/hangup.def" |
#include "devmap/devmap1.def" |
#include "vfs/vfs1.def" |
{NULL, NULL, NULL} |
}; |
static bool run_test(test_t *test) |
{ |
printf("%s\t\t%s\n", test->name, test->desc); |
/* Execute the test */ |
char * ret = test->entry(false); |
if (ret == NULL) { |
printf("Test passed\n\n"); |
return true; |
} |
printf("%s\n\n", ret); |
return false; |
} |
static void run_safe_tests(void) |
{ |
} |
static void list_tests(void) |
{ |
test_t *test; |
char c = 'a'; |
for (test = tests; test->name != NULL; test++, c++) |
printf("%c\t%s\t\t%s%s\n", c, test->name, test->desc, (test->safe ? "" : " (unsafe)")); |
printf("*\t\t\tRun all safe tests\n"); |
} |
int main(void) |
{ |
while (1) { |
char c; |
test_t *test; |
list_tests(); |
printf("> "); |
c = getchar(); |
printf("%c\n", c); |
if ((c >= 'a') && (c <= 'z')) { |
for (test = tests; test->name != NULL; test++, c--) |
if (c == 'a') |
break; |
if (c > 'a') |
printf("Unknown test\n\n"); |
else |
run_test(test); |
} else if (c == '*') |
run_safe_tests(); |
else |
printf("Invalid test\n\n"); |
} |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/app/tester/tester.h |
---|
0,0 → 1,78 |
/* |
* Copyright (c) 2007 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup tester |
* @{ |
*/ |
/** @file |
*/ |
#ifndef TESTER_H_ |
#define TESTER_H_ |
#include <sys/types.h> |
#include <bool.h> |
#include <ipc/ipc.h> |
#define IPC_TEST_START 10000 |
#define MAX_PHONES 20 |
#define MAX_CONNECTIONS 50 |
extern int myservice; |
extern int phones[MAX_PHONES]; |
extern int connections[MAX_CONNECTIONS]; |
extern ipc_callid_t callids[MAX_CONNECTIONS]; |
typedef char * (* test_entry_t)(bool); |
typedef struct { |
char * name; |
char * desc; |
test_entry_t entry; |
bool safe; |
} test_t; |
extern char * test_thread1(bool quiet); |
extern char * test_print1(bool quiet); |
extern char * test_fault1(bool quiet); |
extern char * test_fault2(bool quiet); |
extern char * test_register(bool quiet); |
extern char * test_connect(bool quiet); |
extern char * test_send_async(bool quiet); |
extern char * test_send_sync(bool quiet); |
extern char * test_answer(bool quiet); |
extern char * test_hangup(bool quiet); |
extern char * test_devmap1(bool quiet); |
extern char * test_vfs1(bool quiet); |
extern test_t tests[]; |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/app/tester/Makefile |
---|
0,0 → 1,85 |
# |
# Copyright (c) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
## Setup toolchain |
# |
LIBC_PREFIX = ../../lib/libc |
SOFTINT_PREFIX = ../../lib/softint |
include $(LIBC_PREFIX)/Makefile.toolchain |
CFLAGS += -I../../srv/kbd/include |
LIBS = $(LIBC_PREFIX)/libc.a |
## Sources |
# |
OUTPUT = tester |
SOURCES = tester.c \ |
thread/thread1.c \ |
print/print1.c \ |
fault/fault1.c \ |
fault/fault2.c \ |
ipc/register.c \ |
ipc/connect.c \ |
ipc/send_async.c \ |
ipc/send_sync.c \ |
ipc/answer.c \ |
ipc/hangup.c \ |
devmap/devmap1.c \ |
vfs/vfs1.c |
OBJECTS := $(addsuffix .o,$(basename $(SOURCES))) |
.PHONY: all clean depend disasm |
all: $(OUTPUT) disasm |
-include Makefile.depend |
clean: |
-rm -f $(OUTPUT) $(OUTPUT).map $(OUTPUT).disasm Makefile.depend |
depend: |
$(CC) $(DEFS) $(CFLAGS) -M $(SOURCES) > Makefile.depend |
$(OUTPUT): $(OBJECTS) $(LIBS) |
$(LD) -T $(LIBC_PREFIX)/arch/$(ARCH)/_link.ld $(OBJECTS) $(LIBS) $(LFLAGS) -o $@ -Map $(OUTPUT).map |
disasm: |
$(OBJDUMP) -d $(OUTPUT) >$(OUTPUT).disasm |
%.o: %.S |
$(CC) $(DEFS) $(AFLAGS) $(CFLAGS) -D__ASM__ -c $< -o $@ |
%.o: %.s |
$(AS) $(AFLAGS) $< -o $@ |
%.o: %.c |
$(CC) $(DEFS) $(CFLAGS) -c $< -o $@ |
/tags/0.3.0/uspace/app/tester/ipc/register.c |
---|
0,0 → 1,89 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#include <stdio.h> |
#include <unistd.h> |
#include <async.h> |
#include <errno.h> |
#include "../tester.h" |
static void client_connection(ipc_callid_t iid, ipc_call_t *icall) |
{ |
ipc_callid_t callid; |
ipc_call_t call; |
ipcarg_t phonehash = icall->in_phone_hash; |
int retval; |
int i; |
printf("Connected phone: %P, accepting\n", icall->in_phone_hash); |
ipc_answer_0(iid, EOK); |
for (i = 0; i < 1024; i++) |
if (!connections[i]) { |
connections[i] = phonehash; |
break; |
} |
while (1) { |
callid = async_get_call(&call); |
switch (IPC_GET_METHOD(call)) { |
case IPC_M_PHONE_HUNGUP: |
printf("Phone (%P) hung up.\n", phonehash); |
retval = 0; |
break; |
default: |
printf("Received message from %P: %X\n", phonehash, |
callid); |
for (i = 0; i < 1024; i++) |
if (!callids[i]) { |
callids[i] = callid; |
break; |
} |
continue; |
} |
ipc_answer_0(callid, retval); |
} |
} |
char * test_register(bool quiet) |
{ |
int i; |
async_set_client_connection(client_connection); |
for (i = IPC_TEST_START; i < IPC_TEST_START + 10; i++) { |
ipcarg_t phonead; |
int res = ipc_connect_to_me(PHONE_NS, i, 0, 0, &phonead); |
if (!res) |
break; |
printf("Failed registering as %d..:%d\n", i, res); |
} |
printf("Registered as service: %d\n", i); |
myservice = i; |
return NULL; |
} |
/tags/0.3.0/uspace/app/tester/ipc/connect.c |
---|
0,0 → 1,57 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#include <stdio.h> |
#include <unistd.h> |
#include "../tester.h" |
char * test_connect(bool quiet) |
{ |
char c; |
int svc; |
int phid; |
printf("Choose one service: 0:10000....9:10009\n"); |
do { |
c = getchar(); |
} while (c < '0' || c > '9'); |
svc = IPC_TEST_START + c - '0'; |
if (svc == myservice) |
return "Currently cannot connect to myself, update test"; |
printf("Connecting to %d..", svc); |
phid = ipc_connect_me_to(PHONE_NS, svc, 0, 0); |
if (phid > 0) { |
printf("phoneid: %d\n", phid); |
phones[phid] = 1; |
} else |
return "Error"; |
return NULL; |
} |
/tags/0.3.0/uspace/app/tester/ipc/answer.c |
---|
0,0 → 1,76 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#include <stdio.h> |
#include <unistd.h> |
#include <errno.h> |
#include "../tester.h" |
char * test_answer(bool quiet) |
{ |
int i,cnt, errn = 0; |
char c; |
cnt = 0; |
for (i = 0;i < 50; i++) { |
if (callids[i]) { |
printf("%d: %P\n", cnt, callids[i]); |
cnt++; |
} |
if (cnt >= 10) |
break; |
} |
if (!cnt) |
return NULL; |
printf("Choose message:\n"); |
do { |
c = getchar(); |
} while (c < '0' || (c-'0') >= cnt); |
cnt = c - '0' + 1; |
for (i = 0; cnt; i++) |
if (callids[i]) |
cnt--; |
i -= 1; |
printf("Normal (n) or hangup (h) or error(e) message?\n"); |
do { |
c = getchar(); |
} while (c != 'n' && c != 'h' && c != 'e'); |
if (c == 'n') |
errn = 0; |
else if (c == 'h') |
errn = EHANGUP; |
else if (c == 'e') |
errn = ENOENT; |
printf("Answering %P\n", callids[i]); |
ipc_answer_0(callids[i], errn); |
callids[i] = 0; |
return NULL; |
} |
/tags/0.3.0/uspace/app/tester/ipc/send_async.c |
---|
0,0 → 1,55 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#include <stdio.h> |
#include <unistd.h> |
#include "../tester.h" |
static void callback(void *_private, int retval, ipc_call_t *data) |
{ |
printf("Received response to msg %d - retval: %d.\n", _private, retval); |
} |
char * test_send_async(bool quiet) |
{ |
int phoneid; |
static int msgid = 1; |
char c; |
printf("Select phoneid to send msg: 2-9\n"); |
do { |
c = getchar(); |
} while (c < '2' || c > '9'); |
phoneid = c - '0'; |
ipc_call_async_0(phoneid, 2000, (void *) msgid, callback, 1); |
printf("Async sent - msg %d\n", msgid); |
msgid++; |
return NULL; |
} |
/tags/0.3.0/uspace/app/tester/ipc/send_sync.c |
---|
0,0 → 1,52 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#include <stdio.h> |
#include <unistd.h> |
#include "../tester.h" |
#include <ipc/ipc.h> |
char * test_send_sync(bool quiet) |
{ |
int phoneid; |
int res; |
static int msgid = 1; |
char c; |
printf("Select phoneid to send msg: 2-9\n"); |
do { |
c = getchar(); |
} while (c < '2' || c > '9'); |
phoneid = c - '0'; |
printf("Sending msg..."); |
res = ipc_call_sync_0_0(phoneid, 2000); |
printf("done: %d\n", res); |
return NULL; |
} |
/tags/0.3.0/uspace/app/tester/ipc/hangup.def |
---|
0,0 → 1,6 |
{ |
"hangup", |
"IPC hangup test", |
&test_hangup, |
true |
}, |
/tags/0.3.0/uspace/app/tester/ipc/send_sync.def |
---|
0,0 → 1,6 |
{ |
"send_sync", |
"IPC send sync message test", |
&test_send_sync, |
true |
}, |
/tags/0.3.0/uspace/app/tester/ipc/hangup.c |
---|
0,0 → 1,51 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#include <stdio.h> |
#include <unistd.h> |
#include <errno.h> |
#include "../tester.h" |
char * test_hangup(bool quiet) |
{ |
char c; |
int res; |
int phoneid; |
printf("Select phoneid to hangup: 2-9\n"); |
do { |
c = getchar(); |
} while (c < '2' || c > '9'); |
phoneid = c - '0'; |
printf("Hanging up..."); |
res = ipc_hangup(phoneid); |
printf("done: %d\n", phoneid); |
return NULL; |
} |
/tags/0.3.0/uspace/app/tester/ipc/send_async.def |
---|
0,0 → 1,6 |
{ |
"send_async", |
"IPC send async message test", |
&test_send_async, |
true |
}, |
/tags/0.3.0/uspace/app/tester/ipc/answer.def |
---|
0,0 → 1,6 |
{ |
"answer", |
"IPC answer message test", |
&test_answer, |
true |
}, |
/tags/0.3.0/uspace/app/tester/ipc/register.def |
---|
0,0 → 1,6 |
{ |
"register", |
"IPC registration test", |
&test_register, |
true |
}, |
/tags/0.3.0/uspace/app/tester/ipc/connect.def |
---|
0,0 → 1,6 |
{ |
"connect", |
"IPC connection test (connect to other service)", |
&test_connect, |
true |
}, |
/tags/0.3.0/uspace/app/tester/thread/thread1.c |
---|
0,0 → 1,83 |
/* |
* Copyright (c) 2005 Jakub Vana |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#define THREADS 5 |
#include <atomic.h> |
#include <thread.h> |
#include <stdio.h> |
#include <unistd.h> |
#include "../tester.h" |
static atomic_t finish; |
static atomic_t threads_finished; |
static bool sh_quiet; |
static void threadtest(void *data) |
{ |
thread_detach(thread_get_id()); |
while (atomic_get(&finish)) { |
if (!sh_quiet) |
printf("%llu ", thread_get_id()); |
usleep(100000); |
} |
atomic_inc(&threads_finished); |
} |
char * test_thread1(bool quiet) |
{ |
unsigned int i, total = 0; |
sh_quiet = quiet; |
atomic_set(&finish, 1); |
atomic_set(&threads_finished, 0); |
for (i = 0; i < THREADS; i++) { |
if (thread_create(threadtest, NULL, "threadtest", NULL) < 0) { |
if (!quiet) |
printf("Could not create thread %d\n", i); |
break; |
} |
total++; |
} |
if (!quiet) |
printf("Running threads for 10 seconds...\n"); |
sleep(10); |
atomic_set(&finish, 0); |
while (atomic_get(&threads_finished) < total) { |
if (!quiet) |
printf("Threads left: %d\n", total - atomic_get(&threads_finished)); |
sleep(1); |
} |
return NULL; |
} |
/tags/0.3.0/uspace/app/tester/thread/thread1.def |
---|
0,0 → 1,6 |
{ |
"thread1", |
"Thread test", |
&test_thread1, |
true |
}, |
/tags/0.3.0/uspace/app/tester/fault/fault1.c |
---|
0,0 → 1,37 |
/* |
* Copyright (c) 2005 Jakub Vana |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#include "../tester.h" |
char * test_fault1(bool quiet) |
{ |
((int *)(0))[1] = 0; |
return "Survived write to NULL"; |
} |
/tags/0.3.0/uspace/app/tester/fault/fault2.c |
---|
0,0 → 1,40 |
/* |
* Copyright (c) 2005 Jakub Vana |
* Copyright (c) 2005 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#include "../tester.h" |
char * test_fault2(bool quiet) |
{ |
volatile long long var; |
volatile int var1; |
var1 = *((int *) (((char *) (&var)) + 1)); |
return "Survived unaligned read"; |
} |
/tags/0.3.0/uspace/app/tester/fault/fault1.def |
---|
0,0 → 1,6 |
{ |
"fault1", |
"Write to NULL", |
&test_fault1, |
false |
}, |
/tags/0.3.0/uspace/app/tester/fault/fault2.def |
---|
0,0 → 1,6 |
{ |
"fault2", |
"Unaligned read", |
&test_fault2, |
false |
}, |
/tags/0.3.0/uspace/app/tester/print/print1.def |
---|
0,0 → 1,6 |
{ |
"print1", |
"Printf test", |
&test_print1, |
true |
}, |
/tags/0.3.0/uspace/app/tester/print/print1.c |
---|
0,0 → 1,73 |
/* |
* Copyright (c) 2005 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#include <stdio.h> |
#include <unistd.h> |
#include "../tester.h" |
#define BUFFER_SIZE 32 |
char * test_print1(bool quiet) |
{ |
if (!quiet) { |
int retval; |
unsigned int nat = 0x12345678u; |
char buffer[BUFFER_SIZE]; |
printf(" text 10.8s %*.*s \n", 5, 3, "text"); |
printf(" very long text 10.8s %10.8s \n", "very long text"); |
printf(" text 8.10s %8.10s \n", "text"); |
printf(" very long text 8.10s %8.10s \n", "very long text"); |
printf(" char: c '%c', 3.2c '%3.2c', -3.2c '%-3.2c', 2.3c '%2.3c', -2.3c '%-2.3c' \n",'a', 'b', 'c', 'd', 'e' ); |
printf(" int: d '%d', 3.2d '%3.2d', -3.2d '%-3.2d', 2.3d '%2.3d', -2.3d '%-2.3d' \n",1, 1, 1, 1, 1 ); |
printf(" -int: d '%d', 3.2d '%3.2d', -3.2d '%-3.2d', 2.3d '%2.3d', -2.3d '%-2.3d' \n",-1, -1, -1, -1, -1 ); |
printf(" 0xint: x '%#x', 5.3x '%#5.3x', -5.3x '%#-5.3x', 3.5x '%#3.5x', -3.5x '%#-3.5x' \n",17, 17, 17, 17, 17 ); |
printf("'%#llx' 64bit, '%#x' 32bit, '%#hhx' 8bit, '%#hx' 16bit, unative_t '%#zx'. '%#llx' 64bit and '%s' string.\n", 0x1234567887654321ll, 0x12345678, 0x12, 0x1234, nat, 0x1234567887654321ull, "Lovely string" ); |
printf(" Print to NULL '%s'\n", NULL); |
retval = snprintf(buffer, BUFFER_SIZE, "Short text without parameters."); |
printf("Result is: '%s', retval = %d\n", buffer, retval); |
retval = snprintf(buffer, BUFFER_SIZE, "Very very very long text without parameters."); |
printf("Result is: '%s', retval = %d\n", buffer, retval); |
printf("Print short text to %d char long buffer via snprintf.\n", BUFFER_SIZE); |
retval = snprintf(buffer, BUFFER_SIZE, "Short %s", "text"); |
printf("Result is: '%s', retval = %d\n", buffer, retval); |
printf("Print long text to %d char long buffer via snprintf.\n", BUFFER_SIZE); |
retval = snprintf(buffer, BUFFER_SIZE, "Very long %s. This text`s length is more than %d. We are interested in the result.", "text" , BUFFER_SIZE); |
printf("Result is: '%s', retval = %d\n", buffer, retval); |
} |
return NULL; |
} |
/tags/0.3.0/uspace/app/ash/tools/mksyntax.c |
---|
0,0 → 1,428 |
/* $NetBSD: mksyntax.c,v 1.23 2000/07/18 19:13:21 cgd Exp $ */ |
/*- |
* Copyright (c) 1991, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Kenneth Almquist. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
*/ |
#ifndef lint |
static const char copyright[] = |
"@(#) Copyright (c) 1991, 1993\n\ |
The Regents of the University of California. All rights reserved.\n"; |
#endif /* not lint */ |
#ifndef lint |
#if 0 |
static char sccsid[] = "@(#)mksyntax.c 8.2 (Berkeley) 5/4/95"; |
#else |
static const char rcsid[] = |
"$NetBSD: mksyntax.c,v 1.23 2000/07/18 19:13:21 cgd Exp $"; |
#endif |
#endif /* not lint */ |
/* |
* This program creates syntax.h and syntax.c. |
*/ |
#include <stdio.h> |
#include <stdlib.h> |
#include <string.h> |
#include <sys/types.h> |
#include "../parser.h" |
struct synclass { |
char *name; |
char *comment; |
}; |
/* Syntax classes */ |
struct synclass synclass[] = { |
{ "CWORD", "character is nothing special" }, |
{ "CNL", "newline character" }, |
{ "CBACK", "a backslash character" }, |
{ "CSQUOTE", "single quote" }, |
{ "CDQUOTE", "double quote" }, |
{ "CENDQUOTE", "a terminating quote" }, |
{ "CBQUOTE", "backwards single quote" }, |
{ "CVAR", "a dollar sign" }, |
{ "CENDVAR", "a '}' character" }, |
{ "CLP", "a left paren in arithmetic" }, |
{ "CRP", "a right paren in arithmetic" }, |
{ "CEOF", "end of file" }, |
{ "CCTL", "like CWORD, except it must be escaped" }, |
{ "CSPCL", "these terminate a word" }, |
{ NULL, NULL } |
}; |
/* |
* Syntax classes for is_ functions. Warning: if you add new classes |
* you may have to change the definition of the is_in_name macro. |
*/ |
struct synclass is_entry[] = { |
{ "ISDIGIT", "a digit" }, |
{ "ISUPPER", "an upper case letter" }, |
{ "ISLOWER", "a lower case letter" }, |
{ "ISUNDER", "an underscore" }, |
{ "ISSPECL", "the name of a special parameter" }, |
{ NULL, NULL } |
}; |
static char writer[] = "\ |
/*\n\ |
* This file was generated by the mksyntax program.\n\ |
*/\n\ |
\n"; |
static FILE *cfile; |
static FILE *hfile; |
static char *syntax[513]; |
static int base; |
static int size; /* number of values which a char variable can have */ |
static int nbits; /* number of bits in a character */ |
static int digit_contig;/* true if digits are contiguous */ |
static void filltable(char *); |
static void init(void); |
static void add(char *, char *); |
static void print(char *); |
static void output_type_macros(void); |
static void digit_convert(void); |
int main(int, char **); |
int |
main(argc, argv) |
int argc; |
char **argv; |
{ |
#ifdef TARGET_CHAR |
TARGET_CHAR c; |
TARGET_CHAR d; |
#else |
char c; |
char d; |
#endif |
int sign; |
int i; |
char buf[80]; |
int pos; |
static char digit[] = "0123456789"; |
/* Create output files */ |
if ((cfile = fopen("syntax.c", "w")) == NULL) { |
perror("syntax.c"); |
exit(2); |
} |
if ((hfile = fopen("syntax.h", "w")) == NULL) { |
perror("syntax.h"); |
exit(2); |
} |
fputs(writer, hfile); |
fputs(writer, cfile); |
/* Determine the characteristics of chars. */ |
c = -1; |
if (c <= 0) |
sign = 1; |
else |
sign = 0; |
for (nbits = 1 ; ; nbits++) { |
d = (1 << nbits) - 1; |
if (d == c) |
break; |
} |
printf("%s %d bit chars\n", sign? "signed" : "unsigned", nbits); |
if (nbits > 9) { |
fputs("Characters can't have more than 9 bits\n", stderr); |
exit(2); |
} |
size = (1 << nbits) + 1; |
base = 1; |
if (sign) |
base += 1 << (nbits - 1); |
digit_contig = 1; |
for (i = 0 ; i < 10 ; i++) { |
if (digit[i] != '0' + i) |
digit_contig = 0; |
} |
fputs("#include <sys/cdefs.h>\n", hfile); |
fputs("#include <ctype.h>\n", hfile); |
/* Generate the #define statements in the header file */ |
fputs("/* Syntax classes */\n", hfile); |
for (i = 0 ; synclass[i].name ; i++) { |
sprintf(buf, "#define %s %d", synclass[i].name, i); |
fputs(buf, hfile); |
for (pos = strlen(buf) ; pos < 32 ; pos = (pos + 8) & ~07) |
putc('\t', hfile); |
fprintf(hfile, "/* %s */\n", synclass[i].comment); |
} |
putc('\n', hfile); |
fputs("/* Syntax classes for is_ functions */\n", hfile); |
for (i = 0 ; is_entry[i].name ; i++) { |
sprintf(buf, "#define %s %#o", is_entry[i].name, 1 << i); |
fputs(buf, hfile); |
for (pos = strlen(buf) ; pos < 32 ; pos = (pos + 8) & ~07) |
putc('\t', hfile); |
fprintf(hfile, "/* %s */\n", is_entry[i].comment); |
} |
putc('\n', hfile); |
fprintf(hfile, "#define SYNBASE %d\n", base); |
fprintf(hfile, "#define PEOF %d\n\n", -base); |
if (sign) |
fprintf(hfile, "#define UPEOF %d\n\n", -base); |
else |
fprintf(hfile, "#define UPEOF ((unsigned char) %d)\n\n", -base); |
putc('\n', hfile); |
fputs("#define BASESYNTAX (basesyntax + SYNBASE)\n", hfile); |
fputs("#define DQSYNTAX (dqsyntax + SYNBASE)\n", hfile); |
fputs("#define SQSYNTAX (sqsyntax + SYNBASE)\n", hfile); |
fputs("#define ARISYNTAX (arisyntax + SYNBASE)\n", hfile); |
putc('\n', hfile); |
output_type_macros(); /* is_digit, etc. */ |
putc('\n', hfile); |
/* Generate the syntax tables. */ |
fputs("#include \"shell.h\"\n", cfile); |
fputs("#include \"syntax.h\"\n\n", cfile); |
init(); |
fputs("/* syntax table used when not in quotes */\n", cfile); |
add("\n", "CNL"); |
add("\\", "CBACK"); |
add("'", "CSQUOTE"); |
add("\"", "CDQUOTE"); |
add("`", "CBQUOTE"); |
add("$", "CVAR"); |
add("}", "CENDVAR"); |
add("<>();&| \t", "CSPCL"); |
print("basesyntax"); |
init(); |
fputs("\n/* syntax table used when in double quotes */\n", cfile); |
add("\n", "CNL"); |
add("\\", "CBACK"); |
add("\"", "CENDQUOTE"); |
add("`", "CBQUOTE"); |
add("$", "CVAR"); |
add("}", "CENDVAR"); |
/* ':/' for tilde expansion, '-' for [a\-x] pattern ranges */ |
add("!*?[=~:/-]", "CCTL"); |
print("dqsyntax"); |
init(); |
fputs("\n/* syntax table used when in single quotes */\n", cfile); |
add("\n", "CNL"); |
add("'", "CENDQUOTE"); |
/* ':/' for tilde expansion, '-' for [a\-x] pattern ranges */ |
add("!*?[=~:/-]\\", "CCTL"); |
print("sqsyntax"); |
init(); |
fputs("\n/* syntax table used when in arithmetic */\n", cfile); |
add("\n", "CNL"); |
add("\\", "CBACK"); |
add("`", "CBQUOTE"); |
add("'", "CSQUOTE"); |
add("\"", "CDQUOTE"); |
add("$", "CVAR"); |
add("}", "CENDVAR"); |
add("(", "CLP"); |
add(")", "CRP"); |
print("arisyntax"); |
filltable("0"); |
fputs("\n/* character classification table */\n", cfile); |
add("0123456789", "ISDIGIT"); |
add("abcdefghijklmnopqrstucvwxyz", "ISLOWER"); |
add("ABCDEFGHIJKLMNOPQRSTUCVWXYZ", "ISUPPER"); |
add("_", "ISUNDER"); |
add("#?$!-*@", "ISSPECL"); |
print("is_type"); |
if (! digit_contig) |
digit_convert(); |
exit(0); |
/* NOTREACHED */ |
} |
/* |
* Clear the syntax table. |
*/ |
static void |
filltable(dftval) |
char *dftval; |
{ |
int i; |
for (i = 0 ; i < size ; i++) |
syntax[i] = dftval; |
} |
/* |
* Initialize the syntax table with default values. |
*/ |
static void |
init() |
{ |
filltable("CWORD"); |
syntax[0] = "CEOF"; |
#ifdef TARGET_CHAR |
syntax[base + (TARGET_CHAR)CTLESC] = "CCTL"; |
syntax[base + (TARGET_CHAR)CTLVAR] = "CCTL"; |
syntax[base + (TARGET_CHAR)CTLENDVAR] = "CCTL"; |
syntax[base + (TARGET_CHAR)CTLBACKQ] = "CCTL"; |
syntax[base + (TARGET_CHAR)CTLBACKQ + (TARGET_CHAR)CTLQUOTE] = "CCTL"; |
syntax[base + (TARGET_CHAR)CTLARI] = "CCTL"; |
syntax[base + (TARGET_CHAR)CTLENDARI] = "CCTL"; |
syntax[base + (TARGET_CHAR)CTLQUOTEMARK] = "CCTL"; |
#else |
syntax[base + CTLESC] = "CCTL"; |
syntax[base + CTLVAR] = "CCTL"; |
syntax[base + CTLENDVAR] = "CCTL"; |
syntax[base + CTLBACKQ] = "CCTL"; |
syntax[base + CTLBACKQ + CTLQUOTE] = "CCTL"; |
syntax[base + CTLARI] = "CCTL"; |
syntax[base + CTLENDARI] = "CCTL"; |
syntax[base + CTLQUOTEMARK] = "CCTL"; |
#endif /* TARGET_CHAR */ |
} |
/* |
* Add entries to the syntax table. |
*/ |
static void |
add(p, type) |
char *p, *type; |
{ |
while (*p) |
syntax[*p++ + base] = type; |
} |
/* |
* Output the syntax table. |
*/ |
static void |
print(name) |
char *name; |
{ |
int i; |
int col; |
fprintf(hfile, "extern const char %s[];\n", name); |
fprintf(cfile, "const char %s[%d] = {\n", name, size); |
col = 0; |
for (i = 0 ; i < size ; i++) { |
if (i == 0) { |
fputs(" ", cfile); |
} else if ((i & 03) == 0) { |
fputs(",\n ", cfile); |
col = 0; |
} else { |
putc(',', cfile); |
while (++col < 9 * (i & 03)) |
putc(' ', cfile); |
} |
fputs(syntax[i], cfile); |
col += strlen(syntax[i]); |
} |
fputs("\n};\n", cfile); |
} |
/* |
* Output character classification macros (e.g. is_digit). If digits are |
* contiguous, we can test for them quickly. |
*/ |
static char *macro[] = { |
"#define is_digit(c)\t((is_type+SYNBASE)[c] & ISDIGIT)", |
"#define is_alpha(c)\t((c) != UPEOF && ((c) < CTLESC || (c) > CTLENDARI) && isalpha((unsigned char) (c)))", |
"#define is_name(c)\t((c) != UPEOF && ((c) < CTLESC || (c) > CTLENDARI) && ((c) == '_' || isalpha((unsigned char) (c))))", |
"#define is_in_name(c)\t((c) != UPEOF && ((c) < CTLESC || (c) > CTLENDARI) && ((c) == '_' || isalnum((unsigned char) (c))))", |
"#define is_special(c)\t((is_type+SYNBASE)[c] & (ISSPECL|ISDIGIT))", |
NULL |
}; |
static void |
output_type_macros() |
{ |
char **pp; |
if (digit_contig) |
macro[0] = "#define is_digit(c)\t((unsigned)((c) - '0') <= 9)"; |
for (pp = macro ; *pp ; pp++) |
fprintf(hfile, "%s\n", *pp); |
if (digit_contig) |
fputs("#define digit_val(c)\t((c) - '0')\n", hfile); |
else |
fputs("#define digit_val(c)\t(digit_value[c])\n", hfile); |
} |
/* |
* Output digit conversion table (if digits are not contiguous). |
*/ |
static void |
digit_convert() |
{ |
int maxdigit; |
static char digit[] = "0123456789"; |
char *p; |
int i; |
maxdigit = 0; |
for (p = digit ; *p ; p++) |
if (*p > maxdigit) |
maxdigit = *p; |
fputs("extern const char digit_value[];\n", hfile); |
fputs("\n\nconst char digit_value[] = {\n", cfile); |
for (i = 0 ; i <= maxdigit ; i++) { |
for (p = digit ; *p && *p != i ; p++); |
if (*p == '\0') |
p = digit; |
fprintf(cfile, " %ld,\n", (long)(p - digit)); |
} |
fputs("};\n", cfile); |
} |
/tags/0.3.0/uspace/app/ash/tools/Makefile |
---|
0,0 → 1,56 |
# |
# Copyright (c) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
SOURCES = \ |
mkinit.c \ |
mknodes.c \ |
mksyntax.c \ |
mksignames.c |
OBJECTS := $(addsuffix .o,$(basename $(SOURCES))) |
OUTPUT := $(addprefix ../,$(basename $(SOURCES))) |
.PHONY: all clean move-output |
all: $(OUTPUT) |
$(OUTPUT): $(OBJECTS) |
$(CC) $< $(LFLAGS) -o $@ |
clean: |
-rm -f $(OUTPUT) $(OBJECTS) |
%.o: %.S |
$(CC) $(DEFS) $(AFLAGS) $(CFLAGS) -D__ASM__ -c $< -o $@ |
%.o: %.s |
$(AS) $(AFLAGS) $< -o $@ |
%.o: %.c |
$(CC) $(DEFS) $(CFLAGS) -c $< -o $@ |
/tags/0.3.0/uspace/app/ash/tools/mksignames.c |
---|
0,0 → 1,400 |
/* signames.c -- Create and write `signames.c', which contains an array of |
signal names. */ |
/* Copyright (C) 1992 Free Software Foundation, Inc. |
This file is part of GNU Bash, the Bourne Again SHell. |
Bash is free software; you can redistribute it and/or modify it under |
the terms of the GNU General Public License as published by the Free |
Software Foundation; either version 2, or (at your option) any later |
version. |
Bash is distributed in the hope that it will be useful, but WITHOUT ANY |
WARRANTY; without even the implied warranty of MERCHANTABILITY or |
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
for more details. |
You should have received a copy of the GNU General Public License along |
with Bash; see the file COPYING. If not, write to the Free Software |
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ |
#include <stdio.h> |
#include <sys/types.h> |
#include <signal.h> |
#include <stdlib.h> |
#if !defined (NSIG) |
# define NSIG 64 |
#endif |
char *signal_names[2 * NSIG]; |
char *progname; |
#if defined (SIGRTMAX) || defined (SIGRTMIN) |
# define RTLEN 14 |
# define RTLIM 256 |
#endif |
void |
initialize_signames () |
{ |
register int i; |
#if defined (SIGRTMAX) || defined (SIGRTMIN) |
int rtmin, rtmax, rtcnt; |
#endif |
for (i = 1; i < sizeof(signal_names)/sizeof(signal_names[0]); i++) |
signal_names[i] = (char *)NULL; |
/* `signal' 0 is what we do on exit. */ |
signal_names[0] = "EXIT"; |
/* Place signal names which can be aliases for more common signal |
names first. This allows (for example) SIGABRT to overwrite SIGLOST. */ |
/* POSIX 1003.1b-1993 real time signals, but take care of incomplete |
implementations. Acoording to the standard, both, SIGRTMIN and |
SIGRTMAX must be defined, SIGRTMIN must be stricly less than |
SIGRTMAX, and the difference must be at least 7, that is, there |
must be at least eight distinct real time signals. */ |
/* The generated signal names are SIGRTMIN, SIGRTMIN+1, ..., |
SIGRTMIN+x, SIGRTMAX-x, ..., SIGRTMAX-1, SIGRTMAX. If the number |
of RT signals is odd, there is an extra SIGRTMIN+(x+1). |
These names are the ones used by ksh and /usr/xpg4/bin/sh on SunOS5. */ |
#if defined (SIGRTMIN) |
rtmin = SIGRTMIN; |
signal_names[rtmin] = "SIGRTMIN"; |
#endif |
#if defined (SIGRTMAX) |
rtmax = SIGRTMAX; |
signal_names[rtmax] = "SIGRTMAX"; |
#endif |
#if defined (SIGRTMAX) && defined (SIGRTMIN) |
if (rtmax > rtmin) |
{ |
rtcnt = (rtmax - rtmin - 1) / 2; |
/* croak if there are too many RT signals */ |
if (rtcnt >= RTLIM/2) |
{ |
rtcnt = RTLIM/2-1; |
fprintf(stderr, "%s: error: more than %i real time signals, fix `%s'\n", |
progname, RTLIM, progname); |
} |
for (i = 1; i <= rtcnt; i++) |
{ |
signal_names[rtmin+i] = (char *)malloc(RTLEN); |
sprintf (signal_names[rtmin+i], "SIGRTMIN+%d", i); |
signal_names[rtmax-i] = (char *)malloc(RTLEN); |
sprintf (signal_names[rtmax-i], "SIGRTMAX-%d", i); |
} |
if (rtcnt < RTLIM/2-1 && rtcnt != (rtmax-rtmin)/2) |
{ |
/* Need an extra RTMIN signal */ |
signal_names[rtmin+rtcnt+1] = (char *)malloc(RTLEN); |
sprintf (signal_names[rtmin+rtcnt+1], "SIGRTMIN+%d", rtcnt+1); |
} |
} |
#endif /* SIGRTMIN && SIGRTMAX */ |
/* AIX */ |
#if defined (SIGLOST) /* resource lost (eg, record-lock lost) */ |
signal_names[SIGLOST] = "SIGLOST"; |
#endif |
#if defined (SIGMSG) /* HFT input data pending */ |
signal_names[SIGMSG] = "SIGMSG"; |
#endif |
#if defined (SIGDANGER) /* system crash imminent */ |
signal_names[SIGDANGER] = "SIGDANGER"; |
#endif |
#if defined (SIGMIGRATE) /* migrate process to another CPU */ |
signal_names[SIGMIGRATE] = "SIGMIGRATE"; |
#endif |
#if defined (SIGPRE) /* programming error */ |
signal_names[SIGPRE] = "SIGPRE"; |
#endif |
#if defined (SIGVIRT) /* AIX virtual time alarm */ |
signal_names[SIGVIRT] = "SIGVIRT"; |
#endif |
#if defined (SIGALRM1) /* m:n condition variables */ |
signal_names[SIGALRM1] = "SIGALRM1"; |
#endif |
#if defined (SIGWAITING) /* m:n scheduling */ |
signal_names[SIGWAITING] = "SIGWAITING"; |
#endif |
#if defined (SIGGRANT) /* HFT monitor mode granted */ |
signal_names[SIGGRANT] = "SIGGRANT"; |
#endif |
#if defined (SIGKAP) /* keep alive poll from native keyboard */ |
signal_names[SIGKAP] = "SIGKAP"; |
#endif |
#if defined (SIGRETRACT) /* HFT monitor mode retracted */ |
signal_names[SIGRETRACT] = "SIGRETRACT"; |
#endif |
#if defined (SIGSOUND) /* HFT sound sequence has completed */ |
signal_names[SIGSOUND] = "SIGSOUND"; |
#endif |
#if defined (SIGSAK) /* Secure Attention Key */ |
signal_names[SIGSAK] = "SIGSAK"; |
#endif |
/* SunOS5 */ |
#if defined (SIGLWP) /* special signal used by thread library */ |
signal_names[SIGLWP] = "SIGLWP"; |
#endif |
#if defined (SIGFREEZE) /* special signal used by CPR */ |
signal_names[SIGFREEZE] = "SIGFREEZE"; |
#endif |
#if defined (SIGTHAW) /* special signal used by CPR */ |
signal_names[SIGTHAW] = "SIGTHAW"; |
#endif |
#if defined (SIGCANCEL) /* thread cancellation signal used by libthread */ |
signal_names[SIGCANCEL] = "SIGCANCEL"; |
#endif |
/* HP-UX */ |
#if defined (SIGDIL) /* DIL signal (?) */ |
signal_names[SIGDIL] = "SIGDIL"; |
#endif |
/* System V */ |
#if defined (SIGCLD) /* Like SIGCHLD. */ |
signal_names[SIGCLD] = "SIGCLD"; |
#endif |
#if defined (SIGPWR) /* power state indication */ |
signal_names[SIGPWR] = "SIGPWR"; |
#endif |
#if defined (SIGPOLL) /* Pollable event (for streams) */ |
signal_names[SIGPOLL] = "SIGPOLL"; |
#endif |
/* Unknown */ |
#if defined (SIGWINDOW) |
signal_names[SIGWINDOW] = "SIGWINDOW"; |
#endif |
/* Common */ |
#if defined (SIGHUP) /* hangup */ |
signal_names[SIGHUP] = "SIGHUP"; |
#endif |
#if defined (SIGINT) /* interrupt */ |
signal_names[SIGINT] = "SIGINT"; |
#endif |
#if defined (SIGQUIT) /* quit */ |
signal_names[SIGQUIT] = "SIGQUIT"; |
#endif |
#if defined (SIGILL) /* illegal instruction (not reset when caught) */ |
signal_names[SIGILL] = "SIGILL"; |
#endif |
#if defined (SIGTRAP) /* trace trap (not reset when caught) */ |
signal_names[SIGTRAP] = "SIGTRAP"; |
#endif |
#if defined (SIGIOT) /* IOT instruction */ |
signal_names[SIGIOT] = "SIGIOT"; |
#endif |
#if defined (SIGABRT) /* Cause current process to dump core. */ |
signal_names[SIGABRT] = "SIGABRT"; |
#endif |
#if defined (SIGEMT) /* EMT instruction */ |
signal_names[SIGEMT] = "SIGEMT"; |
#endif |
#if defined (SIGFPE) /* floating point exception */ |
signal_names[SIGFPE] = "SIGFPE"; |
#endif |
#if defined (SIGKILL) /* kill (cannot be caught or ignored) */ |
signal_names[SIGKILL] = "SIGKILL"; |
#endif |
#if defined (SIGBUS) /* bus error */ |
signal_names[SIGBUS] = "SIGBUS"; |
#endif |
#if defined (SIGSEGV) /* segmentation violation */ |
signal_names[SIGSEGV] = "SIGSEGV"; |
#endif |
#if defined (SIGSYS) /* bad argument to system call */ |
signal_names[SIGSYS] = "SIGSYS"; |
#endif |
#if defined (SIGPIPE) /* write on a pipe with no one to read it */ |
signal_names[SIGPIPE] = "SIGPIPE"; |
#endif |
#if defined (SIGALRM) /* alarm clock */ |
signal_names[SIGALRM] = "SIGALRM"; |
#endif |
#if defined (SIGTERM) /* software termination signal from kill */ |
signal_names[SIGTERM] = "SIGTERM"; |
#endif |
#if defined (SIGURG) /* urgent condition on IO channel */ |
signal_names[SIGURG] = "SIGURG"; |
#endif |
#if defined (SIGSTOP) /* sendable stop signal not from tty */ |
signal_names[SIGSTOP] = "SIGSTOP"; |
#endif |
#if defined (SIGTSTP) /* stop signal from tty */ |
signal_names[SIGTSTP] = "SIGTSTP"; |
#endif |
#if defined (SIGCONT) /* continue a stopped process */ |
signal_names[SIGCONT] = "SIGCONT"; |
#endif |
#if defined (SIGCHLD) /* to parent on child stop or exit */ |
signal_names[SIGCHLD] = "SIGCHLD"; |
#endif |
#if defined (SIGTTIN) /* to readers pgrp upon background tty read */ |
signal_names[SIGTTIN] = "SIGTTIN"; |
#endif |
#if defined (SIGTTOU) /* like TTIN for output if (tp->t_local<OSTOP) */ |
signal_names[SIGTTOU] = "SIGTTOU"; |
#endif |
#if defined (SIGIO) /* input/output possible signal */ |
signal_names[SIGIO] = "SIGIO"; |
#endif |
#if defined (SIGXCPU) /* exceeded CPU time limit */ |
signal_names[SIGXCPU] = "SIGXCPU"; |
#endif |
#if defined (SIGXFSZ) /* exceeded file size limit */ |
signal_names[SIGXFSZ] = "SIGXFSZ"; |
#endif |
#if defined (SIGVTALRM) /* virtual time alarm */ |
signal_names[SIGVTALRM] = "SIGVTALRM"; |
#endif |
#if defined (SIGPROF) /* profiling time alarm */ |
signal_names[SIGPROF] = "SIGPROF"; |
#endif |
#if defined (SIGWINCH) /* window changed */ |
signal_names[SIGWINCH] = "SIGWINCH"; |
#endif |
/* 4.4 BSD */ |
#if defined (SIGINFO) && !defined (_SEQUENT_) /* information request */ |
signal_names[SIGINFO] = "SIGINFO"; |
#endif |
#if defined (SIGUSR1) /* user defined signal 1 */ |
signal_names[SIGUSR1] = "SIGUSR1"; |
#endif |
#if defined (SIGUSR2) /* user defined signal 2 */ |
signal_names[SIGUSR2] = "SIGUSR2"; |
#endif |
#if defined (SIGKILLTHR) /* BeOS: Kill Thread */ |
signal_names[SIGKILLTHR] = "SIGKILLTHR"; |
#endif |
for (i = 0; i < NSIG; i++) |
if (signal_names[i] == (char *)NULL) |
{ |
signal_names[i] = (char *)malloc (18); |
sprintf (signal_names[i], "SIGJUNK(%d)", i); |
} |
signal_names[NSIG] = "DEBUG"; |
} |
void |
write_signames (stream) |
FILE *stream; |
{ |
register int i; |
fprintf (stream, "/* This file was automatically created by %s.\n", |
progname); |
fprintf (stream, " Do not edit. Edit support/mksignames.c instead. */\n\n"); |
fprintf (stream, "#include <signal.h>\n\n"); |
fprintf (stream, |
"/* A translation list so we can be polite to our users. */\n"); |
fprintf (stream, "char *signal_names[NSIG + 2] = {\n"); |
for (i = 0; i <= NSIG; i++) |
fprintf (stream, " \"%s\",\n", signal_names[i]); |
fprintf (stream, " (char *)0x0,\n"); |
fprintf (stream, "};\n"); |
} |
int |
main (argc, argv) |
int argc; |
char **argv; |
{ |
char *stream_name; |
FILE *stream; |
progname = argv[0]; |
if (argc == 1) |
{ |
stream_name = "signames.c"; |
} |
else if (argc == 2) |
{ |
stream_name = argv[1]; |
} |
else |
{ |
fprintf (stderr, "Usage: %s [output-file]\n", progname); |
exit (1); |
} |
stream = fopen (stream_name, "w"); |
if (!stream) |
{ |
fprintf (stderr, "%s: %s: cannot open for writing\n", |
progname, stream_name); |
exit (2); |
} |
initialize_signames (); |
write_signames (stream); |
exit (0); |
} |
/tags/0.3.0/uspace/app/ash/tools/mknodes.c |
---|
0,0 → 1,492 |
/* $NetBSD: mknodes.c,v 1.18 2000/07/27 04:06:49 cgd Exp $ */ |
/*- |
* Copyright (c) 1991, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Kenneth Almquist. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
*/ |
#ifndef lint |
static const char copyright[] = |
"@(#) Copyright (c) 1991, 1993\n\ |
The Regents of the University of California. All rights reserved.\n"; |
#endif /* not lint */ |
#ifndef lint |
#if 0 |
static char sccsid[] = "@(#)mknodes.c 8.2 (Berkeley) 5/4/95"; |
#else |
static const char rcsid[] = |
"$NetBSD: mknodes.c,v 1.18 2000/07/27 04:06:49 cgd Exp $"; |
#endif |
#endif /* not lint */ |
/* |
* This program reads the nodetypes file and nodes.c.pat file. It generates |
* the files nodes.h and nodes.c. |
*/ |
#include <stdio.h> |
#include <stdlib.h> |
#include <string.h> |
#ifdef __STDC__ |
#include <stdarg.h> |
#else |
#include <varargs.h> |
#endif |
#define MAXTYPES 50 /* max number of node types */ |
#define MAXFIELDS 20 /* max fields in a structure */ |
#define BUFLEN 100 /* size of character buffers */ |
/* field types */ |
#define T_NODE 1 /* union node *field */ |
#define T_NODELIST 2 /* struct nodelist *field */ |
#define T_STRING 3 |
#define T_INT 4 /* int field */ |
#define T_OTHER 5 /* other */ |
#define T_TEMP 6 /* don't copy this field */ |
struct field { /* a structure field */ |
char *name; /* name of field */ |
int type; /* type of field */ |
char *decl; /* declaration of field */ |
}; |
struct str { /* struct representing a node structure */ |
char *tag; /* structure tag */ |
int nfields; /* number of fields in the structure */ |
struct field field[MAXFIELDS]; /* the fields of the structure */ |
int done; /* set if fully parsed */ |
}; |
static int ntypes; /* number of node types */ |
static char *nodename[MAXTYPES]; /* names of the nodes */ |
static struct str *nodestr[MAXTYPES]; /* type of structure used by the node */ |
static int nstr; /* number of structures */ |
static struct str str[MAXTYPES]; /* the structures */ |
static struct str *curstr; /* current structure */ |
static FILE *infp; |
static char line[1024]; |
static int linno; |
static char *linep; |
static void parsenode(void); |
static void parsefield(void); |
static void output(char *); |
static void outsizes(FILE *); |
static void outfunc(FILE *, int); |
static void indent(int, FILE *); |
static int nextfield(char *); |
static void skipbl(void); |
static int readline(void); |
static void error(const char *, ...); |
static char *savestr(const char *); |
int main(int, char **); |
int |
main(argc, argv) |
int argc; |
char **argv; |
{ |
/* |
* some versions of linux complain: initializer element is not |
* constant if this is done at compile time. |
*/ |
infp = stdin; |
if (argc != 3) |
error("usage: mknodes file"); |
if ((infp = fopen(argv[1], "r")) == NULL) |
error("Can't open %s", argv[1]); |
while (readline()) { |
if (line[0] == ' ' || line[0] == '\t') |
parsefield(); |
else if (line[0] != '\0') |
parsenode(); |
} |
output(argv[2]); |
exit(0); |
/* NOTREACHED */ |
} |
static void |
parsenode() |
{ |
char name[BUFLEN]; |
char tag[BUFLEN]; |
struct str *sp; |
if (curstr && curstr->nfields > 0) |
curstr->done = 1; |
nextfield(name); |
if (! nextfield(tag)) |
error("Tag expected"); |
if (*linep != '\0') |
error("Garbage at end of line"); |
nodename[ntypes] = savestr(name); |
for (sp = str ; sp < str + nstr ; sp++) { |
if (strcmp(sp->tag, tag) == 0) |
break; |
} |
if (sp >= str + nstr) { |
sp->tag = savestr(tag); |
sp->nfields = 0; |
curstr = sp; |
nstr++; |
} |
nodestr[ntypes] = sp; |
ntypes++; |
} |
static void |
parsefield() |
{ |
char name[BUFLEN]; |
char type[BUFLEN]; |
char decl[2 * BUFLEN]; |
struct field *fp; |
if (curstr == NULL || curstr->done) |
error("No current structure to add field to"); |
if (! nextfield(name)) |
error("No field name"); |
if (! nextfield(type)) |
error("No field type"); |
fp = &curstr->field[curstr->nfields]; |
fp->name = savestr(name); |
if (strcmp(type, "nodeptr") == 0) { |
fp->type = T_NODE; |
sprintf(decl, "union node *%s", name); |
} else if (strcmp(type, "nodelist") == 0) { |
fp->type = T_NODELIST; |
sprintf(decl, "struct nodelist *%s", name); |
} else if (strcmp(type, "string") == 0) { |
fp->type = T_STRING; |
sprintf(decl, "char *%s", name); |
} else if (strcmp(type, "int") == 0) { |
fp->type = T_INT; |
sprintf(decl, "int %s", name); |
} else if (strcmp(type, "other") == 0) { |
fp->type = T_OTHER; |
} else if (strcmp(type, "temp") == 0) { |
fp->type = T_TEMP; |
} else { |
error("Unknown type %s", type); |
} |
if (fp->type == T_OTHER || fp->type == T_TEMP) { |
skipbl(); |
fp->decl = savestr(linep); |
} else { |
if (*linep) |
error("Garbage at end of line"); |
fp->decl = savestr(decl); |
} |
curstr->nfields++; |
} |
char writer[] = "\ |
/*\n\ |
* This file was generated by the mknodes program.\n\ |
*/\n\ |
\n"; |
static void |
output(file) |
char *file; |
{ |
FILE *hfile; |
FILE *cfile; |
FILE *patfile; |
int i; |
struct str *sp; |
struct field *fp; |
char *p; |
if ((patfile = fopen(file, "r")) == NULL) |
error("Can't open %s", file); |
if ((hfile = fopen("nodes.h", "w")) == NULL) |
error("Can't create nodes.h"); |
if ((cfile = fopen("nodes.c", "w")) == NULL) |
error("Can't create nodes.c"); |
fputs(writer, hfile); |
for (i = 0 ; i < ntypes ; i++) |
fprintf(hfile, "#define %s %d\n", nodename[i], i); |
fputs("\n\n\n", hfile); |
for (sp = str ; sp < &str[nstr] ; sp++) { |
fprintf(hfile, "struct %s {\n", sp->tag); |
for (i = sp->nfields, fp = sp->field ; --i >= 0 ; fp++) { |
fprintf(hfile, " %s;\n", fp->decl); |
} |
fputs("};\n\n\n", hfile); |
} |
fputs("union node {\n", hfile); |
fprintf(hfile, " int type;\n"); |
for (sp = str ; sp < &str[nstr] ; sp++) { |
fprintf(hfile, " struct %s %s;\n", sp->tag, sp->tag); |
} |
fputs("};\n\n\n", hfile); |
fputs("struct nodelist {\n", hfile); |
fputs("\tstruct nodelist *next;\n", hfile); |
fputs("\tunion node *n;\n", hfile); |
fputs("};\n\n\n", hfile); |
fputs("#ifdef __STDC__\n", hfile); |
fputs("union node *copyfunc(union node *);\n", hfile); |
fputs("void freefunc(union node *);\n", hfile); |
fputs("#else\n", hfile); |
fputs("union node *copyfunc();\n", hfile); |
fputs("void freefunc();\n", hfile); |
fputs("#endif\n", hfile); |
fputs(writer, cfile); |
while (fgets(line, sizeof line, patfile) != NULL) { |
for (p = line ; *p == ' ' || *p == '\t' ; p++); |
if (strcmp(p, "%SIZES\n") == 0) |
outsizes(cfile); |
else if (strcmp(p, "%CALCSIZE\n") == 0) |
outfunc(cfile, 1); |
else if (strcmp(p, "%COPY\n") == 0) |
outfunc(cfile, 0); |
else |
fputs(line, cfile); |
} |
} |
static void |
outsizes(cfile) |
FILE *cfile; |
{ |
int i; |
fprintf(cfile, "static const short nodesize[%d] = {\n", ntypes); |
for (i = 0 ; i < ntypes ; i++) { |
fprintf(cfile, " ALIGN(sizeof (struct %s)),\n", nodestr[i]->tag); |
} |
fprintf(cfile, "};\n"); |
} |
static void |
outfunc(cfile, calcsize) |
FILE *cfile; |
int calcsize; |
{ |
struct str *sp; |
struct field *fp; |
int i; |
fputs(" if (n == NULL)\n", cfile); |
if (calcsize) |
fputs(" return;\n", cfile); |
else |
fputs(" return NULL;\n", cfile); |
if (calcsize) |
fputs(" funcblocksize += nodesize[n->type];\n", cfile); |
else { |
fputs(" new = funcblock;\n", cfile); |
fputs(" funcblock = (char *) funcblock + nodesize[n->type];\n", cfile); |
} |
fputs(" switch (n->type) {\n", cfile); |
for (sp = str ; sp < &str[nstr] ; sp++) { |
for (i = 0 ; i < ntypes ; i++) { |
if (nodestr[i] == sp) |
fprintf(cfile, " case %s:\n", nodename[i]); |
} |
for (i = sp->nfields ; --i >= 1 ; ) { |
fp = &sp->field[i]; |
switch (fp->type) { |
case T_NODE: |
if (calcsize) { |
indent(12, cfile); |
fprintf(cfile, "calcsize(n->%s.%s);\n", |
sp->tag, fp->name); |
} else { |
indent(12, cfile); |
fprintf(cfile, "new->%s.%s = copynode(n->%s.%s);\n", |
sp->tag, fp->name, sp->tag, fp->name); |
} |
break; |
case T_NODELIST: |
if (calcsize) { |
indent(12, cfile); |
fprintf(cfile, "sizenodelist(n->%s.%s);\n", |
sp->tag, fp->name); |
} else { |
indent(12, cfile); |
fprintf(cfile, "new->%s.%s = copynodelist(n->%s.%s);\n", |
sp->tag, fp->name, sp->tag, fp->name); |
} |
break; |
case T_STRING: |
if (calcsize) { |
indent(12, cfile); |
fprintf(cfile, "funcstringsize += strlen(n->%s.%s) + 1;\n", |
sp->tag, fp->name); |
} else { |
indent(12, cfile); |
fprintf(cfile, "new->%s.%s = nodesavestr(n->%s.%s);\n", |
sp->tag, fp->name, sp->tag, fp->name); |
} |
break; |
case T_INT: |
case T_OTHER: |
if (! calcsize) { |
indent(12, cfile); |
fprintf(cfile, "new->%s.%s = n->%s.%s;\n", |
sp->tag, fp->name, sp->tag, fp->name); |
} |
break; |
} |
} |
indent(12, cfile); |
fputs("break;\n", cfile); |
} |
fputs(" };\n", cfile); |
if (! calcsize) |
fputs(" new->type = n->type;\n", cfile); |
} |
static void |
indent(amount, fp) |
int amount; |
FILE *fp; |
{ |
while (amount >= 8) { |
putc('\t', fp); |
amount -= 8; |
} |
while (--amount >= 0) { |
putc(' ', fp); |
} |
} |
static int |
nextfield(buf) |
char *buf; |
{ |
char *p, *q; |
p = linep; |
while (*p == ' ' || *p == '\t') |
p++; |
q = buf; |
while (*p != ' ' && *p != '\t' && *p != '\0') |
*q++ = *p++; |
*q = '\0'; |
linep = p; |
return (q > buf); |
} |
static void |
skipbl() |
{ |
while (*linep == ' ' || *linep == '\t') |
linep++; |
} |
static int |
readline() |
{ |
char *p; |
if (fgets(line, 1024, infp) == NULL) |
return 0; |
for (p = line ; *p != '#' && *p != '\n' && *p != '\0' ; p++); |
while (p > line && (p[-1] == ' ' || p[-1] == '\t')) |
p--; |
*p = '\0'; |
linep = line; |
linno++; |
if (p - line > BUFLEN) |
error("Line too long"); |
return 1; |
} |
static void |
#ifdef __STDC__ |
error(const char *msg, ...) |
#else |
error(va_alist) |
va_dcl |
#endif |
{ |
va_list va; |
#ifdef __STDC__ |
va_start(va, msg); |
#else |
char *msg; |
va_start(va); |
msg = va_arg(va, char *); |
#endif |
(void) fprintf(stderr, "line %d: ", linno); |
(void) vfprintf(stderr, msg, va); |
(void) fputc('\n', stderr); |
va_end(va); |
exit(2); |
/* NOTREACHED */ |
} |
static char * |
savestr(s) |
const char *s; |
{ |
char *p; |
if ((p = malloc(strlen(s) + 1)) == NULL) |
error("Out of space"); |
(void) strcpy(p, s); |
return p; |
} |
/tags/0.3.0/uspace/app/ash/tools/mkinit.c |
---|
0,0 → 1,525 |
/* $NetBSD: mkinit.c,v 1.20 2000/07/18 19:13:20 cgd Exp $ */ |
/*- |
* Copyright (c) 1991, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Kenneth Almquist. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
*/ |
#ifndef lint |
static const char copyright[] = |
"@(#) Copyright (c) 1991, 1993\n\ |
The Regents of the University of California. All rights reserved.\n"; |
#endif /* not lint */ |
#ifndef lint |
#if 0 |
static char sccsid[] = "@(#)mkinit.c 8.2 (Berkeley) 5/4/95"; |
#else |
static const char rcsid[] = |
"$NetBSD: mkinit.c,v 1.20 2000/07/18 19:13:20 cgd Exp $"; |
#endif |
#endif /* not lint */ |
/* |
* This program scans all the source files for code to handle various |
* special events and combines this code into one file. This (allegedly) |
* improves the structure of the program since there is no need for |
* anyone outside of a module to know that that module performs special |
* operations on particular events. |
* |
* Usage: mkinit sourcefile... |
*/ |
#include <sys/types.h> |
#include <stdio.h> |
#include <stdlib.h> |
#include <string.h> |
#include <fcntl.h> |
#include <unistd.h> |
/* |
* OUTFILE is the name of the output file. Output is initially written |
* to the file OUTTEMP, which is then moved to OUTFILE. |
*/ |
#define OUTFILE "init.c" |
#define OUTTEMP "init.c.new" |
/* |
* A text structure is basicly just a string that grows as more characters |
* are added onto the end of it. It is implemented as a linked list of |
* blocks of characters. The routines addstr and addchar append a string |
* or a single character, respectively, to a text structure. Writetext |
* writes the contents of a text structure to a file. |
*/ |
#define BLOCKSIZE 512 |
struct text { |
char *nextc; |
int nleft; |
struct block *start; |
struct block *last; |
}; |
struct block { |
struct block *next; |
char text[BLOCKSIZE]; |
}; |
/* |
* There is one event structure for each event that mkinit handles. |
*/ |
struct event { |
char *name; /* name of event (e.g. INIT) */ |
char *routine; /* name of routine called on event */ |
char *comment; /* comment describing routine */ |
struct text code; /* code for handling event */ |
}; |
char writer[] = "\ |
/*\n\ |
* This file was generated by the mkinit program.\n\ |
*/\n\ |
\n"; |
char init[] = "\ |
/*\n\ |
* Initialization code.\n\ |
*/\n"; |
char reset[] = "\ |
/*\n\ |
* This routine is called when an error or an interrupt occurs in an\n\ |
* interactive shell and control is returned to the main command loop.\n\ |
*/\n"; |
char shellproc[] = "\ |
/*\n\ |
* This routine is called to initialize the shell to run a shell procedure.\n\ |
*/\n"; |
struct event event[] = { |
{"INIT", "init", init}, |
{"RESET", "reset", reset}, |
{"SHELLPROC", "initshellproc", shellproc}, |
{NULL, NULL} |
}; |
char *curfile; /* current file */ |
int linno; /* current line */ |
char *header_files[200]; /* list of header files */ |
struct text defines; /* #define statements */ |
struct text decls; /* declarations */ |
int amiddecls; /* for formatting */ |
void readfile(char *); |
int match(char *, char *); |
int gooddefine(char *); |
void doevent(struct event *, FILE *, char *); |
void doinclude(char *); |
void dodecl(char *, FILE *); |
void output(void); |
void addstr(char *, struct text *); |
void addchar(int, struct text *); |
void writetext(struct text *, FILE *); |
FILE *ckfopen(char *, char *); |
void *ckmalloc(int); |
char *savestr(char *); |
void error(char *); |
int main(int, char **); |
#define equal(s1, s2) (strcmp(s1, s2) == 0) |
int |
main(argc, argv) |
int argc; |
char **argv; |
{ |
char **ap; |
header_files[0] = "\"shell.h\""; |
header_files[1] = "\"mystring.h\""; |
header_files[2] = "\"init.h\""; |
for (ap = argv + 1 ; *ap ; ap++) |
readfile(*ap); |
output(); |
rename(OUTTEMP, OUTFILE); |
exit(0); |
/* NOTREACHED */ |
} |
/* |
* Parse an input file. |
*/ |
void |
readfile(fname) |
char *fname; |
{ |
FILE *fp; |
char line[1024]; |
struct event *ep; |
fp = ckfopen(fname, "r"); |
curfile = fname; |
linno = 0; |
amiddecls = 0; |
while (fgets(line, sizeof line, fp) != NULL) { |
linno++; |
for (ep = event ; ep->name ; ep++) { |
if (line[0] == ep->name[0] && match(ep->name, line)) { |
doevent(ep, fp, fname); |
break; |
} |
} |
if (line[0] == 'I' && match("INCLUDE", line)) |
doinclude(line); |
if (line[0] == 'M' && match("MKINIT", line)) |
dodecl(line, fp); |
if (line[0] == '#' && gooddefine(line)) |
addstr(line, &defines); |
if (line[0] == '#' && gooddefine(line)) { |
char *cp; |
char line2[1024]; |
static const char undef[] = "#undef "; |
strcpy(line2, line); |
memcpy(line2, undef, sizeof(undef) - 1); |
cp = line2 + sizeof(undef) - 1; |
while(*cp && (*cp == ' ' || *cp == '\t')) |
cp++; |
while(*cp && *cp != ' ' && *cp != '\t' && *cp != '\n') |
cp++; |
*cp++ = '\n'; *cp = '\0'; |
addstr(line2, &defines); |
addstr(line, &defines); |
} |
} |
fclose(fp); |
} |
int |
match(name, line) |
char *name; |
char *line; |
{ |
char *p, *q; |
p = name, q = line; |
while (*p) { |
if (*p++ != *q++) |
return 0; |
} |
if (*q != '{' && *q != ' ' && *q != '\t' && *q != '\n') |
return 0; |
return 1; |
} |
int |
gooddefine(line) |
char *line; |
{ |
char *p; |
if (! match("#define", line)) |
return 0; /* not a define */ |
p = line + 7; |
while (*p == ' ' || *p == '\t') |
p++; |
while (*p != ' ' && *p != '\t') { |
if (*p == '(') |
return 0; /* macro definition */ |
p++; |
} |
while (*p != '\n' && *p != '\0') |
p++; |
if (p[-1] == '\\') |
return 0; /* multi-line definition */ |
return 1; |
} |
void |
doevent(ep, fp, fname) |
struct event *ep; |
FILE *fp; |
char *fname; |
{ |
char line[1024]; |
int indent; |
char *p; |
sprintf(line, "\n /* from %s: */\n", fname); |
addstr(line, &ep->code); |
addstr(" {\n", &ep->code); |
for (;;) { |
linno++; |
if (fgets(line, sizeof line, fp) == NULL) |
error("Unexpected EOF"); |
if (equal(line, "}\n")) |
break; |
indent = 6; |
for (p = line ; *p == '\t' ; p++) |
indent += 8; |
for ( ; *p == ' ' ; p++) |
indent++; |
if (*p == '\n' || *p == '#') |
indent = 0; |
while (indent >= 8) { |
addchar('\t', &ep->code); |
indent -= 8; |
} |
while (indent > 0) { |
addchar(' ', &ep->code); |
indent--; |
} |
addstr(p, &ep->code); |
} |
addstr(" }\n", &ep->code); |
} |
void |
doinclude(line) |
char *line; |
{ |
char *p; |
char *name; |
char **pp; |
for (p = line ; *p != '"' && *p != '<' && *p != '\0' ; p++); |
if (*p == '\0') |
error("Expecting '\"' or '<'"); |
name = p; |
while (*p != ' ' && *p != '\t' && *p != '\n') |
p++; |
if (p[-1] != '"' && p[-1] != '>') |
error("Missing terminator"); |
*p = '\0'; |
/* name now contains the name of the include file */ |
for (pp = header_files ; *pp && ! equal(*pp, name) ; pp++); |
if (*pp == NULL) |
*pp = savestr(name); |
} |
void |
dodecl(line1, fp) |
char *line1; |
FILE *fp; |
{ |
char line[1024]; |
char *p, *q; |
if (strcmp(line1, "MKINIT\n") == 0) { /* start of struct/union decl */ |
addchar('\n', &decls); |
do { |
linno++; |
if (fgets(line, sizeof line, fp) == NULL) |
error("Unterminated structure declaration"); |
addstr(line, &decls); |
} while (line[0] != '}'); |
amiddecls = 0; |
} else { |
if (! amiddecls) |
addchar('\n', &decls); |
q = NULL; |
for (p = line1 + 6 ; *p && strchr("=/\n", *p) == NULL; p++) |
continue; |
if (*p == '=') { /* eliminate initialization */ |
for (q = p ; *q && *q != ';' ; q++); |
if (*q == '\0') |
q = NULL; |
else { |
while (p[-1] == ' ') |
p--; |
*p = '\0'; |
} |
} |
addstr("extern", &decls); |
addstr(line1 + 6, &decls); |
if (q != NULL) |
addstr(q, &decls); |
amiddecls = 1; |
} |
} |
/* |
* Write the output to the file OUTTEMP. |
*/ |
void |
output() { |
FILE *fp; |
char **pp; |
struct event *ep; |
fp = ckfopen(OUTTEMP, "w"); |
fputs(writer, fp); |
for (pp = header_files ; *pp ; pp++) |
fprintf(fp, "#include %s\n", *pp); |
fputs("\n\n\n", fp); |
writetext(&defines, fp); |
fputs("\n\n", fp); |
writetext(&decls, fp); |
for (ep = event ; ep->name ; ep++) { |
fputs("\n\n\n", fp); |
fputs(ep->comment, fp); |
fprintf(fp, "\nvoid\n%s() {\n", ep->routine); |
writetext(&ep->code, fp); |
fprintf(fp, "}\n"); |
} |
fclose(fp); |
} |
/* |
* A text structure is simply a block of text that is kept in memory. |
* Addstr appends a string to the text struct, and addchar appends a single |
* character. |
*/ |
void |
addstr(s, text) |
char *s; |
struct text *text; |
{ |
while (*s) { |
if (--text->nleft < 0) |
addchar(*s++, text); |
else |
*text->nextc++ = *s++; |
} |
} |
void |
addchar(c, text) |
int c; |
struct text *text; |
{ |
struct block *bp; |
if (--text->nleft < 0) { |
bp = ckmalloc(sizeof *bp); |
if (text->start == NULL) |
text->start = bp; |
else |
text->last->next = bp; |
text->last = bp; |
text->nextc = bp->text; |
text->nleft = BLOCKSIZE - 1; |
} |
*text->nextc++ = c; |
} |
/* |
* Write the contents of a text structure to a file. |
*/ |
void |
writetext(text, fp) |
struct text *text; |
FILE *fp; |
{ |
struct block *bp; |
if (text->start != NULL) { |
for (bp = text->start ; bp != text->last ; bp = bp->next) |
fwrite(bp->text, sizeof (char), BLOCKSIZE, fp); |
fwrite(bp->text, sizeof (char), BLOCKSIZE - text->nleft, fp); |
} |
} |
FILE * |
ckfopen(file, mode) |
char *file; |
char *mode; |
{ |
FILE *fp; |
if ((fp = fopen(file, mode)) == NULL) { |
fprintf(stderr, "Can't open %s\n", file); |
exit(2); |
} |
return fp; |
} |
void * |
ckmalloc(nbytes) |
int nbytes; |
{ |
char *p; |
if ((p = malloc(nbytes)) == NULL) |
error("Out of space"); |
return p; |
} |
char * |
savestr(s) |
char *s; |
{ |
char *p; |
p = ckmalloc(strlen(s) + 1); |
strcpy(p, s); |
return p; |
} |
void |
error(msg) |
char *msg; |
{ |
if (curfile != NULL) |
fprintf(stderr, "%s:%d: ", curfile, linno); |
fprintf(stderr, "%s\n", msg); |
exit(2); |
/* NOTREACHED */ |
} |
/tags/0.3.0/uspace/app/ash/Makefile |
---|
0,0 → 1,180 |
# |
# Copyright (c) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
include ../../../version |
include ../../Makefile.config |
## Setup toolchain |
# |
LIBC_PREFIX = ../../lib/libc |
SOFTINT_PREFIX = ../../lib/softint |
include $(LIBC_PREFIX)/Makefile.toolchain |
CFLAGS += \ |
-DSHELL \ |
-I. \ |
-DNO_HISTORY \ |
-DBSD=1 \ |
-DSMALL \ |
-D_GNU_SOURCE \ |
-DGLOB_BROKEN \ |
-D__COPYRIGHT\(x\)= \ |
-D__RCSID\(x\)= |
# -D_DIAGASSERT\(x\)= \ |
# -DHETIO |
LIBS = $(LIBC_PREFIX)/libc.a |
DEFS += -DRELEASE=\"$(RELEASE)\" |
ifdef REVISION |
DEFS += "-DREVISION=\"$(REVISION)\"" |
endif |
ifdef TIMESTAMP |
DEFS += "-DTIMESTAMP=\"$(TIMESTAMP)\"" |
endif |
## Sources |
# |
OUTPUT = sh |
SHSRCS = \ |
fake.c \ |
alias.c \ |
cd.c \ |
bltin/echo.c \ |
error.c \ |
eval.c \ |
exec.c \ |
expand.c \ |
hetio.c \ |
histedit.c \ |
input.c \ |
jobs.c \ |
mail.c \ |
main.c \ |
memalloc.c \ |
miscbltin.c \ |
mystring.c \ |
options.c \ |
output.c \ |
parser.c \ |
redir.c \ |
show.c \ |
setmode.c \ |
bltin/test.c \ |
bltin/times.c \ |
trap.c \ |
var.c |
GENSRCS = \ |
builtins.c \ |
init.c \ |
nodes.c \ |
syntax.c \ |
signames.c |
# lex.yy.c \ |
# arith.c \ |
# arith.h \ |
GENHEADERS = \ |
token.h \ |
nodes.h \ |
syntax.h \ |
builtins.h |
SOURCES = ${SHSRCS} ${GENSRCS} |
SUBDIRS = tools |
OBJECTS := $(addsuffix .o,$(basename $(SOURCES))) |
.PHONY: all clean depend disasm all-subdirs |
all: all-subdirs $(OUTPUT) disasm |
all-subdirs: |
for i in $(SUBDIRS); do \ |
echo "make all in $$i..."; \ |
make -C $$i all; \ |
done |
-include Makefile.depend |
.ORDER: builtins.c builtins.h |
builtins.c builtins.h: mkbuiltins builtins.def |
sh mkbuiltins shell.h builtins.def `pwd` |
INIT_DEPS = alias.c eval.c exec.c input.c jobs.c options.c parser.c \ |
redir.c trap.c var.c output.c |
init.c: mkinit $(INIT_DEPS) |
./mkinit $(INIT_DEPS) |
signames.c: mksignames |
./mksignames |
nodes.c nodes.h: mknodes nodetypes nodes.c.pat |
./mknodes ./nodetypes ./nodes.c.pat |
syntax.c syntax.h: mksyntax |
./mksyntax |
#arith.c arith.h: arith.y |
# yacc -d arith.y |
# mv y.tab.h arith.h |
# mv y.tab.c arith.c |
token.h: mktokens |
sh ./mktokens |
clean: |
-rm -f $(OUTPUT) $(OUTPUT).map $(OUTPUT).disasm Makefile.depend |
-rm -f $(GENSRCS) $(GENHEADERS) $(OBJECTS) |
for i in $(SUBDIRS); do \ |
echo "make clean in $$i..."; \ |
make -C $$i clean; \ |
done |
depend: |
$(CC) $(DEFS) $(CFLAGS) -M $(SOURCES) $(GENHEADERS) > Makefile.depend |
$(OUTPUT): $(GENSRCS) $(GENHEADERS) $(OBJECTS) $(LIBS) |
$(LD) -T $(LIBC_PREFIX)/arch/$(ARCH)/_link.ld $(OBJECTS) $(LIBS) $(LFLAGS) -o $@ -Map $(OUTPUT).map |
disasm: |
$(OBJDUMP) -d $(OUTPUT) >$(OUTPUT).disasm |
%.o: %.S |
$(CC) $(DEFS) $(AFLAGS) $(CFLAGS) -D__ASM__ -c $< -o $@ |
%.o: %.s |
$(AS) $(AFLAGS) $< -o $@ |
%.o: %.c |
$(CC) $(DEFS) $(CFLAGS) -c $< -o $@ |
/tags/0.3.0/uspace/app/ash/setmode.c |
---|
0,0 → 1,486 |
/* $NetBSD: setmode.c,v 1.28 2000/01/25 15:43:43 enami Exp $ */ |
/* |
* Copyright (c) 1989, 1993, 1994 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Dave Borman at Cray Research, Inc. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
*/ |
#include <sys/cdefs.h> |
#if defined(LIBC_SCCS) && !defined(lint) |
#if 0 |
static char sccsid[] = "@(#)setmode.c 8.2 (Berkeley) 3/25/94"; |
#else |
__RCSID("$NetBSD: setmode.c,v 1.28 2000/01/25 15:43:43 enami Exp $"); |
#endif |
#endif /* LIBC_SCCS and not lint */ |
#include <sys/types.h> |
#include <sys/stat.h> |
#include <assert.h> |
#include <ctype.h> |
#include <errno.h> |
#include <signal.h> |
#include <stdlib.h> |
#include <unistd.h> |
#ifdef SETMODE_DEBUG |
#include <stdio.h> |
#endif |
#ifdef __weak_alias |
__weak_alias(getmode,_getmode) |
__weak_alias(setmode,_setmode) |
#endif |
#ifdef __GLIBC__ |
#define S_ISTXT __S_ISVTX |
#endif |
#define SET_LEN 6 /* initial # of bitcmd struct to malloc */ |
#define SET_LEN_INCR 4 /* # of bitcmd structs to add as needed */ |
typedef struct bitcmd { |
char cmd; |
char cmd2; |
mode_t bits; |
} BITCMD; |
#define CMD2_CLR 0x01 |
#define CMD2_SET 0x02 |
#define CMD2_GBITS 0x04 |
#define CMD2_OBITS 0x08 |
#define CMD2_UBITS 0x10 |
static BITCMD *addcmd (BITCMD *, int, int, int, u_int); |
static void compress_mode (BITCMD *); |
#ifdef SETMODE_DEBUG |
static void dumpmode (BITCMD *); |
#endif |
/* |
* Given the old mode and an array of bitcmd structures, apply the operations |
* described in the bitcmd structures to the old mode, and return the new mode. |
* Note that there is no '=' command; a strict assignment is just a '-' (clear |
* bits) followed by a '+' (set bits). |
*/ |
mode_t |
getmode(bbox, omode) |
const void *bbox; |
mode_t omode; |
{ |
const BITCMD *set; |
mode_t clrval, newmode, value; |
_DIAGASSERT(bbox != NULL); |
set = (const BITCMD *)bbox; |
newmode = omode; |
for (value = 0;; set++) |
switch(set->cmd) { |
/* |
* When copying the user, group or other bits around, we "know" |
* where the bits are in the mode so that we can do shifts to |
* copy them around. If we don't use shifts, it gets real |
* grundgy with lots of single bit checks and bit sets. |
*/ |
case 'u': |
value = (newmode & S_IRWXU) >> 6; |
goto common; |
case 'g': |
value = (newmode & S_IRWXG) >> 3; |
goto common; |
case 'o': |
value = newmode & S_IRWXO; |
common: if (set->cmd2 & CMD2_CLR) { |
clrval = |
(set->cmd2 & CMD2_SET) ? S_IRWXO : value; |
if (set->cmd2 & CMD2_UBITS) |
newmode &= ~((clrval<<6) & set->bits); |
if (set->cmd2 & CMD2_GBITS) |
newmode &= ~((clrval<<3) & set->bits); |
if (set->cmd2 & CMD2_OBITS) |
newmode &= ~(clrval & set->bits); |
} |
if (set->cmd2 & CMD2_SET) { |
if (set->cmd2 & CMD2_UBITS) |
newmode |= (value<<6) & set->bits; |
if (set->cmd2 & CMD2_GBITS) |
newmode |= (value<<3) & set->bits; |
if (set->cmd2 & CMD2_OBITS) |
newmode |= value & set->bits; |
} |
break; |
case '+': |
newmode |= set->bits; |
break; |
case '-': |
newmode &= ~set->bits; |
break; |
case 'X': |
if (omode & (S_IFDIR|S_IXUSR|S_IXGRP|S_IXOTH)) |
newmode |= set->bits; |
break; |
case '\0': |
default: |
#ifdef SETMODE_DEBUG |
(void)printf("getmode:%04o -> %04o\n", omode, newmode); |
#endif |
return (newmode); |
} |
} |
#define ADDCMD(a, b, c, d) do { \ |
if (set >= endset) { \ |
BITCMD *newset; \ |
setlen += SET_LEN_INCR; \ |
newset = realloc(saveset, sizeof(BITCMD) * setlen); \ |
if (newset == NULL) { \ |
free(saveset); \ |
return (NULL); \ |
} \ |
set = newset + (set - saveset); \ |
saveset = newset; \ |
endset = newset + (setlen - 2); \ |
} \ |
set = addcmd(set, (a), (b), (c), (d)); \ |
} while (/*CONSTCOND*/0) |
#define STANDARD_BITS (S_ISUID|S_ISGID|S_IRWXU|S_IRWXG|S_IRWXO) |
void * |
setmode(p) |
const char *p; |
{ |
int perm, who; |
char op, *ep; |
BITCMD *set, *saveset, *endset; |
sigset_t sigset, sigoset; |
mode_t mask; |
int equalopdone = 0; /* pacify gcc */ |
int permXbits, setlen; |
if (!*p) |
return (NULL); |
/* |
* Get a copy of the mask for the permissions that are mask relative. |
* Flip the bits, we want what's not set. Since it's possible that |
* the caller is opening files inside a signal handler, protect them |
* as best we can. |
*/ |
sigfillset(&sigset); |
(void)sigprocmask(SIG_BLOCK, &sigset, &sigoset); |
(void)umask(mask = umask(0)); |
mask = ~mask; |
(void)sigprocmask(SIG_SETMASK, &sigoset, NULL); |
setlen = SET_LEN + 2; |
if ((set = malloc((u_int)(sizeof(BITCMD) * setlen))) == NULL) |
return (NULL); |
saveset = set; |
endset = set + (setlen - 2); |
/* |
* If an absolute number, get it and return; disallow non-octal digits |
* or illegal bits. |
*/ |
if (isdigit((unsigned char)*p)) { |
perm = (mode_t)strtol(p, &ep, 8); |
if (*ep || perm & ~(STANDARD_BITS|S_ISTXT)) { |
free(saveset); |
return (NULL); |
} |
ADDCMD('=', (STANDARD_BITS|S_ISTXT), perm, mask); |
set->cmd = 0; |
return (saveset); |
} |
/* |
* Build list of structures to set/clear/copy bits as described by |
* each clause of the symbolic mode. |
*/ |
for (;;) { |
/* First, find out which bits might be modified. */ |
for (who = 0;; ++p) { |
switch (*p) { |
case 'a': |
who |= STANDARD_BITS; |
break; |
case 'u': |
who |= S_ISUID|S_IRWXU; |
break; |
case 'g': |
who |= S_ISGID|S_IRWXG; |
break; |
case 'o': |
who |= S_IRWXO; |
break; |
default: |
goto getop; |
} |
} |
getop: if ((op = *p++) != '+' && op != '-' && op != '=') { |
free(saveset); |
return (NULL); |
} |
if (op == '=') |
equalopdone = 0; |
who &= ~S_ISTXT; |
for (perm = 0, permXbits = 0;; ++p) { |
switch (*p) { |
case 'r': |
perm |= S_IRUSR|S_IRGRP|S_IROTH; |
break; |
case 's': |
/* |
* If specific bits where requested and |
* only "other" bits ignore set-id. |
*/ |
if (who == 0 || (who & ~S_IRWXO)) |
perm |= S_ISUID|S_ISGID; |
break; |
case 't': |
/* |
* If specific bits where requested and |
* only "other" bits ignore set-id. |
*/ |
if (who == 0 || (who & ~S_IRWXO)) { |
who |= S_ISTXT; |
perm |= S_ISTXT; |
} |
break; |
case 'w': |
perm |= S_IWUSR|S_IWGRP|S_IWOTH; |
break; |
case 'X': |
permXbits = S_IXUSR|S_IXGRP|S_IXOTH; |
break; |
case 'x': |
perm |= S_IXUSR|S_IXGRP|S_IXOTH; |
break; |
case 'u': |
case 'g': |
case 'o': |
/* |
* When ever we hit 'u', 'g', or 'o', we have |
* to flush out any partial mode that we have, |
* and then do the copying of the mode bits. |
*/ |
if (perm) { |
ADDCMD(op, who, perm, mask); |
perm = 0; |
} |
if (op == '=') |
equalopdone = 1; |
if (op == '+' && permXbits) { |
ADDCMD('X', who, permXbits, mask); |
permXbits = 0; |
} |
ADDCMD(*p, who, op, mask); |
break; |
default: |
/* |
* Add any permissions that we haven't already |
* done. |
*/ |
if (perm || (op == '=' && !equalopdone)) { |
if (op == '=') |
equalopdone = 1; |
ADDCMD(op, who, perm, mask); |
perm = 0; |
} |
if (permXbits) { |
ADDCMD('X', who, permXbits, mask); |
permXbits = 0; |
} |
goto apply; |
} |
} |
apply: if (!*p) |
break; |
if (*p != ',') |
goto getop; |
++p; |
} |
set->cmd = 0; |
#ifdef SETMODE_DEBUG |
(void)printf("Before compress_mode()\n"); |
dumpmode(saveset); |
#endif |
compress_mode(saveset); |
#ifdef SETMODE_DEBUG |
(void)printf("After compress_mode()\n"); |
dumpmode(saveset); |
#endif |
return (saveset); |
} |
static BITCMD * |
addcmd(set, op, who, oparg, mask) |
BITCMD *set; |
int oparg, who; |
int op; |
u_int mask; |
{ |
_DIAGASSERT(set != NULL); |
switch (op) { |
case '=': |
set->cmd = '-'; |
set->bits = who ? who : STANDARD_BITS; |
set++; |
op = '+'; |
/* FALLTHROUGH */ |
case '+': |
case '-': |
case 'X': |
set->cmd = op; |
set->bits = (who ? who : mask) & oparg; |
break; |
case 'u': |
case 'g': |
case 'o': |
set->cmd = op; |
if (who) { |
set->cmd2 = ((who & S_IRUSR) ? CMD2_UBITS : 0) | |
((who & S_IRGRP) ? CMD2_GBITS : 0) | |
((who & S_IROTH) ? CMD2_OBITS : 0); |
set->bits = (mode_t)~0; |
} else { |
set->cmd2 = CMD2_UBITS | CMD2_GBITS | CMD2_OBITS; |
set->bits = mask; |
} |
if (oparg == '+') |
set->cmd2 |= CMD2_SET; |
else if (oparg == '-') |
set->cmd2 |= CMD2_CLR; |
else if (oparg == '=') |
set->cmd2 |= CMD2_SET|CMD2_CLR; |
break; |
} |
return (set + 1); |
} |
#ifdef SETMODE_DEBUG |
static void |
dumpmode(set) |
BITCMD *set; |
{ |
_DIAGASSERT(set != NULL); |
for (; set->cmd; ++set) |
(void)printf("cmd: '%c' bits %04o%s%s%s%s%s%s\n", |
set->cmd, set->bits, set->cmd2 ? " cmd2:" : "", |
set->cmd2 & CMD2_CLR ? " CLR" : "", |
set->cmd2 & CMD2_SET ? " SET" : "", |
set->cmd2 & CMD2_UBITS ? " UBITS" : "", |
set->cmd2 & CMD2_GBITS ? " GBITS" : "", |
set->cmd2 & CMD2_OBITS ? " OBITS" : ""); |
} |
#endif |
/* |
* Given an array of bitcmd structures, compress by compacting consecutive |
* '+', '-' and 'X' commands into at most 3 commands, one of each. The 'u', |
* 'g' and 'o' commands continue to be separate. They could probably be |
* compacted, but it's not worth the effort. |
*/ |
static void |
compress_mode(set) |
BITCMD *set; |
{ |
BITCMD *nset; |
int setbits, clrbits, Xbits, op; |
_DIAGASSERT(set != NULL); |
for (nset = set;;) { |
/* Copy over any 'u', 'g' and 'o' commands. */ |
while ((op = nset->cmd) != '+' && op != '-' && op != 'X') { |
*set++ = *nset++; |
if (!op) |
return; |
} |
for (setbits = clrbits = Xbits = 0;; nset++) { |
if ((op = nset->cmd) == '-') { |
clrbits |= nset->bits; |
setbits &= ~nset->bits; |
Xbits &= ~nset->bits; |
} else if (op == '+') { |
setbits |= nset->bits; |
clrbits &= ~nset->bits; |
Xbits &= ~nset->bits; |
} else if (op == 'X') |
Xbits |= nset->bits & ~setbits; |
else |
break; |
} |
if (clrbits) { |
set->cmd = '-'; |
set->cmd2 = 0; |
set->bits = clrbits; |
set++; |
} |
if (setbits) { |
set->cmd = '+'; |
set->cmd2 = 0; |
set->bits = setbits; |
set++; |
} |
if (Xbits) { |
set->cmd = 'X'; |
set->cmd2 = 0; |
set->bits = Xbits; |
set++; |
} |
} |
} |
/tags/0.3.0/uspace/app/ash/options.h |
---|
0,0 → 1,115 |
/* $NetBSD: options.h,v 1.13 1999/07/09 03:05:50 christos Exp $ */ |
/*- |
* Copyright (c) 1991, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Kenneth Almquist. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
* |
* @(#)options.h 8.2 (Berkeley) 5/4/95 |
*/ |
struct shparam { |
int nparam; /* # of positional parameters (without $0) */ |
unsigned char malloc; /* if parameter list dynamically allocated */ |
char **p; /* parameter list */ |
int optind; /* next parameter to be processed by getopts */ |
int optoff; /* used by getopts */ |
}; |
#define eflag optlist[0].val |
#define fflag optlist[1].val |
#define Iflag optlist[2].val |
#define iflag optlist[3].val |
#define mflag optlist[4].val |
#define nflag optlist[5].val |
#define sflag optlist[6].val |
#define xflag optlist[7].val |
#define vflag optlist[8].val |
#define Vflag optlist[9].val |
#define Eflag optlist[10].val |
#define Cflag optlist[11].val |
#define aflag optlist[12].val |
#define bflag optlist[13].val |
#define uflag optlist[14].val |
#define qflag optlist[15].val |
#define NOPTS 16 |
struct optent { |
const char *name; |
const char letter; |
char val; |
}; |
#ifdef DEFINE_OPTIONS |
struct optent optlist[NOPTS] = { |
{ "errexit", 'e', 0 }, |
{ "noglob", 'f', 0 }, |
{ "ignoreeof", 'I', 0 }, |
{ "interactive",'i', 0 }, |
{ "monitor", 'm', 0 }, |
{ "noexec", 'n', 0 }, |
{ "stdin", 's', 0 }, |
{ "xtrace", 'x', 0 }, |
{ "verbose", 'v', 0 }, |
{ "vi", 'V', 0 }, |
{ "emacs", 'E', 0 }, |
{ "noclobber", 'C', 0 }, |
{ "allexport", 'a', 0 }, |
{ "notify", 'b', 0 }, |
{ "nounset", 'u', 0 }, |
{ "quietprofile", 'q', 0 }, |
}; |
#else |
extern struct optent optlist[NOPTS]; |
#endif |
extern char *minusc; /* argument to -c option */ |
extern char *arg0; /* $0 */ |
extern struct shparam shellparam; /* $@ */ |
extern char **argptr; /* argument list for builtin commands */ |
extern char *optarg; /* set by nextopt */ |
extern char *optptr; /* used by nextopt */ |
void procargs (int, char **); |
void optschanged (void); |
void setparam (char **); |
void freeparam (volatile struct shparam *); |
int shiftcmd (int, char **); |
int setcmd (int, char **); |
int getoptscmd (int, char **); |
int nextopt (const char *); |
void getoptsreset (const char *); |
/tags/0.3.0/uspace/app/ash/mkbuiltins |
---|
0,0 → 1,100 |
#!/bin/sh - |
# $NetBSD: mkbuiltins,v 1.15 1999/07/09 03:05:50 christos Exp $ |
# |
# Copyright (c) 1991, 1993 |
# The Regents of the University of California. All rights reserved. |
# |
# This code is derived from software contributed to Berkeley by |
# Kenneth Almquist. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# 1. Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# 2. Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# 3. All advertising materials mentioning features or use of this software |
# must display the following acknowledgement: |
# This product includes software developed by the University of |
# California, Berkeley and its contributors. |
# 4. Neither the name of the University nor the names of its contributors |
# may be used to endorse or promote products derived from this software |
# without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
# SUCH DAMAGE. |
# |
# @(#)mkbuiltins 8.2 (Berkeley) 5/4/95 |
temp=/tmp/ka$$ |
havehist=1 |
if [ "X$1" = "X-h" ]; then |
havehist=0 |
shift |
fi |
shell=$1 |
builtins=$2 |
objdir=$3 |
havejobs=0 |
if grep '^#define JOBS[ ]*1' ${shell} > /dev/null |
then |
havejobs=1 |
fi |
exec > ${objdir}/builtins.c |
cat <<\! |
/* |
* This file was generated by the mkbuiltins program. |
*/ |
#include "shell.h" |
#include "builtins.h" |
! |
awk '/^[^#]/ {if(('$havejobs' || $2 != "-j") && ('$havehist' || $2 != "-h")) \ |
print $0}' ${builtins} | sed 's/-j//' > $temp |
awk '{ printf "int %s (int, char **);\n", $1}' $temp |
echo ' |
int (*const builtinfunc[]) (int, char **) = {' |
awk '/^[^#]/ { printf "\t%s,\n", $1}' $temp |
echo '}; |
const struct builtincmd builtincmd[] = {' |
awk '{ for (i = 2 ; i <= NF ; i++) { |
printf "\t{ \"%s\", %d },\n", $i, NR-1 |
}}' $temp |
echo ' { NULL, 0 } |
};' |
exec > ${objdir}/builtins.h |
cat <<\! |
/* |
* This file was generated by the mkbuiltins program. |
*/ |
#include <sys/cdefs.h> |
! |
tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ < $temp | |
awk '{ printf "#define %s %d\n", $1, NR-1}' |
echo ' |
struct builtincmd { |
const char *name; |
int code; |
}; |
extern int (*const builtinfunc[]) (int, char **); |
extern const struct builtincmd builtincmd[];' |
rm -f $temp |
/tags/0.3.0/uspace/app/ash/fake.c |
---|
0,0 → 1,50 |
/* |
* Copyright (c) 2008 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#include "fake.h" |
uid_t getuid(void) |
{ |
return 0; |
} |
uid_t geteuid(void) |
{ |
return 0; |
} |
uid_t getgid(void) |
{ |
return 0; |
} |
uid_t getegid(void) |
{ |
return 0; |
} |
/tags/0.3.0/uspace/app/ash/init.h |
---|
0,0 → 1,43 |
/* $NetBSD: init.h,v 1.8 1995/05/11 21:29:14 christos Exp $ */ |
/*- |
* Copyright (c) 1991, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Kenneth Almquist. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
* |
* @(#)init.h 8.2 (Berkeley) 5/4/95 |
*/ |
void init (void); |
void reset (void); |
void initshellproc (void); |
/tags/0.3.0/uspace/app/ash/fake.h |
---|
0,0 → 1,43 |
/* |
* Copyright (c) 2008 Josef Cejka |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#ifndef fake_h |
#define fake_h |
typedef int uid_t; |
uid_t getuid(void); |
uid_t geteuid(void); |
uid_t getgid(void); |
uid_t getegid(void); |
/* setjmp.h */ |
typedef int jmp_buf[6]; |
#endif |
/tags/0.3.0/uspace/app/ash/sh.1 |
---|
0,0 → 1,1614 |
.\" $NetBSD: sh.1,v 1.40 2000/11/20 17:48:05 christos Exp $ |
.\" Copyright (c) 1991, 1993 |
.\" The Regents of the University of California. All rights reserved. |
.\" |
.\" This code is derived from software contributed to Berkeley by |
.\" Kenneth Almquist. |
.\" |
.\" Redistribution and use in source and binary forms, with or without |
.\" modification, are permitted provided that the following conditions |
.\" are met: |
.\" 1. Redistributions of source code must retain the above copyright |
.\" notice, this list of conditions and the following disclaimer. |
.\" 2. Redistributions in binary form must reproduce the above copyright |
.\" notice, this list of conditions and the following disclaimer in the |
.\" documentation and/or other materials provided with the distribution. |
.\" 3. All advertising materials mentioning features or use of this software |
.\" must display the following acknowledgement: |
.\" This product includes software developed by the University of |
.\" California, Berkeley and its contributors. |
.\" 4. Neither the name of the University nor the names of its contributors |
.\" may be used to endorse or promote products derived from this software |
.\" without specific prior written permission. |
.\" |
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
.\" SUCH DAMAGE. |
.\" |
.\" @(#)sh.1 8.6 (Berkeley) 5/4/95 |
.\" |
.Dd January 9, 1999 |
.Os |
.Dt SH 1 |
.Sh NAME |
sh \- command interpreter (shell) |
.Sh SYNOPSIS |
.Nm sh |
.Op Fl /+aCefnuvxIimqsVEbc |
.Op Fl o Ar longname |
.Bk -words |
.Op Ar target ... |
.Ek |
.Sh DESCRIPTION |
Sh is the standard command interpreter for the system. The current version |
of |
.Nm |
is in the process of being changed to conform with the |
.Tn POSIX |
1003.2 and 1003.2a specifications for the shell. This version has many |
features which make it appear similar in some respects to the Korn shell, |
but it is not a Korn shell clone (see |
.Xr ksh 1 ) . |
Only features designated by |
.Tn POSIX , |
plus a few Berkeley extensions, are being incorporated into this shell. |
We expect |
.Tn POSIX |
conformance by the time 4.4 BSD is released. This man page is not intended |
to be a tutorial or a complete specification of the shell. |
.Ss Overview |
The shell is a command that reads lines from either a file or the |
terminal, interprets them, and generally executes other commands. It is |
the program that is running when a user logs into the system (although a |
user can select a different shell with the |
.Xr chsh 1 |
command). The shell implements a language that has flow control |
constructs, a macro facility that provides a variety of features in |
addition to data storage, along with built in history and line editing |
capabilities. It incorporates many features to aid interactive use and |
has the advantage that the interpretative language is common to both |
interactive and non-interactive use (shell scripts). That is, commands |
can be typed directly to the running shell or can be put into a file and |
the file can be executed directly by the shell. |
.Ss Invocation |
If no args are present and if the standard input of the shell |
is connected to a terminal (or if the |
.Fl i |
flag is set), |
and the |
.Fl c |
option is not present, the shell is considered an interactive shell. An |
interactive shell generally prompts before each command and handles |
programming and command errors differently (as described below). When |
first starting, the shell inspects argument 0, and if it begins with a |
dash |
.Sq - , |
the shell is also considered |
a login shell. This is normally done automatically by the system |
when the user first logs in. A login shell first reads commands |
from the files |
.Pa /etc/profile |
and |
.Pa .profile |
if they exist. |
If the environment variable |
.Ev ENV |
is set on entry to a shell, or is set in the |
.Pa .profile |
of a login shell, the shell next reads |
commands from the file named in |
.Ev ENV . |
Therefore, a user should place commands that are to be executed only at |
login time in the |
.Pa .profile |
file, and commands that are executed for every shell inside the |
.Ev ENV |
file. To set the |
.Ev ENV |
variable to some file, place the following line in your |
.Pa .profile |
of your home directory |
.Pp |
.Dl ENV=$HOME/.shinit; export ENV |
.Pp |
substituting for |
.Dq .shinit |
any filename you wish. Since the |
.Ev ENV |
file is read for every invocation of the shell, including shell scripts |
and non-interactive shells, the following paradigm is useful for |
restricting commands in the |
.Ev ENV |
file to interactive invocations. Place commands within the |
.Dq case |
and |
.Dq esac |
below (these commands are described later): |
.Pp |
.Bl -item -compact -offset indent |
.It |
.Li case $- in *i*) |
.Bl -item -compact -offset indent |
.It |
.Li # commands for interactive use only |
.It |
.Li ... |
.El |
.It |
.Li esac |
.El |
.Pp |
If command line arguments besides the options have been specified, then |
the shell treats the first argument as the name of a file from which to |
read commands (a shell script), and the remaining arguments are set as the |
positional parameters of the shell ($1, $2, etc). Otherwise, the shell |
reads commands from its standard input. |
.Ss Argument List Processing |
All of the single letter options have a corresponding name that can be |
used as an argument to the |
.Fl o |
option. The set |
.Fl o |
name is provided next to the single letter option in |
the description below. Specifying a dash |
.Dq - |
turns the option on, while using a plus |
.Dq + |
disables the option. |
The following options can be set from the command line or |
with the |
.Xr set 1 |
builtin (described later). |
.Bl -tag -width aaaallexportfoo -offset indent |
.It Fl a Em allexport |
Export all variables assigned to. (UNIMPLEMENTED for 4.4alpha) |
.It Fl c |
Read commands from the command line. |
No commands will be read from the standard input. |
.It Fl C Em noclobber |
Don't overwrite existing files with |
.Dq > . |
(UNIMPLEMENTED for 4.4alpha) |
.It Fl e Em errexit |
If not interactive, exit immediately if any untested command fails. |
The exit status of a command is considered to be |
explicitly tested if the command is used to control |
an |
.Ic if , |
.Ic elif , |
.Ic while , |
or |
.Ic until ; |
or if the command is the left hand operand of an |
.Dq && |
or |
.Dq || |
operator. |
.It Fl f Em noglob |
Disable pathname expansion. |
.It Fl n Em noexec |
If not interactive, read commands but do not execute them. This is useful |
for checking the syntax of shell scripts. |
.It Fl u Em nounset |
Write a message to standard error when attempting to expand a variable |
that is not set, and if the shell is not interactive, exit immediately. |
(UNIMPLEMENTED for 4.4alpha) |
.It Fl v Em verbose |
The shell writes its input to standard error as it is read. Useful for |
debugging. |
.It Fl x Em xtrace |
Write each command to standard error (preceded |
by a |
.Sq +\ ) |
before it is executed. Useful for debugging. |
.It Fl q Em quietprofile |
If the |
.Fl v |
or |
.Fl x |
options have been set, do not apply them when reading |
initialization files, these being |
.Pa /etc/profile , |
.Pa .profile , |
and the file specified by the |
.Ev ENV |
environment variable. |
.It Fl I Em ignoreeof |
Ignore EOF's from input when interactive. |
.It Fl i Em interactive |
Force the shell to behave interactively. |
.It Fl m Em monitor |
Turn on job control (set automatically when interactive). |
.It Fl s Em stdin |
Read commands from standard input (set automatically if no file arguments |
are present). This option has no effect when set after the shell has |
already started running (i.e. with |
.Xr set 1 ) . |
.It Fl V Em vi |
Enable the built-in |
.Xr vi 1 |
command line editor (disables |
.Fl E |
if it has been set). |
.It Fl E Em emacs |
Enable the built-in |
.Xr emacs 1 |
command line editor (disables |
.Fl V |
if it has been set). |
.It Fl b Em notify |
Enable asynchronous notification of background job completion. |
(UNIMPLEMENTED for 4.4alpha) |
.El |
.Ss Lexical Structure |
The shell reads input in terms of lines from a file and breaks it up into |
words at whitespace (blanks and tabs), and at certain sequences of |
characters that are special to the shell called |
.Dq operators . |
There are two types of operators: control operators and redirection |
operators (their meaning is discussed later). Following is a list of operators: |
.Bl -ohang -offset indent |
.It "Control operators:" |
.Dl & && ( ) ; ;; | || <newline> |
.It "Redirection operator:" |
.Dl < > >| << >> <& >& <<- <> |
.El |
.Ss Quoting |
Quoting is used to remove the special meaning of certain characters or |
words to the shell, such as operators, whitespace, or keywords. There are |
three types of quoting: matched single quotes, matched double quotes, and |
backslash. |
.Ss Backslash |
A backslash preserves the literal meaning of the following |
character, with the exception of |
.Aq newline . |
A backslash preceding a |
.Aq newline |
is treated as a line continuation. |
.Ss Single Quotes |
Enclosing characters in single quotes preserves the literal meaning of all |
the characters (except single quotes, making it impossible to put |
single-quotes in a single-quoted string). |
.Ss Double Quotes |
Enclosing characters within double quotes preserves the literal |
meaning of all characters except dollarsign |
.Pq $ , |
backquote |
.Pq ` , |
and backslash |
.Pq \e . |
The backslash inside double quotes is historically weird, and serves to |
quote only the following characters: |
.Dl $ ` \*q \e <newline> . |
Otherwise it remains literal. |
.Ss Reserved Words |
Reserved words are words that have special meaning to the |
shell and are recognized at the beginning of a line and |
after a control operator. The following are reserved words: |
.Bl -column while while while while while -offset indent |
.It ! Ta elif Ta fi Ta while Ta case |
.It else Ta for Ta then Ta { Ta } |
.It do Ta done Ta until Ta if Ta esac |
.El |
.Pp |
Their meaning is discussed later. |
.Ss Aliases |
An alias is a name and corresponding value set using the |
.Xr alias 1 |
builtin command. Whenever a reserved word may occur (see above), |
and after checking for reserved words, the shell |
checks the word to see if it matches an alias. If it does, |
it replaces it in the input stream with its value. For example, |
if there is an alias called |
.Dq lf |
with the value |
.Dq "ls -F" , |
then the input: |
.Pp |
.Dl lf foobar <return> |
.Pp |
would become |
.Pp |
.Dl ls -F foobar <return> |
.Pp |
Aliases provide a convenient way for naive users to create shorthands for |
commands without having to learn how to create functions with arguments. |
They can also be used to create lexically obscure code. This use is |
discouraged. |
.Ss Commands |
The shell interprets the words it reads according to a language, the |
specification of which is outside the scope of this man page (refer to the |
BNF in the |
.Tn POSIX |
1003.2 document). Essentially though, a line is read and if the first |
word of the line (or after a control operator) is not a reserved word, |
then the shell has recognized a simple command. Otherwise, a complex |
command or some other special construct may have been recognized. |
.Ss Simple Commands |
If a simple command has been recognized, the shell performs |
the following actions: |
.Bl -enum -offset indent |
.It |
Leading words of the form |
.Dq name=value |
are stripped off and assigned to the environment of the simple command. |
Redirection operators and their arguments (as described below) are |
stripped off and saved for processing. |
.It |
The remaining words are expanded as described in |
the section called |
.Dq Expansions , |
and the first remaining word is considered the command name and the |
command is located. The remaining words are considered the arguments of |
the command. If no command name resulted, then the |
.Dq name=value |
variable assignments recognized in item 1 affect the current shell. |
.It |
Redirections are performed as described in the next section. |
.El |
.Ss Redirections |
Redirections are used to change where a command reads its input or sends |
its output. In general, redirections open, close, or duplicate an |
existing reference to a file. The overall format used for redirection is: |
.Pp |
.Dl [n] Va redir-op Ar file |
.Pp |
where |
.Va redir-op |
is one of the redirection operators mentioned previously. Following is a |
list of the possible redirections. The |
.Bq n |
is an optional number, as in |
.Sq 3 |
(not |
.Sq Bq 3 , |
that refers to a file descriptor. |
.Bl -tag -width aaabsfiles -offset indent |
.It [n] Ns > file |
Redirect standard output (or n) to file. |
.It [n] Ns >| file |
Same, but override the |
.Fl C |
option. |
.It [n] Ns >> file |
Append standard output (or n) to file. |
.It [n] Ns < file |
Redirect standard input (or n) from file. |
.It [n1] Ns <& Ns n2 |
Duplicate standard input (or n1) from file descriptor n2. |
.It [n] Ns <&- |
Close standard input (or n). |
.It [n1] Ns >& Ns n2 |
Duplicate standard output (or n1) from n2. |
.It [n] Ns >&- |
Close standard output (or n). |
.It [n] Ns <> file |
Open file for reading and writing on standard input (or n). |
.El |
.Pp |
The following redirection is often called a |
.Dq here-document . |
.Bl -item -offset indent |
.It |
.Li [n]<< delimiter |
.Dl here-doc-text... |
.Li delimiter |
.El |
.Pp |
All the text on successive lines up to the delimiter is saved away and |
made available to the command on standard input, or file descriptor n if |
it is specified. If the delimiter as specified on the initial line is |
quoted, then the here-doc-text is treated literally, otherwise the text is |
subjected to parameter expansion, command substitution, and arithmetic |
expansion (as described in the section on |
.Dq Expansions ) . |
If the operator is |
.Dq <<- |
instead of |
.Dq << , |
then leading tabs in the here-doc-text are stripped. |
.Ss Search and Execution |
There are three types of commands: shell functions, builtin commands, and |
normal programs -- and the command is searched for (by name) in that |
order. They each are executed in a different way. |
.Pp |
When a shell function is executed, all of the shell positional parameters |
(except $0, which remains unchanged) are set to the arguments of the shell |
function. The variables which are explicitly placed in the environment of |
the command (by placing assignments to them before the function name) are |
made local to the function and are set to the values given. Then the |
command given in the function definition is executed. The positional |
parameters are restored to their original values when the command |
completes. This all occurs within the current shell. |
.Pp |
Shell builtins are executed internally to the shell, without spawning a |
new process. |
.Pp |
Otherwise, if the command name doesn't match a function or builtin, the |
command is searched for as a normal program in the filesystem (as |
described in the next section). When a normal program is executed, the |
shell runs the program, passing the arguments and the environment to the |
program. If the program is not a normal executable file (i.e., if it does |
not begin with the "magic number" whose |
.Tn ASCII |
representation is "#!", so |
.Xr execve 2 |
returns |
.Er ENOEXEC |
then) the shell will interpret the program in a subshell. The child shell |
will reinitialize itself in this case, so that the effect will be as if a |
new shell had been invoked to handle the ad-hoc shell script, except that |
the location of hashed commands located in the parent shell will be |
remembered by the child. |
.Pp |
Note that previous versions of this document and the source code itself |
misleadingly and sporadically refer to a shell script without a magic |
number as a "shell procedure". |
.Ss Path Search |
.Pp |
When locating a command, the shell first looks to see if it has a shell |
function by that name. Then it looks for a builtin command by that name. |
If a builtin command is not found, one of two things happen: |
.Bl -enum |
.It |
Command names containing a slash are simply executed without performing |
any searches. |
.It |
The shell searches each entry in |
.Ev PATH |
in turn for the command. The value of the |
.Ev PATH |
variable should be a series of entries separated by colons. Each entry |
consists of a directory name. The current directory may be indicated |
implicitly by an empty directory name, or explicitly by a single period. |
.El |
.Ss Command Exit Status |
Each command has an exit status that can influence the behavior |
of other shell commands. The paradigm is that a command exits |
with zero for normal or success, and non-zero for failure, |
error, or a false indication. The man page for each command |
should indicate the various exit codes and what they mean. |
Additionally, the builtin commands return exit codes, as does |
an executed shell function. |
.Ss Complex Commands |
Complex commands are combinations of simple commands with control |
operators or reserved words, together creating a larger complex command. |
More generally, a command is one of the following: |
.Bl -bullet |
.It |
simple command |
.It |
pipeline |
.It |
list or compound-list |
.It |
compound command |
.It |
function definition |
.El |
.Pp |
Unless otherwise stated, the exit status of a command is that of the last |
simple command executed by the command. |
.Ss Pipelines |
.Pp |
A pipeline is a sequence of one or more commands separated |
by the control operator |. The standard output of all but |
the last command is connected to the standard input |
of the next command. The standard output of the last |
command is inherited from the shell, as usual. |
.Pp |
The format for a pipeline is: |
.Pp |
.Dl [!] command1 [ | command2 ...] |
.Pp |
The standard output of command1 is connected to the standard input of |
command2. The standard input, standard output, or both of a command is |
considered to be assigned by the pipeline before any redirection specified |
by redirection operators that are part of the command. |
.Pp |
If the pipeline is not in the background (discussed later), the shell |
waits for all commands to complete. |
.Pp |
If the reserved word ! does not precede the pipeline, the exit status is |
the exit status of the last command specified in the pipeline. |
Otherwise, the exit status is the logical NOT of the exit status of the |
last command. That is, if the last command returns zero, the exit status |
is 1; if the last command returns greater than zero, the exit status is |
zero. |
.Pp |
Because pipeline assignment of standard input or standard output or both |
takes place before redirection, it can be modified by redirection. For |
example: |
.Pp |
.Dl $ command1 2>&1 | command2 |
.Pp |
sends both the standard output and standard error of command1 |
to the standard input of command2. |
.Pp |
A ; or <newline> terminator causes the preceding AND-OR-list (described |
next) to be executed sequentially; a & causes asynchronous execution of |
the preceding AND-OR-list. |
.Pp |
Note that unlike some other shells, each process in the pipeline is a |
child of the invoking shell (unless it is a shell builtin, in which case |
it executes in the current shell -- but any effect it has on the |
environment is wiped). |
.Ss Background Commands -- & |
If a command is terminated by the control operator ampersand (&), the |
shell executes the command asynchronously -- that is, the shell does not |
wait for the command to finish before executing the next command. |
.Pp |
The format for running a command in background is: |
.Pp |
.Dl command1 & [command2 & ...] |
.Pp |
If the shell is not interactive, the standard input of an asynchronous |
command is set to |
.Pa /dev/null . |
.Ss Lists -- Generally Speaking |
A list is a sequence of zero or more commands separated by newlines, |
semicolons, or ampersands, and optionally terminated by one of these three |
characters. The commands in a list are executed in the order they are |
written. If command is followed by an ampersand, the shell starts the |
command and immediately proceed onto the next command; otherwise it waits |
for the command to terminate before proceeding to the next one. |
.Ss Short-Circuit List Operators |
.Dq && |
and |
.Dq || |
are AND-OR list operators. |
.Dq && |
executes the first command, and then executes the second command iff the |
exit status of the first command is zero. |
.Dq || |
is similar, but executes the second command iff the exit status of the first |
command is nonzero. |
.Dq && |
and |
.Dq || |
both have the same priority. |
.Ss Flow-Control Constructs -- if, while, for, case |
The syntax of the if command is |
.Bd -literal -offset indent |
if list |
then list |
[ elif list |
then list ] ... |
[ else list ] |
fi |
.Ed |
.Pp |
The syntax of the while command is |
.Bd -literal -offset indent |
while list |
do list |
done |
.Ed |
.Pp |
The two lists are executed repeatedly while the exit status of the |
first list is zero. The until command is similar, but has the word |
until in place of while, which causes it to |
repeat until the exit status of the first list is zero. |
.Pp |
The syntax of the for command is |
.Bd -literal -offset indent |
for variable in word... |
do list |
done |
.Ed |
.Pp |
The words are expanded, and then the list is executed repeatedly with the |
variable set to each word in turn. do and done may be replaced with |
.Dq { |
and |
.Dq } . |
.Pp |
The syntax of the break and continue command is |
.Bd -literal -offset indent |
break [ num ] |
continue [ num ] |
.Ed |
.Pp |
Break terminates the num innermost for or while loops. |
Continue continues with the next iteration of the innermost loop. |
These are implemented as builtin commands. |
.Pp |
The syntax of the case command is |
.Bd -literal -offset indent |
case word in |
pattern) list ;; |
\&... |
esac |
.Ed |
.Pp |
The pattern can actually be one or more patterns (see Shell |
Patterns described later), separated by |
.Dq \*(Ba |
characters. |
.Ss Grouping Commands Together |
Commands may be grouped by writing either |
.Pp |
.Dl (list) |
.Pp |
or |
.Pp |
.Dl { list; } |
.Pp |
The first of these executes the commands in a subshell. Builtin commands |
grouped into a (list) will not affect the current shell. The second form |
does not fork another shell so is slightly more efficient. Grouping |
commands together this way allows you to redirect their output as though |
they were one program: |
.Pp |
.Bd -literal -offset indent |
{ echo \*q hello \\c\*q ; echo \*q world" } > greeting |
.Ed |
.Pp |
.Ss Functions |
The syntax of a function definition is |
.Pp |
.Dl name ( ) command |
.Pp |
A function definition is an executable statement; when executed it |
installs a function named name and returns an exit status of zero. The |
command is normally a list enclosed between |
.Dq { |
and |
.Dq } . |
.Pp |
Variables may be declared to be local to a function by using a local |
command. This should appear as the first statement of a function, and the |
syntax is |
.Pp |
.Dl local [ variable | - ] ... |
.Pp |
Local is implemented as a builtin command. |
.Pp |
When a variable is made local, it inherits the initial value and exported |
and readonly flags from the variable with the same name in the surrounding |
scope, if there is one. Otherwise, the variable is initially unset. The |
shell uses dynamic scoping, so that if you make the variable x local to |
function f, which then calls function g, references to the variable x made |
inside g will refer to the variable x declared inside f, not to the global |
variable named x. |
.Pp |
The only special parameter than can be made local is |
.Dq - . |
Making |
.Dq - |
local any shell options that are changed via the set command inside the |
function to be restored to their original values when the function |
returns. |
.Pp |
The syntax of the return command is |
.Pp |
.Dl return [ exitstatus ] |
.Pp |
It terminates the currently executing function. Return is |
implemented as a builtin command. |
.Ss Variables and Parameters |
The shell maintains a set of parameters. A parameter denoted by a name is |
called a variable. When starting up, the shell turns all the environment |
variables into shell variables. New variables can be set using the form |
.Pp |
.Dl name=value |
.Pp |
Variables set by the user must have a name consisting solely of |
alphabetics, numerics, and underscores - the first of which must not be |
numeric. A parameter can also be denoted by a number or a special |
character as explained below. |
.Ss Positional Parameters |
A positional parameter is a parameter denoted by a number (n > 0). The |
shell sets these initially to the values of its command line arguments |
that follow the name of the shell script. The |
.Xr set 1 |
builtin can also be used to set or reset them. |
.Ss Special Parameters |
A special parameter is a parameter denoted by one of the following special |
characters. The value of the parameter is listed next to its character. |
.Bl -tag -width thinhyphena |
.It * |
Expands to the positional parameters, starting from one. When the |
expansion occurs within a double-quoted string it expands to a single |
field with the value of each parameter separated by the first character of |
the |
.Ev IFS |
variable, or by a <space> if |
.Ev IFS |
is unset. |
.It @ |
Expands to the positional parameters, starting from one. When |
the expansion occurs within double-quotes, each positional |
parameter expands as a separate argument. |
If there are no positional parameters, the |
expansion of @ generates zero arguments, even when @ is |
double-quoted. What this basically means, for example, is |
if $1 is |
.Dq abc |
and $2 is |
.Dq def ghi , |
then |
.Qq $@ |
expands to |
the two arguments: |
.Pp |
.Sm off |
.Dl \*q abc \*q \ \*q def\ ghi \*q |
.Sm on |
.It # |
Expands to the number of positional parameters. |
.It ? |
Expands to the exit status of the most recent pipeline. |
.It - (Hyphen.) |
Expands to the current option flags (the single-letter |
option names concatenated into a string) as specified on |
invocation, by the set builtin command, or implicitly |
by the shell. |
.It $ |
Expands to the process ID of the invoked shell. A subshell |
retains the same value of $ as its parent. |
.It ! |
Expands to the process ID of the most recent background |
command executed from the current shell. For a |
pipeline, the process ID is that of the last command in the |
pipeline. |
.It 0 (Zero.) |
Expands to the name of the shell or shell script. |
.El |
.Ss Word Expansions |
This clause describes the various expansions that are performed on words. |
Not all expansions are performed on every word, as explained later. |
.Pp |
Tilde expansions, parameter expansions, command substitutions, arithmetic |
expansions, and quote removals that occur within a single word expand to a |
single field. It is only field splitting or pathname expansion that can |
create multiple fields from a single word. The single exception to this |
rule is the expansion of the special parameter @ within double-quotes, as |
was described above. |
.Pp |
The order of word expansion is: |
.Bl -enum |
.It |
Tilde Expansion, Parameter Expansion, Command Substitution, |
Arithmetic Expansion (these all occur at the same time). |
.It |
Field Splitting is performed on fields |
generated by step (1) unless the |
.Ev IFS |
variable is null. |
.It |
Pathname Expansion (unless set |
.Fl f |
is in effect). |
.It |
Quote Removal. |
.El |
.Pp |
The $ character is used to introduce parameter expansion, command |
substitution, or arithmetic evaluation. |
.Ss Tilde Expansion (substituting a user's home directory) |
A word beginning with an unquoted tilde character (~) is |
subjected to tilde expansion. All the characters up to |
a slash (/) or the end of the word are treated as a username |
and are replaced with the user's home directory. If the |
username is missing (as in |
.Pa ~/foobar ) , |
the tilde is replaced with the value of the |
.Va HOME |
variable (the current user's home directory). |
.Ss Parameter Expansion |
The format for parameter expansion is as follows: |
.Pp |
.Dl ${expression} |
.Pp |
where expression consists of all characters until the matching |
.Dq } . |
Any |
.Dq } |
escaped by a backslash or within a quoted string, and characters in |
embedded arithmetic expansions, command substitutions, and variable |
expansions, are not examined in determining the matching |
.Dq } . |
.Pp |
The simplest form for parameter expansion is: |
.Pp |
.Dl ${parameter} |
.Pp |
The value, if any, of parameter is substituted. |
.Pp |
The parameter name or symbol can be enclosed in braces, which are |
optional except for positional parameters with more than one digit or |
when parameter is followed by a character that could be interpreted as |
part of the name. |
If a parameter expansion occurs inside |
double-quotes: |
.Bl -enum |
.It |
Pathname expansion is not performed on the results of the |
expansion. |
.It |
Field splitting is not performed on the results of the |
expansion, with the exception of @. |
.El |
.Pp |
In addition, a parameter expansion can be modified by using one of the |
following formats. |
.Bl -tag -width aaparameterwordaaaaa |
.It ${parameter:-word} |
Use Default Values. If parameter is unset or null, the expansion of word |
is substituted; otherwise, the value of parameter is substituted. |
.It ${parameter:=word} |
Assign Default Values. If parameter is unset or null, the expansion of |
word is assigned to parameter. In all cases, the final value of parameter |
is substituted. Only variables, not positional parameters or special |
parameters, can be assigned in this way. |
.It ${parameter:?[word]} |
Indicate Error if Null or Unset. If parameter is unset or null, the |
expansion of word (or a message indicating it is unset if word is omitted) |
is written to standard error and the shell exits with a nonzero exit |
status. Otherwise, the value of parameter is substituted. An interactive |
shell need not exit. |
.It ${parameter:+word} |
Use Alternative Value. If parameter is unset or null, null is |
substituted; otherwise, the expansion of word is substituted. |
.El |
.Pp |
In the parameter expansions shown previously, use of the colon in the |
format results in a test for a parameter that is unset or null; omission |
of the colon results in a test for a parameter that is only unset. |
.Bl -tag -width aaparameterwordaaaaa |
.It ${#parameter} |
String Length. The length in characters of |
the value of parameter. |
.El |
.Pp |
The following four varieties of parameter expansion provide for substring |
processing. In each case, pattern matching notation (see Shell Patterns), |
rather than regular expression notation, is used to evaluate the patterns. |
If parameter is * or @, the result of the expansion is unspecified. |
Enclosing the full parameter expansion string in double-quotes does not |
cause the following four varieties of pattern characters to be quoted, |
whereas quoting characters within the braces has this effect. |
.Bl -tag -width aaparameterwordaaaaa |
.It ${parameter%word} |
Remove Smallest Suffix Pattern. The word is expanded to produce a |
pattern. The parameter expansion then results in parameter, with the |
smallest portion of the suffix matched by the pattern deleted. |
.It ${parameter%%word} |
Remove Largest Suffix Pattern. The word is expanded to produce a pattern. |
The parameter expansion then results in parameter, with the largest |
portion of the suffix matched by the pattern deleted. |
.It ${parameter#word} |
Remove Smallest Prefix Pattern. The word is expanded to produce a |
pattern. The parameter expansion then results in parameter, with the |
smallest portion of the prefix matched by the pattern deleted. |
.It ${parameter##word} |
Remove Largest Prefix Pattern. The word is expanded to produce a pattern. |
The parameter expansion then results in parameter, with the largest |
portion of the prefix matched by the pattern deleted. |
.El |
.Ss Command Substitution |
Command substitution allows the output of a command to be substituted in |
place of the command name itself. Command substitution occurs when |
the command is enclosed as follows: |
.Pp |
.Dl $(command) |
.Pp |
or |
.Po |
.Dq backquoted |
version |
.Pc : |
.Pp |
.Dl `command` |
.Pp |
The shell expands the command substitution by executing command in a |
subshell environment and replacing the command substitution with the |
standard output of the command, removing sequences of one or more |
<newline>s at the end of the substitution. (Embedded <newline>s before |
the end of the output are not removed; however, during field splitting, |
they may be translated into <space>s, depending on the value of |
.Ev IFS |
and quoting that is in effect.) |
.Ss Arithmetic Expansion |
.Pp |
Arithmetic expansion provides a mechanism for evaluating an arithmetic |
expression and substituting its value. The format for arithmetic |
expansion is as follows: |
.Pp |
.Dl $((expression)) |
.Pp |
The expression is treated as if it were in double-quotes, except |
that a double-quote inside the expression is not treated specially. The |
shell expands all tokens in the expression for parameter expansion, |
command substitution, and quote removal. |
.Pp |
Next, the shell treats this as an arithmetic expression and |
substitutes the value of the expression. |
.Ss White Space Splitting (Field Splitting) |
After parameter expansion, command substitution, and |
arithmetic expansion the shell scans the results of |
expansions and substitutions that did not occur in double-quotes for |
field splitting and multiple fields can result. |
.Pp |
The shell treats each character of the |
.Ev IFS |
as a delimiter and use the delimiters to split the results of parameter |
expansion and command substitution into fields. |
.Ss Pathname Expansion (File Name Generation) |
Unless the |
.Fl f |
flag is set, file name generation is performed after word splitting is |
complete. Each word is viewed as a series of patterns, separated by |
slashes. The process of expansion replaces the word with the names of all |
existing files whose names can be formed by replacing each pattern with a |
string that matches the specified pattern. There are two restrictions on |
this: first, a pattern cannot match a string containing a slash, and |
second, a pattern cannot match a string starting with a period unless the |
first character of the pattern is a period. The next section describes the |
patterns used for both Pathname Expansion and the |
.Xr case 1 |
command. |
.Ss Shell Patterns |
A pattern consists of normal characters, which match themselves, |
and meta-characters. The meta-characters are |
.Dq ! , |
.Dq * , |
.Dq ? , |
and |
.Dq [ . |
These characters lose their special meanings if they are quoted. When |
command or variable substitution is performed and the dollar sign or back |
quotes are not double quoted, the value of the variable or the output of |
the command is scanned for these characters and they are turned into |
meta-characters. |
.Pp |
An asterisk |
.Pq Dq * |
matches any string of characters. A question mark matches any single |
character. A left bracket |
.Pq Dq \&[ |
introduces a character class. The end of |
the character class is indicated by a |
.Pq Dq \&] ; |
if the |
.Dq \&] |
is missing then the |
.Dq \&[ |
matches a |
.Dq \&[ |
rather than introducing a character class. A character class matches any |
of the characters between the square brackets. A range of characters may |
be specified using a minus sign. The character class may be complemented |
by making an exclamation point the first character of the character class. |
.Pp |
To include a |
.Dq \&] |
in a character class, make it the first character listed (after the |
.Dq \&! , |
if any). To include a minus sign, make it the first or last character listed |
.Ss Builtins |
.Pp |
This section lists the builtin commands which are builtin because they |
need to perform some operation that can't be performed by a separate |
process. In addition to these, there are several other commands that may |
be builtin for efficiency (e.g. |
.Xr printf 1 , |
.Xr echo 1 , |
.Xr test 1 , |
etc). |
.Bl -tag -width 5n |
.It : |
A null command that returns a 0 (true) exit value. |
.It \&. file |
The commands in the specified file are read and executed by the shell. |
.It alias Op Ar name Ns Op Ar "=string ..." |
If |
.Ar name=string |
is specified, the shell defines the alias |
.Ar name |
with value |
.Ar string . |
If just |
.Ar name |
is specified, the value of the alias |
.Ar name |
is printed. With no arguments, the |
.Ic alias |
builtin prints the |
names and values of all defined aliases (see |
.Ic unalias ) . |
.It bg [ Ar job ] ... |
Continue the specified jobs (or the current job if no |
jobs are given) in the background. |
.It command Ar command Ar arg... |
Execute the specified builtin command. (This is useful when you |
have a shell function with the same name as a builtin command.) |
.It cd Op Ar directory |
Switch to the specified directory (default |
.Ev $HOME ) . |
If an entry for |
.Ev CDPATH |
appears in the environment of the |
.Ic cd |
command or the shell variable |
.Ev CDPATH |
is set and the directory name does not begin with a slash, then the |
directories listed in |
.Ev CDPATH |
will be searched for the specified directory. The format of |
.Ev CDPATH |
is the same as that of |
.Ev PATH . |
In an interactive shell, the |
.Ic cd |
command will print out the name of the |
directory that it actually switched to if this is different from the name |
that the user gave. These may be different either because the |
.Ev CDPATH |
mechanism was used or because a symbolic link was crossed. |
.It eval Ar string... |
Concatenate all the arguments with spaces. Then re-parse and execute |
the command. |
.It exec Op Ar command arg... |
Unless command is omitted, the shell process is replaced with the |
specified program (which must be a real program, not a shell builtin or |
function). Any redirections on the |
.Ic exec |
command are marked as permanent, so that they are not undone when the |
.Ic exec |
command finishes. |
.It exit Op Ar exitstatus |
Terminate the shell process. If |
.Ar exitstatus |
is given it is used as the exit status of the shell; otherwise the |
exit status of the preceding command is used. |
.It export Ar name... |
.It export Fl p |
The specified names are exported so that they will appear in the |
environment of subsequent commands. The only way to un-export a variable |
is to unset it. The shell allows the value of a variable to be set at the |
same time it is exported by writing |
.Pp |
.Dl export name=value |
.Pp |
With no arguments the export command lists the names of all exported variables. |
With the |
.Fl p |
option specified the output will be formatted suitably for non-interactive use. |
.It Xo fc Op Fl e Ar editor |
.Op Ar first Op Ar last |
.Xc |
.It Xo fc Fl l |
.Op Fl nr |
.Op Ar first Op Ar last |
.Xc |
.It Xo fc Fl s Op Ar old=new |
.Op Ar first |
.Xc |
The |
.Ic fc |
builtin lists, or edits and re-executes, commands previously entered |
to an interactive shell. |
.Bl -tag -width 5n |
.It Fl e No editor |
Use the editor named by editor to edit the commands. The |
editor string is a command name, subject to search via the |
.Ev PATH |
variable. The value in the |
.Ev FCEDIT |
variable is used as a default when |
.Fl e |
is not specified. If |
.Ev FCEDIT |
is null or unset, the value of the |
.Ev EDITOR |
variable is used. If |
.Ev EDITOR |
is null or unset, |
.Xr ed 1 |
is used as the editor. |
.It Fl l No (ell) |
List the commands rather than invoking an editor on them. The commands |
are written in the sequence indicated by the first and last operands, as |
affected by |
.Fl r , |
with each command preceded by the command number. |
.It Fl n |
Suppress command numbers when listing with -l. |
.It Fl r |
Reverse the order of the commands listed (with |
.Fl l ) |
or edited (with neither |
.Fl l |
nor |
.Fl s ) . |
.It Fl s |
Re-execute the command without invoking an editor. |
.It first |
.It last |
Select the commands to list or edit. The number of previous commands that |
can be accessed are determined by the value of the |
.Ev HISTSIZE |
variable. The value of first or last or both are one of the following: |
.Bl -tag -width 5n |
.It [+]number |
A positive number representing a command number; command numbers can be |
displayed with the |
.Fl l |
option. |
.It Fl number |
A negative decimal number representing the command that was executed |
number of commands previously. For example, -1 is the immediately |
previous command. |
.El |
.It string |
A string indicating the most recently entered command that begins with |
that string. If the old=new operand is not also specified with |
.Fl s , |
the string form of the first operand cannot contain an embedded equal sign. |
.El |
.Pp |
The following environment variables affect the execution of fc: |
.Bl -tag -width HISTSIZE |
.It Ev FCEDIT |
Name of the editor to use. |
.It Ev HISTSIZE |
The number of previous commands that are accessible. |
.El |
.It fg Op Ar job |
Move the specified job or the current job to the foreground. |
.It getopts Ar optstring var |
The |
.Tn POSIX |
.Ic getopts |
command, not to be confused with the |
.Em Bell Labs |
-derived |
.Xr getopt 1 . |
.Pp |
The first argument should be a series of letters, each of which may be |
optionally followed by a colon to indicate that the option requires an |
argument. The variable specified is set to the parsed option. |
.Pp |
The |
.Ic getopts |
command deprecates the older |
.Xr getopt 1 |
utility due to its handling of arguments containing whitespace. |
.Pp |
The |
.Ic getopts |
builtin may be used to obtain options and their arguments |
from a list of parameters. When invoked, |
.Ic getopts |
places the value of the next option from the option string in the list in |
the shell variable specified by |
.Va var |
and it's index in the shell variable |
.Ev OPTIND . |
When the shell is invoked, |
.Ev OPTIND |
is initialized to 1. For each option that requires an argument, the |
.Ic getopts |
builtin will place it in the shell variable |
.Ev OPTARG . |
If an option is not allowed for in the |
.Va optstring , |
then |
.Ev OPTARG |
will be unset. |
.Pp |
.Va optstring |
is a string of recognized option letters (see |
.Xr getopt 3 ) . |
If a letter is followed by a colon, the option is expected to have an |
argument which may or may not be separated from it by white space. If an |
option character is not found where expected, |
.Ic getopts |
will set the variable |
.Va var |
to a |
.Dq ? ; |
.Ic getopts |
will then unset |
.Ev OPTARG |
and write output to standard error. By specifying a colon as the |
first character of |
.Va optstring |
all errors will be ignored. |
.Pp |
A nonzero value is returned when the last option is reached. |
If there are no remaining arguments, |
.Ic getopts |
will set |
.Va var |
to the special option, |
.Dq -- , |
otherwise, it will set |
.Va var |
to |
.Dq ? . |
.Pp |
The following code fragment shows how one might process the arguments |
for a command that can take the options |
.Op a |
and |
.Op b , |
and the option |
.Op c , |
which requires an argument. |
.Pp |
.Bd -literal -offset indent |
while getopts abc: f |
do |
case $f in |
a | b) flag=$f;; |
c) carg=$OPTARG;; |
\\?) echo $USAGE; exit 1;; |
esac |
done |
shift `expr $OPTIND - 1` |
.Ed |
.Pp |
This code will accept any of the following as equivalent: |
.Pp |
.Bd -literal -offset indent |
cmd \-acarg file file |
cmd \-a \-c arg file file |
cmd \-carg -a file file |
cmd \-a \-carg \-\- file file |
.Ed |
.It hash Fl rv Ar command... |
The shell maintains a hash table which remembers the |
locations of commands. With no arguments whatsoever, |
the |
.Ic hash |
command prints out the contents of this table. Entries which have not |
been looked at since the last |
.Ic cd |
command are marked with an asterisk; it is possible for these entries |
to be invalid. |
.Pp |
With arguments, the |
.Ic hash |
command removes the specified commands from the hash table (unless |
they are functions) and then locates them. With the |
.Fl v |
option, hash prints the locations of the commands as it finds them. The |
.Fl r |
option causes the hash command to delete all the entries in the hash table |
except for functions. |
.It jobid Op Ar job |
Print the process id's of the processes in the job. |
If the |
.Ar job |
argument is omitted, the current job is used. |
.It jobs |
This command lists out all the background processes |
which are children of the current shell process. |
.It pwd |
Print the current directory. The builtin command may |
differ from the program of the same name because the |
builtin command remembers what the current directory |
is rather than recomputing it each time. This makes |
it faster. However, if the current directory is |
renamed, the builtin version of |
.Ic pwd |
will continue to print the old name for the directory. |
.It Xo read Op Fl p Ar prompt |
.Op Fl r |
.Ar variable... |
.Xc |
The prompt is printed if the |
.Fl p |
option is specified and the standard input is a terminal. Then a line is |
read from the standard input. The trailing newline is deleted from the |
line and the line is split as described in the section on word splitting |
above, and the pieces are assigned to the variables in order. |
At least one variable must be specified. |
If there are |
more pieces than variables, the remaining pieces (along with the |
characters in |
.Ev IFS |
that separated them) are assigned to the last variable. If there are more |
variables than pieces, the remaining variables are assigned the null |
string. The |
.Ic read |
builtin will indicate success unless EOF is encountered on input, in |
which case failure is returned. |
.Pp |
By default, unless the |
.Fl r |
option is specified, the backslash |
.Dq \e |
acts as an escape character, causing the following character to be treated |
literally. If a backslash is followed by a newline, the backslash and the |
newline will be deleted. |
.It readonly Ar name... |
.It readonly Fl p |
The specified names are marked as read only, so that they cannot be |
subsequently modified or unset. The shell allows the value of a variable |
to be set at the same time it is marked read only by writing |
.Pp |
.Dl readonly name=value |
.Pp |
With no arguments the readonly command lists the names of all read only |
variables. |
With the |
.Fl p |
option specified the output will be formatted suitably for non-interactive use. |
.Pp |
.It Xo set |
.Oo { |
.Fl options | Cm +options | Cm -- } |
.Oc Ar arg... |
.Xc |
The |
.Ic set |
command performs three different functions. |
.Pp |
With no arguments, it lists the values of all shell |
variables. |
.Pp |
If options are given, it sets the specified option |
flags, or clears them as described in the section |
called |
.Sx Argument List Processing . |
.Pp |
The third use of the set command is to set the values of the shell's |
positional parameters to the specified args. To change the positional |
parameters without changing any options, use |
.Dq -- |
as the first argument to set. If no args are present, the set command |
will clear all the positional parameters (equivalent to executing |
.Dq shift $# . ) |
.It setvar Ar variable Ar value |
Assigns value to variable. (In general it is better to write |
variable=value rather than using |
.Ic setvar . |
.Ic setvar |
is intended to be used in |
functions that assign values to variables whose names are passed as |
parameters.) |
.It shift Op Ar n |
Shift the positional parameters n times. A |
.Ic shift |
sets the value of |
.Va $1 |
to the value of |
.Va $2 , |
the value of |
.Va $2 |
to the value of |
.Va $3 , |
and so on, decreasing |
the value of |
.Va $# |
by one. If there are zero positional parameters, |
.Ic shift |
does nothing. |
.It times |
Print the accumulated user and system times for the shell and for processes |
run from the shell. The return status is 0. |
.It Xo trap |
.Op Ar action |
.Ar signal... |
.Xc |
Cause the shell to parse and execute action when any of the specified |
signals are received. The signals are specified by signal number. If |
.Ar signal |
is |
.Li 0 , |
the action is executed when the shell exits. |
.Ar action |
may be null or omitted; the former causes the specified signal to be |
ignored and the latter causes the default action to be taken. When the |
shell forks off a subshell, it resets trapped (but not ignored) signals to |
the default action. The |
.Ic trap |
command has no effect on signals that were |
ignored on entry to the shell. |
.It type Op Ar name ... |
Interpret each name as a command and print the resolution of the command |
search. Possible resolutions are: |
shell keyword, alias, shell builtin, |
command, tracked alias and not found. For aliases the alias expansion is |
printed; for commands and tracked aliases the complete pathname of the |
command is printed. |
.It ulimit Xo |
.Op Fl H \*(Ba Fl S |
.Op Fl a \*(Ba Fl tfdscmlpn Op Ar value |
.Xc |
Inquire about or set the hard or soft limits on processes or set new |
limits. The choice between hard limit (which no process is allowed to |
violate, and which may not be raised once it has been lowered) and soft |
limit (which causes processes to be signaled but not necessarily killed, |
and which may be raised) is made with these flags: |
.Bl -tag -width Fl |
.It Fl H |
set or inquire about hard limits |
.It Fl S |
set or inquire about soft limits. If neither |
.Fl H |
nor |
.Fl S |
is specified, the soft limit is displayed or both limits are set. If both |
are specified, the last one wins. |
.El |
.Pp |
.Bl -tag -width Fl |
The limit to be interrogated or set, then, is chosen by specifying |
any one of these flags: |
.It Fl a |
show all the current limits |
.It Fl t |
show or set the limit on CPU time (in seconds) |
.It Fl f |
show or set the limit on the largest file that can be created |
(in 512-byte blocks) |
.It Fl d |
show or set the limit on the data segment size of a process (in kilobytes) |
.It Fl s |
show or set the limit on the stack size of a process (in kilobytes) |
.It Fl c |
show or set the limit on the largest core dump size that can be produced |
(in 512-byte blocks) |
.It Fl m |
show or set the limit on the total physical memory that can be |
in use by a process (in kilobytes) |
.It Fl l |
show or set the limit on how much memory a process can lock with |
.Xr mlock 2 |
(in kilobytes) |
.It Fl p |
show or set the limit on the number of processes this user can |
have at one time |
.It Fl n |
show or set the limit on the number files a process can have open at once |
.El |
.Pp |
If none of these is specified, it is the limit on file size that is shown |
or set. If value is specified, the limit is set to that number; otherwise |
the current limit is displayed. |
.Pp |
Limits of an arbitrary process can be displayed or set using the |
.Xr sysctl 8 |
utility. |
.Pp |
.It umask Op Ar mask |
Set the value of umask (see |
.Xr umask 2 ) |
to the specified octal value. If the argument is omitted, the umask value |
is printed. |
.It unalias Xo |
.Op Fl a |
.Op Ar name |
.Xc |
If |
.Ar name |
is specified, the shell removes that alias. If |
.Fl a |
is specified, all aliases are removed. |
.It unset Ar name... |
The specified variables and functions are unset and unexported. If a given |
name corresponds to both a variable and a function, both the variable and |
the function are unset. |
.It wait Op Ar job |
Wait for the specified job to complete and return the exit status of the |
last process in the job. If the argument is omitted, wait for all jobs to |
complete and the return an exit status of zero. |
.El |
.Ss Command Line Editing |
When |
.Nm |
is being used interactively from a terminal, the current command |
and the command history (see |
.Ic fc |
in |
.Sx Builtins ) |
can be edited using vi-mode command-line editing. This mode uses commands, |
described below, similar to a subset of those described in the vi man |
page. The command |
.Ql set -o vi |
enables vi-mode editing and place sh into vi insert mode. With vi-mode |
enabled, sh can be switched between insert mode and command mode. The |
editor is not described in full here, but will be in a later document. |
It's similar to vi: typing |
.Aq ESC |
will throw you into command VI command mode. Hitting |
.Aq return |
while in command mode will pass the line to the shell. |
.Sh ENVIRONMENT |
.Bl -tag -width MAILCHECK |
.It Ev HOME |
Set automaticly by |
.Xr login 1 |
from the user's login directory in the password file |
.Pq Xr passwd 4 . |
This environment variable also functions as the default argument for the |
cd builtin. |
.It Ev PATH |
The default search path for executables. See the above section |
.Sx Path Search . |
.It Ev CDPATH |
The search path used with the cd builtin. |
.It Ev MAIL |
The name of a mail file, that will be checked for the arrival of new mail. |
Overridden by |
.Ev MAILPATH . |
.It Ev MAILCHECK |
The frequency in seconds that the shell checks for the arrival of mail |
in the files specified by the |
.Ev MAILPATH |
or the |
.Ev MAIL |
file. If set to 0, the check will occur at each prompt. |
.It Ev MAILPATH |
A colon |
.Dq \&: |
separated list of file names, for the shell to check for incoming mail. |
This environment setting overrides the |
.Ev MAIL |
setting. There is a maximum of 10 mailboxes that can be monitored at once. |
.It Ev PS1 |
The primary prompt string, which defaults to |
.Dq $ \ , |
unless you are the superuser, in which case it defaults to |
.Dq # \ . |
.It Ev PS2 |
The secondary prompt string, which defaults to |
.Dq > \ . |
.It Ev IFS |
Input Field Separators. This is normally set to <space> <tab> and |
<newline>. See the |
.Sx White Space Splitting |
section for more details. |
.It Ev TERM |
The default terminal setting for the shell. This is inherited by |
children of the shell, and is used in the history editing modes. |
.It Ev HISTSIZE |
The number of lines in the history buffer for the shell. |
.El |
.Sh FILES |
.Bl -item -width HOMEprofilexxxx |
.It |
.Pa $HOME/.profile |
.It |
.Pa /etc/profile |
.El |
.Sh SEE ALSO |
.Xr csh 1 , |
.Xr getopt 1 , |
.Xr ksh 1 , |
.Xr login 1 , |
.Xr test 1 , |
.Xr getopt 3 , |
.Xr passwd 4 , |
.Xr profile 4 , |
.Xr environ 5 |
.Xr sysctl 8 |
.Sh HISTORY |
A |
.Nm |
command appeared in |
.At v1 . |
It was, however, unmaintainable so we wrote this one. |
.Sh EXIT STATUS |
Errors that are detected by the shell, such as a syntax error, will cause the |
shell to exit with a non-zero exit status. If the shell is not an |
interactive shell, the execution of the shell file will be aborted. Otherwise |
the shell will return the exit status of the last command executed, or |
if the exit builtin is used with a numeric argument, it will return the |
argument. |
.Sh BUGS |
Setuid shell scripts should be avoided at all costs, as they are a |
significant security risk. |
/tags/0.3.0/uspace/app/ash/lex.yy.c |
---|
0,0 → 1,1904 |
#line 3 "lex.yy.c" |
#define YY_INT_ALIGNED short int |
/* A lexical scanner generated by flex */ |
#define FLEX_SCANNER |
#define YY_FLEX_MAJOR_VERSION 2 |
#define YY_FLEX_MINOR_VERSION 5 |
#define YY_FLEX_SUBMINOR_VERSION 33 |
#if YY_FLEX_SUBMINOR_VERSION > 0 |
#define FLEX_BETA |
#endif |
/* First, we deal with platform-specific or compiler-specific issues. */ |
/* begin standard C headers. */ |
#include <stdio.h> |
#include <string.h> |
#include <errno.h> |
#include <stdlib.h> |
/* end standard C headers. */ |
/* flex integer type definitions */ |
#ifndef FLEXINT_H |
#define FLEXINT_H |
/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */ |
#if __STDC_VERSION__ >= 199901L |
/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, |
* if you want the limit (max/min) macros for int types. |
*/ |
#ifndef __STDC_LIMIT_MACROS |
#define __STDC_LIMIT_MACROS 1 |
#endif |
#include <inttypes.h> |
typedef int8_t flex_int8_t; |
typedef uint8_t flex_uint8_t; |
typedef int16_t flex_int16_t; |
typedef uint16_t flex_uint16_t; |
typedef int32_t flex_int32_t; |
typedef uint32_t flex_uint32_t; |
#else |
typedef signed char flex_int8_t; |
typedef short int flex_int16_t; |
typedef int flex_int32_t; |
typedef unsigned char flex_uint8_t; |
typedef unsigned short int flex_uint16_t; |
typedef unsigned int flex_uint32_t; |
#endif /* ! C99 */ |
/* Limits of integral types. */ |
#ifndef INT8_MIN |
#define INT8_MIN (-128) |
#endif |
#ifndef INT16_MIN |
#define INT16_MIN (-32767-1) |
#endif |
#ifndef INT32_MIN |
#define INT32_MIN (-2147483647-1) |
#endif |
#ifndef INT8_MAX |
#define INT8_MAX (127) |
#endif |
#ifndef INT16_MAX |
#define INT16_MAX (32767) |
#endif |
#ifndef INT32_MAX |
#define INT32_MAX (2147483647) |
#endif |
#ifndef UINT8_MAX |
#define UINT8_MAX (255U) |
#endif |
#ifndef UINT16_MAX |
#define UINT16_MAX (65535U) |
#endif |
#ifndef UINT32_MAX |
#define UINT32_MAX (4294967295U) |
#endif |
#endif /* ! FLEXINT_H */ |
#ifdef __cplusplus |
/* The "const" storage-class-modifier is valid. */ |
#define YY_USE_CONST |
#else /* ! __cplusplus */ |
#if __STDC__ |
#define YY_USE_CONST |
#endif /* __STDC__ */ |
#endif /* ! __cplusplus */ |
#ifdef YY_USE_CONST |
#define yyconst const |
#else |
#define yyconst |
#endif |
/* Returned upon end-of-file. */ |
#define YY_NULL 0 |
/* Promotes a possibly negative, possibly signed char to an unsigned |
* integer for use as an array index. If the signed char is negative, |
* we want to instead treat it as an 8-bit unsigned char, hence the |
* double cast. |
*/ |
#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) |
/* Enter a start condition. This macro really ought to take a parameter, |
* but we do it the disgusting crufty way forced on us by the ()-less |
* definition of BEGIN. |
*/ |
#define BEGIN (yy_start) = 1 + 2 * |
/* Translate the current start state into a value that can be later handed |
* to BEGIN to return to the state. The YYSTATE alias is for lex |
* compatibility. |
*/ |
#define YY_START (((yy_start) - 1) / 2) |
#define YYSTATE YY_START |
/* Action number for EOF rule of a given start state. */ |
#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) |
/* Special action meaning "start processing a new file". */ |
#define YY_NEW_FILE yyrestart(yyin ) |
#define YY_END_OF_BUFFER_CHAR 0 |
/* Size of default input buffer. */ |
#ifndef YY_BUF_SIZE |
#define YY_BUF_SIZE 16384 |
#endif |
/* The state buf must be large enough to hold one state per character in the main buffer. |
*/ |
#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) |
#ifndef YY_TYPEDEF_YY_BUFFER_STATE |
#define YY_TYPEDEF_YY_BUFFER_STATE |
typedef struct yy_buffer_state *YY_BUFFER_STATE; |
#endif |
extern int yyleng; |
extern FILE *yyin, *yyout; |
#define EOB_ACT_CONTINUE_SCAN 0 |
#define EOB_ACT_END_OF_FILE 1 |
#define EOB_ACT_LAST_MATCH 2 |
#define YY_LESS_LINENO(n) |
/* Return all but the first "n" matched characters back to the input stream. */ |
#define yyless(n) \ |
do \ |
{ \ |
/* Undo effects of setting up yytext. */ \ |
int yyless_macro_arg = (n); \ |
YY_LESS_LINENO(yyless_macro_arg);\ |
*yy_cp = (yy_hold_char); \ |
YY_RESTORE_YY_MORE_OFFSET \ |
(yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ |
YY_DO_BEFORE_ACTION; /* set up yytext again */ \ |
} \ |
while ( 0 ) |
#define unput(c) yyunput( c, (yytext_ptr) ) |
/* The following is because we cannot portably get our hands on size_t |
* (without autoconf's help, which isn't available because we want |
* flex-generated scanners to compile on their own). |
*/ |
#ifndef YY_TYPEDEF_YY_SIZE_T |
#define YY_TYPEDEF_YY_SIZE_T |
typedef unsigned int yy_size_t; |
#endif |
#ifndef YY_STRUCT_YY_BUFFER_STATE |
#define YY_STRUCT_YY_BUFFER_STATE |
struct yy_buffer_state |
{ |
FILE *yy_input_file; |
char *yy_ch_buf; /* input buffer */ |
char *yy_buf_pos; /* current position in input buffer */ |
/* Size of input buffer in bytes, not including room for EOB |
* characters. |
*/ |
yy_size_t yy_buf_size; |
/* Number of characters read into yy_ch_buf, not including EOB |
* characters. |
*/ |
int yy_n_chars; |
/* Whether we "own" the buffer - i.e., we know we created it, |
* and can realloc() it to grow it, and should free() it to |
* delete it. |
*/ |
int yy_is_our_buffer; |
/* Whether this is an "interactive" input source; if so, and |
* if we're using stdio for input, then we want to use getc() |
* instead of fread(), to make sure we stop fetching input after |
* each newline. |
*/ |
int yy_is_interactive; |
/* Whether we're considered to be at the beginning of a line. |
* If so, '^' rules will be active on the next match, otherwise |
* not. |
*/ |
int yy_at_bol; |
int yy_bs_lineno; /**< The line count. */ |
int yy_bs_column; /**< The column count. */ |
/* Whether to try to fill the input buffer when we reach the |
* end of it. |
*/ |
int yy_fill_buffer; |
int yy_buffer_status; |
#define YY_BUFFER_NEW 0 |
#define YY_BUFFER_NORMAL 1 |
/* When an EOF's been seen but there's still some text to process |
* then we mark the buffer as YY_EOF_PENDING, to indicate that we |
* shouldn't try reading from the input source any more. We might |
* still have a bunch of tokens to match, though, because of |
* possible backing-up. |
* |
* When we actually see the EOF, we change the status to "new" |
* (via yyrestart()), so that the user can continue scanning by |
* just pointing yyin at a new input file. |
*/ |
#define YY_BUFFER_EOF_PENDING 2 |
}; |
#endif /* !YY_STRUCT_YY_BUFFER_STATE */ |
/* Stack of input buffers. */ |
static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ |
static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ |
static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ |
/* We provide macros for accessing buffer states in case in the |
* future we want to put the buffer states in a more general |
* "scanner state". |
* |
* Returns the top of the stack, or NULL. |
*/ |
#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ |
? (yy_buffer_stack)[(yy_buffer_stack_top)] \ |
: NULL) |
/* Same as previous macro, but useful when we know that the buffer stack is not |
* NULL or when we need an lvalue. For internal use only. |
*/ |
#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] |
/* yy_hold_char holds the character lost when yytext is formed. */ |
static char yy_hold_char; |
static int yy_n_chars; /* number of characters read into yy_ch_buf */ |
int yyleng; |
/* Points to current character in buffer. */ |
static char *yy_c_buf_p = (char *) 0; |
static int yy_init = 0; /* whether we need to initialize */ |
static int yy_start = 0; /* start state number */ |
/* Flag which is used to allow yywrap()'s to do buffer switches |
* instead of setting up a fresh yyin. A bit of a hack ... |
*/ |
static int yy_did_buffer_switch_on_eof; |
void yyrestart (FILE *input_file ); |
void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ); |
YY_BUFFER_STATE yy_create_buffer (FILE *file,int size ); |
void yy_delete_buffer (YY_BUFFER_STATE b ); |
void yy_flush_buffer (YY_BUFFER_STATE b ); |
void yypush_buffer_state (YY_BUFFER_STATE new_buffer ); |
void yypop_buffer_state (void ); |
static void yyensure_buffer_stack (void ); |
static void yy_load_buffer_state (void ); |
static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file ); |
#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER ) |
YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size ); |
YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str ); |
YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len ); |
void *yyalloc (yy_size_t ); |
void *yyrealloc (void *,yy_size_t ); |
void yyfree (void * ); |
#define yy_new_buffer yy_create_buffer |
#define yy_set_interactive(is_interactive) \ |
{ \ |
if ( ! YY_CURRENT_BUFFER ){ \ |
yyensure_buffer_stack (); \ |
YY_CURRENT_BUFFER_LVALUE = \ |
yy_create_buffer(yyin,YY_BUF_SIZE ); \ |
} \ |
YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ |
} |
#define yy_set_bol(at_bol) \ |
{ \ |
if ( ! YY_CURRENT_BUFFER ){\ |
yyensure_buffer_stack (); \ |
YY_CURRENT_BUFFER_LVALUE = \ |
yy_create_buffer(yyin,YY_BUF_SIZE ); \ |
} \ |
YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ |
} |
#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) |
/* Begin user sect3 */ |
typedef unsigned char YY_CHAR; |
FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; |
typedef int yy_state_type; |
extern int yylineno; |
int yylineno = 1; |
extern char *yytext; |
#define yytext_ptr yytext |
static yy_state_type yy_get_previous_state (void ); |
static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); |
static int yy_get_next_buffer (void ); |
static void yy_fatal_error (yyconst char msg[] ); |
/* Done after the current pattern has been matched and before the |
* corresponding action - sets up yytext. |
*/ |
#define YY_DO_BEFORE_ACTION \ |
(yytext_ptr) = yy_bp; \ |
yyleng = (size_t) (yy_cp - yy_bp); \ |
(yy_hold_char) = *yy_cp; \ |
*yy_cp = '\0'; \ |
(yy_c_buf_p) = yy_cp; |
#define YY_NUM_RULES 26 |
#define YY_END_OF_BUFFER 27 |
/* This struct is not used in this scanner, |
but its presence is necessary. */ |
struct yy_trans_info |
{ |
flex_int32_t yy_verify; |
flex_int32_t yy_nxt; |
}; |
static yyconst flex_int16_t yy_accept[33] = |
{ 0, |
0, 0, 27, 25, 1, 1, 24, 20, 9, 3, |
4, 18, 21, 22, 19, 2, 14, 25, 12, 8, |
7, 23, 11, 6, 2, 16, 15, 10, 13, 17, |
5, 0 |
} ; |
static yyconst flex_int32_t yy_ec[256] = |
{ 0, |
1, 1, 1, 1, 1, 1, 1, 1, 2, 3, |
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
1, 2, 4, 1, 1, 1, 5, 6, 1, 7, |
8, 9, 10, 1, 11, 1, 12, 13, 13, 13, |
13, 13, 13, 13, 13, 13, 13, 1, 1, 14, |
15, 16, 1, 1, 1, 1, 1, 1, 1, 1, |
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
1, 1, 1, 17, 1, 1, 1, 1, 1, 1, |
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
1, 1, 1, 18, 1, 19, 1, 1, 1, 1, |
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
1, 1, 1, 1, 1 |
} ; |
static yyconst flex_int32_t yy_meta[20] = |
{ 0, |
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
1, 1, 1, 1, 1, 1, 1, 1, 1 |
} ; |
static yyconst flex_int16_t yy_base[33] = |
{ 0, |
0, 0, 30, 31, 31, 31, 14, 31, 22, 31, |
31, 31, 31, 31, 31, 14, 6, 11, 7, 31, |
7, 31, 31, 31, 11, 31, 31, 31, 31, 31, |
31, 31 |
} ; |
static yyconst flex_int16_t yy_def[33] = |
{ 0, |
32, 1, 32, 32, 32, 32, 32, 32, 32, 32, |
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, |
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, |
32, 0 |
} ; |
static yyconst flex_int16_t yy_nxt[51] = |
{ 0, |
4, 5, 6, 7, 8, 9, 10, 11, 12, 13, |
14, 15, 16, 17, 18, 19, 20, 21, 22, 26, |
27, 29, 30, 25, 31, 28, 25, 24, 23, 32, |
3, 32, 32, 32, 32, 32, 32, 32, 32, 32, |
32, 32, 32, 32, 32, 32, 32, 32, 32, 32 |
} ; |
static yyconst flex_int16_t yy_chk[51] = |
{ 0, |
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
1, 1, 1, 1, 1, 1, 1, 1, 1, 17, |
17, 19, 19, 25, 21, 18, 16, 9, 7, 3, |
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, |
32, 32, 32, 32, 32, 32, 32, 32, 32, 32 |
} ; |
static yy_state_type yy_last_accepting_state; |
static char *yy_last_accepting_cpos; |
extern int yy_flex_debug; |
int yy_flex_debug = 0; |
/* The intent behind this definition is that it'll catch |
* any uses of REJECT which flex missed. |
*/ |
#define REJECT reject_used_but_not_detected |
#define yymore() yymore_used_but_not_detected |
#define YY_MORE_ADJ 0 |
#define YY_RESTORE_YY_MORE_OFFSET |
char *yytext; |
#line 1 "arith_lex.l" |
#line 2 "arith_lex.l" |
/* $NetBSD: arith_lex.l,v 1.10 1999/02/05 07:52:52 christos Exp $ */ |
/*- |
* Copyright (c) 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Kenneth Almquist. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
*/ |
#include <sys/cdefs.h> |
#ifndef lint |
#if 0 |
static char sccsid[] = "@(#)arith_lex.l 8.3 (Berkeley) 5/4/95"; |
#else |
__RCSID("$NetBSD: arith_lex.l,v 1.10 1999/02/05 07:52:52 christos Exp $"); |
#endif |
#endif /* not lint */ |
#include <unistd.h> |
#include "arith.h" |
#include "error.h" |
#include "expand.h" |
extern int yylval; |
extern char *arith_buf, *arith_startbuf; |
#undef YY_INPUT |
#define YY_INPUT(buf,result,max) \ |
result = (*buf = *arith_buf++) ? 1 : YY_NULL; |
#define YY_NO_UNPUT |
#line 530 "lex.yy.c" |
#define INITIAL 0 |
#ifndef YY_NO_UNISTD_H |
/* Special case for "unistd.h", since it is non-ANSI. We include it way |
* down here because we want the user's section 1 to have been scanned first. |
* The user has a chance to override it with an option. |
*/ |
#include <unistd.h> |
#endif |
#ifndef YY_EXTRA_TYPE |
#define YY_EXTRA_TYPE void * |
#endif |
static int yy_init_globals (void ); |
/* Macros after this point can all be overridden by user definitions in |
* section 1. |
*/ |
#ifndef YY_SKIP_YYWRAP |
#ifdef __cplusplus |
extern "C" int yywrap (void ); |
#else |
extern int yywrap (void ); |
#endif |
#endif |
static void yyunput (int c,char *buf_ptr ); |
#ifndef yytext_ptr |
static void yy_flex_strncpy (char *,yyconst char *,int ); |
#endif |
#ifdef YY_NEED_STRLEN |
static int yy_flex_strlen (yyconst char * ); |
#endif |
#ifndef YY_NO_INPUT |
#ifdef __cplusplus |
static int yyinput (void ); |
#else |
static int input (void ); |
#endif |
#endif |
/* Amount of stuff to slurp up with each read. */ |
#ifndef YY_READ_BUF_SIZE |
#define YY_READ_BUF_SIZE 8192 |
#endif |
/* Copy whatever the last rule matched to the standard output. */ |
#ifndef ECHO |
/* This used to be an fputs(), but since the string might contain NUL's, |
* we now use fwrite(). |
*/ |
#define ECHO (void) fwrite( yytext, yyleng, 1, yyout ) |
#endif |
/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, |
* is returned in "result". |
*/ |
#ifndef YY_INPUT |
#define YY_INPUT(buf,result,max_size) \ |
if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ |
{ \ |
int c = '*'; \ |
size_t n; \ |
for ( n = 0; n < max_size && \ |
(c = getc( yyin )) != EOF && c != '\n'; ++n ) \ |
buf[n] = (char) c; \ |
if ( c == '\n' ) \ |
buf[n++] = (char) c; \ |
if ( c == EOF && ferror( yyin ) ) \ |
YY_FATAL_ERROR( "input in flex scanner failed" ); \ |
result = n; \ |
} \ |
else \ |
{ \ |
errno=0; \ |
while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \ |
{ \ |
if( errno != EINTR) \ |
{ \ |
YY_FATAL_ERROR( "input in flex scanner failed" ); \ |
break; \ |
} \ |
errno=0; \ |
clearerr(yyin); \ |
} \ |
}\ |
\ |
#endif |
/* No semi-colon after return; correct usage is to write "yyterminate();" - |
* we don't want an extra ';' after the "return" because that will cause |
* some compilers to complain about unreachable statements. |
*/ |
#ifndef yyterminate |
#define yyterminate() return YY_NULL |
#endif |
/* Number of entries by which start-condition stack grows. */ |
#ifndef YY_START_STACK_INCR |
#define YY_START_STACK_INCR 25 |
#endif |
/* Report a fatal error. */ |
#ifndef YY_FATAL_ERROR |
#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) |
#endif |
/* end tables serialization structures and prototypes */ |
/* Default declaration of generated scanner - a define so the user can |
* easily add parameters. |
*/ |
#ifndef YY_DECL |
#define YY_DECL_IS_OURS 1 |
extern int yylex (void); |
#define YY_DECL int yylex (void) |
#endif /* !YY_DECL */ |
/* Code executed at the beginning of each rule, after yytext and yyleng |
* have been set up. |
*/ |
#ifndef YY_USER_ACTION |
#define YY_USER_ACTION |
#endif |
/* Code executed at the end of each rule. */ |
#ifndef YY_BREAK |
#define YY_BREAK break; |
#endif |
#define YY_RULE_SETUP \ |
YY_USER_ACTION |
/** The main scanner function which does all the work. |
*/ |
YY_DECL |
{ |
register yy_state_type yy_current_state; |
register char *yy_cp, *yy_bp; |
register int yy_act; |
#line 62 "arith_lex.l" |
#line 685 "lex.yy.c" |
if ( !(yy_init) ) |
{ |
(yy_init) = 1; |
#ifdef YY_USER_INIT |
YY_USER_INIT; |
#endif |
if ( ! (yy_start) ) |
(yy_start) = 1; /* first start state */ |
if ( ! yyin ) |
yyin = stdin; |
if ( ! yyout ) |
yyout = stdout; |
if ( ! YY_CURRENT_BUFFER ) { |
yyensure_buffer_stack (); |
YY_CURRENT_BUFFER_LVALUE = |
yy_create_buffer(yyin,YY_BUF_SIZE ); |
} |
yy_load_buffer_state( ); |
} |
while ( 1 ) /* loops until end-of-file is reached */ |
{ |
yy_cp = (yy_c_buf_p); |
/* Support of yytext. */ |
*yy_cp = (yy_hold_char); |
/* yy_bp points to the position in yy_ch_buf of the start of |
* the current run. |
*/ |
yy_bp = yy_cp; |
yy_current_state = (yy_start); |
yy_match: |
do |
{ |
register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; |
if ( yy_accept[yy_current_state] ) |
{ |
(yy_last_accepting_state) = yy_current_state; |
(yy_last_accepting_cpos) = yy_cp; |
} |
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) |
{ |
yy_current_state = (int) yy_def[yy_current_state]; |
if ( yy_current_state >= 33 ) |
yy_c = yy_meta[(unsigned int) yy_c]; |
} |
yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; |
++yy_cp; |
} |
while ( yy_base[yy_current_state] != 31 ); |
yy_find_action: |
yy_act = yy_accept[yy_current_state]; |
if ( yy_act == 0 ) |
{ /* have to back up */ |
yy_cp = (yy_last_accepting_cpos); |
yy_current_state = (yy_last_accepting_state); |
yy_act = yy_accept[yy_current_state]; |
} |
YY_DO_BEFORE_ACTION; |
do_action: /* This label is used only to access EOF actions. */ |
switch ( yy_act ) |
{ /* beginning of action switch */ |
case 0: /* must back up */ |
/* undo the effects of YY_DO_BEFORE_ACTION */ |
*yy_cp = (yy_hold_char); |
yy_cp = (yy_last_accepting_cpos); |
yy_current_state = (yy_last_accepting_state); |
goto yy_find_action; |
case 1: |
/* rule 1 can match eol */ |
YY_RULE_SETUP |
#line 63 "arith_lex.l" |
{ ; } |
YY_BREAK |
case 2: |
YY_RULE_SETUP |
#line 64 "arith_lex.l" |
{ yylval = atol(yytext); return(ARITH_NUM); } |
YY_BREAK |
case 3: |
YY_RULE_SETUP |
#line 65 "arith_lex.l" |
{ return(ARITH_LPAREN); } |
YY_BREAK |
case 4: |
YY_RULE_SETUP |
#line 66 "arith_lex.l" |
{ return(ARITH_RPAREN); } |
YY_BREAK |
case 5: |
YY_RULE_SETUP |
#line 67 "arith_lex.l" |
{ return(ARITH_OR); } |
YY_BREAK |
case 6: |
YY_RULE_SETUP |
#line 68 "arith_lex.l" |
{ return(ARITH_AND); } |
YY_BREAK |
case 7: |
YY_RULE_SETUP |
#line 69 "arith_lex.l" |
{ return(ARITH_BOR); } |
YY_BREAK |
case 8: |
YY_RULE_SETUP |
#line 70 "arith_lex.l" |
{ return(ARITH_BXOR); } |
YY_BREAK |
case 9: |
YY_RULE_SETUP |
#line 71 "arith_lex.l" |
{ return(ARITH_BAND); } |
YY_BREAK |
case 10: |
YY_RULE_SETUP |
#line 72 "arith_lex.l" |
{ return(ARITH_EQ); } |
YY_BREAK |
case 11: |
YY_RULE_SETUP |
#line 73 "arith_lex.l" |
{ return(ARITH_NE); } |
YY_BREAK |
case 12: |
YY_RULE_SETUP |
#line 74 "arith_lex.l" |
{ return(ARITH_GT); } |
YY_BREAK |
case 13: |
YY_RULE_SETUP |
#line 75 "arith_lex.l" |
{ return(ARITH_GE); } |
YY_BREAK |
case 14: |
YY_RULE_SETUP |
#line 76 "arith_lex.l" |
{ return(ARITH_LT); } |
YY_BREAK |
case 15: |
YY_RULE_SETUP |
#line 77 "arith_lex.l" |
{ return(ARITH_LE); } |
YY_BREAK |
case 16: |
YY_RULE_SETUP |
#line 78 "arith_lex.l" |
{ return(ARITH_LSHIFT); } |
YY_BREAK |
case 17: |
YY_RULE_SETUP |
#line 79 "arith_lex.l" |
{ return(ARITH_RSHIFT); } |
YY_BREAK |
case 18: |
YY_RULE_SETUP |
#line 80 "arith_lex.l" |
{ return(ARITH_MUL); } |
YY_BREAK |
case 19: |
YY_RULE_SETUP |
#line 81 "arith_lex.l" |
{ return(ARITH_DIV); } |
YY_BREAK |
case 20: |
YY_RULE_SETUP |
#line 82 "arith_lex.l" |
{ return(ARITH_REM); } |
YY_BREAK |
case 21: |
YY_RULE_SETUP |
#line 83 "arith_lex.l" |
{ return(ARITH_ADD); } |
YY_BREAK |
case 22: |
YY_RULE_SETUP |
#line 84 "arith_lex.l" |
{ return(ARITH_SUB); } |
YY_BREAK |
case 23: |
YY_RULE_SETUP |
#line 85 "arith_lex.l" |
{ return(ARITH_BNOT); } |
YY_BREAK |
case 24: |
YY_RULE_SETUP |
#line 86 "arith_lex.l" |
{ return(ARITH_NOT); } |
YY_BREAK |
case 25: |
YY_RULE_SETUP |
#line 87 "arith_lex.l" |
{ error("arith: syntax error: \"%s\"\n", arith_startbuf); } |
YY_BREAK |
case 26: |
YY_RULE_SETUP |
#line 88 "arith_lex.l" |
ECHO; |
YY_BREAK |
#line 899 "lex.yy.c" |
case YY_STATE_EOF(INITIAL): |
yyterminate(); |
case YY_END_OF_BUFFER: |
{ |
/* Amount of text matched not including the EOB char. */ |
int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; |
/* Undo the effects of YY_DO_BEFORE_ACTION. */ |
*yy_cp = (yy_hold_char); |
YY_RESTORE_YY_MORE_OFFSET |
if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) |
{ |
/* We're scanning a new file or input source. It's |
* possible that this happened because the user |
* just pointed yyin at a new source and called |
* yylex(). If so, then we have to assure |
* consistency between YY_CURRENT_BUFFER and our |
* globals. Here is the right place to do so, because |
* this is the first action (other than possibly a |
* back-up) that will match for the new input source. |
*/ |
(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; |
YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; |
YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; |
} |
/* Note that here we test for yy_c_buf_p "<=" to the position |
* of the first EOB in the buffer, since yy_c_buf_p will |
* already have been incremented past the NUL character |
* (since all states make transitions on EOB to the |
* end-of-buffer state). Contrast this with the test |
* in input(). |
*/ |
if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) |
{ /* This was really a NUL. */ |
yy_state_type yy_next_state; |
(yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; |
yy_current_state = yy_get_previous_state( ); |
/* Okay, we're now positioned to make the NUL |
* transition. We couldn't have |
* yy_get_previous_state() go ahead and do it |
* for us because it doesn't know how to deal |
* with the possibility of jamming (and we don't |
* want to build jamming into it because then it |
* will run more slowly). |
*/ |
yy_next_state = yy_try_NUL_trans( yy_current_state ); |
yy_bp = (yytext_ptr) + YY_MORE_ADJ; |
if ( yy_next_state ) |
{ |
/* Consume the NUL. */ |
yy_cp = ++(yy_c_buf_p); |
yy_current_state = yy_next_state; |
goto yy_match; |
} |
else |
{ |
yy_cp = (yy_c_buf_p); |
goto yy_find_action; |
} |
} |
else switch ( yy_get_next_buffer( ) ) |
{ |
case EOB_ACT_END_OF_FILE: |
{ |
(yy_did_buffer_switch_on_eof) = 0; |
if ( yywrap( ) ) |
{ |
/* Note: because we've taken care in |
* yy_get_next_buffer() to have set up |
* yytext, we can now set up |
* yy_c_buf_p so that if some total |
* hoser (like flex itself) wants to |
* call the scanner after we return the |
* YY_NULL, it'll still work - another |
* YY_NULL will get returned. |
*/ |
(yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; |
yy_act = YY_STATE_EOF(YY_START); |
goto do_action; |
} |
else |
{ |
if ( ! (yy_did_buffer_switch_on_eof) ) |
YY_NEW_FILE; |
} |
break; |
} |
case EOB_ACT_CONTINUE_SCAN: |
(yy_c_buf_p) = |
(yytext_ptr) + yy_amount_of_matched_text; |
yy_current_state = yy_get_previous_state( ); |
yy_cp = (yy_c_buf_p); |
yy_bp = (yytext_ptr) + YY_MORE_ADJ; |
goto yy_match; |
case EOB_ACT_LAST_MATCH: |
(yy_c_buf_p) = |
&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; |
yy_current_state = yy_get_previous_state( ); |
yy_cp = (yy_c_buf_p); |
yy_bp = (yytext_ptr) + YY_MORE_ADJ; |
goto yy_find_action; |
} |
break; |
} |
default: |
YY_FATAL_ERROR( |
"fatal flex scanner internal error--no action found" ); |
} /* end of action switch */ |
} /* end of scanning one token */ |
} /* end of yylex */ |
/* yy_get_next_buffer - try to read in a new buffer |
* |
* Returns a code representing an action: |
* EOB_ACT_LAST_MATCH - |
* EOB_ACT_CONTINUE_SCAN - continue scanning from current position |
* EOB_ACT_END_OF_FILE - end of file |
*/ |
static int yy_get_next_buffer (void) |
{ |
register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; |
register char *source = (yytext_ptr); |
register int number_to_move, i; |
int ret_val; |
if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) |
YY_FATAL_ERROR( |
"fatal flex scanner internal error--end of buffer missed" ); |
if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) |
{ /* Don't try to fill the buffer, so this is an EOF. */ |
if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) |
{ |
/* We matched a single character, the EOB, so |
* treat this as a final EOF. |
*/ |
return EOB_ACT_END_OF_FILE; |
} |
else |
{ |
/* We matched some text prior to the EOB, first |
* process it. |
*/ |
return EOB_ACT_LAST_MATCH; |
} |
} |
/* Try to read more data. */ |
/* First move last chars to start of buffer. */ |
number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; |
for ( i = 0; i < number_to_move; ++i ) |
*(dest++) = *(source++); |
if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) |
/* don't do the read, it's not guaranteed to return an EOF, |
* just force an EOF |
*/ |
YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; |
else |
{ |
int num_to_read = |
YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; |
while ( num_to_read <= 0 ) |
{ /* Not enough room in the buffer - grow it. */ |
/* just a shorter name for the current buffer */ |
YY_BUFFER_STATE b = YY_CURRENT_BUFFER; |
int yy_c_buf_p_offset = |
(int) ((yy_c_buf_p) - b->yy_ch_buf); |
if ( b->yy_is_our_buffer ) |
{ |
int new_size = b->yy_buf_size * 2; |
if ( new_size <= 0 ) |
b->yy_buf_size += b->yy_buf_size / 8; |
else |
b->yy_buf_size *= 2; |
b->yy_ch_buf = (char *) |
/* Include room in for 2 EOB chars. */ |
yyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); |
} |
else |
/* Can't grow it, we don't own it. */ |
b->yy_ch_buf = 0; |
if ( ! b->yy_ch_buf ) |
YY_FATAL_ERROR( |
"fatal error - scanner input buffer overflow" ); |
(yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; |
num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - |
number_to_move - 1; |
} |
if ( num_to_read > YY_READ_BUF_SIZE ) |
num_to_read = YY_READ_BUF_SIZE; |
/* Read in more data. */ |
YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), |
(yy_n_chars), num_to_read ); |
YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); |
} |
if ( (yy_n_chars) == 0 ) |
{ |
if ( number_to_move == YY_MORE_ADJ ) |
{ |
ret_val = EOB_ACT_END_OF_FILE; |
yyrestart(yyin ); |
} |
else |
{ |
ret_val = EOB_ACT_LAST_MATCH; |
YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = |
YY_BUFFER_EOF_PENDING; |
} |
} |
else |
ret_val = EOB_ACT_CONTINUE_SCAN; |
(yy_n_chars) += number_to_move; |
YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; |
YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; |
(yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; |
return ret_val; |
} |
/* yy_get_previous_state - get the state just before the EOB char was reached */ |
static yy_state_type yy_get_previous_state (void) |
{ |
register yy_state_type yy_current_state; |
register char *yy_cp; |
yy_current_state = (yy_start); |
for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) |
{ |
register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); |
if ( yy_accept[yy_current_state] ) |
{ |
(yy_last_accepting_state) = yy_current_state; |
(yy_last_accepting_cpos) = yy_cp; |
} |
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) |
{ |
yy_current_state = (int) yy_def[yy_current_state]; |
if ( yy_current_state >= 33 ) |
yy_c = yy_meta[(unsigned int) yy_c]; |
} |
yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; |
} |
return yy_current_state; |
} |
/* yy_try_NUL_trans - try to make a transition on the NUL character |
* |
* synopsis |
* next_state = yy_try_NUL_trans( current_state ); |
*/ |
static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) |
{ |
register int yy_is_jam; |
register char *yy_cp = (yy_c_buf_p); |
register YY_CHAR yy_c = 1; |
if ( yy_accept[yy_current_state] ) |
{ |
(yy_last_accepting_state) = yy_current_state; |
(yy_last_accepting_cpos) = yy_cp; |
} |
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) |
{ |
yy_current_state = (int) yy_def[yy_current_state]; |
if ( yy_current_state >= 33 ) |
yy_c = yy_meta[(unsigned int) yy_c]; |
} |
yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; |
yy_is_jam = (yy_current_state == 32); |
return yy_is_jam ? 0 : yy_current_state; |
} |
static void yyunput (int c, register char * yy_bp ) |
{ |
register char *yy_cp; |
yy_cp = (yy_c_buf_p); |
/* undo effects of setting up yytext */ |
*yy_cp = (yy_hold_char); |
if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) |
{ /* need to shift things up to make room */ |
/* +2 for EOB chars. */ |
register int number_to_move = (yy_n_chars) + 2; |
register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ |
YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; |
register char *source = |
&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; |
while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) |
*--dest = *--source; |
yy_cp += (int) (dest - source); |
yy_bp += (int) (dest - source); |
YY_CURRENT_BUFFER_LVALUE->yy_n_chars = |
(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; |
if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) |
YY_FATAL_ERROR( "flex scanner push-back overflow" ); |
} |
*--yy_cp = (char) c; |
(yytext_ptr) = yy_bp; |
(yy_hold_char) = *yy_cp; |
(yy_c_buf_p) = yy_cp; |
} |
#ifndef YY_NO_INPUT |
#ifdef __cplusplus |
static int yyinput (void) |
#else |
static int input (void) |
#endif |
{ |
int c; |
*(yy_c_buf_p) = (yy_hold_char); |
if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) |
{ |
/* yy_c_buf_p now points to the character we want to return. |
* If this occurs *before* the EOB characters, then it's a |
* valid NUL; if not, then we've hit the end of the buffer. |
*/ |
if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) |
/* This was really a NUL. */ |
*(yy_c_buf_p) = '\0'; |
else |
{ /* need more input */ |
int offset = (yy_c_buf_p) - (yytext_ptr); |
++(yy_c_buf_p); |
switch ( yy_get_next_buffer( ) ) |
{ |
case EOB_ACT_LAST_MATCH: |
/* This happens because yy_g_n_b() |
* sees that we've accumulated a |
* token and flags that we need to |
* try matching the token before |
* proceeding. But for input(), |
* there's no matching to consider. |
* So convert the EOB_ACT_LAST_MATCH |
* to EOB_ACT_END_OF_FILE. |
*/ |
/* Reset buffer status. */ |
yyrestart(yyin ); |
/*FALLTHROUGH*/ |
case EOB_ACT_END_OF_FILE: |
{ |
if ( yywrap( ) ) |
return EOF; |
if ( ! (yy_did_buffer_switch_on_eof) ) |
YY_NEW_FILE; |
#ifdef __cplusplus |
return yyinput(); |
#else |
return input(); |
#endif |
} |
case EOB_ACT_CONTINUE_SCAN: |
(yy_c_buf_p) = (yytext_ptr) + offset; |
break; |
} |
} |
} |
c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ |
*(yy_c_buf_p) = '\0'; /* preserve yytext */ |
(yy_hold_char) = *++(yy_c_buf_p); |
return c; |
} |
#endif /* ifndef YY_NO_INPUT */ |
/** Immediately switch to a different input stream. |
* @param input_file A readable stream. |
* |
* @note This function does not reset the start condition to @c INITIAL . |
*/ |
void yyrestart (FILE * input_file ) |
{ |
if ( ! YY_CURRENT_BUFFER ){ |
yyensure_buffer_stack (); |
YY_CURRENT_BUFFER_LVALUE = |
yy_create_buffer(yyin,YY_BUF_SIZE ); |
} |
yy_init_buffer(YY_CURRENT_BUFFER,input_file ); |
yy_load_buffer_state( ); |
} |
/** Switch to a different input buffer. |
* @param new_buffer The new input buffer. |
* |
*/ |
void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ) |
{ |
/* TODO. We should be able to replace this entire function body |
* with |
* yypop_buffer_state(); |
* yypush_buffer_state(new_buffer); |
*/ |
yyensure_buffer_stack (); |
if ( YY_CURRENT_BUFFER == new_buffer ) |
return; |
if ( YY_CURRENT_BUFFER ) |
{ |
/* Flush out information for old buffer. */ |
*(yy_c_buf_p) = (yy_hold_char); |
YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); |
YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); |
} |
YY_CURRENT_BUFFER_LVALUE = new_buffer; |
yy_load_buffer_state( ); |
/* We don't actually know whether we did this switch during |
* EOF (yywrap()) processing, but the only time this flag |
* is looked at is after yywrap() is called, so it's safe |
* to go ahead and always set it. |
*/ |
(yy_did_buffer_switch_on_eof) = 1; |
} |
static void yy_load_buffer_state (void) |
{ |
(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; |
(yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; |
yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; |
(yy_hold_char) = *(yy_c_buf_p); |
} |
/** Allocate and initialize an input buffer state. |
* @param file A readable stream. |
* @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. |
* |
* @return the allocated buffer state. |
*/ |
YY_BUFFER_STATE yy_create_buffer (FILE * file, int size ) |
{ |
YY_BUFFER_STATE b; |
b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); |
if ( ! b ) |
YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); |
b->yy_buf_size = size; |
/* yy_ch_buf has to be 2 characters longer than the size given because |
* we need to put in 2 end-of-buffer characters. |
*/ |
b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 ); |
if ( ! b->yy_ch_buf ) |
YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); |
b->yy_is_our_buffer = 1; |
yy_init_buffer(b,file ); |
return b; |
} |
/** Destroy the buffer. |
* @param b a buffer created with yy_create_buffer() |
* |
*/ |
void yy_delete_buffer (YY_BUFFER_STATE b ) |
{ |
if ( ! b ) |
return; |
if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ |
YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; |
if ( b->yy_is_our_buffer ) |
yyfree((void *) b->yy_ch_buf ); |
yyfree((void *) b ); |
} |
#ifndef _UNISTD_H /* assume unistd.h has isatty() for us */ |
#ifdef __cplusplus |
extern "C" { |
#endif |
#ifdef __THROW /* this is a gnuism */ |
extern int isatty (int ) __THROW; |
#else |
extern int isatty (int ); |
#endif |
#ifdef __cplusplus |
} |
#endif |
#endif |
/* Initializes or reinitializes a buffer. |
* This function is sometimes called more than once on the same buffer, |
* such as during a yyrestart() or at EOF. |
*/ |
static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file ) |
{ |
int oerrno = errno; |
yy_flush_buffer(b ); |
b->yy_input_file = file; |
b->yy_fill_buffer = 1; |
/* If b is the current buffer, then yy_init_buffer was _probably_ |
* called from yyrestart() or through yy_get_next_buffer. |
* In that case, we don't want to reset the lineno or column. |
*/ |
if (b != YY_CURRENT_BUFFER){ |
b->yy_bs_lineno = 1; |
b->yy_bs_column = 0; |
} |
b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; |
errno = oerrno; |
} |
/** Discard all buffered characters. On the next scan, YY_INPUT will be called. |
* @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. |
* |
*/ |
void yy_flush_buffer (YY_BUFFER_STATE b ) |
{ |
if ( ! b ) |
return; |
b->yy_n_chars = 0; |
/* We always need two end-of-buffer characters. The first causes |
* a transition to the end-of-buffer state. The second causes |
* a jam in that state. |
*/ |
b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; |
b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; |
b->yy_buf_pos = &b->yy_ch_buf[0]; |
b->yy_at_bol = 1; |
b->yy_buffer_status = YY_BUFFER_NEW; |
if ( b == YY_CURRENT_BUFFER ) |
yy_load_buffer_state( ); |
} |
/** Pushes the new state onto the stack. The new state becomes |
* the current state. This function will allocate the stack |
* if necessary. |
* @param new_buffer The new state. |
* |
*/ |
void yypush_buffer_state (YY_BUFFER_STATE new_buffer ) |
{ |
if (new_buffer == NULL) |
return; |
yyensure_buffer_stack(); |
/* This block is copied from yy_switch_to_buffer. */ |
if ( YY_CURRENT_BUFFER ) |
{ |
/* Flush out information for old buffer. */ |
*(yy_c_buf_p) = (yy_hold_char); |
YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); |
YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); |
} |
/* Only push if top exists. Otherwise, replace top. */ |
if (YY_CURRENT_BUFFER) |
(yy_buffer_stack_top)++; |
YY_CURRENT_BUFFER_LVALUE = new_buffer; |
/* copied from yy_switch_to_buffer. */ |
yy_load_buffer_state( ); |
(yy_did_buffer_switch_on_eof) = 1; |
} |
/** Removes and deletes the top of the stack, if present. |
* The next element becomes the new top. |
* |
*/ |
void yypop_buffer_state (void) |
{ |
if (!YY_CURRENT_BUFFER) |
return; |
yy_delete_buffer(YY_CURRENT_BUFFER ); |
YY_CURRENT_BUFFER_LVALUE = NULL; |
if ((yy_buffer_stack_top) > 0) |
--(yy_buffer_stack_top); |
if (YY_CURRENT_BUFFER) { |
yy_load_buffer_state( ); |
(yy_did_buffer_switch_on_eof) = 1; |
} |
} |
/* Allocates the stack if it does not exist. |
* Guarantees space for at least one push. |
*/ |
static void yyensure_buffer_stack (void) |
{ |
int num_to_alloc; |
if (!(yy_buffer_stack)) { |
/* First allocation is just for 2 elements, since we don't know if this |
* scanner will even need a stack. We use 2 instead of 1 to avoid an |
* immediate realloc on the next call. |
*/ |
num_to_alloc = 1; |
(yy_buffer_stack) = (struct yy_buffer_state**)yyalloc |
(num_to_alloc * sizeof(struct yy_buffer_state*) |
); |
memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); |
(yy_buffer_stack_max) = num_to_alloc; |
(yy_buffer_stack_top) = 0; |
return; |
} |
if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ |
/* Increase the buffer to prepare for a possible push. */ |
int grow_size = 8 /* arbitrary grow size */; |
num_to_alloc = (yy_buffer_stack_max) + grow_size; |
(yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc |
((yy_buffer_stack), |
num_to_alloc * sizeof(struct yy_buffer_state*) |
); |
/* zero only the new slots.*/ |
memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); |
(yy_buffer_stack_max) = num_to_alloc; |
} |
} |
/** Setup the input buffer state to scan directly from a user-specified character buffer. |
* @param base the character buffer |
* @param size the size in bytes of the character buffer |
* |
* @return the newly allocated buffer state object. |
*/ |
YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size ) |
{ |
YY_BUFFER_STATE b; |
if ( size < 2 || |
base[size-2] != YY_END_OF_BUFFER_CHAR || |
base[size-1] != YY_END_OF_BUFFER_CHAR ) |
/* They forgot to leave room for the EOB's. */ |
return 0; |
b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); |
if ( ! b ) |
YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); |
b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ |
b->yy_buf_pos = b->yy_ch_buf = base; |
b->yy_is_our_buffer = 0; |
b->yy_input_file = 0; |
b->yy_n_chars = b->yy_buf_size; |
b->yy_is_interactive = 0; |
b->yy_at_bol = 1; |
b->yy_fill_buffer = 0; |
b->yy_buffer_status = YY_BUFFER_NEW; |
yy_switch_to_buffer(b ); |
return b; |
} |
/** Setup the input buffer state to scan a string. The next call to yylex() will |
* scan from a @e copy of @a str. |
* @param str a NUL-terminated string to scan |
* |
* @return the newly allocated buffer state object. |
* @note If you want to scan bytes that may contain NUL values, then use |
* yy_scan_bytes() instead. |
*/ |
YY_BUFFER_STATE yy_scan_string (yyconst char * yystr ) |
{ |
return yy_scan_bytes(yystr,strlen(yystr) ); |
} |
/** Setup the input buffer state to scan the given bytes. The next call to yylex() will |
* scan from a @e copy of @a bytes. |
* @param bytes the byte buffer to scan |
* @param len the number of bytes in the buffer pointed to by @a bytes. |
* |
* @return the newly allocated buffer state object. |
*/ |
YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, int _yybytes_len ) |
{ |
YY_BUFFER_STATE b; |
char *buf; |
yy_size_t n; |
int i; |
/* Get memory for full buffer, including space for trailing EOB's. */ |
n = _yybytes_len + 2; |
buf = (char *) yyalloc(n ); |
if ( ! buf ) |
YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); |
for ( i = 0; i < _yybytes_len; ++i ) |
buf[i] = yybytes[i]; |
buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; |
b = yy_scan_buffer(buf,n ); |
if ( ! b ) |
YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); |
/* It's okay to grow etc. this buffer, and we should throw it |
* away when we're done. |
*/ |
b->yy_is_our_buffer = 1; |
return b; |
} |
#ifndef YY_EXIT_FAILURE |
#define YY_EXIT_FAILURE 2 |
#endif |
static void yy_fatal_error (yyconst char* msg ) |
{ |
(void) fprintf( stderr, "%s\n", msg ); |
exit( YY_EXIT_FAILURE ); |
} |
/* Redefine yyless() so it works in section 3 code. */ |
#undef yyless |
#define yyless(n) \ |
do \ |
{ \ |
/* Undo effects of setting up yytext. */ \ |
int yyless_macro_arg = (n); \ |
YY_LESS_LINENO(yyless_macro_arg);\ |
yytext[yyleng] = (yy_hold_char); \ |
(yy_c_buf_p) = yytext + yyless_macro_arg; \ |
(yy_hold_char) = *(yy_c_buf_p); \ |
*(yy_c_buf_p) = '\0'; \ |
yyleng = yyless_macro_arg; \ |
} \ |
while ( 0 ) |
/* Accessor methods (get/set functions) to struct members. */ |
/** Get the current line number. |
* |
*/ |
int yyget_lineno (void) |
{ |
return yylineno; |
} |
/** Get the input stream. |
* |
*/ |
FILE *yyget_in (void) |
{ |
return yyin; |
} |
/** Get the output stream. |
* |
*/ |
FILE *yyget_out (void) |
{ |
return yyout; |
} |
/** Get the length of the current token. |
* |
*/ |
int yyget_leng (void) |
{ |
return yyleng; |
} |
/** Get the current token. |
* |
*/ |
char *yyget_text (void) |
{ |
return yytext; |
} |
/** Set the current line number. |
* @param line_number |
* |
*/ |
void yyset_lineno (int line_number ) |
{ |
yylineno = line_number; |
} |
/** Set the input stream. This does not discard the current |
* input buffer. |
* @param in_str A readable stream. |
* |
* @see yy_switch_to_buffer |
*/ |
void yyset_in (FILE * in_str ) |
{ |
yyin = in_str ; |
} |
void yyset_out (FILE * out_str ) |
{ |
yyout = out_str ; |
} |
int yyget_debug (void) |
{ |
return yy_flex_debug; |
} |
void yyset_debug (int bdebug ) |
{ |
yy_flex_debug = bdebug ; |
} |
static int yy_init_globals (void) |
{ |
/* Initialization is the same as for the non-reentrant scanner. |
* This function is called from yylex_destroy(), so don't allocate here. |
*/ |
(yy_buffer_stack) = 0; |
(yy_buffer_stack_top) = 0; |
(yy_buffer_stack_max) = 0; |
(yy_c_buf_p) = (char *) 0; |
(yy_init) = 0; |
(yy_start) = 0; |
/* Defined in main.c */ |
#ifdef YY_STDINIT |
yyin = stdin; |
yyout = stdout; |
#else |
yyin = (FILE *) 0; |
yyout = (FILE *) 0; |
#endif |
/* For future reference: Set errno on error, since we are called by |
* yylex_init() |
*/ |
return 0; |
} |
/* yylex_destroy is for both reentrant and non-reentrant scanners. */ |
int yylex_destroy (void) |
{ |
/* Pop the buffer stack, destroying each element. */ |
while(YY_CURRENT_BUFFER){ |
yy_delete_buffer(YY_CURRENT_BUFFER ); |
YY_CURRENT_BUFFER_LVALUE = NULL; |
yypop_buffer_state(); |
} |
/* Destroy the stack itself. */ |
yyfree((yy_buffer_stack) ); |
(yy_buffer_stack) = NULL; |
/* Reset the globals. This is important in a non-reentrant scanner so the next time |
* yylex() is called, initialization will occur. */ |
yy_init_globals( ); |
return 0; |
} |
/* |
* Internal utility routines. |
*/ |
#ifndef yytext_ptr |
static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) |
{ |
register int i; |
for ( i = 0; i < n; ++i ) |
s1[i] = s2[i]; |
} |
#endif |
#ifdef YY_NEED_STRLEN |
static int yy_flex_strlen (yyconst char * s ) |
{ |
register int n; |
for ( n = 0; s[n]; ++n ) |
; |
return n; |
} |
#endif |
void *yyalloc (yy_size_t size ) |
{ |
return (void *) malloc( size ); |
} |
void *yyrealloc (void * ptr, yy_size_t size ) |
{ |
/* The cast to (char *) in the following accommodates both |
* implementations that use char* generic pointers, and those |
* that use void* generic pointers. It works with the latter |
* because both ANSI C and C++ allow castless assignment from |
* any pointer type to void*, and deal with argument conversions |
* as though doing an assignment. |
*/ |
return (void *) realloc( (char *) ptr, size ); |
} |
void yyfree (void * ptr ) |
{ |
free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ |
} |
#define YYTABLES_NAME "yytables" |
#line 88 "arith_lex.l" |
void |
arith_lex_reset() { |
#ifdef YY_NEW_FILE |
YY_NEW_FILE; |
#endif |
} |
/tags/0.3.0/uspace/app/ash/nodetypes |
---|
0,0 → 1,147 |
# $NetBSD: nodetypes,v 1.9 1999/02/04 16:17:39 christos Exp $ |
# Copyright (c) 1991, 1993 |
# The Regents of the University of California. All rights reserved. |
# |
# This code is derived from software contributed to Berkeley by |
# Kenneth Almquist. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# 1. Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# 2. Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# 3. All advertising materials mentioning features or use of this software |
# must display the following acknowledgement: |
# This product includes software developed by the University of |
# California, Berkeley and its contributors. |
# 4. Neither the name of the University nor the names of its contributors |
# may be used to endorse or promote products derived from this software |
# without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
# SUCH DAMAGE. |
# |
# @(#)nodetypes 8.2 (Berkeley) 5/4/95 |
# This file describes the nodes used in parse trees. Unindented lines |
# contain a node type followed by a structure tag. Subsequent indented |
# lines specify the fields of the structure. Several node types can share |
# the same structure, in which case the fields of the structure should be |
# specified only once. |
# |
# A field of a structure is described by the name of the field followed |
# by a type. The currently implemented types are: |
# nodeptr - a pointer to a node |
# nodelist - a pointer to a list of nodes |
# string - a pointer to a nul terminated string |
# int - an integer |
# other - any type that can be copied by assignment |
# temp - a field that doesn't have to be copied when the node is copied |
# The last two types should be followed by the text of a C declaration for |
# the field. |
NSEMI nbinary # two commands separated by a semicolon |
type int |
ch1 nodeptr # the first child |
ch2 nodeptr # the second child |
NCMD ncmd # a simple command |
type int |
backgnd int # set to run command in background |
args nodeptr # the arguments |
redirect nodeptr # list of file redirections |
NPIPE npipe # a pipeline |
type int |
backgnd int # set to run pipeline in background |
cmdlist nodelist # the commands in the pipeline |
NREDIR nredir # redirection (of a compex command) |
type int |
n nodeptr # the command |
redirect nodeptr # list of file redirections |
NBACKGND nredir # run command in background |
NSUBSHELL nredir # run command in a subshell |
NAND nbinary # the && operator |
NOR nbinary # the || operator |
NIF nif # the if statement. Elif clauses are handled |
type int # using multiple if nodes. |
test nodeptr # if test |
ifpart nodeptr # then ifpart |
elsepart nodeptr # else elsepart |
NWHILE nbinary # the while statement. First child is the test |
NUNTIL nbinary # the until statement |
NFOR nfor # the for statement |
type int |
args nodeptr # for var in args |
body nodeptr # do body; done |
var string # the for variable |
NCASE ncase # a case statement |
type int |
expr nodeptr # the word to switch on |
cases nodeptr # the list of cases (NCLIST nodes) |
NCLIST nclist # a case |
type int |
next nodeptr # the next case in list |
pattern nodeptr # list of patterns for this case |
body nodeptr # code to execute for this case |
NDEFUN narg # define a function. The "next" field contains |
# the body of the function. |
NARG narg # represents a word |
type int |
next nodeptr # next word in list |
text string # the text of the word |
backquote nodelist # list of commands in back quotes |
NTO nfile # fd> fname |
NFROM nfile # fd< fname |
NFROMTO nfile # fd<> fname |
NAPPEND nfile # fd>> fname |
NTOOV nfile # fd>| fname |
type int |
next nodeptr # next redirection in list |
fd int # file descriptor being redirected |
fname nodeptr # file name, in a NARG node |
expfname temp char *expfname # actual file name |
NTOFD ndup # fd<&dupfd |
NFROMFD ndup # fd>&dupfd |
type int |
next nodeptr # next redirection in list |
fd int # file descriptor being redirected |
dupfd int # file descriptor to duplicate |
vname nodeptr # file name if fd>&$var |
NHERE nhere # fd<<\! |
NXHERE nhere # fd<<! |
type int |
next nodeptr # next redirection in list |
fd int # file descriptor being redirected |
doc nodeptr # input to command (NARG node) |
NNOT nnot # ! command (actually pipeline) |
type int |
com nodeptr |
/tags/0.3.0/uspace/app/ash/error.c |
---|
0,0 → 1,301 |
/* $NetBSD: error.c,v 1.23 2000/07/03 03:26:19 matt Exp $ */ |
/*- |
* Copyright (c) 1991, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Kenneth Almquist. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
*/ |
#include <sys/cdefs.h> |
#ifndef lint |
#if 0 |
static char sccsid[] = "@(#)error.c 8.2 (Berkeley) 5/4/95"; |
#else |
__RCSID("$NetBSD: error.c,v 1.23 2000/07/03 03:26:19 matt Exp $"); |
#endif |
#endif /* not lint */ |
/* |
* Errors and exceptions. |
*/ |
#include <signal.h> |
#include <stdlib.h> |
#include <unistd.h> |
#include <errno.h> |
#include "shell.h" |
#include "main.h" |
#include "options.h" |
#include "output.h" |
#include "error.h" |
#include "show.h" |
/* |
* Code to handle exceptions in C. |
*/ |
struct jmploc *handler; |
int exception; |
volatile int suppressint; |
volatile int intpending; |
char *commandname; |
static void exverror (int, const char *, va_list) |
__attribute__((__noreturn__)); |
/* |
* Called to raise an exception. Since C doesn't include exceptions, we |
* just do a longjmp to the exception handler. The type of exception is |
* stored in the global variable "exception". |
*/ |
void |
exraise(e) |
int e; |
{ |
if (handler == NULL) |
abort(); |
exception = e; |
longjmp(handler->loc, 1); |
} |
/* |
* Called from trap.c when a SIGINT is received. (If the user specifies |
* that SIGINT is to be trapped or ignored using the trap builtin, then |
* this routine is not called.) Suppressint is nonzero when interrupts |
* are held using the INTOFF macro. The call to _exit is necessary because |
* there is a short period after a fork before the signal handlers are |
* set to the appropriate value for the child. (The test for iflag is |
* just defensive programming.) |
*/ |
void |
onint() { |
sigset_t sigset; |
if (suppressint) { |
intpending++; |
return; |
} |
intpending = 0; |
sigemptyset(&sigset); |
sigprocmask(SIG_SETMASK, &sigset, NULL); |
if (rootshell && iflag) |
exraise(EXINT); |
else { |
signal(SIGINT, SIG_DFL); |
raise(SIGINT); |
} |
/* NOTREACHED */ |
} |
/* |
* Exverror is called to raise the error exception. If the first argument |
* is not NULL then error prints an error message using printf style |
* formatting. It then raises the error exception. |
*/ |
static void |
exverror(cond, msg, ap) |
int cond; |
const char *msg; |
va_list ap; |
{ |
CLEAR_PENDING_INT; |
INTOFF; |
#ifdef DEBUG |
if (msg) |
TRACE(("exverror(%d, \"%s\") pid=%d\n", cond, msg, getpid())); |
else |
TRACE(("exverror(%d, NULL) pid=%d\n", cond, getpid())); |
#endif |
if (msg) { |
if (commandname) |
outfmt(&errout, "%s: ", commandname); |
doformat(&errout, msg, ap); |
out2c('\n'); |
} |
flushall(); |
exraise(cond); |
/* NOTREACHED */ |
} |
#ifdef __STDC__ |
void |
error(const char *msg, ...) |
#else |
void |
error(va_alist) |
va_dcl |
#endif |
{ |
#ifndef __STDC__ |
const char *msg; |
#endif |
va_list ap; |
#ifdef __STDC__ |
va_start(ap, msg); |
#else |
va_start(ap); |
msg = va_arg(ap, const char *); |
#endif |
exverror(EXERROR, msg, ap); |
/* NOTREACHED */ |
va_end(ap); |
} |
#ifdef __STDC__ |
void |
exerror(int cond, const char *msg, ...) |
#else |
void |
exerror(va_alist) |
va_dcl |
#endif |
{ |
#ifndef __STDC__ |
int cond; |
const char *msg; |
#endif |
va_list ap; |
#ifdef __STDC__ |
va_start(ap, msg); |
#else |
va_start(ap); |
cond = va_arg(ap, int); |
msg = va_arg(ap, const char *); |
#endif |
exverror(cond, msg, ap); |
/* NOTREACHED */ |
va_end(ap); |
} |
/* |
* Table of error messages. |
*/ |
struct errname { |
short errcode; /* error number */ |
short action; /* operation which encountered the error */ |
const char *msg; /* text describing the error */ |
}; |
#define ALL (E_OPEN|E_CREAT|E_EXEC) |
STATIC const struct errname errormsg[] = { |
{ EINTR, ALL, "interrupted" }, |
{ EACCES, ALL, "permission denied" }, |
{ EIO, ALL, "I/O error" }, |
{ ENOENT, E_OPEN, "no such file" }, |
{ ENOENT, E_CREAT,"directory nonexistent" }, |
{ ENOENT, E_EXEC, "not found" }, |
{ ENOTDIR, E_OPEN, "no such file" }, |
{ ENOTDIR, E_CREAT,"directory nonexistent" }, |
{ ENOTDIR, E_EXEC, "not found" }, |
{ EISDIR, ALL, "is a directory" }, |
{ EEXIST, E_CREAT,"file exists" }, |
#ifdef notdef |
{ EMFILE, ALL, "too many open files" }, |
#endif |
{ ENFILE, ALL, "file table overflow" }, |
{ ENOSPC, ALL, "file system full" }, |
#ifdef EDQUOT |
{ EDQUOT, ALL, "disk quota exceeded" }, |
#endif |
#ifdef ENOSR |
{ ENOSR, ALL, "no streams resources" }, |
#endif |
{ ENXIO, ALL, "no such device or address" }, |
{ EROFS, ALL, "read-only file system" }, |
{ ETXTBSY, ALL, "text busy" }, |
#ifdef SYSV |
{ EAGAIN, E_EXEC, "not enough memory" }, |
#endif |
{ ENOMEM, ALL, "not enough memory" }, |
#ifdef ENOLINK |
{ ENOLINK, ALL, "remote access failed" }, |
#endif |
#ifdef EMULTIHOP |
{ EMULTIHOP, ALL, "remote access failed" }, |
#endif |
#ifdef ECOMM |
{ ECOMM, ALL, "remote access failed" }, |
#endif |
#ifdef ESTALE |
{ ESTALE, ALL, "remote access failed" }, |
#endif |
#ifdef ETIMEDOUT |
{ ETIMEDOUT, ALL, "remote access failed" }, |
#endif |
#ifdef ELOOP |
{ ELOOP, ALL, "symbolic link loop" }, |
#endif |
{ E2BIG, E_EXEC, "argument list too long" }, |
#ifdef ELIBACC |
{ ELIBACC, E_EXEC, "shared library missing" }, |
#endif |
{ 0, 0, NULL }, |
}; |
/* |
* Return a string describing an error. The returned string may be a |
* pointer to a static buffer that will be overwritten on the next call. |
* Action describes the operation that got the error. |
*/ |
const char * |
errmsg(e, action) |
int e; |
int action; |
{ |
struct errname const *ep; |
static char buf[12]; |
for (ep = errormsg ; ep->errcode ; ep++) { |
if (ep->errcode == e && (ep->action & action) != 0) |
return ep->msg; |
} |
fmtstr(buf, sizeof buf, "error %d", e); |
return buf; |
} |
/tags/0.3.0/uspace/app/ash/error.h |
---|
0,0 → 1,109 |
/* $NetBSD: error.h,v 1.13 1999/07/09 03:05:49 christos Exp $ */ |
/*- |
* Copyright (c) 1991, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Kenneth Almquist. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
* |
* @(#)error.h 8.2 (Berkeley) 5/4/95 |
*/ |
/* |
* Types of operations (passed to the errmsg routine). |
*/ |
#define E_OPEN 01 /* opening a file */ |
#define E_CREAT 02 /* creating a file */ |
#define E_EXEC 04 /* executing a program */ |
/* |
* We enclose jmp_buf in a structure so that we can declare pointers to |
* jump locations. The global variable handler contains the location to |
* jump to when an exception occurs, and the global variable exception |
* contains a code identifying the exeception. To implement nested |
* exception handlers, the user should save the value of handler on entry |
* to an inner scope, set handler to point to a jmploc structure for the |
* inner scope, and restore handler on exit from the scope. |
*/ |
#include <setjmp.h> |
#include "fake.h" |
struct jmploc { |
jmp_buf loc; |
}; |
extern struct jmploc *handler; |
extern int exception; |
/* exceptions */ |
#define EXINT 0 /* SIGINT received */ |
#define EXERROR 1 /* a generic error */ |
#define EXSHELLPROC 2 /* execute a shell procedure */ |
#define EXEXEC 3 /* command execution failed */ |
/* |
* These macros allow the user to suspend the handling of interrupt signals |
* over a period of time. This is similar to SIGHOLD to or sigblock, but |
* much more efficient and portable. (But hacking the kernel is so much |
* more fun than worrying about efficiency and portability. :-)) |
*/ |
extern volatile int suppressint; |
extern volatile int intpending; |
extern char *commandname; /* name of command--printed on error */ |
#define INTOFF suppressint++ |
#define INTON { if (--suppressint == 0 && intpending) onint(); } |
#define FORCEINTON {suppressint = 0; if (intpending) onint();} |
#define CLEAR_PENDING_INT intpending = 0 |
#define int_pending() intpending |
void exraise (int) __attribute__((__noreturn__)); |
void onint (void); |
void error (const char *, ...) __attribute__((__noreturn__)); |
void exerror (int, const char *, ...) __attribute__((__noreturn__)); |
const char *errmsg (int, int); |
/* |
* BSD setjmp saves the signal mask, which violates ANSI C and takes time, |
* so we use _setjmp instead. |
*/ |
#if defined(BSD) && !defined(__SVR4) && !defined(__GLIBC__) |
#define setjmp(jmploc) _setjmp(jmploc) |
#define longjmp(jmploc, val) _longjmp(jmploc, val) |
#endif |
/tags/0.3.0/uspace/app/ash/machdep.h |
---|
0,0 → 1,53 |
/* $NetBSD: machdep.h,v 1.8 1995/05/11 21:29:21 christos Exp $ */ |
/*- |
* Copyright (c) 1991, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Kenneth Almquist. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
* |
* @(#)machdep.h 8.2 (Berkeley) 5/4/95 |
*/ |
/* |
* Most machines require the value returned from malloc to be aligned |
* in some way. The following macro will get this right on many machines. |
*/ |
#ifndef ALIGN |
union align { |
int i; |
char *cp; |
}; |
#define ALIGN(nbytes) (((nbytes) + sizeof(union align) - 1) & ~(sizeof(union align) - 1)) |
#endif |
/tags/0.3.0/uspace/app/ash/TOUR |
---|
0,0 → 1,357 |
# $NetBSD: TOUR,v 1.8 1996/10/16 14:24:56 christos Exp $ |
# @(#)TOUR 8.1 (Berkeley) 5/31/93 |
NOTE -- This is the original TOUR paper distributed with ash and |
does not represent the current state of the shell. It is provided anyway |
since it provides helpful information for how the shell is structured, |
but be warned that things have changed -- the current shell is |
still under development. |
================================================================ |
A Tour through Ash |
Copyright 1989 by Kenneth Almquist. |
DIRECTORIES: The subdirectory bltin contains commands which can |
be compiled stand-alone. The rest of the source is in the main |
ash directory. |
SOURCE CODE GENERATORS: Files whose names begin with "mk" are |
programs that generate source code. A complete list of these |
programs is: |
program intput files generates |
------- ------------ --------- |
mkbuiltins builtins builtins.h builtins.c |
mkinit *.c init.c |
mknodes nodetypes nodes.h nodes.c |
mksignames - signames.h signames.c |
mksyntax - syntax.h syntax.c |
mktokens - token.h |
bltin/mkexpr unary_op binary_op operators.h operators.c |
There are undoubtedly too many of these. Mkinit searches all the |
C source files for entries looking like: |
INIT { |
x = 1; /* executed during initialization */ |
} |
RESET { |
x = 2; /* executed when the shell does a longjmp |
back to the main command loop */ |
} |
SHELLPROC { |
x = 3; /* executed when the shell runs a shell procedure */ |
} |
It pulls this code out into routines which are when particular |
events occur. The intent is to improve modularity by isolating |
the information about which modules need to be explicitly |
initialized/reset within the modules themselves. |
Mkinit recognizes several constructs for placing declarations in |
the init.c file. |
INCLUDE "file.h" |
includes a file. The storage class MKINIT makes a declaration |
available in the init.c file, for example: |
MKINIT int funcnest; /* depth of function calls */ |
MKINIT alone on a line introduces a structure or union declara- |
tion: |
MKINIT |
struct redirtab { |
short renamed[10]; |
}; |
Preprocessor #define statements are copied to init.c without any |
special action to request this. |
INDENTATION: The ash source is indented in multiples of six |
spaces. The only study that I have heard of on the subject con- |
cluded that the optimal amount to indent is in the range of four |
to six spaces. I use six spaces since it is not too big a jump |
from the widely used eight spaces. If you really hate six space |
indentation, use the adjind (source included) program to change |
it to something else. |
EXCEPTIONS: Code for dealing with exceptions appears in |
exceptions.c. The C language doesn't include exception handling, |
so I implement it using setjmp and longjmp. The global variable |
exception contains the type of exception. EXERROR is raised by |
calling error. EXINT is an interrupt. EXSHELLPROC is an excep- |
tion which is raised when a shell procedure is invoked. The pur- |
pose of EXSHELLPROC is to perform the cleanup actions associated |
with other exceptions. After these cleanup actions, the shell |
can interpret a shell procedure itself without exec'ing a new |
copy of the shell. |
INTERRUPTS: In an interactive shell, an interrupt will cause an |
EXINT exception to return to the main command loop. (Exception: |
EXINT is not raised if the user traps interrupts using the trap |
command.) The INTOFF and INTON macros (defined in exception.h) |
provide uninterruptable critical sections. Between the execution |
of INTOFF and the execution of INTON, interrupt signals will be |
held for later delivery. INTOFF and INTON can be nested. |
MEMALLOC.C: Memalloc.c defines versions of malloc and realloc |
which call error when there is no memory left. It also defines a |
stack oriented memory allocation scheme. Allocating off a stack |
is probably more efficient than allocation using malloc, but the |
big advantage is that when an exception occurs all we have to do |
to free up the memory in use at the time of the exception is to |
restore the stack pointer. The stack is implemented using a |
linked list of blocks. |
STPUTC: If the stack were contiguous, it would be easy to store |
strings on the stack without knowing in advance how long the |
string was going to be: |
p = stackptr; |
*p++ = c; /* repeated as many times as needed */ |
stackptr = p; |
The folloing three macros (defined in memalloc.h) perform these |
operations, but grow the stack if you run off the end: |
STARTSTACKSTR(p); |
STPUTC(c, p); /* repeated as many times as needed */ |
grabstackstr(p); |
We now start a top-down look at the code: |
MAIN.C: The main routine performs some initialization, executes |
the user's profile if necessary, and calls cmdloop. Cmdloop is |
repeatedly parses and executes commands. |
OPTIONS.C: This file contains the option processing code. It is |
called from main to parse the shell arguments when the shell is |
invoked, and it also contains the set builtin. The -i and -j op- |
tions (the latter turns on job control) require changes in signal |
handling. The routines setjobctl (in jobs.c) and setinteractive |
(in trap.c) are called to handle changes to these options. |
PARSING: The parser code is all in parser.c. A recursive des- |
cent parser is used. Syntax tables (generated by mksyntax) are |
used to classify characters during lexical analysis. There are |
three tables: one for normal use, one for use when inside single |
quotes, and one for use when inside double quotes. The tables |
are machine dependent because they are indexed by character vari- |
ables and the range of a char varies from machine to machine. |
PARSE OUTPUT: The output of the parser consists of a tree of |
nodes. The various types of nodes are defined in the file node- |
types. |
Nodes of type NARG are used to represent both words and the con- |
tents of here documents. An early version of ash kept the con- |
tents of here documents in temporary files, but keeping here do- |
cuments in memory typically results in significantly better per- |
formance. It would have been nice to make it an option to use |
temporary files for here documents, for the benefit of small |
machines, but the code to keep track of when to delete the tem- |
porary files was complex and I never fixed all the bugs in it. |
(AT&T has been maintaining the Bourne shell for more than ten |
years, and to the best of my knowledge they still haven't gotten |
it to handle temporary files correctly in obscure cases.) |
The text field of a NARG structure points to the text of the |
word. The text consists of ordinary characters and a number of |
special codes defined in parser.h. The special codes are: |
CTLVAR Variable substitution |
CTLENDVAR End of variable substitution |
CTLBACKQ Command substitution |
CTLBACKQ|CTLQUOTE Command substitution inside double quotes |
CTLESC Escape next character |
A variable substitution contains the following elements: |
CTLVAR type name '=' [ alternative-text CTLENDVAR ] |
The type field is a single character specifying the type of sub- |
stitution. The possible types are: |
VSNORMAL $var |
VSMINUS ${var-text} |
VSMINUS|VSNUL ${var:-text} |
VSPLUS ${var+text} |
VSPLUS|VSNUL ${var:+text} |
VSQUESTION ${var?text} |
VSQUESTION|VSNUL ${var:?text} |
VSASSIGN ${var=text} |
VSASSIGN|VSNUL ${var=text} |
In addition, the type field will have the VSQUOTE flag set if the |
variable is enclosed in double quotes. The name of the variable |
comes next, terminated by an equals sign. If the type is not |
VSNORMAL, then the text field in the substitution follows, ter- |
minated by a CTLENDVAR byte. |
Commands in back quotes are parsed and stored in a linked list. |
The locations of these commands in the string are indicated by |
CTLBACKQ and CTLBACKQ+CTLQUOTE characters, depending upon whether |
the back quotes were enclosed in double quotes. |
The character CTLESC escapes the next character, so that in case |
any of the CTL characters mentioned above appear in the input, |
they can be passed through transparently. CTLESC is also used to |
escape '*', '?', '[', and '!' characters which were quoted by the |
user and thus should not be used for file name generation. |
CTLESC characters have proved to be particularly tricky to get |
right. In the case of here documents which are not subject to |
variable and command substitution, the parser doesn't insert any |
CTLESC characters to begin with (so the contents of the text |
field can be written without any processing). Other here docu- |
ments, and words which are not subject to splitting and file name |
generation, have the CTLESC characters removed during the vari- |
able and command substitution phase. Words which are subject |
splitting and file name generation have the CTLESC characters re- |
moved as part of the file name phase. |
EXECUTION: Command execution is handled by the following files: |
eval.c The top level routines. |
redir.c Code to handle redirection of input and output. |
jobs.c Code to handle forking, waiting, and job control. |
exec.c Code to to path searches and the actual exec sys call. |
expand.c Code to evaluate arguments. |
var.c Maintains the variable symbol table. Called from expand.c. |
EVAL.C: Evaltree recursively executes a parse tree. The exit |
status is returned in the global variable exitstatus. The alter- |
native entry evalbackcmd is called to evaluate commands in back |
quotes. It saves the result in memory if the command is a buil- |
tin; otherwise it forks off a child to execute the command and |
connects the standard output of the child to a pipe. |
JOBS.C: To create a process, you call makejob to return a job |
structure, and then call forkshell (passing the job structure as |
an argument) to create the process. Waitforjob waits for a job |
to complete. These routines take care of process groups if job |
control is defined. |
REDIR.C: Ash allows file descriptors to be redirected and then |
restored without forking off a child process. This is accom- |
plished by duplicating the original file descriptors. The redir- |
tab structure records where the file descriptors have be dupli- |
cated to. |
EXEC.C: The routine find_command locates a command, and enters |
the command in the hash table if it is not already there. The |
third argument specifies whether it is to print an error message |
if the command is not found. (When a pipeline is set up, |
find_command is called for all the commands in the pipeline be- |
fore any forking is done, so to get the commands into the hash |
table of the parent process. But to make command hashing as |
transparent as possible, we silently ignore errors at that point |
and only print error messages if the command cannot be found |
later.) |
The routine shellexec is the interface to the exec system call. |
EXPAND.C: Arguments are processed in three passes. The first |
(performed by the routine argstr) performs variable and command |
substitution. The second (ifsbreakup) performs word splitting |
and the third (expandmeta) performs file name generation. If the |
"/u" directory is simulated, then when "/u/username" is replaced |
by the user's home directory, the flag "didudir" is set. This |
tells the cd command that it should print out the directory name, |
just as it would if the "/u" directory were implemented using |
symbolic links. |
VAR.C: Variables are stored in a hash table. Probably we should |
switch to extensible hashing. The variable name is stored in the |
same string as the value (using the format "name=value") so that |
no string copying is needed to create the environment of a com- |
mand. Variables which the shell references internally are preal- |
located so that the shell can reference the values of these vari- |
ables without doing a lookup. |
When a program is run, the code in eval.c sticks any environment |
variables which precede the command (as in "PATH=xxx command") in |
the variable table as the simplest way to strip duplicates, and |
then calls "environment" to get the value of the environment. |
There are two consequences of this. First, if an assignment to |
PATH precedes the command, the value of PATH before the assign- |
ment must be remembered and passed to shellexec. Second, if the |
program turns out to be a shell procedure, the strings from the |
environment variables which preceded the command must be pulled |
out of the table and replaced with strings obtained from malloc, |
since the former will automatically be freed when the stack (see |
the entry on memalloc.c) is emptied. |
BUILTIN COMMANDS: The procedures for handling these are scat- |
tered throughout the code, depending on which location appears |
most appropriate. They can be recognized because their names al- |
ways end in "cmd". The mapping from names to procedures is |
specified in the file builtins, which is processed by the mkbuil- |
tins command. |
A builtin command is invoked with argc and argv set up like a |
normal program. A builtin command is allowed to overwrite its |
arguments. Builtin routines can call nextopt to do option pars- |
ing. This is kind of like getopt, but you don't pass argc and |
argv to it. Builtin routines can also call error. This routine |
normally terminates the shell (or returns to the main command |
loop if the shell is interactive), but when called from a builtin |
command it causes the builtin command to terminate with an exit |
status of 2. |
The directory bltins contains commands which can be compiled in- |
dependently but can also be built into the shell for efficiency |
reasons. The makefile in this directory compiles these programs |
in the normal fashion (so that they can be run regardless of |
whether the invoker is ash), but also creates a library named |
bltinlib.a which can be linked with ash. The header file bltin.h |
takes care of most of the differences between the ash and the |
stand-alone environment. The user should call the main routine |
"main", and #define main to be the name of the routine to use |
when the program is linked into ash. This #define should appear |
before bltin.h is included; bltin.h will #undef main if the pro- |
gram is to be compiled stand-alone. |
CD.C: This file defines the cd and pwd builtins. The pwd com- |
mand runs /bin/pwd the first time it is invoked (unless the user |
has already done a cd to an absolute pathname), but then |
remembers the current directory and updates it when the cd com- |
mand is run, so subsequent pwd commands run very fast. The main |
complication in the cd command is in the docd command, which |
resolves symbolic links into actual names and informs the user |
where the user ended up if he crossed a symbolic link. |
SIGNALS: Trap.c implements the trap command. The routine set- |
signal figures out what action should be taken when a signal is |
received and invokes the signal system call to set the signal ac- |
tion appropriately. When a signal that a user has set a trap for |
is caught, the routine "onsig" sets a flag. The routine dotrap |
is called at appropriate points to actually handle the signal. |
When an interrupt is caught and no trap has been set for that |
signal, the routine "onint" in error.c is called. |
OUTPUT: Ash uses it's own output routines. There are three out- |
put structures allocated. "Output" represents the standard out- |
put, "errout" the standard error, and "memout" contains output |
which is to be stored in memory. This last is used when a buil- |
tin command appears in backquotes, to allow its output to be col- |
lected without doing any I/O through the UNIX operating system. |
The variables out1 and out2 normally point to output and errout, |
respectively, but they are set to point to memout when appropri- |
ate inside backquotes. |
INPUT: The basic input routine is pgetc, which reads from the |
current input file. There is a stack of input files; the current |
input file is the top file on this stack. The code allows the |
input to come from a string rather than a file. (This is for the |
-c option and the "." and eval builtin commands.) The global |
variable plinno is saved and restored when files are pushed and |
popped from the stack. The parser routines store the number of |
the current line in this variable. |
DEBUGGING: If DEBUG is defined in shell.h, then the shell will |
write debugging information to the file $HOME/trace. Most of |
this is done using the TRACE macro, which takes a set of printf |
arguments inside two sets of parenthesis. Example: |
"TRACE(("n=%d0, n))". The double parenthesis are necessary be- |
cause the preprocessor can't handle functions with a variable |
number of arguments. Defining DEBUG also causes the shell to |
generate a core dump if it is sent a quit signal. The tracing |
code is in show.c. |
/tags/0.3.0/uspace/app/ash/hetio.c |
---|
0,0 → 1,378 |
/* |
* Termios command line History and Editting for NetBSD sh (ash) |
* Copyright (c) 1999 |
* Main code: Adam Rogoyski <rogoyski@cs.utexas.edu> |
* Etc: Dave Cinege <dcinege@psychosis.com> |
* |
* You may use this code as you wish, so long as the original author(s) |
* are attributed in any redistributions of the source code. |
* This code is 'as is' with no warranty. |
* This code may safely be consumed by a BSD or GPL license. |
* |
* v 0.5 19990328 Initial release |
* |
* Future plans: Simple file and path name completion. (like BASH) |
* |
*/ |
/* |
Usage and Known bugs: |
Terminal key codes are not extensive, and more will probably |
need to be added. This version was created on Debian GNU/Linux 2.x. |
Delete, Backspace, Home, End, and the arrow keys were tested |
to work in an Xterm and console. Ctrl-A also works as Home. |
Ctrl-E also works as End. The binary size increase is <3K. |
Editting will not display correctly for lines greater then the |
terminal width. (more then one line.) However, history will. |
*/ |
#include <stdio.h> |
#include <unistd.h> |
#include <stdlib.h> |
#include <string.h> |
#include <termios.h> |
#include <ctype.h> |
#include <sys/ioctl.h> |
#include "input.h" |
#include "output.h" |
#ifdef HETIO |
#include "hetio.h" |
#define MAX_HISTORY 15 /* Maximum length of the linked list for the command line history */ |
#define ESC 27 |
#define DEL 127 |
static struct history *his_front = NULL; /* First element in command line list */ |
static struct history *his_end = NULL; /* Last element in command line list */ |
static struct termios old_term, new_term; /* Current termio and the previous termio before starting ash */ |
static int history_counter = 0; /* Number of commands in history list */ |
static int reset_term = 0; /* Set to true if the terminal needs to be reset upon exit */ |
//static int hetio_inter = 0; |
int hetio_inter = 0; |
struct history |
{ |
char *s; |
struct history *p; |
struct history *n; |
}; |
void input_delete (int); |
void input_home (int *); |
void input_end (int *, int); |
void input_backspace (int *, int *); |
void hetio_init(void) |
{ |
hetio_inter = 1; |
} |
void hetio_reset_term(void) |
{ |
if (reset_term) |
tcsetattr(1, TCSANOW, &old_term); |
} |
void setIO(struct termios *new, struct termios *old) /* Set terminal IO to canonical mode, and save old term settings. */ |
{ |
tcgetattr(0, old); |
memcpy(new, old, sizeof(*new)); |
new->c_cc[VMIN] = 1; |
new->c_cc[VTIME] = 0; |
new->c_lflag &= ~ICANON; /* unbuffered input */ |
new->c_lflag &= ~ECHO; |
tcsetattr(0, TCSANOW, new); |
} |
void input_home(int *cursor) /* Command line input routines */ |
{ |
while (*cursor > 0) { |
out1c('\b'); |
--*cursor; |
} |
flushout(&output); |
} |
void input_delete(int cursor) |
{ |
int j = 0; |
memmove(parsenextc + cursor, parsenextc + cursor + 1, |
BUFSIZ - cursor - 1); |
for (j = cursor; j < (BUFSIZ - 1); j++) { |
if (!*(parsenextc + j)) |
break; |
else |
out1c(*(parsenextc + j)); |
} |
out1str(" \b"); |
while (j-- > cursor) |
out1c('\b'); |
flushout(&output); |
} |
void input_end(int *cursor, int len) |
{ |
while (*cursor < len) { |
out1str("\033[C"); |
++*cursor; |
} |
flushout(&output); |
} |
void |
input_backspace(int *cursor, int *len) |
{ |
int j = 0; |
if (*cursor > 0) { |
out1str("\b \b"); |
--*cursor; |
memmove(parsenextc + *cursor, parsenextc + *cursor + 1, |
BUFSIZ - *cursor + 1); |
for (j = *cursor; j < (BUFSIZ - 1); j++) { |
if (!*(parsenextc + j)) |
break; |
else |
out1c(*(parsenextc + j)); |
} |
out1str(" \b"); |
while (j-- > *cursor) |
out1c('\b'); |
--*len; |
flushout(&output); |
} |
} |
int hetio_read_input(int fd) |
{ |
int nr = 0; |
if (!hetio_inter) { /* Are we an interactive shell? */ |
return -255; |
} else { |
int len = 0; |
int j = 0; |
int cursor = 0; |
int break_out = 0; |
int ret = 0; |
char c = 0; |
struct history *hp = his_end; |
if (!reset_term) { |
setIO(&new_term, &old_term); |
reset_term = 1; |
} else { |
tcsetattr(0, TCSANOW, &new_term); |
} |
memset(parsenextc, 0, BUFSIZ); |
while (1) { |
if ((ret = read(fd, &c, 1)) < 1) |
return ret; |
switch (c) { |
case 1: /* Control-A Beginning of line */ |
input_home(&cursor); |
break; |
case 5: /* Control-E EOL */ |
input_end(&cursor, len); |
break; |
case 4: /* Control-D */ |
#ifndef CTRL_D_DELETE |
return 0; |
#else |
if (cursor != len) { |
input_delete(cursor); |
len--; |
} |
break; |
#endif |
case '\b': /* Backspace */ |
case DEL: |
input_backspace(&cursor, &len); |
break; |
case '\n': /* Enter */ |
*(parsenextc + len++ + 1) = c; |
out1c(c); |
flushout(&output); |
break_out = 1; |
break; |
case ESC: /* escape sequence follows */ |
if ((ret = read(fd, &c, 1)) < 1) |
return ret; |
if (c == '[' || c == 'O' ) { /* 91 */ |
if ((ret = read(fd, &c, 1)) < 1) |
return ret; |
switch (c) { |
case 'A': |
if (hp && hp->p) { /* Up */ |
hp = hp->p; |
goto hop; |
} |
break; |
case 'B': |
if (hp && hp->n && hp->n->s) { /* Down */ |
hp = hp->n; |
goto hop; |
} |
break; |
hop: /* hop */ |
len = strlen(parsenextc); |
for (; cursor > 0; cursor--) /* return to begining of line */ |
out1c('\b'); |
for (j = 0; j < len; j++) /* erase old command */ |
out1c(' '); |
for (j = len; j > 0; j--) /* return to begining of line */ |
out1c('\b'); |
strcpy (parsenextc, hp->s); /* write new command */ |
len = strlen (hp->s); |
out1str(parsenextc); |
flushout(&output); |
cursor = len; |
break; |
case 'C': /* Right */ |
if (cursor < len) { |
out1str("\033[C"); |
cursor++; |
flushout(&output); |
} |
break; |
case 'D': /* Left */ |
if (cursor > 0) { |
out1str("\033[D"); |
cursor--; |
flushout(&output); |
} |
break; |
case '3': /* Delete */ |
if (cursor != len) { |
input_delete(cursor); |
len--; |
} |
break; |
case 'H': /* Home (xterm) */ |
case '1': /* Home (Ctrl-A) */ |
input_home(&cursor); |
break; |
case 'F': /* End (xterm_ */ |
case '4': /* End (Ctrl-E) */ |
input_end(&cursor, len); |
break; |
} |
if (c == '1' || c == '3' || c == '4') |
if ((ret = read(fd, &c, 1)) < 1) |
return ret; /* read 126 (~) */ |
} |
c = 0; |
break; |
default: /* If it's regular input, do the normal thing */ |
if (!isprint(c)) /* Skip non-printable characters */ |
break; |
if (len >= (BUFSIZ - 2)) /* Need to leave space for enter */ |
break; |
len++; |
if (cursor == (len - 1)) { /* Append if at the end of the line */ |
*(parsenextc + cursor) = c; |
} else { /* Insert otherwise */ |
memmove(parsenextc + cursor + 1, parsenextc + cursor, |
len - cursor - 1); |
*(parsenextc + cursor) = c; |
for (j = cursor; j < len; j++) |
out1c(*(parsenextc + j)); |
for (; j > cursor; j--) |
out1str("\033[D"); |
} |
cursor++; |
out1c(c); |
flushout(&output); |
break; |
} |
if (break_out) /* Enter is the command terminator, no more input. */ |
break; |
} |
nr = len + 1; |
tcsetattr(0, TCSANOW, &old_term); |
if (*(parsenextc)) { /* Handle command history log */ |
struct history *h = his_end; |
if (!h) { /* No previous history */ |
h = his_front = malloc(sizeof (struct history)); |
h->n = malloc(sizeof (struct history)); |
h->p = NULL; |
h->s = strdup(parsenextc); |
h->n->p = h; |
h->n->n = NULL; |
h->n->s = NULL; |
his_end = h->n; |
history_counter++; |
} else { /* Add a new history command */ |
h->n = malloc(sizeof (struct history)); |
h->n->p = h; |
h->n->n = NULL; |
h->n->s = NULL; |
h->s = strdup(parsenextc); |
his_end = h->n; |
if (history_counter >= MAX_HISTORY) { /* After max history, remove the last known command */ |
struct history *p = his_front->n; |
p->p = NULL; |
free(his_front->s); |
free(his_front); |
his_front = p; |
} else { |
history_counter++; |
} |
} |
} |
} |
return nr; |
} |
#endif |
/tags/0.3.0/uspace/app/ash/mktokens |
---|
0,0 → 1,96 |
#!/bin/sh - |
# $NetBSD: mktokens,v 1.9 1999/07/09 03:05:50 christos Exp $ |
# |
# Copyright (c) 1991, 1993 |
# The Regents of the University of California. All rights reserved. |
# |
# This code is derived from software contributed to Berkeley by |
# Kenneth Almquist. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# 1. Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# 2. Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# 3. All advertising materials mentioning features or use of this software |
# must display the following acknowledgement: |
# This product includes software developed by the University of |
# California, Berkeley and its contributors. |
# 4. Neither the name of the University nor the names of its contributors |
# may be used to endorse or promote products derived from this software |
# without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
# SUCH DAMAGE. |
# |
# @(#)mktokens 8.1 (Berkeley) 5/31/93 |
# The following is a list of tokens. The second column is nonzero if the |
# token marks the end of a list. The third column is the name to print in |
# error messages. |
cat > /tmp/ka$$ <<\! |
TEOF 1 end of file |
TNL 0 newline |
TSEMI 0 ";" |
TBACKGND 0 "&" |
TAND 0 "&&" |
TOR 0 "||" |
TPIPE 0 "|" |
TLP 0 "(" |
TRP 1 ")" |
TENDCASE 1 ";;" |
TENDBQUOTE 1 "`" |
TREDIR 0 redirection |
TWORD 0 word |
TIF 0 "if" |
TTHEN 1 "then" |
TELSE 1 "else" |
TELIF 1 "elif" |
TFI 1 "fi" |
TWHILE 0 "while" |
TUNTIL 0 "until" |
TFOR 0 "for" |
TDO 1 "do" |
TDONE 1 "done" |
TBEGIN 0 "{" |
TEND 1 "}" |
TCASE 0 "case" |
TESAC 1 "esac" |
TNOT 0 "!" |
! |
nl=`wc -l /tmp/ka$$` |
exec > token.h |
awk '{print "#define " $1 " " NR-1}' /tmp/ka$$ |
echo ' |
/* Array indicating which tokens mark the end of a list */ |
const char tokendlist[] = {' |
awk '{print "\t" $2 ","}' /tmp/ka$$ |
echo '}; |
const char *const tokname[] = {' |
sed -e 's/"/\\"/g' \ |
-e 's/[^ ]*[ ][ ]*[^ ]*[ ][ ]*\(.*\)/ "\1",/' \ |
/tmp/ka$$ |
echo '}; |
' |
sed 's/"//g' /tmp/ka$$ | awk ' |
/TIF/{print "#define KWDOFFSET " NR-1; print ""; |
print "const char *const parsekwd[] = {"} |
/TIF/,/neverfound/{print " \"" $3 "\","}' |
echo ' 0 |
};' |
rm /tmp/ka$$ |
/tags/0.3.0/uspace/app/ash/shell.h |
---|
0,0 → 1,86 |
/* $NetBSD: shell.h,v 1.13 2000/05/22 10:18:47 elric Exp $ */ |
/*- |
* Copyright (c) 1991, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Kenneth Almquist. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
* |
* @(#)shell.h 8.2 (Berkeley) 5/4/95 |
*/ |
/* |
* The follow should be set to reflect the type of system you have: |
* JOBS -> 1 if you have Berkeley job control, 0 otherwise. |
* SHORTNAMES -> 1 if your linker cannot handle long names. |
* define BSD if you are running 4.2 BSD or later. |
* define SYSV if you are running under System V. |
* define DEBUG=1 to compile in debugging (set global "debug" to turn on) |
* define DEBUG=2 to compile in and turn on debugging. |
* |
* When debugging is on, debugging info will be written to $HOME/trace and |
* a quit signal will generate a core dump. |
*/ |
#define JOBS 0 |
#ifndef BSD |
#define BSD 1 |
#endif |
//#include "fake.h" |
#ifdef __STDC__ |
typedef void *pointer; |
#ifndef NULL |
#define NULL (void *)0 |
#endif |
#else /* not __STDC__ */ |
typedef char *pointer; |
#ifndef NULL |
#define NULL 0 |
#endif |
#endif /* not __STDC__ */ |
#define STATIC /* empty */ |
#define MKINIT /* empty */ |
#include <sys/cdefs.h> |
extern char nullstr[1]; /* null string */ |
#ifdef DEBUG |
#define TRACE(param) trace param |
#else |
#define TRACE(param) |
#endif |
/tags/0.3.0/uspace/app/ash/hetio.h |
---|
0,0 → 1,22 |
/* |
* Termios command line History and Editting for NetBSD sh (ash) |
* Copyright (c) 1999 |
* Main code: Adam Rogoyski <rogoyski@cs.utexas.edu> |
* Etc: Dave Cinege <dcinege@psychosis.com> |
* |
* You may use this code as you wish, so long as the original author(s) |
* are attributed in any redistributions of the source code. |
* This code is 'as is' with no warranty. |
* This code may safely be consumed by a BSD or GPL license. |
* |
* v 0.5 19990328 Initial release |
* |
* Future plans: Simple file and path name completion. (like BASH) |
* |
*/ |
void hetio_init(void); |
int hetio_read_input(int fd); |
void hetio_reset_term(void); |
extern int hetio_inter; |
/tags/0.3.0/uspace/app/ash/exec.c |
---|
0,0 → 1,1181 |
/* $NetBSD: exec.c,v 1.31 2000/11/01 19:21:41 christos Exp $ */ |
/*- |
* Copyright (c) 1991, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Kenneth Almquist. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
*/ |
#include <sys/cdefs.h> |
#ifndef lint |
#if 0 |
static char sccsid[] = "@(#)exec.c 8.4 (Berkeley) 6/8/95"; |
#else |
__RCSID("$NetBSD: exec.c,v 1.31 2000/11/01 19:21:41 christos Exp $"); |
#endif |
#endif /* not lint */ |
#include <sys/types.h> |
#include <sys/stat.h> |
#include <unistd.h> |
#include <fcntl.h> |
#include <errno.h> |
#include <stdlib.h> |
#include <sysexits.h> |
/* |
* When commands are first encountered, they are entered in a hash table. |
* This ensures that a full path search will not have to be done for them |
* on each invocation. |
* |
* We should investigate converting to a linear search, even though that |
* would make the command name "hash" a misnomer. |
*/ |
#include "shell.h" |
#include "main.h" |
#include "nodes.h" |
#include "parser.h" |
#include "redir.h" |
#include "eval.h" |
#include "exec.h" |
#include "builtins.h" |
#include "var.h" |
#include "options.h" |
#include "input.h" |
#include "output.h" |
#include "syntax.h" |
#include "memalloc.h" |
#include "error.h" |
#include "init.h" |
#include "mystring.h" |
#include "show.h" |
#include "jobs.h" |
#include "alias.h" |
#define CMDTABLESIZE 31 /* should be prime */ |
#define ARB 1 /* actual size determined at run time */ |
struct tblentry { |
struct tblentry *next; /* next entry in hash chain */ |
union param param; /* definition of builtin function */ |
short cmdtype; /* index identifying command */ |
char rehash; /* if set, cd done since entry created */ |
char cmdname[ARB]; /* name of command */ |
}; |
STATIC struct tblentry *cmdtable[CMDTABLESIZE]; |
STATIC int builtinloc = -1; /* index in path of %builtin, or -1 */ |
int exerrno = 0; /* Last exec error */ |
STATIC void tryexec (char *, char **, char **); |
STATIC void execinterp (char **, char **); |
STATIC void printentry (struct tblentry *, int); |
STATIC void clearcmdentry (int); |
STATIC struct tblentry *cmdlookup (char *, int); |
STATIC void delete_cmd_entry (void); |
STATIC int describe_command (char *, int); |
STATIC int path_change (const char *, int *); |
STATIC int is_regular_builtin (const char *); |
/* |
* Exec a program. Never returns. If you change this routine, you may |
* have to change the find_command routine as well. |
*/ |
void |
shellexec(argv, envp, path, idx) |
char **argv, **envp; |
const char *path; |
int idx; |
{ |
char *cmdname; |
int e; |
if (fd2 >= 0 && fd2 != 2) { |
close(fd2); |
} |
if (strchr(argv[0], '/') != NULL) { |
tryexec(argv[0], argv, envp); |
e = errno; |
} else { |
e = ENOENT; |
while ((cmdname = padvance(&path, argv[0])) != NULL) { |
if (--idx < 0 && pathopt == NULL) { |
tryexec(cmdname, argv, envp); |
if (errno != ENOENT && errno != ENOTDIR) |
e = errno; |
} |
stunalloc(cmdname); |
} |
} |
/* Map to POSIX errors */ |
switch (e) { |
case EACCES: |
exerrno = 126; |
break; |
case ENOENT: |
exerrno = 127; |
break; |
default: |
exerrno = 2; |
break; |
} |
exerror(EXEXEC, "%s: %s", argv[0], errmsg(e, E_EXEC)); |
/* NOTREACHED */ |
} |
STATIC void |
tryexec(cmd, argv, envp) |
char *cmd; |
char **argv; |
char **envp; |
{ |
int e; |
#if !defined(BSD) && !defined(linux) |
char *p; |
#endif |
#ifdef SYSV |
do { |
execve(cmd, argv, envp); |
} while (errno == EINTR); |
#else |
execve(cmd, argv, envp); |
#endif |
e = errno; |
if (e == ENOEXEC) { |
initshellproc(); |
setinputfile(cmd, 0); |
commandname = arg0 = savestr(argv[0]); |
#if !defined(BSD) && !defined(linux) |
pgetc(); pungetc(); /* fill up input buffer */ |
p = parsenextc; |
if (parsenleft > 2 && p[0] == '#' && p[1] == '!') { |
argv[0] = cmd; |
execinterp(argv, envp); |
} |
#endif |
setparam(argv + 1); |
exraise(EXSHELLPROC); |
} |
errno = e; |
} |
#if !defined(BSD) && !defined(linux) |
/* |
* Execute an interpreter introduced by "#!", for systems where this |
* feature has not been built into the kernel. If the interpreter is |
* the shell, return (effectively ignoring the "#!"). If the execution |
* of the interpreter fails, exit. |
* |
* This code peeks inside the input buffer in order to avoid actually |
* reading any input. It would benefit from a rewrite. |
*/ |
#define NEWARGS 5 |
STATIC void |
execinterp(argv, envp) |
char **argv, **envp; |
{ |
int n; |
char *inp; |
char *outp; |
char c; |
char *p; |
char **ap; |
char *newargs[NEWARGS]; |
int i; |
char **ap2; |
char **new; |
n = parsenleft - 2; |
inp = parsenextc + 2; |
ap = newargs; |
for (;;) { |
while (--n >= 0 && (*inp == ' ' || *inp == '\t')) |
inp++; |
if (n < 0) |
goto bad; |
if ((c = *inp++) == '\n') |
break; |
if (ap == &newargs[NEWARGS]) |
bad: error("Bad #! line"); |
STARTSTACKSTR(outp); |
do { |
STPUTC(c, outp); |
} while (--n >= 0 && (c = *inp++) != ' ' && c != '\t' && c != '\n'); |
STPUTC('\0', outp); |
n++, inp--; |
*ap++ = grabstackstr(outp); |
} |
if (ap == newargs + 1) { /* if no args, maybe no exec is needed */ |
p = newargs[0]; |
for (;;) { |
if (equal(p, "sh") || equal(p, "ash")) { |
return; |
} |
while (*p != '/') { |
if (*p == '\0') |
goto break2; |
p++; |
} |
p++; |
} |
break2:; |
} |
i = (char *)ap - (char *)newargs; /* size in bytes */ |
if (i == 0) |
error("Bad #! line"); |
for (ap2 = argv ; *ap2++ != NULL ; ); |
new = ckmalloc(i + ((char *)ap2 - (char *)argv)); |
ap = newargs, ap2 = new; |
while ((i -= sizeof (char **)) >= 0) |
*ap2++ = *ap++; |
ap = argv; |
while (*ap2++ = *ap++); |
shellexec(new, envp, pathval(), 0); |
/* NOTREACHED */ |
} |
#endif |
/* |
* Do a path search. The variable path (passed by reference) should be |
* set to the start of the path before the first call; padvance will update |
* this value as it proceeds. Successive calls to padvance will return |
* the possible path expansions in sequence. If an option (indicated by |
* a percent sign) appears in the path entry then the global variable |
* pathopt will be set to point to it; otherwise pathopt will be set to |
* NULL. |
*/ |
const char *pathopt; |
char * |
padvance(path, name) |
const char **path; |
const char *name; |
{ |
const char *p; |
char *q; |
const char *start; |
int len; |
if (*path == NULL) |
return NULL; |
start = *path; |
for (p = start ; *p && *p != ':' && *p != '%' ; p++); |
len = p - start + strlen(name) + 2; /* "2" is for '/' and '\0' */ |
while (stackblocksize() < len) |
growstackblock(); |
q = stackblock(); |
if (p != start) { |
memcpy(q, start, p - start); |
q += p - start; |
*q++ = '/'; |
} |
strcpy(q, name); |
pathopt = NULL; |
if (*p == '%') { |
pathopt = ++p; |
while (*p && *p != ':') p++; |
} |
if (*p == ':') |
*path = p + 1; |
else |
*path = NULL; |
return stalloc(len); |
} |
/*** Command hashing code ***/ |
int |
hashcmd(argc, argv) |
int argc; |
char **argv; |
{ |
struct tblentry **pp; |
struct tblentry *cmdp; |
int c; |
int verbose; |
struct cmdentry entry; |
char *name; |
verbose = 0; |
while ((c = nextopt("rv")) != '\0') { |
if (c == 'r') { |
clearcmdentry(0); |
} else if (c == 'v') { |
verbose++; |
} |
} |
if (*argptr == NULL) { |
for (pp = cmdtable ; pp < &cmdtable[CMDTABLESIZE] ; pp++) { |
for (cmdp = *pp ; cmdp ; cmdp = cmdp->next) { |
if (cmdp->cmdtype != CMDBUILTIN) { |
printentry(cmdp, verbose); |
} |
} |
} |
return 0; |
} |
c = 0; |
while ((name = *argptr) != NULL) { |
if ((cmdp = cmdlookup(name, 0)) != NULL |
&& (cmdp->cmdtype == CMDNORMAL |
|| (cmdp->cmdtype == CMDBUILTIN && builtinloc >= 0))) |
delete_cmd_entry(); |
find_command(name, &entry, DO_ERR, pathval()); |
if (entry.cmdtype == CMDUNKNOWN) c = 1; |
else if (verbose) { |
cmdp = cmdlookup(name, 0); |
if (cmdp) printentry(cmdp, verbose); |
flushall(); |
} |
argptr++; |
} |
return c; |
} |
STATIC void |
printentry(cmdp, verbose) |
struct tblentry *cmdp; |
int verbose; |
{ |
int idx; |
const char *path; |
char *name; |
if (cmdp->cmdtype == CMDNORMAL) { |
idx = cmdp->param.index; |
path = pathval(); |
do { |
name = padvance(&path, cmdp->cmdname); |
stunalloc(name); |
} while (--idx >= 0); |
out1str(name); |
} else if (cmdp->cmdtype == CMDBUILTIN) { |
out1fmt("builtin %s", cmdp->cmdname); |
} else if (cmdp->cmdtype == CMDFUNCTION) { |
out1fmt("function %s", cmdp->cmdname); |
if (verbose) { |
INTOFF; |
name = commandtext(cmdp->param.func); |
out1c(' '); |
out1str(name); |
ckfree(name); |
INTON; |
} |
#ifdef DEBUG |
} else { |
error("internal error: cmdtype %d", cmdp->cmdtype); |
#endif |
} |
if (cmdp->rehash) |
out1c('*'); |
out1c('\n'); |
} |
/* |
* Resolve a command name. If you change this routine, you may have to |
* change the shellexec routine as well. |
*/ |
void |
find_command(name, entry, act, path) |
char *name; |
struct cmdentry *entry; |
int act; |
const char *path; |
{ |
struct tblentry *cmdp; |
int idx; |
int prev; |
char *fullname; |
struct stat statb; |
int e; |
int i; |
int bltin; |
int firstchange; |
int updatetbl; |
int regular; |
/* If name contains a slash, don't use the hash table */ |
if (strchr(name, '/') != NULL) { |
if (act & DO_ABS) { |
while (stat(name, &statb) < 0) { |
#ifdef SYSV |
if (errno == EINTR) |
continue; |
#endif |
if (errno != ENOENT && errno != ENOTDIR) |
e = errno; |
entry->cmdtype = CMDUNKNOWN; |
entry->u.index = -1; |
return; |
} |
entry->cmdtype = CMDNORMAL; |
entry->u.index = -1; |
return; |
} |
entry->cmdtype = CMDNORMAL; |
entry->u.index = 0; |
return; |
} |
updatetbl = 1; |
if (act & DO_BRUTE) { |
firstchange = path_change(path, &bltin); |
} else { |
bltin = builtinloc; |
firstchange = 9999; |
} |
/* If name is in the table, and not invalidated by cd, we're done */ |
if ((cmdp = cmdlookup(name, 0)) != NULL && cmdp->rehash == 0) { |
if (cmdp->cmdtype == CMDFUNCTION) { |
if (act & DO_NOFUN) { |
updatetbl = 0; |
} else { |
goto success; |
} |
} else if (act & DO_BRUTE) { |
if ((cmdp->cmdtype == CMDNORMAL && |
cmdp->param.index >= firstchange) || |
(cmdp->cmdtype == CMDBUILTIN && |
((builtinloc < 0 && bltin >= 0) ? |
bltin : builtinloc) >= firstchange)) { |
/* need to recompute the entry */ |
} else { |
goto success; |
} |
} else { |
goto success; |
} |
} |
if ((regular = is_regular_builtin(name))) { |
if (cmdp && (cmdp->cmdtype == CMDBUILTIN)) { |
goto success; |
} |
} else if (act & DO_BRUTE) { |
if (firstchange == 0) { |
updatetbl = 0; |
} |
} |
/* If %builtin not in path, check for builtin next */ |
if ((bltin < 0 || regular) && (i = find_builtin(name)) >= 0) { |
if (!updatetbl) { |
entry->cmdtype = CMDBUILTIN; |
entry->u.index = i; |
return; |
} |
INTOFF; |
cmdp = cmdlookup(name, 1); |
cmdp->cmdtype = CMDBUILTIN; |
cmdp->param.index = i; |
INTON; |
goto success; |
} |
/* We have to search path. */ |
prev = -1; /* where to start */ |
if (cmdp && cmdp->rehash) { /* doing a rehash */ |
if (cmdp->cmdtype == CMDBUILTIN) |
prev = builtinloc; |
else |
prev = cmdp->param.index; |
} |
e = ENOENT; |
idx = -1; |
loop: |
while ((fullname = padvance(&path, name)) != NULL) { |
stunalloc(fullname); |
idx++; |
if (idx >= firstchange) { |
updatetbl = 0; |
} |
if (pathopt) { |
if (prefix("builtin", pathopt)) { |
if ((i = find_builtin(name)) >= 0) { |
if (!updatetbl) { |
entry->cmdtype = CMDBUILTIN; |
entry->u.index = i; |
return; |
} |
INTOFF; |
cmdp = cmdlookup(name, 1); |
cmdp->cmdtype = CMDBUILTIN; |
cmdp->param.index = i; |
INTON; |
goto success; |
} else { |
continue; |
} |
} else if (!(act & DO_NOFUN) && |
prefix("func", pathopt)) { |
/* handled below */ |
} else { |
continue; /* ignore unimplemented options */ |
} |
} |
/* if rehash, don't redo absolute path names */ |
if (fullname[0] == '/' && idx <= prev && |
idx < firstchange) { |
if (idx < prev) |
continue; |
TRACE(("searchexec \"%s\": no change\n", name)); |
goto success; |
} |
while (stat(fullname, &statb) < 0) { |
#ifdef SYSV |
if (errno == EINTR) |
continue; |
#endif |
if (errno != ENOENT && errno != ENOTDIR) |
e = errno; |
goto loop; |
} |
e = EACCES; /* if we fail, this will be the error */ |
if (!S_ISREG(statb.st_mode)) |
continue; |
if (pathopt) { /* this is a %func directory */ |
stalloc(strlen(fullname) + 1); |
readcmdfile(fullname); |
if ((cmdp = cmdlookup(name, 0)) == NULL || cmdp->cmdtype != CMDFUNCTION) |
error("%s not defined in %s", name, fullname); |
stunalloc(fullname); |
goto success; |
} |
#ifdef notdef |
if (statb.st_uid == geteuid()) { |
if ((statb.st_mode & 0100) == 0) |
goto loop; |
} else if (statb.st_gid == getegid()) { |
if ((statb.st_mode & 010) == 0) |
goto loop; |
} else { |
if ((statb.st_mode & 01) == 0) |
goto loop; |
} |
#endif |
TRACE(("searchexec \"%s\" returns \"%s\"\n", name, fullname)); |
/* If we aren't called with DO_BRUTE and cmdp is set, it must |
be a function and we're being called with DO_NOFUN */ |
if (!updatetbl) { |
entry->cmdtype = CMDNORMAL; |
entry->u.index = idx; |
return; |
} |
INTOFF; |
cmdp = cmdlookup(name, 1); |
cmdp->cmdtype = CMDNORMAL; |
cmdp->param.index = idx; |
INTON; |
goto success; |
} |
/* We failed. If there was an entry for this command, delete it */ |
if (cmdp && updatetbl) |
delete_cmd_entry(); |
if (act & DO_ERR) |
outfmt(out2, "%s: %s\n", name, errmsg(e, E_EXEC)); |
entry->cmdtype = CMDUNKNOWN; |
return; |
success: |
cmdp->rehash = 0; |
entry->cmdtype = cmdp->cmdtype; |
entry->u = cmdp->param; |
} |
/* |
* Search the table of builtin commands. |
*/ |
int |
find_builtin(name) |
char *name; |
{ |
const struct builtincmd *bp; |
for (bp = builtincmd ; bp->name ; bp++) { |
if (*bp->name == *name && equal(bp->name, name)) |
return bp->code; |
} |
return -1; |
} |
/* |
* Called when a cd is done. Marks all commands so the next time they |
* are executed they will be rehashed. |
*/ |
void |
hashcd() { |
struct tblentry **pp; |
struct tblentry *cmdp; |
for (pp = cmdtable ; pp < &cmdtable[CMDTABLESIZE] ; pp++) { |
for (cmdp = *pp ; cmdp ; cmdp = cmdp->next) { |
if (cmdp->cmdtype == CMDNORMAL |
|| (cmdp->cmdtype == CMDBUILTIN && builtinloc >= 0)) |
cmdp->rehash = 1; |
} |
} |
} |
/* |
* Called before PATH is changed. The argument is the new value of PATH; |
* pathval() still returns the old value at this point. Called with |
* interrupts off. |
*/ |
void |
changepath(newval) |
const char *newval; |
{ |
int firstchange; |
int bltin; |
firstchange = path_change(newval, &bltin); |
if (builtinloc < 0 && bltin >= 0) |
builtinloc = bltin; /* zap builtins */ |
clearcmdentry(firstchange); |
builtinloc = bltin; |
} |
/* |
* Clear out command entries. The argument specifies the first entry in |
* PATH which has changed. |
*/ |
STATIC void |
clearcmdentry(firstchange) |
int firstchange; |
{ |
struct tblentry **tblp; |
struct tblentry **pp; |
struct tblentry *cmdp; |
INTOFF; |
for (tblp = cmdtable ; tblp < &cmdtable[CMDTABLESIZE] ; tblp++) { |
pp = tblp; |
while ((cmdp = *pp) != NULL) { |
if ((cmdp->cmdtype == CMDNORMAL && |
cmdp->param.index >= firstchange) |
|| (cmdp->cmdtype == CMDBUILTIN && |
builtinloc >= firstchange)) { |
*pp = cmdp->next; |
ckfree(cmdp); |
} else { |
pp = &cmdp->next; |
} |
} |
} |
INTON; |
} |
/* |
* Delete all functions. |
*/ |
#ifdef mkinit |
MKINIT void deletefuncs (void); |
SHELLPROC { |
deletefuncs(); |
} |
#endif |
void |
deletefuncs() { |
struct tblentry **tblp; |
struct tblentry **pp; |
struct tblentry *cmdp; |
INTOFF; |
for (tblp = cmdtable ; tblp < &cmdtable[CMDTABLESIZE] ; tblp++) { |
pp = tblp; |
while ((cmdp = *pp) != NULL) { |
if (cmdp->cmdtype == CMDFUNCTION) { |
*pp = cmdp->next; |
freefunc(cmdp->param.func); |
ckfree(cmdp); |
} else { |
pp = &cmdp->next; |
} |
} |
} |
INTON; |
} |
/* |
* Locate a command in the command hash table. If "add" is nonzero, |
* add the command to the table if it is not already present. The |
* variable "lastcmdentry" is set to point to the address of the link |
* pointing to the entry, so that delete_cmd_entry can delete the |
* entry. |
*/ |
struct tblentry **lastcmdentry; |
STATIC struct tblentry * |
cmdlookup(name, add) |
char *name; |
int add; |
{ |
int hashval; |
char *p; |
struct tblentry *cmdp; |
struct tblentry **pp; |
p = name; |
hashval = *p << 4; |
while (*p) |
hashval += *p++; |
hashval &= 0x7FFF; |
pp = &cmdtable[hashval % CMDTABLESIZE]; |
for (cmdp = *pp ; cmdp ; cmdp = cmdp->next) { |
if (equal(cmdp->cmdname, name)) |
break; |
pp = &cmdp->next; |
} |
if (add && cmdp == NULL) { |
INTOFF; |
cmdp = *pp = ckmalloc(sizeof (struct tblentry) - ARB |
+ strlen(name) + 1); |
cmdp->next = NULL; |
cmdp->cmdtype = CMDUNKNOWN; |
cmdp->rehash = 0; |
strcpy(cmdp->cmdname, name); |
INTON; |
} |
lastcmdentry = pp; |
return cmdp; |
} |
/* |
* Delete the command entry returned on the last lookup. |
*/ |
STATIC void |
delete_cmd_entry() { |
struct tblentry *cmdp; |
INTOFF; |
cmdp = *lastcmdentry; |
*lastcmdentry = cmdp->next; |
ckfree(cmdp); |
INTON; |
} |
#ifdef notdef |
void |
getcmdentry(name, entry) |
char *name; |
struct cmdentry *entry; |
{ |
struct tblentry *cmdp = cmdlookup(name, 0); |
if (cmdp) { |
entry->u = cmdp->param; |
entry->cmdtype = cmdp->cmdtype; |
} else { |
entry->cmdtype = CMDUNKNOWN; |
entry->u.index = 0; |
} |
} |
#endif |
/* |
* Add a new command entry, replacing any existing command entry for |
* the same name. |
*/ |
void |
addcmdentry(name, entry) |
char *name; |
struct cmdentry *entry; |
{ |
struct tblentry *cmdp; |
INTOFF; |
cmdp = cmdlookup(name, 1); |
if (cmdp->cmdtype == CMDFUNCTION) { |
freefunc(cmdp->param.func); |
} |
cmdp->cmdtype = entry->cmdtype; |
cmdp->param = entry->u; |
INTON; |
} |
/* |
* Define a shell function. |
*/ |
void |
defun(name, func) |
char *name; |
union node *func; |
{ |
struct cmdentry entry; |
entry.cmdtype = CMDFUNCTION; |
entry.u.func = copyfunc(func); |
addcmdentry(name, &entry); |
} |
/* |
* Delete a function if it exists. |
*/ |
int |
unsetfunc(name) |
char *name; |
{ |
struct tblentry *cmdp; |
if ((cmdp = cmdlookup(name, 0)) != NULL && cmdp->cmdtype == CMDFUNCTION) { |
freefunc(cmdp->param.func); |
delete_cmd_entry(); |
return (0); |
} |
return (1); |
} |
/* |
* Locate and print what a word is... |
*/ |
int |
typecmd(argc, argv) |
int argc; |
char **argv; |
{ |
struct cmdentry entry; |
struct tblentry *cmdp; |
char * const *pp; |
struct alias *ap; |
int i; |
int err = 0; |
extern char *const parsekwd[]; |
for (i = 1; i < argc; i++) { |
out1str(argv[i]); |
/* First look at the keywords */ |
for (pp = parsekwd; *pp; pp++) |
if (**pp == *argv[i] && equal(*pp, argv[i])) |
break; |
if (*pp) { |
out1str(" is a shell keyword\n"); |
continue; |
} |
/* Then look at the aliases */ |
if ((ap = lookupalias(argv[i], 1)) != NULL) { |
out1fmt(" is an alias for %s\n", ap->val); |
continue; |
} |
/* Then check if it is a tracked alias */ |
if ((cmdp = cmdlookup(argv[i], 0)) != NULL) { |
entry.cmdtype = cmdp->cmdtype; |
entry.u = cmdp->param; |
} |
else { |
/* Finally use brute force */ |
find_command(argv[i], &entry, DO_ABS, pathval()); |
} |
switch (entry.cmdtype) { |
case CMDNORMAL: { |
if (strchr(argv[i], '/') == NULL) { |
const char *path = pathval(); |
char *name; |
int j = entry.u.index; |
do { |
name = padvance(&path, argv[i]); |
stunalloc(name); |
} while (--j >= 0); |
out1fmt(" is%s %s\n", |
cmdp ? " a tracked alias for" : "", name); |
} else { |
if (access(argv[i], X_OK) == 0) |
out1fmt(" is %s\n", argv[i]); |
else |
out1fmt(": %s\n", strerror(errno)); |
} |
break; |
} |
case CMDFUNCTION: |
out1str(" is a shell function\n"); |
break; |
case CMDBUILTIN: |
out1str(" is a shell builtin\n"); |
break; |
default: |
out1str(": not found\n"); |
err |= 127; |
break; |
} |
} |
return err; |
} |
STATIC int |
describe_command(command, verbose) |
char *command; |
int verbose; |
{ |
struct cmdentry entry; |
struct tblentry *cmdp; |
char **pp; |
struct alias *ap; |
extern char *const parsekwd[]; |
for (pp = (char **)parsekwd; *pp; pp++) |
if (**pp == *command && equal(*pp, command)) |
break; |
if (*pp) { |
if (verbose) { |
out1fmt("%s is a reserved word\n", command); |
} else { |
out1fmt("%s\n", command); |
} |
return 0; |
} |
/* Then look at the aliases */ |
if ((ap = lookupalias(command, 1)) != NULL) { |
if (verbose) { |
out1fmt("%s is aliased to `%s'\n", command, ap->val); |
} else { |
out1fmt("alias %s='%s'\n", command, ap->val); |
} |
return 0; |
} |
/* Then check if it is a tracked alias */ |
if ((cmdp = cmdlookup(command, 0)) != NULL) { |
entry.cmdtype = cmdp->cmdtype; |
entry.u = cmdp->param; |
} |
else { |
/* Finally use brute force */ |
find_command(command, &entry, DO_ABS, pathval()); |
} |
switch (entry.cmdtype) { |
case CMDNORMAL: { |
int j = entry.u.index; |
const char *path = pathval(); |
char *name; |
if (j == -1) |
name = command; |
else { |
do { |
name = padvance(&path, command); |
stunalloc(name); |
} while (--j >= 0); |
} |
if (verbose) { |
out1fmt("%s is %s\n", command, name); |
} else { |
out1fmt("%s\n", name); |
} |
break; |
} |
case CMDFUNCTION: |
if (verbose) { |
out1fmt("%s is a function\n", command); |
} else { |
out1fmt("%s\n", command); |
} |
break; |
case CMDBUILTIN: |
if (verbose) { |
if (is_special_builtin(command)) { |
out1fmt("%s is a special built-in utility\n", command); |
} else { |
out1fmt("%s is a built-in utility\n", command); |
} |
} else { |
out1fmt("%s\n", command); |
} |
break; |
default: |
outfmt(out2, "%s not found\n", command); |
return 127; |
} |
return 0; |
} |
int |
commandcmd(argc, argv) |
int argc; |
char **argv; |
{ |
int c; |
int default_path = 0; |
int verify_only = 0; |
int verbose_verify_only = 0; |
while ((c = nextopt("pvV")) != '\0') |
switch (c) { |
case 'p': |
default_path = 1; |
break; |
case 'v': |
verify_only = 1; |
break; |
case 'V': |
verbose_verify_only = 1; |
break; |
default: |
outfmt(out2, |
"command: nextopt returned character code 0%o\n", c); |
return EX_SOFTWARE; |
} |
if (default_path + verify_only + verbose_verify_only > 1 || |
!*argptr) { |
outfmt(out2, |
"command [-p] command [arg ...]\n"); |
outfmt(out2, |
"command {-v|-V} command\n"); |
return EX_USAGE; |
} |
if (verify_only || verbose_verify_only) { |
return describe_command(*argptr, verbose_verify_only); |
} |
return 0; |
} |
STATIC int |
path_change(newval, bltin) |
const char *newval; |
int *bltin; |
{ |
const char *old, *new; |
int idx; |
int firstchange; |
old = pathval(); |
new = newval; |
firstchange = 9999; /* assume no change */ |
idx = 0; |
*bltin = -1; |
for (;;) { |
if (*old != *new) { |
firstchange = idx; |
if ((*old == '\0' && *new == ':') |
|| (*old == ':' && *new == '\0')) |
firstchange++; |
old = new; /* ignore subsequent differences */ |
} |
if (*new == '\0') |
break; |
if (*new == '%' && *bltin < 0 && prefix("builtin", new + 1)) |
*bltin = idx; |
if (*new == ':') { |
idx++; |
} |
new++, old++; |
} |
if (builtinloc >= 0 && *bltin < 0) |
firstchange = 0; |
return firstchange; |
} |
STATIC int |
is_regular_builtin(name) |
const char *name; |
{ |
static const char *regular_builtins[] = { |
"alias", "bg", "cd", "command", "false", "fc", "fg", |
"getopts", "jobs", "kill", "newgrp", "read", "true", |
"umask", "unalias", "wait", (char *)NULL |
}; |
int i; |
if (!name) return 0; |
for (i = 0; regular_builtins[i]; i++) |
if (equal(name, regular_builtins[i])) return 1; |
return 0; |
} |
/tags/0.3.0/uspace/app/ash/cd.c |
---|
0,0 → 1,382 |
/* $NetBSD: cd.c,v 1.27 1999/07/09 03:05:49 christos Exp $ */ |
/*- |
* Copyright (c) 1991, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Kenneth Almquist. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
*/ |
#include <sys/cdefs.h> |
#ifndef lint |
#if 0 |
static char sccsid[] = "@(#)cd.c 8.2 (Berkeley) 5/4/95"; |
#else |
__RCSID("$NetBSD: cd.c,v 1.27 1999/07/09 03:05:49 christos Exp $"); |
#endif |
#endif /* not lint */ |
#include <sys/types.h> |
#include <sys/stat.h> |
#include <stdlib.h> |
#include <string.h> |
#include <unistd.h> |
#include <errno.h> |
/* |
* The cd and pwd commands. |
*/ |
#include "shell.h" |
#include "var.h" |
#include "nodes.h" /* for jobs.h */ |
#include "jobs.h" |
#include "options.h" |
#include "output.h" |
#include "memalloc.h" |
#include "error.h" |
#include "exec.h" |
#include "redir.h" |
#include "mystring.h" |
#include "show.h" |
#include "cd.h" |
STATIC int docd (char *, int); |
STATIC char *getcomponent (void); |
STATIC void updatepwd (char *); |
char *curdir = NULL; /* current working directory */ |
char *prevdir; /* previous working directory */ |
STATIC char *cdcomppath; |
int |
cdcmd(argc, argv) |
int argc; |
char **argv; |
{ |
const char *dest; |
const char *path; |
char *p; |
struct stat statb; |
int print = 0; |
nextopt(nullstr); |
if ((dest = *argptr) == NULL && (dest = bltinlookup("HOME", 1)) == NULL) |
error("HOME not set"); |
if (*dest == '\0') |
dest = "."; |
if (dest[0] == '-' && dest[1] == '\0') { |
dest = prevdir ? prevdir : curdir; |
print = 1; |
if (dest) |
print = 1; |
else |
dest = "."; |
} |
if (*dest == '/' || (path = bltinlookup("CDPATH", 1)) == NULL) |
path = nullstr; |
while ((p = padvance(&path, dest)) != NULL) { |
if (stat(p, &statb) >= 0 && S_ISDIR(statb.st_mode)) { |
if (!print) { |
/* |
* XXX - rethink |
*/ |
if (p[0] == '.' && p[1] == '/' && p[2] != '\0') |
p += 2; |
print = strcmp(p, dest); |
} |
if (docd(p, print) >= 0) |
return 0; |
} |
} |
error("can't cd to %s", dest); |
/* NOTREACHED */ |
} |
/* |
* Actually do the chdir. In an interactive shell, print the |
* directory name if "print" is nonzero. |
*/ |
STATIC int |
docd(dest, print) |
char *dest; |
int print; |
{ |
char *p; |
char *q; |
char *component; |
struct stat statb; |
int first; |
int badstat; |
TRACE(("docd(\"%s\", %d) called\n", dest, print)); |
/* |
* Check each component of the path. If we find a symlink or |
* something we can't stat, clear curdir to force a getcwd() |
* next time we get the value of the current directory. |
*/ |
badstat = 0; |
cdcomppath = stalloc(strlen(dest) + 1); |
scopy(dest, cdcomppath); |
STARTSTACKSTR(p); |
if (*dest == '/') { |
STPUTC('/', p); |
cdcomppath++; |
} |
first = 1; |
while ((q = getcomponent()) != NULL) { |
if (q[0] == '\0' || (q[0] == '.' && q[1] == '\0')) |
continue; |
if (! first) |
STPUTC('/', p); |
first = 0; |
component = q; |
while (*q) |
STPUTC(*q++, p); |
if (equal(component, "..")) |
continue; |
STACKSTRNUL(p); |
if ((lstat(stackblock(), &statb) < 0) |
|| (S_ISLNK(statb.st_mode))) { |
/* print = 1; */ |
badstat = 1; |
break; |
} |
} |
INTOFF; |
if (chdir(dest) < 0) { |
INTON; |
return -1; |
} |
updatepwd(badstat ? NULL : dest); |
INTON; |
if (print && iflag && curdir) |
out1fmt("%s\n", curdir); |
return 0; |
} |
/* |
* Get the next component of the path name pointed to by cdcomppath. |
* This routine overwrites the string pointed to by cdcomppath. |
*/ |
STATIC char * |
getcomponent() { |
char *p; |
char *start; |
if ((p = cdcomppath) == NULL) |
return NULL; |
start = cdcomppath; |
while (*p != '/' && *p != '\0') |
p++; |
if (*p == '\0') { |
cdcomppath = NULL; |
} else { |
*p++ = '\0'; |
cdcomppath = p; |
} |
return start; |
} |
/* |
* Update curdir (the name of the current directory) in response to a |
* cd command. We also call hashcd to let the routines in exec.c know |
* that the current directory has changed. |
*/ |
STATIC void |
updatepwd(dir) |
char *dir; |
{ |
char *new; |
char *p; |
hashcd(); /* update command hash table */ |
/* |
* If our argument is NULL, we don't know the current directory |
* any more because we traversed a symbolic link or something |
* we couldn't stat(). |
*/ |
if (dir == NULL || curdir == NULL) { |
if (prevdir) |
ckfree(prevdir); |
INTOFF; |
prevdir = curdir; |
curdir = NULL; |
getpwd(); |
setvar("PWD", curdir, VEXPORT|VTEXTFIXED); |
setvar("OLDPWD", prevdir, VEXPORT|VTEXTFIXED); |
INTON; |
return; |
} |
cdcomppath = stalloc(strlen(dir) + 1); |
scopy(dir, cdcomppath); |
STARTSTACKSTR(new); |
if (*dir != '/') { |
p = curdir; |
while (*p) |
STPUTC(*p++, new); |
if (p[-1] == '/') |
STUNPUTC(new); |
} |
while ((p = getcomponent()) != NULL) { |
if (equal(p, "..")) { |
while (new > stackblock() && (STUNPUTC(new), *new) != '/'); |
} else if (*p != '\0' && ! equal(p, ".")) { |
STPUTC('/', new); |
while (*p) |
STPUTC(*p++, new); |
} |
} |
if (new == stackblock()) |
STPUTC('/', new); |
STACKSTRNUL(new); |
INTOFF; |
if (prevdir) |
ckfree(prevdir); |
prevdir = curdir; |
curdir = savestr(stackblock()); |
setvar("PWD", curdir, VEXPORT|VTEXTFIXED); |
setvar("OLDPWD", prevdir, VEXPORT|VTEXTFIXED); |
INTON; |
} |
int |
pwdcmd(argc, argv) |
int argc; |
char **argv; |
{ |
getpwd(); |
out1str(curdir); |
out1c('\n'); |
return 0; |
} |
#define MAXPWD 256 |
/* |
* Find out what the current directory is. If we already know the current |
* directory, this routine returns immediately. |
*/ |
void |
getpwd() |
{ |
char buf[MAXPWD]; |
if (curdir) |
return; |
/* |
* Things are a bit complicated here; we could have just used |
* getcwd, but traditionally getcwd is implemented using popen |
* to /bin/pwd. This creates a problem for us, since we cannot |
* keep track of the job if it is being ran behind our backs. |
* So we re-implement getcwd(), and we suppress interrupts |
* throughout the process. This is not completely safe, since |
* the user can still break out of it by killing the pwd program. |
* We still try to use getcwd for systems that we know have a |
* c implementation of getcwd, that does not open a pipe to |
* /bin/pwd. |
*/ |
#if defined(__NetBSD__) || defined(__SVR4) || defined(__GLIBC__) |
if (getcwd(buf, sizeof(buf)) == NULL) { |
char *pwd = getenv("PWD"); |
struct stat stdot, stpwd; |
if (pwd && *pwd == '/' && stat(".", &stdot) != -1 && |
stat(pwd, &stpwd) != -1 && |
stdot.st_dev == stpwd.st_dev && |
stdot.st_ino == stpwd.st_ino) { |
curdir = savestr(pwd); |
return; |
} |
error("getcwd() failed: %s", strerror(errno)); |
} |
curdir = savestr(buf); |
#else |
{ |
char *p; |
int i; |
int status; |
struct job *jp; |
int pip[2]; |
INTOFF; |
if (pipe(pip) < 0) |
error("Pipe call failed"); |
jp = makejob((union node *)NULL, 1); |
if (forkshell(jp, (union node *)NULL, FORK_NOJOB) == 0) { |
(void) close(pip[0]); |
if (pip[1] != 1) { |
close(1); |
copyfd(pip[1], 1); |
close(pip[1]); |
} |
(void) execl("/bin/pwd", "pwd", (char *)0); |
error("Cannot exec /bin/pwd"); |
} |
(void) close(pip[1]); |
pip[1] = -1; |
p = buf; |
while ((i = read(pip[0], p, buf + MAXPWD - p)) > 0 |
|| (i == -1 && errno == EINTR)) { |
if (i > 0) |
p += i; |
} |
(void) close(pip[0]); |
pip[0] = -1; |
status = waitforjob(jp); |
if (status != 0) |
error((char *)0); |
if (i < 0 || p == buf || p[-1] != '\n') |
error("pwd command failed"); |
p[-1] = '\0'; |
} |
curdir = savestr(buf); |
INTON; |
#endif |
} |
/tags/0.3.0/uspace/app/ash/bltin/echo.c |
---|
0,0 → 1,127 |
/* $NetBSD: echo.c,v 1.8 1996/11/02 18:26:06 christos Exp $ */ |
/*- |
* Copyright (c) 1991, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Kenneth Almquist. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
* |
* @(#)echo.c 8.1 (Berkeley) 5/31/93 |
*/ |
/* |
* Echo command. |
*/ |
#define main echocmd |
#ifdef _GNU_SOURCE |
#include <stdio.h> |
#include "../mystring.h" |
#else |
#include "bltin.h" |
#endif |
/* #define eflag 1 */ |
int |
main(argc, argv) char **argv; { |
register char **ap; |
register char *p; |
register char c; |
int nflag = 0; |
#ifndef eflag |
int eflag = 0; |
#endif |
ap = argv; |
if (argc) |
ap++; |
while ((p = *ap) != NULL && *p == '-') { |
if (equal(p, "-n")) { |
nflag = 1; |
} else if (equal(p, "-e")) { |
#ifndef eflag |
eflag = 1; |
#endif |
} else if (equal(p, "-E")) { |
#ifndef eflag |
eflag = 0; |
#endif |
} |
else break; |
ap++; |
} |
while ((p = *ap++) != NULL) { |
while ((c = *p++) != '\0') { |
if (c == '\\' && eflag) { |
switch (c = *p++) { |
case 'a': c = '\007'; break; |
case 'b': c = '\b'; break; |
case 'c': return 0; /* exit */ |
case 'e': c = '\033'; break; |
case 'f': c = '\f'; break; |
case 'n': c = '\n'; break; |
case 'r': c = '\r'; break; |
case 't': c = '\t'; break; |
case 'v': c = '\v'; break; |
case '\\': break; /* c = '\\' */ |
case '0': case '1': case '2': case '3': |
case '4': case '5': case '6': case '7': |
c -= '0'; |
if (*p >= '0' && *p <= '7') |
c = c * 8 + (*p++ - '0'); |
if (*p >= '0' && *p <= '7') |
c = c * 8 + (*p++ - '0'); |
break; |
default: |
p--; |
break; |
} |
} |
putchar(c); |
} |
if (*ap) |
putchar(' '); |
} |
if (! nflag) |
putchar('\n'); |
#ifdef _GNU_SOURCE |
fflush(stdout); |
if (ferror(stdout)) { |
clearerr(stdout); |
return 1; |
} |
#endif |
return 0; |
} |
/tags/0.3.0/uspace/app/ash/bltin/test.c |
---|
0,0 → 1,583 |
/* $NetBSD: test.c,v 1.22 2000/04/09 23:24:59 christos Exp $ */ |
/* |
* test(1); version 7-like -- author Erik Baalbergen |
* modified by Eric Gisin to be used as built-in. |
* modified by Arnold Robbins to add SVR3 compatibility |
* (-x -c -b -p -u -g -k) plus Korn's -L -nt -ot -ef and new -S (socket). |
* modified by J.T. Conklin for NetBSD. |
* |
* This program is in the Public Domain. |
*/ |
#include <sys/cdefs.h> |
#ifndef lint |
__RCSID("$NetBSD: test.c,v 1.22 2000/04/09 23:24:59 christos Exp $"); |
#endif |
#include <sys/types.h> |
#include <sys/stat.h> |
#include <unistd.h> |
#include <ctype.h> |
#include <errno.h> |
#include <stdio.h> |
#include <stdlib.h> |
#include <string.h> |
#include <err.h> |
#ifdef __STDC__ |
#include <stdarg.h> |
#else |
#include <varargs.h> |
#endif |
/* test(1) accepts the following grammar: |
oexpr ::= aexpr | aexpr "-o" oexpr ; |
aexpr ::= nexpr | nexpr "-a" aexpr ; |
nexpr ::= primary | "!" primary |
primary ::= unary-operator operand |
| operand binary-operator operand |
| operand |
| "(" oexpr ")" |
; |
unary-operator ::= "-r"|"-w"|"-x"|"-f"|"-d"|"-c"|"-b"|"-p"| |
"-u"|"-g"|"-k"|"-s"|"-t"|"-z"|"-n"|"-o"|"-O"|"-G"|"-L"|"-S"; |
binary-operator ::= "="|"!="|"-eq"|"-ne"|"-ge"|"-gt"|"-le"|"-lt"| |
"-nt"|"-ot"|"-ef"; |
operand ::= <any legal UNIX file name> |
*/ |
enum token { |
EOI, |
FILRD, |
FILWR, |
FILEX, |
FILEXIST, |
FILREG, |
FILDIR, |
FILCDEV, |
FILBDEV, |
FILFIFO, |
FILSOCK, |
FILSYM, |
FILGZ, |
FILTT, |
FILSUID, |
FILSGID, |
FILSTCK, |
FILNT, |
FILOT, |
FILEQ, |
FILUID, |
FILGID, |
STREZ, |
STRNZ, |
STREQ, |
STRNE, |
STRLT, |
STRGT, |
INTEQ, |
INTNE, |
INTGE, |
INTGT, |
INTLE, |
INTLT, |
UNOT, |
BAND, |
BOR, |
LPAREN, |
RPAREN, |
OPERAND |
}; |
enum token_types { |
UNOP, |
BINOP, |
BUNOP, |
BBINOP, |
PAREN |
}; |
static struct t_op { |
const char *op_text; |
short op_num, op_type; |
} const ops [] = { |
{"-r", FILRD, UNOP}, |
{"-w", FILWR, UNOP}, |
{"-x", FILEX, UNOP}, |
{"-e", FILEXIST,UNOP}, |
{"-f", FILREG, UNOP}, |
{"-d", FILDIR, UNOP}, |
{"-c", FILCDEV,UNOP}, |
{"-b", FILBDEV,UNOP}, |
{"-p", FILFIFO,UNOP}, |
{"-u", FILSUID,UNOP}, |
{"-g", FILSGID,UNOP}, |
{"-k", FILSTCK,UNOP}, |
{"-s", FILGZ, UNOP}, |
{"-t", FILTT, UNOP}, |
{"-z", STREZ, UNOP}, |
{"-n", STRNZ, UNOP}, |
{"-h", FILSYM, UNOP}, /* for backwards compat */ |
{"-O", FILUID, UNOP}, |
{"-G", FILGID, UNOP}, |
{"-L", FILSYM, UNOP}, |
{"-S", FILSOCK,UNOP}, |
{"=", STREQ, BINOP}, |
{"!=", STRNE, BINOP}, |
{"<", STRLT, BINOP}, |
{">", STRGT, BINOP}, |
{"-eq", INTEQ, BINOP}, |
{"-ne", INTNE, BINOP}, |
{"-ge", INTGE, BINOP}, |
{"-gt", INTGT, BINOP}, |
{"-le", INTLE, BINOP}, |
{"-lt", INTLT, BINOP}, |
{"-nt", FILNT, BINOP}, |
{"-ot", FILOT, BINOP}, |
{"-ef", FILEQ, BINOP}, |
{"!", UNOT, BUNOP}, |
{"-a", BAND, BBINOP}, |
{"-o", BOR, BBINOP}, |
{"(", LPAREN, PAREN}, |
{")", RPAREN, PAREN}, |
{0, 0, 0} |
}; |
static char **t_wp; |
static struct t_op const *t_wp_op; |
static gid_t *group_array = NULL; |
static int ngroups; |
static void syntax __P((const char *, const char *)); |
static int oexpr __P((enum token)); |
static int aexpr __P((enum token)); |
static int nexpr __P((enum token)); |
static int primary __P((enum token)); |
static int binop __P((void)); |
static int filstat __P((char *, enum token)); |
static enum token t_lex __P((char *)); |
static int isoperand __P((void)); |
static int getn __P((const char *)); |
static int newerf __P((const char *, const char *)); |
static int olderf __P((const char *, const char *)); |
static int equalf __P((const char *, const char *)); |
static int test_eaccess(); |
static int bash_group_member(); |
static void initialize_group_array(); |
#if defined(SHELL) |
extern void error __P((const char *, ...)) __attribute__((__noreturn__)); |
#else |
static void error __P((const char *, ...)) __attribute__((__noreturn__)); |
static void |
#ifdef __STDC__ |
error(const char *msg, ...) |
#else |
error(va_alist) |
va_dcl |
#endif |
{ |
va_list ap; |
#ifndef __STDC__ |
const char *msg; |
va_start(ap); |
msg = va_arg(ap, const char *); |
#else |
va_start(ap, msg); |
#endif |
verrx(2, msg, ap); |
/*NOTREACHED*/ |
va_end(ap); |
} |
#endif |
#ifdef SHELL |
int testcmd __P((int, char **)); |
int |
testcmd(argc, argv) |
int argc; |
char **argv; |
#else |
int main __P((int, char **)); |
int |
main(argc, argv) |
int argc; |
char **argv; |
#endif |
{ |
int res; |
if (strcmp(argv[0], "[") == 0) { |
if (strcmp(argv[--argc], "]")) |
error("missing ]"); |
argv[argc] = NULL; |
} |
if (argc < 2) |
return 1; |
t_wp = &argv[1]; |
res = !oexpr(t_lex(*t_wp)); |
if (*t_wp != NULL && *++t_wp != NULL) |
syntax(*t_wp, "unexpected operator"); |
return res; |
} |
static void |
syntax(op, msg) |
const char *op; |
const char *msg; |
{ |
if (op && *op) |
error("%s: %s", op, msg); |
else |
error("%s", msg); |
} |
static int |
oexpr(n) |
enum token n; |
{ |
int res; |
res = aexpr(n); |
if (t_lex(*++t_wp) == BOR) |
return oexpr(t_lex(*++t_wp)) || res; |
t_wp--; |
return res; |
} |
static int |
aexpr(n) |
enum token n; |
{ |
int res; |
res = nexpr(n); |
if (t_lex(*++t_wp) == BAND) |
return aexpr(t_lex(*++t_wp)) && res; |
t_wp--; |
return res; |
} |
static int |
nexpr(n) |
enum token n; /* token */ |
{ |
if (n == UNOT) |
return !nexpr(t_lex(*++t_wp)); |
return primary(n); |
} |
static int |
primary(n) |
enum token n; |
{ |
enum token nn; |
int res; |
if (n == EOI) |
return 0; /* missing expression */ |
if (n == LPAREN) { |
if ((nn = t_lex(*++t_wp)) == RPAREN) |
return 0; /* missing expression */ |
res = oexpr(nn); |
if (t_lex(*++t_wp) != RPAREN) |
syntax(NULL, "closing paren expected"); |
return res; |
} |
if (t_wp_op && t_wp_op->op_type == UNOP) { |
/* unary expression */ |
if (*++t_wp == NULL) |
syntax(t_wp_op->op_text, "argument expected"); |
switch (n) { |
case STREZ: |
return strlen(*t_wp) == 0; |
case STRNZ: |
return strlen(*t_wp) != 0; |
case FILTT: |
return isatty(getn(*t_wp)); |
default: |
return filstat(*t_wp, n); |
} |
} |
if (t_lex(t_wp[1]), t_wp_op && t_wp_op->op_type == BINOP) { |
return binop(); |
} |
return strlen(*t_wp) > 0; |
} |
static int |
binop() |
{ |
const char *opnd1, *opnd2; |
struct t_op const *op; |
opnd1 = *t_wp; |
(void) t_lex(*++t_wp); |
op = t_wp_op; |
if ((opnd2 = *++t_wp) == (char *)0) |
syntax(op->op_text, "argument expected"); |
switch (op->op_num) { |
case STREQ: |
return strcmp(opnd1, opnd2) == 0; |
case STRNE: |
return strcmp(opnd1, opnd2) != 0; |
case STRLT: |
return strcmp(opnd1, opnd2) < 0; |
case STRGT: |
return strcmp(opnd1, opnd2) > 0; |
case INTEQ: |
return getn(opnd1) == getn(opnd2); |
case INTNE: |
return getn(opnd1) != getn(opnd2); |
case INTGE: |
return getn(opnd1) >= getn(opnd2); |
case INTGT: |
return getn(opnd1) > getn(opnd2); |
case INTLE: |
return getn(opnd1) <= getn(opnd2); |
case INTLT: |
return getn(opnd1) < getn(opnd2); |
case FILNT: |
return newerf (opnd1, opnd2); |
case FILOT: |
return olderf (opnd1, opnd2); |
case FILEQ: |
return equalf (opnd1, opnd2); |
default: |
abort(); |
/* NOTREACHED */ |
} |
} |
static int |
filstat(nm, mode) |
char *nm; |
enum token mode; |
{ |
struct stat s; |
if (mode == FILSYM ? lstat(nm, &s) : stat(nm, &s)) |
return 0; |
switch (mode) { |
case FILRD: |
return test_eaccess(nm, R_OK) == 0; |
case FILWR: |
return test_eaccess(nm, W_OK) == 0; |
case FILEX: |
return test_eaccess(nm, X_OK) == 0; |
case FILEXIST: |
return 1; |
case FILREG: |
return S_ISREG(s.st_mode); |
case FILDIR: |
return S_ISDIR(s.st_mode); |
case FILCDEV: |
return S_ISCHR(s.st_mode); |
case FILBDEV: |
return S_ISBLK(s.st_mode); |
case FILFIFO: |
return S_ISFIFO(s.st_mode); |
case FILSOCK: |
return S_ISSOCK(s.st_mode); |
case FILSYM: |
return S_ISLNK(s.st_mode); |
case FILSUID: |
return (s.st_mode & S_ISUID) != 0; |
case FILSGID: |
return (s.st_mode & S_ISGID) != 0; |
case FILSTCK: |
return (s.st_mode & S_ISVTX) != 0; |
case FILGZ: |
return s.st_size > (off_t)0; |
case FILUID: |
return s.st_uid == geteuid(); |
case FILGID: |
return s.st_gid == getegid(); |
default: |
return 1; |
} |
} |
static enum token |
t_lex(s) |
char *s; |
{ |
struct t_op const *op = ops; |
if (s == 0) { |
t_wp_op = (struct t_op *)0; |
return EOI; |
} |
while (op->op_text) { |
if (strcmp(s, op->op_text) == 0) { |
if ((op->op_type == UNOP && isoperand()) || |
(op->op_num == LPAREN && *(t_wp+1) == 0)) |
break; |
t_wp_op = op; |
return op->op_num; |
} |
op++; |
} |
t_wp_op = (struct t_op *)0; |
return OPERAND; |
} |
static int |
isoperand() |
{ |
struct t_op const *op = ops; |
char *s; |
char *t; |
if ((s = *(t_wp+1)) == 0) |
return 1; |
if ((t = *(t_wp+2)) == 0) |
return 0; |
while (op->op_text) { |
if (strcmp(s, op->op_text) == 0) |
return op->op_type == BINOP && |
(t[0] != ')' || t[1] != '\0'); |
op++; |
} |
return 0; |
} |
/* atoi with error detection */ |
static int |
getn(s) |
const char *s; |
{ |
char *p; |
long r; |
errno = 0; |
r = strtol(s, &p, 10); |
if (errno != 0) |
error("%s: out of range", s); |
while (isspace((unsigned char)*p)) |
p++; |
if (*p) |
error("%s: bad number", s); |
return (int) r; |
} |
static int |
newerf (f1, f2) |
const char *f1, *f2; |
{ |
struct stat b1, b2; |
return (stat (f1, &b1) == 0 && |
stat (f2, &b2) == 0 && |
b1.st_mtime > b2.st_mtime); |
} |
static int |
olderf (f1, f2) |
const char *f1, *f2; |
{ |
struct stat b1, b2; |
return (stat (f1, &b1) == 0 && |
stat (f2, &b2) == 0 && |
b1.st_mtime < b2.st_mtime); |
} |
static int |
equalf (f1, f2) |
const char *f1, *f2; |
{ |
struct stat b1, b2; |
return (stat (f1, &b1) == 0 && |
stat (f2, &b2) == 0 && |
b1.st_dev == b2.st_dev && |
b1.st_ino == b2.st_ino); |
} |
/* Do the same thing access(2) does, but use the effective uid and gid, |
and don't make the mistake of telling root that any file is |
executable. */ |
static int |
test_eaccess (path, mode) |
char *path; |
int mode; |
{ |
struct stat st; |
int euid = geteuid(); |
if (stat (path, &st) < 0) |
return (-1); |
if (euid == 0) { |
/* Root can read or write any file. */ |
if (mode != X_OK) |
return (0); |
/* Root can execute any file that has any one of the execute |
bits set. */ |
if (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)) |
return (0); |
} |
if (st.st_uid == euid) /* owner */ |
mode <<= 6; |
else if (bash_group_member (st.st_gid)) |
mode <<= 3; |
if (st.st_mode & mode) |
return (0); |
return (-1); |
} |
static void |
initialize_group_array () |
{ |
ngroups = getgroups(0, NULL); |
group_array = malloc(ngroups * sizeof(gid_t)); |
if (!group_array) |
error(strerror(ENOMEM)); |
getgroups(ngroups, group_array); |
} |
/* Return non-zero if GID is one that we have in our groups list. */ |
static int |
bash_group_member (gid) |
gid_t gid; |
{ |
register int i; |
/* Short-circuit if possible, maybe saving a call to getgroups(). */ |
if (gid == getgid() || gid == getegid()) |
return (1); |
if (ngroups == 0) |
initialize_group_array (); |
/* Search through the list looking for GID. */ |
for (i = 0; i < ngroups; i++) |
if (gid == group_array[i]) |
return (1); |
return (0); |
} |
/tags/0.3.0/uspace/app/ash/bltin/times.c |
---|
0,0 → 1,30 |
#ifdef _GNU_SOURCE |
/* |
* Copyright (c) 1999 Herbert Xu <herbert@debian.org> |
* This file contains code for the times builtin. |
* $Id: ash-0.4.0-cumulative_fixes-1.patch,v 1.1 2004/06/04 10:32:01 jim Exp $ |
*/ |
#include <stdio.h> |
#include <sys/times.h> |
#include <unistd.h> |
#define main timescmd |
int main() { |
struct tms buf; |
long int clk_tck = sysconf(_SC_CLK_TCK); |
times(&buf); |
printf("%dm%fs %dm%fs\n%dm%fs %dm%fs\n", |
(int) (buf.tms_utime / clk_tck / 60), |
((double) buf.tms_utime) / clk_tck, |
(int) (buf.tms_stime / clk_tck / 60), |
((double) buf.tms_stime) / clk_tck, |
(int) (buf.tms_cutime / clk_tck / 60), |
((double) buf.tms_cutime) / clk_tck, |
(int) (buf.tms_cstime / clk_tck / 60), |
((double) buf.tms_cstime) / clk_tck); |
return 0; |
} |
#endif /* _GNU_SOURCE */ |
/tags/0.3.0/uspace/app/ash/bltin/echo.1 |
---|
0,0 → 1,113 |
.\" $NetBSD: echo.1,v 1.9 1999/03/22 18:30:47 garbled Exp $ |
.\" |
.\" Copyright (c) 1991, 1993 |
.\" The Regents of the University of California. All rights reserved. |
.\" |
.\" This code is derived from software contributed to Berkeley by |
.\" Kenneth Almquist. |
.\" Copyright 1989 by Kenneth Almquist |
.\" |
.\" Redistribution and use in source and binary forms, with or without |
.\" modification, are permitted provided that the following conditions |
.\" are met: |
.\" 1. Redistributions of source code must retain the above copyright |
.\" notice, this list of conditions and the following disclaimer. |
.\" 2. Redistributions in binary form must reproduce the above copyright |
.\" notice, this list of conditions and the following disclaimer in the |
.\" documentation and/or other materials provided with the distribution. |
.\" 3. All advertising materials mentioning features or use of this software |
.\" must display the following acknowledgement: |
.\" This product includes software developed by the University of |
.\" California, Berkeley and its contributors. |
.\" 4. Neither the name of the University nor the names of its contributors |
.\" may be used to endorse or promote products derived from this software |
.\" without specific prior written permission. |
.\" |
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
.\" SUCH DAMAGE. |
.\" |
.\" @(#)echo.1 8.1 (Berkeley) 5/31/93 |
.\" |
.Dd May 31, 1993 |
.Dt ECHO 1 |
.Os |
.Sh NAME |
.Nm echo |
.Nd produce message in a shell script |
.Sh SYNOPSIS |
.Nm |
.Op Fl n | Fl e |
.Ar args... |
.Sh DESCRIPTION |
.Nm |
prints its arguments on the standard output, separated by spaces. |
Unless the |
.Fl n |
option is present, a newline is output following the arguments. |
The |
.Fl e |
option causes |
.Nm |
to treat the escape sequences specially, as described in the following |
paragraph. |
The |
.Fl e |
option is the default, and is provided solely for compatibility with |
other systems. |
Only one of the options |
.Fl n |
and |
.Fl e |
may be given. |
.Pp |
If any of the following sequences of characters is encountered during |
output, the sequence is not output. Instead, the specified action is |
performed: |
.Bl -tag -width indent |
.It Li \eb |
A backspace character is output. |
.It Li \ec |
Subsequent output is suppressed. This is normally used at the end of the |
last argument to suppress the trailing newline that |
.Nm |
would otherwise output. |
.It Li \ef |
Output a form feed. |
.It Li \en |
Output a newline character. |
.It Li \er |
Output a carriage return. |
.It Li \et |
Output a (horizontal) tab character. |
.It Li \ev |
Output a vertical tab. |
.It Li \e0 Ns Ar digits |
Output the character whose value is given by zero to three digits. |
If there are zero digits, a nul character is output. |
.It Li \e\e |
Output a backslash. |
.El |
.Sh HINTS |
Remember that backslash is special to the shell and needs to be escaped. |
To output a message to standard error, say |
.Pp |
.D1 echo message >&2 |
.Sh BUGS |
The octal character escape mechanism |
.Pq Li \e0 Ns Ar digits |
differs from the |
C language mechanism. |
.Pp |
There is no way to force |
.Nm |
to treat its arguments literally, rather than interpreting them as |
options and escape sequences. |
/tags/0.3.0/uspace/app/ash/bltin/bltin.h |
---|
0,0 → 1,81 |
/* $NetBSD: bltin.h,v 1.9 1997/07/04 21:02:29 christos Exp $ */ |
/*- |
* Copyright (c) 1991, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Kenneth Almquist. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
* |
* @(#)bltin.h 8.1 (Berkeley) 5/31/93 |
*/ |
/* |
* This file is included by programs which are optionally built into the |
* shell. If SHELL is defined, we try to map the standard UNIX library |
* routines to ash routines using defines. |
*/ |
#include "../shell.h" |
#include "../mystring.h" |
#include "../memalloc.h" |
#ifdef SHELL |
#include "../output.h" |
#ifndef _GNU_SOURCE |
#define stdout out1 |
#define stderr out2 |
#define printf out1fmt |
#define putc(c, file) outc(c, file) |
#define putchar(c) out1c(c) |
#define fprintf outfmt |
#define fputs outstr |
#define fflush flushout |
#define warnx(a, b, c) { \ |
char buf[64]; \ |
(void)snprintf(buf, sizeof(buf), a, b, c); \ |
error("%s", buf); \ |
} |
#endif |
#define INITARGS(argv) |
#else |
#undef NULL |
#include <stdio.h> |
#undef main |
#define INITARGS(argv) if ((commandname = argv[0]) == NULL) {fputs("Argc is zero\n", stderr); exit(2);} else |
#endif |
pointer stalloc __P((int)); |
void error __P((char *, ...)); |
int echocmd __P((int, char **)); |
extern char *commandname; |
/tags/0.3.0/uspace/app/ash/memalloc.c |
---|
0,0 → 1,329 |
/* $NetBSD: memalloc.c,v 1.23 2000/11/01 19:56:01 christos Exp $ */ |
/*- |
* Copyright (c) 1991, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Kenneth Almquist. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
*/ |
#include <sys/cdefs.h> |
#ifndef lint |
#if 0 |
static char sccsid[] = "@(#)memalloc.c 8.3 (Berkeley) 5/4/95"; |
#else |
__RCSID("$NetBSD: memalloc.c,v 1.23 2000/11/01 19:56:01 christos Exp $"); |
#endif |
#endif /* not lint */ |
#include <stdlib.h> |
#include <unistd.h> |
#include "shell.h" |
#include "output.h" |
#include "memalloc.h" |
#include "error.h" |
#include "machdep.h" |
#include "mystring.h" |
/* |
* Like malloc, but returns an error when out of space. |
*/ |
pointer |
ckmalloc(nbytes) |
int nbytes; |
{ |
pointer p; |
INTOFF; |
p = malloc(nbytes); |
INTON; |
if (p == NULL) |
error("Out of space"); |
return p; |
} |
/* |
* Same for realloc. |
*/ |
pointer |
ckrealloc(p, nbytes) |
pointer p; |
int nbytes; |
{ |
if ((p = realloc(p, nbytes)) == NULL) |
error("Out of space"); |
return p; |
} |
/* |
* Make a copy of a string in safe storage. |
*/ |
char * |
savestr(s) |
char *s; |
{ |
char *p; |
p = ckmalloc(strlen(s) + 1); |
scopy(s, p); |
return p; |
} |
/* |
* Parse trees for commands are allocated in lifo order, so we use a stack |
* to make this more efficient, and also to avoid all sorts of exception |
* handling code to handle interrupts in the middle of a parse. |
* |
* The size 504 was chosen because the Ultrix malloc handles that size |
* well. |
*/ |
#define MINSIZE 504 /* minimum size of a block */ |
struct stack_block { |
struct stack_block *prev; |
char space[MINSIZE]; |
}; |
struct stack_block stackbase; |
struct stack_block *stackp = &stackbase; |
struct stackmark *markp; |
char *stacknxt = stackbase.space; |
int stacknleft = MINSIZE; |
int sstrnleft; |
int herefd = -1; |
pointer |
stalloc(nbytes) |
int nbytes; |
{ |
char *p; |
nbytes = ALIGN(nbytes); |
if (nbytes > stacknleft) { |
int blocksize; |
struct stack_block *sp; |
blocksize = nbytes; |
if (blocksize < MINSIZE) |
blocksize = MINSIZE; |
INTOFF; |
sp = ckmalloc(sizeof(struct stack_block) - MINSIZE + blocksize); |
sp->prev = stackp; |
stacknxt = sp->space; |
stacknleft = blocksize; |
stackp = sp; |
INTON; |
} |
p = stacknxt; |
stacknxt += nbytes; |
stacknleft -= nbytes; |
return p; |
} |
void |
stunalloc(p) |
pointer p; |
{ |
if (p == NULL) { /*DEBUG */ |
write(2, "stunalloc\n", 10); |
abort(); |
} |
stacknleft += stacknxt - (char *)p; |
stacknxt = p; |
} |
void |
setstackmark(mark) |
struct stackmark *mark; |
{ |
mark->stackp = stackp; |
mark->stacknxt = stacknxt; |
mark->stacknleft = stacknleft; |
mark->marknext = markp; |
markp = mark; |
} |
void |
popstackmark(mark) |
struct stackmark *mark; |
{ |
struct stack_block *sp; |
INTOFF; |
markp = mark->marknext; |
while (stackp != mark->stackp) { |
sp = stackp; |
stackp = sp->prev; |
ckfree(sp); |
} |
stacknxt = mark->stacknxt; |
stacknleft = mark->stacknleft; |
INTON; |
} |
/* |
* When the parser reads in a string, it wants to stick the string on the |
* stack and only adjust the stack pointer when it knows how big the |
* string is. Stackblock (defined in stack.h) returns a pointer to a block |
* of space on top of the stack and stackblocklen returns the length of |
* this block. Growstackblock will grow this space by at least one byte, |
* possibly moving it (like realloc). Grabstackblock actually allocates the |
* part of the block that has been used. |
*/ |
void |
growstackblock() { |
char *p; |
int newlen = ALIGN(stacknleft * 2 + 100); |
char *oldspace = stacknxt; |
int oldlen = stacknleft; |
struct stack_block *sp; |
struct stack_block *oldstackp; |
if (stacknxt == stackp->space && stackp != &stackbase) { |
INTOFF; |
oldstackp = stackp; |
sp = stackp; |
stackp = sp->prev; |
sp = ckrealloc((pointer)sp, sizeof(struct stack_block) - MINSIZE + newlen); |
sp->prev = stackp; |
stackp = sp; |
stacknxt = sp->space; |
stacknleft = newlen; |
{ |
/* Stack marks pointing to the start of the old block |
* must be relocated to point to the new block |
*/ |
struct stackmark *xmark; |
xmark = markp; |
while (xmark != NULL && xmark->stackp == oldstackp) { |
xmark->stackp = stackp; |
xmark->stacknxt = stacknxt; |
xmark->stacknleft = stacknleft; |
xmark = xmark->marknext; |
} |
} |
INTON; |
} else { |
p = stalloc(newlen); |
memcpy(p, oldspace, oldlen); |
stacknxt = p; /* free the space */ |
stacknleft += newlen; /* we just allocated */ |
} |
} |
void |
grabstackblock(len) |
int len; |
{ |
len = ALIGN(len); |
stacknxt += len; |
stacknleft -= len; |
} |
/* |
* The following routines are somewhat easier to use that the above. |
* The user declares a variable of type STACKSTR, which may be declared |
* to be a register. The macro STARTSTACKSTR initializes things. Then |
* the user uses the macro STPUTC to add characters to the string. In |
* effect, STPUTC(c, p) is the same as *p++ = c except that the stack is |
* grown as necessary. When the user is done, she can just leave the |
* string there and refer to it using stackblock(). Or she can allocate |
* the space for it using grabstackstr(). If it is necessary to allow |
* someone else to use the stack temporarily and then continue to grow |
* the string, the user should use grabstack to allocate the space, and |
* then call ungrabstr(p) to return to the previous mode of operation. |
* |
* USTPUTC is like STPUTC except that it doesn't check for overflow. |
* CHECKSTACKSPACE can be called before USTPUTC to ensure that there |
* is space for at least one character. |
*/ |
char * |
growstackstr() { |
int len = stackblocksize(); |
if (herefd >= 0 && len >= 1024) { |
xwrite(herefd, stackblock(), len); |
sstrnleft = len - 1; |
return stackblock(); |
} |
growstackblock(); |
sstrnleft = stackblocksize() - len - 1; |
return stackblock() + len; |
} |
/* |
* Called from CHECKSTRSPACE. |
*/ |
char * |
makestrspace() { |
int len = stackblocksize() - sstrnleft; |
growstackblock(); |
sstrnleft = stackblocksize() - len; |
return stackblock() + len; |
} |
void |
ungrabstackstr(s, p) |
char *s; |
char *p; |
{ |
stacknleft += stacknxt - s; |
stacknxt = s; |
sstrnleft = stacknleft - (p - s); |
} |
/tags/0.3.0/uspace/app/ash/alias.c |
---|
0,0 → 1,267 |
/* $NetBSD: alias.c,v 1.10 1998/05/20 00:27:56 christos Exp $ */ |
/*- |
* Copyright (c) 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Kenneth Almquist. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
*/ |
//#include <sys/cdefs.h> |
#ifndef lint |
#if 0 |
static char sccsid[] = "@(#)alias.c 8.3 (Berkeley) 5/4/95"; |
#else |
__RCSID("$NetBSD: alias.c,v 1.10 1998/05/20 00:27:56 christos Exp $"); |
#endif |
#endif /* not lint */ |
#include <stdlib.h> |
#include "shell.h" |
#include "input.h" |
#include "output.h" |
#include "error.h" |
#include "memalloc.h" |
#include "mystring.h" |
#include "alias.h" |
#include "options.h" /* XXX for argptr (should remove?) */ |
#define ATABSIZE 39 |
struct alias *atab[ATABSIZE]; |
STATIC void setalias (char *, char *); |
STATIC int unalias (char *); |
STATIC struct alias **hashalias (char *); |
STATIC |
void |
setalias(char *name, char *val) |
{ |
struct alias *ap, **app; |
app = hashalias(name); |
for (ap = *app; ap; ap = ap->next) { |
if (equal(name, ap->name)) { |
INTOFF; |
ckfree(ap->val); |
ap->val = savestr(val); |
INTON; |
return; |
} |
} |
/* not found */ |
INTOFF; |
ap = ckmalloc(sizeof (struct alias)); |
ap->name = savestr(name); |
/* |
* XXX - HACK: in order that the parser will not finish reading the |
* alias value off the input before processing the next alias, we |
* dummy up an extra space at the end of the alias. This is a crock |
* and should be re-thought. The idea (if you feel inclined to help) |
* is to avoid alias recursions. The mechanism used is: when |
* expanding an alias, the value of the alias is pushed back on the |
* input as a string and a pointer to the alias is stored with the |
* string. The alias is marked as being in use. When the input |
* routine finishes reading the string, it markes the alias not |
* in use. The problem is synchronization with the parser. Since |
* it reads ahead, the alias is marked not in use before the |
* resulting token(s) is next checked for further alias sub. The |
* H A C K is that we add a little fluff after the alias value |
* so that the string will not be exhausted. This is a good |
* idea ------- ***NOT*** |
*/ |
#ifdef notyet |
ap->val = savestr(val); |
#else /* hack */ |
{ |
int len = strlen(val); |
ap->val = ckmalloc(len + 2); |
memcpy(ap->val, val, len); |
ap->val[len] = ' '; /* fluff */ |
ap->val[len+1] = '\0'; |
} |
#endif |
ap->next = *app; |
*app = ap; |
INTON; |
} |
STATIC int |
unalias(name) |
char *name; |
{ |
struct alias *ap, **app; |
app = hashalias(name); |
for (ap = *app; ap; app = &(ap->next), ap = ap->next) { |
if (equal(name, ap->name)) { |
/* |
* if the alias is currently in use (i.e. its |
* buffer is being used by the input routine) we |
* just null out the name instead of freeing it. |
* We could clear it out later, but this situation |
* is so rare that it hardly seems worth it. |
*/ |
if (ap->flag & ALIASINUSE) |
*ap->name = '\0'; |
else { |
INTOFF; |
*app = ap->next; |
ckfree(ap->name); |
ckfree(ap->val); |
ckfree(ap); |
INTON; |
} |
return (0); |
} |
} |
return (1); |
} |
#ifdef mkinit |
MKINIT void rmaliases (void); |
SHELLPROC { |
rmaliases(); |
} |
#endif |
void |
rmaliases() { |
struct alias *ap, *tmp; |
int i; |
INTOFF; |
for (i = 0; i < ATABSIZE; i++) { |
ap = atab[i]; |
atab[i] = NULL; |
while (ap) { |
ckfree(ap->name); |
ckfree(ap->val); |
tmp = ap; |
ap = ap->next; |
ckfree(tmp); |
} |
} |
INTON; |
} |
struct alias * |
lookupalias(name, check) |
char *name; |
int check; |
{ |
struct alias *ap = *hashalias(name); |
for (; ap; ap = ap->next) { |
if (equal(name, ap->name)) { |
if (check && (ap->flag & ALIASINUSE)) |
return (NULL); |
return (ap); |
} |
} |
return (NULL); |
} |
/* |
* TODO - sort output |
*/ |
int |
aliascmd(argc, argv) |
int argc; |
char **argv; |
{ |
char *n, *v; |
int ret = 0; |
struct alias *ap; |
if (argc == 1) { |
int i; |
for (i = 0; i < ATABSIZE; i++) |
for (ap = atab[i]; ap; ap = ap->next) { |
if (*ap->name != '\0') |
out1fmt("alias %s=%s\n", ap->name, ap->val); |
} |
return (0); |
} |
while ((n = *++argv) != NULL) { |
if ((v = strchr(n+1, '=')) == NULL) { /* n+1: funny ksh stuff */ |
if ((ap = lookupalias(n, 0)) == NULL) { |
outfmt(out2, "alias: %s not found\n", n); |
ret = 1; |
} else |
out1fmt("alias %s=%s\n", n, ap->val); |
} |
else { |
*v++ = '\0'; |
setalias(n, v); |
} |
} |
return (ret); |
} |
int |
unaliascmd(argc, argv) |
int argc; |
char **argv; |
{ |
int i; |
while ((i = nextopt("a")) != '\0') { |
if (i == 'a') { |
rmaliases(); |
return (0); |
} |
} |
for (i = 0; *argptr; argptr++) |
i = unalias(*argptr); |
return (i); |
} |
STATIC struct alias ** |
hashalias(p) |
char *p; |
{ |
unsigned int hashval; |
hashval = *p << 4; |
while (*p) |
hashval+= *p++; |
return &atab[hashval % ATABSIZE]; |
} |
/tags/0.3.0/uspace/app/ash/exec.h |
---|
0,0 → 1,79 |
/* $NetBSD: exec.h,v 1.17 2000/05/22 10:18:47 elric Exp $ */ |
/*- |
* Copyright (c) 1991, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Kenneth Almquist. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
* |
* @(#)exec.h 8.3 (Berkeley) 6/8/95 |
*/ |
/* values of cmdtype */ |
#define CMDUNKNOWN -1 /* no entry in table for command */ |
#define CMDNORMAL 0 /* command is an executable program */ |
#define CMDBUILTIN 1 /* command is a shell builtin */ |
#define CMDFUNCTION 2 /* command is a shell function */ |
struct cmdentry { |
int cmdtype; |
union param { |
int index; |
union node *func; |
} u; |
}; |
#define DO_ERR 1 /* find_command prints errors */ |
#define DO_ABS 2 /* find_command checks absolute paths */ |
#define DO_NOFUN 4 /* find_command ignores functions */ |
#define DO_BRUTE 8 /* find_command ignores hash table */ |
extern const char *pathopt; /* set by padvance */ |
extern int exerrno; /* last exec error */ |
void shellexec (char **, char **, const char *, int) |
__attribute__((noreturn)); |
char *padvance (const char **, const char *); |
int hashcmd (int, char **); |
void find_command (char *, struct cmdentry *, int, const char *); |
int find_builtin (char *); |
void hashcd (void); |
void changepath (const char *); |
void deletefuncs (void); |
void getcmdentry (char *, struct cmdentry *); |
void addcmdentry (char *, struct cmdentry *); |
void defun (char *, union node *); |
int unsetfunc (char *); |
int typecmd (int, char **); |
int commandcmd (int, char **); |
/tags/0.3.0/uspace/app/ash/nodes.c.pat |
---|
0,0 → 1,169 |
/* $NetBSD: nodes.c.pat,v 1.8 1997/04/11 23:03:09 christos Exp $ */ |
/*- |
* Copyright (c) 1991, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Kenneth Almquist. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
* |
* @(#)nodes.c.pat 8.2 (Berkeley) 5/4/95 |
*/ |
#include <stdlib.h> |
/* |
* Routine for dealing with parsed shell commands. |
*/ |
#include "shell.h" |
#include "nodes.h" |
#include "memalloc.h" |
#include "machdep.h" |
#include "mystring.h" |
int funcblocksize; /* size of structures in function */ |
int funcstringsize; /* size of strings in node */ |
pointer funcblock; /* block to allocate function from */ |
char *funcstring; /* block to allocate strings from */ |
%SIZES |
STATIC void calcsize (union node *); |
STATIC void sizenodelist (struct nodelist *); |
STATIC union node *copynode (union node *); |
STATIC struct nodelist *copynodelist (struct nodelist *); |
STATIC char *nodesavestr (char *); |
/* |
* Make a copy of a parse tree. |
*/ |
union node * |
copyfunc(n) |
union node *n; |
{ |
if (n == NULL) |
return NULL; |
funcblocksize = 0; |
funcstringsize = 0; |
calcsize(n); |
funcblock = ckmalloc(funcblocksize + funcstringsize); |
funcstring = (char *) funcblock + funcblocksize; |
return copynode(n); |
} |
STATIC void |
calcsize(n) |
union node *n; |
{ |
%CALCSIZE |
} |
STATIC void |
sizenodelist(lp) |
struct nodelist *lp; |
{ |
while (lp) { |
funcblocksize += ALIGN(sizeof(struct nodelist)); |
calcsize(lp->n); |
lp = lp->next; |
} |
} |
STATIC union node * |
copynode(n) |
union node *n; |
{ |
union node *new; |
%COPY |
return new; |
} |
STATIC struct nodelist * |
copynodelist(lp) |
struct nodelist *lp; |
{ |
struct nodelist *start; |
struct nodelist **lpp; |
lpp = &start; |
while (lp) { |
*lpp = funcblock; |
funcblock = (char *) funcblock + ALIGN(sizeof(struct nodelist)); |
(*lpp)->n = copynode(lp->n); |
lp = lp->next; |
lpp = &(*lpp)->next; |
} |
*lpp = NULL; |
return start; |
} |
STATIC char * |
nodesavestr(s) |
char *s; |
{ |
register char *p = s; |
register char *q = funcstring; |
char *rtn = funcstring; |
while ((*q++ = *p++) != '\0') |
continue; |
funcstring = q; |
return rtn; |
} |
/* |
* Free a parse tree. |
*/ |
void |
freefunc(n) |
union node *n; |
{ |
if (n) |
ckfree(n); |
} |
/tags/0.3.0/uspace/app/ash/cd.h |
---|
0,0 → 1,39 |
/* $NetBSD: cd.h,v 1.2 1997/07/04 21:01:52 christos Exp $ */ |
/*- |
* Copyright (c) 1995 |
* The Regents of the University of California. All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
* |
*/ |
void getpwd (void); |
int cdcmd (int, char **); |
int pwdcmd (int, char **); |
/tags/0.3.0/uspace/app/ash/parser.c |
---|
0,0 → 1,1559 |
/* $NetBSD: parser.c,v 1.45 2000/07/27 04:09:27 cgd Exp $ */ |
/*- |
* Copyright (c) 1991, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Kenneth Almquist. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
*/ |
#include <sys/cdefs.h> |
#ifndef lint |
#if 0 |
static char sccsid[] = "@(#)parser.c 8.7 (Berkeley) 5/16/95"; |
#else |
__RCSID("$NetBSD: parser.c,v 1.45 2000/07/27 04:09:27 cgd Exp $"); |
#endif |
#endif /* not lint */ |
#include <stdlib.h> |
#include "shell.h" |
#include "parser.h" |
#include "nodes.h" |
#include "expand.h" /* defines rmescapes() */ |
#include "redir.h" /* defines copyfd() */ |
#include "syntax.h" |
#include "options.h" |
#include "input.h" |
#include "output.h" |
#include "var.h" |
#include "error.h" |
#include "memalloc.h" |
#include "mystring.h" |
#include "alias.h" |
#include "show.h" |
#ifndef SMALL |
#include "myhistedit.h" |
#endif |
/* |
* Shell command parser. |
*/ |
#define EOFMARKLEN 79 |
/* values returned by readtoken */ |
#include "token.h" |
struct heredoc { |
struct heredoc *next; /* next here document in list */ |
union node *here; /* redirection node */ |
char *eofmark; /* string indicating end of input */ |
int striptabs; /* if set, strip leading tabs */ |
}; |
struct heredoc *heredoclist; /* list of here documents to read */ |
int parsebackquote; /* nonzero if we are inside backquotes */ |
int doprompt; /* if set, prompt the user */ |
int needprompt; /* true if interactive and at start of line */ |
int lasttoken; /* last token read */ |
MKINIT int tokpushback; /* last token pushed back */ |
char *wordtext; /* text of last word returned by readtoken */ |
MKINIT int checkkwd; /* 1 == check for kwds, 2 == also eat newlines */ |
struct nodelist *backquotelist; |
union node *redirnode; |
struct heredoc *heredoc; |
int quoteflag; /* set if (part of) last token was quoted */ |
int startlinno; /* line # where last token started */ |
STATIC union node *list (int); |
STATIC union node *andor (void); |
STATIC union node *pipeline (void); |
STATIC union node *command (void); |
STATIC union node *simplecmd (union node **, union node *); |
STATIC union node *makename (void); |
STATIC void parsefname (void); |
STATIC void parseheredoc (void); |
STATIC int peektoken (void); |
STATIC int readtoken (void); |
STATIC int xxreadtoken (void); |
STATIC int readtoken1 (int, char const *, char *, int); |
STATIC int noexpand (char *); |
STATIC void synexpect (int) __attribute__((noreturn)); |
STATIC void synerror (const char *) __attribute__((noreturn)); |
STATIC void setprompt (int); |
/* |
* Read and parse a command. Returns NEOF on end of file. (NULL is a |
* valid parse tree indicating a blank line.) |
*/ |
union node * |
parsecmd(int interact) |
{ |
int t; |
doprompt = interact; |
if (doprompt) |
setprompt(1); |
else |
setprompt(0); |
needprompt = 0; |
t = readtoken(); |
if (t == TEOF) |
return NEOF; |
if (t == TNL) |
return NULL; |
tokpushback++; |
return list(1); |
} |
STATIC union node * |
list(nlflag) |
int nlflag; |
{ |
union node *n1, *n2, *n3; |
int tok; |
checkkwd = 2; |
if (nlflag == 0 && tokendlist[peektoken()]) |
return NULL; |
n1 = NULL; |
for (;;) { |
n2 = andor(); |
tok = readtoken(); |
if (tok == TBACKGND) { |
if (n2->type == NCMD || n2->type == NPIPE) { |
n2->ncmd.backgnd = 1; |
} else if (n2->type == NREDIR) { |
n2->type = NBACKGND; |
} else { |
n3 = (union node *)stalloc(sizeof (struct nredir)); |
n3->type = NBACKGND; |
n3->nredir.n = n2; |
n3->nredir.redirect = NULL; |
n2 = n3; |
} |
} |
if (n1 == NULL) { |
n1 = n2; |
} |
else { |
n3 = (union node *)stalloc(sizeof (struct nbinary)); |
n3->type = NSEMI; |
n3->nbinary.ch1 = n1; |
n3->nbinary.ch2 = n2; |
n1 = n3; |
} |
switch (tok) { |
case TBACKGND: |
case TSEMI: |
tok = readtoken(); |
/* fall through */ |
case TNL: |
if (tok == TNL) { |
parseheredoc(); |
if (nlflag) |
return n1; |
} else { |
tokpushback++; |
} |
checkkwd = 2; |
if (tokendlist[peektoken()]) |
return n1; |
break; |
case TEOF: |
if (heredoclist) |
parseheredoc(); |
else |
pungetc(); /* push back EOF on input */ |
return n1; |
default: |
if (nlflag) |
synexpect(-1); |
tokpushback++; |
return n1; |
} |
} |
} |
STATIC union node * |
andor() { |
union node *n1, *n2, *n3; |
int t; |
checkkwd = 1; |
n1 = pipeline(); |
for (;;) { |
if ((t = readtoken()) == TAND) { |
t = NAND; |
} else if (t == TOR) { |
t = NOR; |
} else { |
tokpushback++; |
return n1; |
} |
checkkwd = 2; |
n2 = pipeline(); |
n3 = (union node *)stalloc(sizeof (struct nbinary)); |
n3->type = t; |
n3->nbinary.ch1 = n1; |
n3->nbinary.ch2 = n2; |
n1 = n3; |
} |
} |
STATIC union node * |
pipeline() { |
union node *n1, *n2, *pipenode; |
struct nodelist *lp, *prev; |
int negate; |
negate = 0; |
TRACE(("pipeline: entered\n")); |
if (readtoken() == TNOT) { |
negate = !negate; |
checkkwd = 1; |
} else |
tokpushback++; |
n1 = command(); |
if (readtoken() == TPIPE) { |
pipenode = (union node *)stalloc(sizeof (struct npipe)); |
pipenode->type = NPIPE; |
pipenode->npipe.backgnd = 0; |
lp = (struct nodelist *)stalloc(sizeof (struct nodelist)); |
pipenode->npipe.cmdlist = lp; |
lp->n = n1; |
do { |
prev = lp; |
lp = (struct nodelist *)stalloc(sizeof (struct nodelist)); |
checkkwd = 2; |
lp->n = command(); |
prev->next = lp; |
} while (readtoken() == TPIPE); |
lp->next = NULL; |
n1 = pipenode; |
} |
tokpushback++; |
if (negate) { |
n2 = (union node *)stalloc(sizeof (struct nnot)); |
n2->type = NNOT; |
n2->nnot.com = n1; |
return n2; |
} else |
return n1; |
} |
STATIC union node * |
command() { |
union node *n1, *n2; |
union node *ap, **app; |
union node *cp, **cpp; |
union node *redir, **rpp; |
int t; |
redir = NULL; |
n1 = NULL; |
rpp = &redir; |
/* Check for redirection which may precede command */ |
while (readtoken() == TREDIR) { |
*rpp = n2 = redirnode; |
rpp = &n2->nfile.next; |
parsefname(); |
} |
tokpushback++; |
switch (readtoken()) { |
case TIF: |
n1 = (union node *)stalloc(sizeof (struct nif)); |
n1->type = NIF; |
n1->nif.test = list(0); |
if (readtoken() != TTHEN) |
synexpect(TTHEN); |
n1->nif.ifpart = list(0); |
n2 = n1; |
while (readtoken() == TELIF) { |
n2->nif.elsepart = (union node *)stalloc(sizeof (struct nif)); |
n2 = n2->nif.elsepart; |
n2->type = NIF; |
n2->nif.test = list(0); |
if (readtoken() != TTHEN) |
synexpect(TTHEN); |
n2->nif.ifpart = list(0); |
} |
if (lasttoken == TELSE) |
n2->nif.elsepart = list(0); |
else { |
n2->nif.elsepart = NULL; |
tokpushback++; |
} |
if (readtoken() != TFI) |
synexpect(TFI); |
checkkwd = 1; |
break; |
case TWHILE: |
case TUNTIL: { |
int got; |
n1 = (union node *)stalloc(sizeof (struct nbinary)); |
n1->type = (lasttoken == TWHILE)? NWHILE : NUNTIL; |
n1->nbinary.ch1 = list(0); |
if ((got=readtoken()) != TDO) { |
TRACE(("expecting DO got %s %s\n", tokname[got], got == TWORD ? wordtext : "")); |
synexpect(TDO); |
} |
n1->nbinary.ch2 = list(0); |
if (readtoken() != TDONE) |
synexpect(TDONE); |
checkkwd = 1; |
break; |
} |
case TFOR: |
if (readtoken() != TWORD || quoteflag || ! goodname(wordtext)) |
synerror("Bad for loop variable"); |
n1 = (union node *)stalloc(sizeof (struct nfor)); |
n1->type = NFOR; |
n1->nfor.var = wordtext; |
if (readtoken() == TWORD && ! quoteflag && equal(wordtext, "in")) { |
app = ≈ |
while (readtoken() == TWORD) { |
n2 = (union node *)stalloc(sizeof (struct narg)); |
n2->type = NARG; |
n2->narg.text = wordtext; |
n2->narg.backquote = backquotelist; |
*app = n2; |
app = &n2->narg.next; |
} |
*app = NULL; |
n1->nfor.args = ap; |
if (lasttoken != TNL && lasttoken != TSEMI) |
synexpect(-1); |
} else { |
static char argvars[5] = {CTLVAR, VSNORMAL|VSQUOTE, |
'@', '=', '\0'}; |
n2 = (union node *)stalloc(sizeof (struct narg)); |
n2->type = NARG; |
n2->narg.text = argvars; |
n2->narg.backquote = NULL; |
n2->narg.next = NULL; |
n1->nfor.args = n2; |
/* |
* Newline or semicolon here is optional (but note |
* that the original Bourne shell only allowed NL). |
*/ |
if (lasttoken != TNL && lasttoken != TSEMI) |
tokpushback++; |
} |
checkkwd = 2; |
if ((t = readtoken()) == TDO) |
t = TDONE; |
else if (t == TBEGIN) |
t = TEND; |
else |
synexpect(-1); |
n1->nfor.body = list(0); |
if (readtoken() != t) |
synexpect(t); |
checkkwd = 1; |
break; |
case TCASE: |
n1 = (union node *)stalloc(sizeof (struct ncase)); |
n1->type = NCASE; |
if (readtoken() != TWORD) |
synexpect(TWORD); |
n1->ncase.expr = n2 = (union node *)stalloc(sizeof (struct narg)); |
n2->type = NARG; |
n2->narg.text = wordtext; |
n2->narg.backquote = backquotelist; |
n2->narg.next = NULL; |
while (readtoken() == TNL); |
if (lasttoken != TWORD || ! equal(wordtext, "in")) |
synerror("expecting \"in\""); |
cpp = &n1->ncase.cases; |
checkkwd = 2, readtoken(); |
do { |
if (lasttoken == TLP) |
readtoken(); |
*cpp = cp = (union node *)stalloc(sizeof (struct nclist)); |
cp->type = NCLIST; |
app = &cp->nclist.pattern; |
for (;;) { |
*app = ap = (union node *)stalloc(sizeof (struct narg)); |
ap->type = NARG; |
ap->narg.text = wordtext; |
ap->narg.backquote = backquotelist; |
if (checkkwd = 2, readtoken() != TPIPE) |
break; |
app = &ap->narg.next; |
readtoken(); |
} |
ap->narg.next = NULL; |
if (lasttoken != TRP) |
synexpect(TRP); |
cp->nclist.body = list(0); |
checkkwd = 2; |
if ((t = readtoken()) != TESAC) { |
if (t != TENDCASE) |
synexpect(TENDCASE); |
else |
checkkwd = 2, readtoken(); |
} |
cpp = &cp->nclist.next; |
} while(lasttoken != TESAC); |
*cpp = NULL; |
checkkwd = 1; |
break; |
case TLP: |
n1 = (union node *)stalloc(sizeof (struct nredir)); |
n1->type = NSUBSHELL; |
n1->nredir.n = list(0); |
n1->nredir.redirect = NULL; |
if (readtoken() != TRP) |
synexpect(TRP); |
checkkwd = 1; |
break; |
case TBEGIN: |
n1 = list(0); |
if (readtoken() != TEND) |
synexpect(TEND); |
checkkwd = 1; |
break; |
/* Handle an empty command like other simple commands. */ |
case TSEMI: |
case TAND: |
case TOR: |
case TNL: |
case TEOF: |
case TRP: |
case TBACKGND: |
/* |
* An empty command before a ; doesn't make much sense, and |
* should certainly be disallowed in the case of `if ;'. |
*/ |
if (!redir) |
synexpect(-1); |
case TWORD: |
tokpushback++; |
n1 = simplecmd(rpp, redir); |
return n1; |
default: |
synexpect(-1); |
/* NOTREACHED */ |
} |
/* Now check for redirection which may follow command */ |
while (readtoken() == TREDIR) { |
*rpp = n2 = redirnode; |
rpp = &n2->nfile.next; |
parsefname(); |
} |
tokpushback++; |
*rpp = NULL; |
if (redir) { |
if (n1->type != NSUBSHELL) { |
n2 = (union node *)stalloc(sizeof (struct nredir)); |
n2->type = NREDIR; |
n2->nredir.n = n1; |
n1 = n2; |
} |
n1->nredir.redirect = redir; |
} |
return n1; |
} |
STATIC union node * |
simplecmd(rpp, redir) |
union node **rpp, *redir; |
{ |
union node *args, **app; |
union node **orig_rpp = rpp; |
union node *n = NULL; |
/* If we don't have any redirections already, then we must reset */ |
/* rpp to be the address of the local redir variable. */ |
if (redir == 0) |
rpp = &redir; |
args = NULL; |
app = &args; |
/* |
* We save the incoming value, because we need this for shell |
* functions. There can not be a redirect or an argument between |
* the function name and the open parenthesis. |
*/ |
orig_rpp = rpp; |
for (;;) { |
if (readtoken() == TWORD) { |
n = (union node *)stalloc(sizeof (struct narg)); |
n->type = NARG; |
n->narg.text = wordtext; |
n->narg.backquote = backquotelist; |
*app = n; |
app = &n->narg.next; |
} else if (lasttoken == TREDIR) { |
*rpp = n = redirnode; |
rpp = &n->nfile.next; |
parsefname(); /* read name of redirection file */ |
} else if (lasttoken == TLP && app == &args->narg.next |
&& rpp == orig_rpp) { |
/* We have a function */ |
if (readtoken() != TRP) |
synexpect(TRP); |
#ifdef notdef |
if (! goodname(n->narg.text)) |
synerror("Bad function name"); |
#endif |
n->type = NDEFUN; |
checkkwd = 2; |
n->narg.next = command(); |
return n; |
} else { |
tokpushback++; |
break; |
} |
} |
*app = NULL; |
*rpp = NULL; |
n = (union node *)stalloc(sizeof (struct ncmd)); |
n->type = NCMD; |
n->ncmd.backgnd = 0; |
n->ncmd.args = args; |
n->ncmd.redirect = redir; |
return n; |
} |
STATIC union node * |
makename() { |
union node *n; |
n = (union node *)stalloc(sizeof (struct narg)); |
n->type = NARG; |
n->narg.next = NULL; |
n->narg.text = wordtext; |
n->narg.backquote = backquotelist; |
return n; |
} |
void fixredir(union node *n, const char *text, int err) |
{ |
TRACE(("Fix redir %s %d\n", text, err)); |
if (!err) |
n->ndup.vname = NULL; |
if (is_digit(text[0]) && text[1] == '\0') |
n->ndup.dupfd = digit_val(text[0]); |
else if (text[0] == '-' && text[1] == '\0') |
n->ndup.dupfd = -1; |
else { |
if (err) |
synerror("Bad fd number"); |
else |
n->ndup.vname = makename(); |
} |
} |
STATIC void |
parsefname() { |
union node *n = redirnode; |
if (readtoken() != TWORD) |
synexpect(-1); |
if (n->type == NHERE) { |
struct heredoc *here = heredoc; |
struct heredoc *p; |
int i; |
if (quoteflag == 0) |
n->type = NXHERE; |
TRACE(("Here document %d\n", n->type)); |
if (here->striptabs) { |
while (*wordtext == '\t') |
wordtext++; |
} |
if (! noexpand(wordtext) || (i = strlen(wordtext)) == 0 || i > EOFMARKLEN) |
synerror("Illegal eof marker for << redirection"); |
rmescapes(wordtext); |
here->eofmark = wordtext; |
here->next = NULL; |
if (heredoclist == NULL) |
heredoclist = here; |
else { |
for (p = heredoclist ; p->next ; p = p->next); |
p->next = here; |
} |
} else if (n->type == NTOFD || n->type == NFROMFD) { |
fixredir(n, wordtext, 0); |
} else { |
n->nfile.fname = makename(); |
} |
} |
/* |
* Input any here documents. |
*/ |
STATIC void |
parseheredoc() { |
struct heredoc *here; |
union node *n; |
while (heredoclist) { |
here = heredoclist; |
heredoclist = here->next; |
if (needprompt) { |
setprompt(2); |
needprompt = 0; |
} |
readtoken1(pgetc(), here->here->type == NHERE? SQSYNTAX : DQSYNTAX, |
here->eofmark, here->striptabs); |
n = (union node *)stalloc(sizeof (struct narg)); |
n->narg.type = NARG; |
n->narg.next = NULL; |
n->narg.text = wordtext; |
n->narg.backquote = backquotelist; |
here->here->nhere.doc = n; |
} |
} |
STATIC int |
peektoken() { |
int t; |
t = readtoken(); |
tokpushback++; |
return (t); |
} |
STATIC int |
readtoken() { |
int t; |
int savecheckkwd = checkkwd; |
struct alias *ap; |
#ifdef DEBUG |
int alreadyseen = tokpushback; |
#endif |
top: |
t = xxreadtoken(); |
if (checkkwd) { |
/* |
* eat newlines |
*/ |
if (checkkwd == 2) { |
checkkwd = 0; |
while (t == TNL) { |
parseheredoc(); |
t = xxreadtoken(); |
} |
} else |
checkkwd = 0; |
/* |
* check for keywords and aliases |
*/ |
if (t == TWORD && !quoteflag) |
{ |
const char *const *pp; |
for (pp = parsekwd; *pp; pp++) { |
if (**pp == *wordtext && equal(*pp, wordtext)) |
{ |
lasttoken = t = pp - |
parsekwd + KWDOFFSET; |
TRACE(("keyword %s recognized\n", tokname[t])); |
goto out; |
} |
} |
if ((ap = lookupalias(wordtext, 1)) != NULL) { |
pushstring(ap->val, strlen(ap->val), ap); |
checkkwd = savecheckkwd; |
goto top; |
} |
} |
out: |
checkkwd = 0; |
} |
#ifdef DEBUG |
if (!alreadyseen) |
TRACE(("token %s %s\n", tokname[t], t == TWORD ? wordtext : "")); |
else |
TRACE(("reread token %s %s\n", tokname[t], t == TWORD ? wordtext : "")); |
#endif |
return (t); |
} |
/* |
* Read the next input token. |
* If the token is a word, we set backquotelist to the list of cmds in |
* backquotes. We set quoteflag to true if any part of the word was |
* quoted. |
* If the token is TREDIR, then we set redirnode to a structure containing |
* the redirection. |
* In all cases, the variable startlinno is set to the number of the line |
* on which the token starts. |
* |
* [Change comment: here documents and internal procedures] |
* [Readtoken shouldn't have any arguments. Perhaps we should make the |
* word parsing code into a separate routine. In this case, readtoken |
* doesn't need to have any internal procedures, but parseword does. |
* We could also make parseoperator in essence the main routine, and |
* have parseword (readtoken1?) handle both words and redirection.] |
*/ |
#define RETURN(token) return lasttoken = token |
STATIC int |
xxreadtoken() { |
int c; |
if (tokpushback) { |
tokpushback = 0; |
return lasttoken; |
} |
if (needprompt) { |
setprompt(2); |
needprompt = 0; |
} |
startlinno = plinno; |
for (;;) { /* until token or start of word found */ |
c = pgetc_macro(); |
if (c == ' ' || c == '\t') |
continue; /* quick check for white space first */ |
switch (c) { |
case ' ': case '\t': |
continue; |
case '#': |
while ((c = pgetc()) != '\n' && c != PEOF); |
pungetc(); |
continue; |
case '\\': |
if (pgetc() == '\n') { |
startlinno = ++plinno; |
if (doprompt) |
setprompt(2); |
else |
setprompt(0); |
continue; |
} |
pungetc(); |
goto breakloop; |
case '\n': |
plinno++; |
needprompt = doprompt; |
RETURN(TNL); |
case PEOF: |
RETURN(TEOF); |
case '&': |
if (pgetc() == '&') |
RETURN(TAND); |
pungetc(); |
RETURN(TBACKGND); |
case '|': |
if (pgetc() == '|') |
RETURN(TOR); |
pungetc(); |
RETURN(TPIPE); |
case ';': |
if (pgetc() == ';') |
RETURN(TENDCASE); |
pungetc(); |
RETURN(TSEMI); |
case '(': |
RETURN(TLP); |
case ')': |
RETURN(TRP); |
default: |
goto breakloop; |
} |
} |
breakloop: |
return readtoken1(c, BASESYNTAX, (char *)NULL, 0); |
#undef RETURN |
} |
/* |
* If eofmark is NULL, read a word or a redirection symbol. If eofmark |
* is not NULL, read a here document. In the latter case, eofmark is the |
* word which marks the end of the document and striptabs is true if |
* leading tabs should be stripped from the document. The argument firstc |
* is the first character of the input token or document. |
* |
* Because C does not have internal subroutines, I have simulated them |
* using goto's to implement the subroutine linkage. The following macros |
* will run code that appears at the end of readtoken1. |
*/ |
#define CHECKEND() {goto checkend; checkend_return:;} |
#define PARSEREDIR() {goto parseredir; parseredir_return:;} |
#define PARSESUB() {goto parsesub; parsesub_return:;} |
#define PARSEBACKQOLD() {oldstyle = 1; goto parsebackq; parsebackq_oldreturn:;} |
#define PARSEBACKQNEW() {oldstyle = 0; goto parsebackq; parsebackq_newreturn:;} |
#define PARSEARITH() {goto parsearith; parsearith_return:;} |
STATIC int |
readtoken1(firstc, syntax, eofmark, striptabs) |
int firstc; |
char const *syntax; |
char *eofmark; |
int striptabs; |
{ |
int c = firstc; |
char *out; |
int len; |
char line[EOFMARKLEN + 1]; |
struct nodelist *bqlist; |
int quotef; |
int dblquote; |
int varnest; /* levels of variables expansion */ |
int arinest; /* levels of arithmetic expansion */ |
int parenlevel; /* levels of parens in arithmetic */ |
int dqvarnest; /* levels of variables expansion within double quotes */ |
int oldstyle; |
char const *prevsyntax; /* syntax before arithmetic */ |
#if __GNUC__ |
/* Avoid longjmp clobbering */ |
(void) &out; |
(void) "ef; |
(void) &dblquote; |
(void) &varnest; |
(void) &arinest; |
(void) &parenlevel; |
(void) &dqvarnest; |
(void) &oldstyle; |
(void) &prevsyntax; |
(void) &syntax; |
#endif |
startlinno = plinno; |
dblquote = 0; |
if (syntax == DQSYNTAX) |
dblquote = 1; |
quotef = 0; |
bqlist = NULL; |
varnest = 0; |
arinest = 0; |
parenlevel = 0; |
dqvarnest = 0; |
STARTSTACKSTR(out); |
loop: { /* for each line, until end of word */ |
#if ATTY |
if (c == '\034' && doprompt |
&& attyset() && ! equal(termval(), "emacs")) { |
attyline(); |
if (syntax == BASESYNTAX) |
return readtoken(); |
c = pgetc(); |
goto loop; |
} |
#endif |
CHECKEND(); /* set c to PEOF if at end of here document */ |
for (;;) { /* until end of line or end of word */ |
CHECKSTRSPACE(3, out); /* permit 3 calls to USTPUTC */ |
switch(syntax[c]) { |
case CNL: /* '\n' */ |
if (syntax == BASESYNTAX) |
goto endword; /* exit outer loop */ |
USTPUTC(c, out); |
plinno++; |
if (doprompt) |
setprompt(2); |
else |
setprompt(0); |
c = pgetc(); |
goto loop; /* continue outer loop */ |
case CWORD: |
USTPUTC(c, out); |
break; |
case CCTL: |
if ((eofmark == NULL || dblquote) && |
dqvarnest == 0) |
USTPUTC(CTLESC, out); |
USTPUTC(c, out); |
break; |
case CBACK: /* backslash */ |
c = pgetc(); |
if (c == PEOF) { |
USTPUTC('\\', out); |
pungetc(); |
} else if (c == '\n') { |
if (doprompt) |
setprompt(2); |
else |
setprompt(0); |
} else { |
if (dblquote && c != '\\' && c != '`' && c != '$' |
&& (c != '"' || eofmark != NULL)) |
USTPUTC('\\', out); |
if (SQSYNTAX[c] == CCTL) |
USTPUTC(CTLESC, out); |
else if (eofmark == NULL) |
USTPUTC(CTLQUOTEMARK, out); |
USTPUTC(c, out); |
quotef++; |
} |
break; |
case CSQUOTE: |
if (eofmark == NULL) |
USTPUTC(CTLQUOTEMARK, out); |
syntax = SQSYNTAX; |
break; |
case CDQUOTE: |
if (eofmark == NULL) |
USTPUTC(CTLQUOTEMARK, out); |
syntax = DQSYNTAX; |
dblquote = 1; |
break; |
case CENDQUOTE: |
if (eofmark != NULL && arinest == 0 && |
varnest == 0) { |
USTPUTC(c, out); |
} else { |
if (arinest) { |
syntax = ARISYNTAX; |
dblquote = 0; |
} else if (eofmark == NULL && |
dqvarnest == 0) { |
syntax = BASESYNTAX; |
dblquote = 0; |
} |
quotef++; |
} |
break; |
case CVAR: /* '$' */ |
PARSESUB(); /* parse substitution */ |
break; |
case CENDVAR: /* '}' */ |
if (varnest > 0) { |
varnest--; |
if (dqvarnest > 0) { |
dqvarnest--; |
} |
USTPUTC(CTLENDVAR, out); |
} else { |
USTPUTC(c, out); |
} |
break; |
case CLP: /* '(' in arithmetic */ |
parenlevel++; |
USTPUTC(c, out); |
break; |
case CRP: /* ')' in arithmetic */ |
if (parenlevel > 0) { |
USTPUTC(c, out); |
--parenlevel; |
} else { |
if (pgetc() == ')') { |
if (--arinest == 0) { |
USTPUTC(CTLENDARI, out); |
syntax = prevsyntax; |
if (syntax == DQSYNTAX) |
dblquote = 1; |
else |
dblquote = 0; |
} else |
USTPUTC(')', out); |
} else { |
/* |
* unbalanced parens |
* (don't 2nd guess - no error) |
*/ |
pungetc(); |
USTPUTC(')', out); |
} |
} |
break; |
case CBQUOTE: /* '`' */ |
PARSEBACKQOLD(); |
break; |
case CEOF: |
goto endword; /* exit outer loop */ |
default: |
if (varnest == 0) |
goto endword; /* exit outer loop */ |
USTPUTC(c, out); |
} |
c = pgetc_macro(); |
} |
} |
endword: |
if (syntax == ARISYNTAX) |
synerror("Missing '))'"); |
if (syntax != BASESYNTAX && ! parsebackquote && eofmark == NULL) |
synerror("Unterminated quoted string"); |
if (varnest != 0) { |
startlinno = plinno; |
synerror("Missing '}'"); |
} |
USTPUTC('\0', out); |
len = out - stackblock(); |
out = stackblock(); |
if (eofmark == NULL) { |
if ((c == '>' || c == '<') |
&& quotef == 0 |
&& len <= 2 |
&& (*out == '\0' || is_digit(*out))) { |
PARSEREDIR(); |
return lasttoken = TREDIR; |
} else { |
pungetc(); |
} |
} |
quoteflag = quotef; |
backquotelist = bqlist; |
grabstackblock(len); |
wordtext = out; |
return lasttoken = TWORD; |
/* end of readtoken routine */ |
/* |
* Check to see whether we are at the end of the here document. When this |
* is called, c is set to the first character of the next input line. If |
* we are at the end of the here document, this routine sets the c to PEOF. |
*/ |
checkend: { |
if (eofmark) { |
if (striptabs) { |
while (c == '\t') |
c = pgetc(); |
} |
if (c == *eofmark) { |
if (pfgets(line, sizeof line) != NULL) { |
char *p, *q; |
p = line; |
for (q = eofmark + 1 ; *q && *p == *q ; p++, q++); |
if (*p == '\n' && *q == '\0') { |
c = PEOF; |
plinno++; |
needprompt = doprompt; |
} else { |
pushstring(line, strlen(line), NULL); |
} |
} |
} |
} |
goto checkend_return; |
} |
/* |
* Parse a redirection operator. The variable "out" points to a string |
* specifying the fd to be redirected. The variable "c" contains the |
* first character of the redirection operator. |
*/ |
parseredir: { |
char fd = *out; |
union node *np; |
np = (union node *)stalloc(sizeof (struct nfile)); |
if (c == '>') { |
np->nfile.fd = 1; |
c = pgetc(); |
if (c == '>') |
np->type = NAPPEND; |
else if (c == '&') |
np->type = NTOFD; |
else if (c == '|') |
np->type = NTOOV; |
else { |
np->type = NTO; |
pungetc(); |
} |
} else { /* c == '<' */ |
np->nfile.fd = 0; |
switch (c = pgetc()) { |
case '<': |
if (sizeof (struct nfile) != sizeof (struct nhere)) { |
np = (union node *)stalloc(sizeof (struct nhere)); |
np->nfile.fd = 0; |
} |
np->type = NHERE; |
heredoc = (struct heredoc *)stalloc(sizeof (struct heredoc)); |
heredoc->here = np; |
if ((c = pgetc()) == '-') { |
heredoc->striptabs = 1; |
} else { |
heredoc->striptabs = 0; |
pungetc(); |
} |
break; |
case '&': |
np->type = NFROMFD; |
break; |
case '>': |
np->type = NFROMTO; |
break; |
default: |
np->type = NFROM; |
pungetc(); |
break; |
} |
} |
if (fd != '\0') |
np->nfile.fd = digit_val(fd); |
redirnode = np; |
goto parseredir_return; |
} |
/* |
* Parse a substitution. At this point, we have read the dollar sign |
* and nothing else. |
*/ |
parsesub: { |
int subtype; |
int typeloc; |
int flags; |
char *p; |
static const char types[] = "}-+?="; |
c = pgetc(); |
if (c != '(' && c != '{' && !is_name(c) && !is_special(c)) { |
USTPUTC('$', out); |
pungetc(); |
} else if (c == '(') { /* $(command) or $((arith)) */ |
if (pgetc() == '(') { |
PARSEARITH(); |
} else { |
pungetc(); |
PARSEBACKQNEW(); |
} |
} else { |
USTPUTC(CTLVAR, out); |
typeloc = out - stackblock(); |
USTPUTC(VSNORMAL, out); |
subtype = VSNORMAL; |
if (c == '{') { |
c = pgetc(); |
if (c == '#') { |
if ((c = pgetc()) == '}') |
c = '#'; |
else |
subtype = VSLENGTH; |
} |
else |
subtype = 0; |
} |
if (is_name(c)) { |
do { |
STPUTC(c, out); |
c = pgetc(); |
} while (is_in_name(c)); |
} else if (is_digit(c)) { |
do { |
USTPUTC(c, out); |
c = pgetc(); |
} while (is_digit(c)); |
} |
else if (is_special(c)) { |
USTPUTC(c, out); |
c = pgetc(); |
} |
else |
badsub: synerror("Bad substitution"); |
STPUTC('=', out); |
flags = 0; |
if (subtype == 0) { |
switch (c) { |
case ':': |
flags = VSNUL; |
c = pgetc(); |
/*FALLTHROUGH*/ |
default: |
p = strchr(types, c); |
if (p == NULL) |
goto badsub; |
subtype = p - types + VSNORMAL; |
break; |
case '%': |
case '#': |
{ |
int cc = c; |
subtype = c == '#' ? VSTRIMLEFT : |
VSTRIMRIGHT; |
c = pgetc(); |
if (c == cc) |
subtype++; |
else |
pungetc(); |
break; |
} |
} |
} else { |
pungetc(); |
} |
if (dblquote || arinest) |
flags |= VSQUOTE; |
*(stackblock() + typeloc) = subtype | flags; |
if (subtype != VSNORMAL) { |
varnest++; |
if (dblquote) { |
dqvarnest++; |
} |
} |
} |
goto parsesub_return; |
} |
/* |
* Called to parse command substitutions. Newstyle is set if the command |
* is enclosed inside $(...); nlpp is a pointer to the head of the linked |
* list of commands (passed by reference), and savelen is the number of |
* characters on the top of the stack which must be preserved. |
*/ |
parsebackq: { |
struct nodelist **nlpp; |
int savepbq; |
union node *n; |
char *volatile str; |
struct jmploc jmploc; |
struct jmploc *volatile savehandler; |
int savelen; |
int saveprompt; |
#ifdef __GNUC__ |
(void) &saveprompt; |
#endif |
savepbq = parsebackquote; |
if (setjmp(jmploc.loc)) { |
if (str) |
ckfree(str); |
parsebackquote = 0; |
handler = savehandler; |
longjmp(handler->loc, 1); |
} |
INTOFF; |
str = NULL; |
savelen = out - stackblock(); |
if (savelen > 0) { |
str = ckmalloc(savelen); |
memcpy(str, stackblock(), savelen); |
} |
savehandler = handler; |
handler = &jmploc; |
INTON; |
if (oldstyle) { |
/* We must read until the closing backquote, giving special |
treatment to some slashes, and then push the string and |
reread it as input, interpreting it normally. */ |
char *pout; |
int pc; |
int psavelen; |
char *pstr; |
STARTSTACKSTR(pout); |
for (;;) { |
if (needprompt) { |
setprompt(2); |
needprompt = 0; |
} |
switch (pc = pgetc()) { |
case '`': |
goto done; |
case '\\': |
if ((pc = pgetc()) == '\n') { |
plinno++; |
if (doprompt) |
setprompt(2); |
else |
setprompt(0); |
/* |
* If eating a newline, avoid putting |
* the newline into the new character |
* stream (via the STPUTC after the |
* switch). |
*/ |
continue; |
} |
if (pc != '\\' && pc != '`' && pc != '$' |
&& (!dblquote || pc != '"')) |
STPUTC('\\', pout); |
break; |
case '\n': |
plinno++; |
needprompt = doprompt; |
break; |
case PEOF: |
startlinno = plinno; |
synerror("EOF in backquote substitution"); |
break; |
default: |
break; |
} |
STPUTC(pc, pout); |
} |
done: |
STPUTC('\0', pout); |
psavelen = pout - stackblock(); |
if (psavelen > 0) { |
pstr = grabstackstr(pout); |
setinputstring(pstr, 1); |
} |
} |
nlpp = &bqlist; |
while (*nlpp) |
nlpp = &(*nlpp)->next; |
*nlpp = (struct nodelist *)stalloc(sizeof (struct nodelist)); |
(*nlpp)->next = NULL; |
parsebackquote = oldstyle; |
if (oldstyle) { |
saveprompt = doprompt; |
doprompt = 0; |
} |
n = list(0); |
if (oldstyle) |
doprompt = saveprompt; |
else { |
if (readtoken() != TRP) |
synexpect(TRP); |
} |
(*nlpp)->n = n; |
if (oldstyle) { |
/* |
* Start reading from old file again, ignoring any pushed back |
* tokens left from the backquote parsing |
*/ |
popfile(); |
tokpushback = 0; |
} |
while (stackblocksize() <= savelen) |
growstackblock(); |
STARTSTACKSTR(out); |
if (str) { |
memcpy(out, str, savelen); |
STADJUST(savelen, out); |
INTOFF; |
ckfree(str); |
str = NULL; |
INTON; |
} |
parsebackquote = savepbq; |
handler = savehandler; |
if (arinest || dblquote) |
USTPUTC(CTLBACKQ | CTLQUOTE, out); |
else |
USTPUTC(CTLBACKQ, out); |
if (oldstyle) |
goto parsebackq_oldreturn; |
else |
goto parsebackq_newreturn; |
} |
/* |
* Parse an arithmetic expansion (indicate start of one and set state) |
*/ |
parsearith: { |
if (++arinest == 1) { |
prevsyntax = syntax; |
syntax = ARISYNTAX; |
USTPUTC(CTLARI, out); |
if (dblquote) |
USTPUTC('"',out); |
else |
USTPUTC(' ',out); |
} else { |
/* |
* we collapse embedded arithmetic expansion to |
* parenthesis, which should be equivalent |
*/ |
USTPUTC('(', out); |
} |
goto parsearith_return; |
} |
} /* end of readtoken */ |
#ifdef mkinit |
RESET { |
tokpushback = 0; |
checkkwd = 0; |
} |
#endif |
/* |
* Returns true if the text contains nothing to expand (no dollar signs |
* or backquotes). |
*/ |
STATIC int |
noexpand(text) |
char *text; |
{ |
char *p; |
char c; |
p = text; |
while ((c = *p++) != '\0') { |
if (c == CTLQUOTEMARK) |
continue; |
if (c == CTLESC) |
p++; |
else if (BASESYNTAX[(int)c] == CCTL) |
return 0; |
} |
return 1; |
} |
/* |
* Return true if the argument is a legal variable name (a letter or |
* underscore followed by zero or more letters, underscores, and digits). |
*/ |
int |
goodname(char *name) |
{ |
char *p; |
p = name; |
if (! is_name(*p)) |
return 0; |
while (*++p) { |
if (! is_in_name(*p)) |
return 0; |
} |
return 1; |
} |
/* |
* Called when an unexpected token is read during the parse. The argument |
* is the token that is expected, or -1 if more than one type of token can |
* occur at this point. |
*/ |
STATIC void |
synexpect(token) |
int token; |
{ |
char msg[64]; |
if (token >= 0) { |
fmtstr(msg, 64, "%s unexpected (expecting %s)", |
tokname[lasttoken], tokname[token]); |
} else { |
fmtstr(msg, 64, "%s unexpected", tokname[lasttoken]); |
} |
synerror(msg); |
/* NOTREACHED */ |
} |
STATIC void |
synerror(msg) |
const char *msg; |
{ |
if (commandname) |
outfmt(&errout, "%s: %d: ", commandname, startlinno); |
outfmt(&errout, "Syntax error: %s\n", msg); |
error((char *)NULL); |
/* NOTREACHED */ |
} |
STATIC void |
setprompt(which) |
int which; |
{ |
whichprompt = which; |
#ifndef SMALL |
if (!el) |
#endif |
out2str(getprompt(NULL)); |
} |
/* |
* called by editline -- any expansions to the prompt |
* should be added here. |
*/ |
const char * |
getprompt(void *unused) |
{ |
switch (whichprompt) { |
case 0: |
return ""; |
case 1: |
return ps1val(); |
case 2: |
return ps2val(); |
default: |
return "<internal prompt error>"; |
} |
} |
/tags/0.3.0/uspace/app/ash/jobs.c |
---|
0,0 → 1,1263 |
/* $NetBSD: jobs.c,v 1.36 2000/05/22 10:18:47 elric Exp $ */ |
/*- |
* Copyright (c) 1991, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Kenneth Almquist. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
*/ |
#include <sys/cdefs.h> |
#ifndef lint |
#if 0 |
static char sccsid[] = "@(#)jobs.c 8.5 (Berkeley) 5/4/95"; |
#else |
__RCSID("$NetBSD: jobs.c,v 1.36 2000/05/22 10:18:47 elric Exp $"); |
#endif |
#endif /* not lint */ |
#include <fcntl.h> |
#include <signal.h> |
#include <errno.h> |
#include <unistd.h> |
#include <stdlib.h> |
#include <paths.h> |
#include <sys/types.h> |
#include <sys/param.h> |
#ifdef BSD |
#include <sys/wait.h> |
#include <sys/time.h> |
#include <sys/resource.h> |
#endif |
#include <sys/ioctl.h> |
#include "shell.h" |
#if JOBS |
#if OLD_TTY_DRIVER |
#include "sgtty.h" |
#else |
#include <termios.h> |
#endif |
#undef CEOF /* syntax.h redefines this */ |
#endif |
#include "redir.h" |
#include "show.h" |
#include "main.h" |
#include "parser.h" |
#include "nodes.h" |
#include "jobs.h" |
#include "options.h" |
#include "trap.h" |
#include "syntax.h" |
#include "input.h" |
#include "output.h" |
#include "memalloc.h" |
#include "error.h" |
#include "mystring.h" |
struct job *jobtab; /* array of jobs */ |
int njobs; /* size of array */ |
MKINIT short backgndpid = -1; /* pid of last background process */ |
#if JOBS |
int initialpgrp; /* pgrp of shell on invocation */ |
short curjob; /* current job */ |
#endif |
STATIC int intreceived; |
STATIC void restartjob (struct job *); |
STATIC void freejob (struct job *); |
STATIC struct job *getjob (char *); |
STATIC int dowait (int, struct job *); |
STATIC int onsigchild (void); |
STATIC int waitproc (int, int *); |
STATIC void cmdtxt (union node *); |
STATIC void cmdputs (const char *); |
STATIC void waitonint(int); |
#if JOBS |
/* |
* Turn job control on and off. |
* |
* Note: This code assumes that the third arg to ioctl is a character |
* pointer, which is true on Berkeley systems but not System V. Since |
* System V doesn't have job control yet, this isn't a problem now. |
*/ |
MKINIT int jobctl; |
void |
setjobctl(on) |
int on; |
{ |
#ifdef OLD_TTY_DRIVER |
int ldisc; |
#endif |
if (on == jobctl || rootshell == 0) |
return; |
if (on) { |
do { /* while we are in the background */ |
#ifdef OLD_TTY_DRIVER |
if (ioctl(fd2, TIOCGPGRP, (char *)&initialpgrp) < 0) { |
#else |
initialpgrp = tcgetpgrp(fd2); |
if (initialpgrp < 0) { |
#endif |
out2str("sh: can't access tty; job control turned off\n"); |
mflag = 0; |
return; |
} |
if (initialpgrp == -1) |
initialpgrp = getpgrp(); |
else if (initialpgrp != getpgrp()) { |
killpg(initialpgrp, SIGTTIN); |
continue; |
} |
} while (0); |
#ifdef OLD_TTY_DRIVER |
if (ioctl(fd2, TIOCGETD, (char *)&ldisc) < 0 || ldisc != NTTYDISC) { |
out2str("sh: need new tty driver to run job control; job control turned off\n"); |
mflag = 0; |
return; |
} |
#endif |
setsignal(SIGTSTP); |
setsignal(SIGTTOU); |
setsignal(SIGTTIN); |
setpgid(0, rootpid); |
#ifdef OLD_TTY_DRIVER |
ioctl(fd2, TIOCSPGRP, (char *)&rootpid); |
#else |
tcsetpgrp(fd2, rootpid); |
#endif |
} else { /* turning job control off */ |
setpgid(0, initialpgrp); |
#ifdef OLD_TTY_DRIVER |
ioctl(fd2, TIOCSPGRP, (char *)&initialpgrp); |
#else |
tcsetpgrp(fd2, initialpgrp); |
#endif |
setsignal(SIGTSTP); |
setsignal(SIGTTOU); |
setsignal(SIGTTIN); |
} |
jobctl = on; |
} |
#endif |
#ifdef mkinit |
INCLUDE <stdlib.h> |
SHELLPROC { |
backgndpid = -1; |
#if JOBS |
jobctl = 0; |
#endif |
} |
#endif |
#if JOBS |
int |
killcmd(argc, argv) |
int argc; |
char **argv; |
{ |
extern char *signal_names[]; |
int signo = -1; |
int list = 0; |
int i; |
pid_t pid; |
struct job *jp; |
if (argc <= 1) { |
error( |
"Usage: kill [-s sigspec | -signum | -sigspec] [pid | job]... or\n" |
"kill -l [exitstatus]" |
); |
} |
if (*argv[1] == '-') { |
signo = decode_signal(argv[1]+1); |
if (signo < 0) { |
int c; |
while ((c = nextopt("ls:")) != '\0') |
switch (c) { |
case 'l': |
list = 1; |
break; |
case 's': |
signo = decode_signal(optarg); |
break; |
default: |
error( |
"nextopt returned character code 0%o", c); |
} |
} else |
argptr++; |
} |
if (!list && signo < 0) |
signo = SIGTERM; |
if ((signo < 0 || !*argptr) ^ list) { |
error( |
"Usage: kill [-s sigspec | -signum | -sigspec] [pid | job]... or\n" |
"kill -l [exitstatus]" |
); |
} |
if (list) { |
if (!*argptr) { |
out1fmt("0\n"); |
for (i = 1; i < NSIG; i++) { |
if (strncmp(signal_names[i], "SIGJUNK(", 8) |
== 0) |
continue; |
out1fmt("%s\n", signal_names[i] + 3); |
} |
return 0; |
} |
signo = atoi(*argptr); |
if (signo > 128) |
signo -= 128; |
if (0 < signo && signo < NSIG) |
out1fmt("%s\n", signal_names[signo] + 3); |
else |
error("invalid signal number or exit status: %s", |
*argptr); |
return 0; |
} |
do { |
if (**argptr == '%') { |
jp = getjob(*argptr); |
if (jp->jobctl == 0) |
error("job %s not created under job control", |
*argptr); |
pid = -jp->ps[0].pid; |
} else |
pid = atoi(*argptr); |
if (kill(pid, signo) != 0) |
error("%s: %s", *argptr, strerror(errno)); |
} while (*++argptr); |
return 0; |
} |
int |
fgcmd(argc, argv) |
int argc; |
char **argv; |
{ |
struct job *jp; |
int pgrp; |
int status; |
jp = getjob(argv[1]); |
if (jp->jobctl == 0) |
error("job not created under job control"); |
pgrp = jp->ps[0].pid; |
#ifdef OLD_TTY_DRIVER |
ioctl(fd2, TIOCSPGRP, (char *)&pgrp); |
#else |
tcsetpgrp(fd2, pgrp); |
#endif |
restartjob(jp); |
INTOFF; |
status = waitforjob(jp); |
INTON; |
return status; |
} |
int |
bgcmd(argc, argv) |
int argc; |
char **argv; |
{ |
struct job *jp; |
do { |
jp = getjob(*++argv); |
if (jp->jobctl == 0) |
error("job not created under job control"); |
restartjob(jp); |
} while (--argc > 1); |
return 0; |
} |
STATIC void |
restartjob(jp) |
struct job *jp; |
{ |
struct procstat *ps; |
int i; |
if (jp->state == JOBDONE) |
return; |
INTOFF; |
killpg(jp->ps[0].pid, SIGCONT); |
for (ps = jp->ps, i = jp->nprocs ; --i >= 0 ; ps++) { |
if (WIFSTOPPED(ps->status)) { |
ps->status = -1; |
jp->state = 0; |
} |
} |
INTON; |
} |
#endif |
int |
jobscmd(argc, argv) |
int argc; |
char **argv; |
{ |
showjobs(0); |
return 0; |
} |
/* |
* Print a list of jobs. If "change" is nonzero, only print jobs whose |
* statuses have changed since the last call to showjobs. |
* |
* If the shell is interrupted in the process of creating a job, the |
* result may be a job structure containing zero processes. Such structures |
* will be freed here. |
*/ |
void |
showjobs(change) |
int change; |
{ |
int jobno; |
int procno; |
int i; |
struct job *jp; |
struct procstat *ps; |
int col; |
char s[64]; |
TRACE(("showjobs(%d) called\n", change)); |
while (dowait(0, (struct job *)NULL) > 0); |
for (jobno = 1, jp = jobtab ; jobno <= njobs ; jobno++, jp++) { |
if (! jp->used) |
continue; |
if (jp->nprocs == 0) { |
freejob(jp); |
continue; |
} |
if (change && ! jp->changed) |
continue; |
procno = jp->nprocs; |
for (ps = jp->ps ; ; ps++) { /* for each process */ |
if (ps == jp->ps) |
fmtstr(s, 64, "[%d] %ld ", jobno, |
(long)ps->pid); |
else |
fmtstr(s, 64, " %ld ", |
(long)ps->pid); |
out1str(s); |
col = strlen(s); |
s[0] = '\0'; |
if (ps->status == -1) { |
/* don't print anything */ |
} else if (WIFEXITED(ps->status)) { |
fmtstr(s, 64, "Exit %d", |
WEXITSTATUS(ps->status)); |
} else { |
#if JOBS |
if (WIFSTOPPED(ps->status)) |
i = WSTOPSIG(ps->status); |
else /* WIFSIGNALED(ps->status) */ |
#endif |
i = WTERMSIG(ps->status); |
if ((i & 0x7F) < NSIG && sys_siglist[i & 0x7F]) |
scopy(sys_siglist[i & 0x7F], s); |
else |
fmtstr(s, 64, "Signal %d", i & 0x7F); |
if (WCOREDUMP(ps->status)) |
strcat(s, " (core dumped)"); |
} |
out1str(s); |
col += strlen(s); |
do { |
out1c(' '); |
col++; |
} while (col < 30); |
out1str(ps->cmd); |
out1c('\n'); |
if (--procno <= 0) |
break; |
} |
jp->changed = 0; |
if (jp->state == JOBDONE) { |
freejob(jp); |
} |
} |
} |
/* |
* Mark a job structure as unused. |
*/ |
STATIC void |
freejob(jp) |
struct job *jp; |
{ |
struct procstat *ps; |
int i; |
INTOFF; |
for (i = jp->nprocs, ps = jp->ps ; --i >= 0 ; ps++) { |
if (ps->cmd != nullstr) |
ckfree(ps->cmd); |
} |
if (jp->ps != &jp->ps0) |
ckfree(jp->ps); |
jp->used = 0; |
#if JOBS |
if (curjob == jp - jobtab + 1) |
curjob = 0; |
#endif |
INTON; |
} |
int |
waitcmd(argc, argv) |
int argc; |
char **argv; |
{ |
struct job *job; |
int status, retval; |
struct job *jp; |
if (argc > 1) { |
job = getjob(argv[1]); |
} else { |
job = NULL; |
} |
for (;;) { /* loop until process terminated or stopped */ |
if (job != NULL) { |
if (job->state) { |
status = job->ps[job->nprocs - 1].status; |
if (WIFEXITED(status)) |
retval = WEXITSTATUS(status); |
#if JOBS |
else if (WIFSTOPPED(status)) |
retval = WSTOPSIG(status) + 128; |
#endif |
else { |
/* XXX: limits number of signals */ |
retval = WTERMSIG(status) + 128; |
} |
if (! iflag) |
freejob(job); |
return retval; |
} |
} else { |
for (jp = jobtab ; ; jp++) { |
if (jp >= jobtab + njobs) { /* no running procs */ |
return 0; |
} |
if (jp->used && jp->state == 0) |
break; |
} |
} |
dowait(1, (struct job *)NULL); |
} |
} |
int |
jobidcmd(argc, argv) |
int argc; |
char **argv; |
{ |
struct job *jp; |
int i; |
jp = getjob(argv[1]); |
for (i = 0 ; i < jp->nprocs ; ) { |
out1fmt("%ld", (long)jp->ps[i].pid); |
out1c(++i < jp->nprocs? ' ' : '\n'); |
} |
return 0; |
} |
/* |
* Convert a job name to a job structure. |
*/ |
STATIC struct job * |
getjob(name) |
char *name; |
{ |
int jobno; |
struct job *jp; |
int pid; |
int i; |
if (name == NULL) { |
#if JOBS |
currentjob: |
if ((jobno = curjob) == 0 || jobtab[jobno - 1].used == 0) |
error("No current job"); |
return &jobtab[jobno - 1]; |
#else |
error("No current job"); |
#endif |
} else if (name[0] == '%') { |
if (is_digit(name[1])) { |
jobno = number(name + 1); |
if (jobno > 0 && jobno <= njobs |
&& jobtab[jobno - 1].used != 0) |
return &jobtab[jobno - 1]; |
#if JOBS |
} else if (name[1] == '%' && name[2] == '\0') { |
goto currentjob; |
#endif |
} else { |
struct job *found = NULL; |
for (jp = jobtab, i = njobs ; --i >= 0 ; jp++) { |
if (jp->used && jp->nprocs > 0 |
&& prefix(name + 1, jp->ps[0].cmd)) { |
if (found) |
error("%s: ambiguous", name); |
found = jp; |
} |
} |
if (found) |
return found; |
} |
} else if (is_number(name)) { |
pid = number(name); |
for (jp = jobtab, i = njobs ; --i >= 0 ; jp++) { |
if (jp->used && jp->nprocs > 0 |
&& jp->ps[jp->nprocs - 1].pid == pid) |
return jp; |
} |
} |
error("No such job: %s", name); |
/* NOTREACHED */ |
} |
/* |
* Return a new job structure, |
*/ |
struct job * |
makejob(node, nprocs) |
union node *node; |
int nprocs; |
{ |
int i; |
struct job *jp; |
for (i = njobs, jp = jobtab ; ; jp++) { |
if (--i < 0) { |
INTOFF; |
if (njobs == 0) { |
jobtab = ckmalloc(4 * sizeof jobtab[0]); |
} else { |
jp = ckmalloc((njobs + 4) * sizeof jobtab[0]); |
memcpy(jp, jobtab, njobs * sizeof jp[0]); |
/* Relocate `ps' pointers */ |
for (i = 0; i < njobs; i++) |
if (jp[i].ps == &jobtab[i].ps0) |
jp[i].ps = &jp[i].ps0; |
ckfree(jobtab); |
jobtab = jp; |
} |
jp = jobtab + njobs; |
for (i = 4 ; --i >= 0 ; jobtab[njobs++].used = 0); |
INTON; |
break; |
} |
if (jp->used == 0) |
break; |
} |
INTOFF; |
jp->state = 0; |
jp->used = 1; |
jp->changed = 0; |
jp->nprocs = 0; |
#if JOBS |
jp->jobctl = jobctl; |
#endif |
if (nprocs > 1) { |
jp->ps = ckmalloc(nprocs * sizeof (struct procstat)); |
} else { |
jp->ps = &jp->ps0; |
} |
INTON; |
TRACE(("makejob(0x%lx, %d) returns %%%d\n", (long)node, nprocs, |
jp - jobtab + 1)); |
return jp; |
} |
/* |
* Fork of a subshell. If we are doing job control, give the subshell its |
* own process group. Jp is a job structure that the job is to be added to. |
* N is the command that will be evaluated by the child. Both jp and n may |
* be NULL. The mode parameter can be one of the following: |
* FORK_FG - Fork off a foreground process. |
* FORK_BG - Fork off a background process. |
* FORK_NOJOB - Like FORK_FG, but don't give the process its own |
* process group even if job control is on. |
* |
* When job control is turned off, background processes have their standard |
* input redirected to /dev/null (except for the second and later processes |
* in a pipeline). |
*/ |
int |
forkshell(jp, n, mode) |
union node *n; |
struct job *jp; |
int mode; |
{ |
int pid; |
int pgrp; |
const char *devnull = _PATH_DEVNULL; |
const char *nullerr = "Can't open %s"; |
TRACE(("forkshell(%%%d, 0x%lx, %d) called\n", jp - jobtab, (long)n, |
mode)); |
INTOFF; |
pid = fork(); |
if (pid == -1) { |
TRACE(("Fork failed, errno=%d\n", errno)); |
INTON; |
error("Cannot fork"); |
} |
if (pid == 0) { |
struct job *p; |
int wasroot; |
int i; |
TRACE(("Child shell %d\n", getpid())); |
wasroot = rootshell; |
rootshell = 0; |
closescript(); |
INTON; |
clear_traps(); |
#if JOBS |
jobctl = 0; /* do job control only in root shell */ |
if (wasroot && mode != FORK_NOJOB && mflag) { |
if (jp == NULL || jp->nprocs == 0) |
pgrp = getpid(); |
else |
pgrp = jp->ps[0].pid; |
setpgid(0, pgrp); |
if (mode == FORK_FG) { |
/*** this causes superfluous TIOCSPGRPS ***/ |
#ifdef OLD_TTY_DRIVER |
if (ioctl(fd2, TIOCSPGRP, (char *)&pgrp) < 0) |
error("TIOCSPGRP failed, errno=%d", errno); |
#else |
if (tcsetpgrp(fd2, pgrp) < 0) |
error("tcsetpgrp failed, errno=%d", errno); |
#endif |
} |
setsignal(SIGTSTP); |
setsignal(SIGTTOU); |
} else if (mode == FORK_BG) { |
ignoresig(SIGINT); |
ignoresig(SIGQUIT); |
ignoresig(SIGHUP); |
if ((jp == NULL || jp->nprocs == 0) && |
! fd0_redirected_p ()) { |
close(0); |
if (open(devnull, O_RDONLY) != 0) |
error(nullerr, devnull); |
} |
} |
#else |
if (mode == FORK_BG) { |
ignoresig(SIGINT); |
ignoresig(SIGQUIT); |
ignoresig(SIGHUP); |
if ((jp == NULL || jp->nprocs == 0) && |
! fd0_redirected_p ()) { |
close(0); |
if (open(devnull, O_RDONLY) != 0) |
error(nullerr, devnull); |
} |
} |
#endif |
for (i = njobs, p = jobtab ; --i >= 0 ; p++) |
if (p->used) |
freejob(p); |
if (wasroot && iflag) { |
setsignal(SIGINT); |
setsignal(SIGQUIT); |
setsignal(SIGTERM); |
} |
return pid; |
} |
if (rootshell && mode != FORK_NOJOB && mflag) { |
if (jp == NULL || jp->nprocs == 0) |
pgrp = pid; |
else |
pgrp = jp->ps[0].pid; |
setpgid(pid, pgrp); |
} |
if (mode == FORK_BG) |
backgndpid = pid; /* set $! */ |
if (jp) { |
struct procstat *ps = &jp->ps[jp->nprocs++]; |
ps->pid = pid; |
ps->status = -1; |
ps->cmd = nullstr; |
if (iflag && rootshell && n) |
ps->cmd = commandtext(n); |
} |
INTON; |
TRACE(("In parent shell: child = %d\n", pid)); |
return pid; |
} |
/* |
* Wait for job to finish. |
* |
* Under job control we have the problem that while a child process is |
* running interrupts generated by the user are sent to the child but not |
* to the shell. This means that an infinite loop started by an inter- |
* active user may be hard to kill. With job control turned off, an |
* interactive user may place an interactive program inside a loop. If |
* the interactive program catches interrupts, the user doesn't want |
* these interrupts to also abort the loop. The approach we take here |
* is to have the shell ignore interrupt signals while waiting for a |
* forground process to terminate, and then send itself an interrupt |
* signal if the child process was terminated by an interrupt signal. |
* Unfortunately, some programs want to do a bit of cleanup and then |
* exit on interrupt; unless these processes terminate themselves by |
* sending a signal to themselves (instead of calling exit) they will |
* confuse this approach. |
*/ |
int |
waitforjob(jp) |
struct job *jp; |
{ |
#if JOBS |
int mypgrp = getpgrp(); |
#endif |
int status; |
int st; |
struct sigaction act, oact; |
INTOFF; |
intreceived = 0; |
#if JOBS |
if (!jobctl) { |
#else |
if (!iflag) { |
#endif |
sigaction(SIGINT, 0, &act); |
act.sa_handler = waitonint; |
sigaction(SIGINT, &act, &oact); |
} |
TRACE(("waitforjob(%%%d) called\n", jp - jobtab + 1)); |
while (jp->state == 0) { |
dowait(1, jp); |
} |
#if JOBS |
if (!jobctl) { |
#else |
if (!iflag) { |
#endif |
extern char *trap[]; |
sigaction(SIGINT, &oact, 0); |
if (intreceived && trap[SIGINT]) kill(getpid(), SIGINT); |
} |
#if JOBS |
if (jp->jobctl) { |
#ifdef OLD_TTY_DRIVER |
if (ioctl(fd2, TIOCSPGRP, (char *)&mypgrp) < 0) |
error("TIOCSPGRP failed, errno=%d\n", errno); |
#else |
if (tcsetpgrp(fd2, mypgrp) < 0) |
error("tcsetpgrp failed, errno=%d\n", errno); |
#endif |
} |
if (jp->state == JOBSTOPPED) |
curjob = jp - jobtab + 1; |
#endif |
status = jp->ps[jp->nprocs - 1].status; |
/* convert to 8 bits */ |
if (WIFEXITED(status)) |
st = WEXITSTATUS(status); |
#if JOBS |
else if (WIFSTOPPED(status)) |
st = WSTOPSIG(status) + 128; |
#endif |
else |
st = WTERMSIG(status) + 128; |
#if JOBS |
if (jp->jobctl) { |
/* |
* This is truly gross. |
* If we're doing job control, then we did a TIOCSPGRP which |
* caused us (the shell) to no longer be in the controlling |
* session -- so we wouldn't have seen any ^C/SIGINT. So, we |
* intuit from the subprocess exit status whether a SIGINT |
* occured, and if so interrupt ourselves. Yuck. - mycroft |
*/ |
if (WIFSIGNALED(status) && WTERMSIG(status) == SIGINT) |
raise(SIGINT); |
} |
#endif |
if (! JOBS || jp->state == JOBDONE) |
freejob(jp); |
INTON; |
return st; |
} |
/* |
* Wait for a process to terminate. |
*/ |
STATIC int |
dowait(block, job) |
int block; |
struct job *job; |
{ |
int pid; |
int status; |
struct procstat *sp; |
struct job *jp; |
struct job *thisjob; |
int done; |
int stopped; |
int core; |
int sig; |
TRACE(("dowait(%d) called\n", block)); |
do { |
pid = waitproc(block, &status); |
TRACE(("wait returns %d, status=%d\n", pid, status)); |
} while (pid == -1 && errno == EINTR); |
if (pid <= 0) |
return pid; |
INTOFF; |
thisjob = NULL; |
for (jp = jobtab ; jp < jobtab + njobs ; jp++) { |
if (jp->used) { |
done = 1; |
stopped = 1; |
for (sp = jp->ps ; sp < jp->ps + jp->nprocs ; sp++) { |
if (sp->pid == -1) |
continue; |
if (sp->pid == pid) { |
TRACE(("Changing status of proc %d from 0x%x to 0x%x\n", pid, sp->status, status)); |
sp->status = status; |
thisjob = jp; |
} |
if (sp->status == -1) |
stopped = 0; |
else if (WIFSTOPPED(sp->status)) |
done = 0; |
} |
if (stopped) { /* stopped or done */ |
int state = done? JOBDONE : JOBSTOPPED; |
if (jp->state != state) { |
TRACE(("Job %d: changing state from %d to %d\n", jp - jobtab + 1, jp->state, state)); |
jp->state = state; |
#if JOBS |
if (done && curjob == jp - jobtab + 1) |
curjob = 0; /* no current job */ |
#endif |
} |
} |
} |
} |
INTON; |
if (! rootshell || ! iflag || (job && thisjob == job)) { |
core = WCOREDUMP(status); |
#if JOBS |
if (WIFSTOPPED(status)) sig = WSTOPSIG(status); |
else |
#endif |
if (WIFEXITED(status)) sig = 0; |
else sig = WTERMSIG(status); |
if (sig != 0 && sig != SIGINT && sig != SIGPIPE) { |
if (thisjob != job) |
outfmt(out2, "%d: ", pid); |
#if JOBS |
if (sig == SIGTSTP && rootshell && iflag) |
outfmt(out2, "%%%ld ", |
(long)(job - jobtab + 1)); |
#endif |
if (sig < NSIG && sys_siglist[sig]) |
out2str(sys_siglist[sig]); |
else |
outfmt(out2, "Signal %d", sig); |
if (core) |
out2str(" - core dumped"); |
out2c('\n'); |
flushout(&errout); |
} else { |
TRACE(("Not printing status: status=%d, sig=%d\n", |
status, sig)); |
} |
} else { |
TRACE(("Not printing status, rootshell=%d, job=0x%x\n", rootshell, job)); |
if (thisjob) |
thisjob->changed = 1; |
} |
return pid; |
} |
/* |
* Do a wait system call. If job control is compiled in, we accept |
* stopped processes. If block is zero, we return a value of zero |
* rather than blocking. |
* |
* System V doesn't have a non-blocking wait system call. It does |
* have a SIGCLD signal that is sent to a process when one of it's |
* children dies. The obvious way to use SIGCLD would be to install |
* a handler for SIGCLD which simply bumped a counter when a SIGCLD |
* was received, and have waitproc bump another counter when it got |
* the status of a process. Waitproc would then know that a wait |
* system call would not block if the two counters were different. |
* This approach doesn't work because if a process has children that |
* have not been waited for, System V will send it a SIGCLD when it |
* installs a signal handler for SIGCLD. What this means is that when |
* a child exits, the shell will be sent SIGCLD signals continuously |
* until is runs out of stack space, unless it does a wait call before |
* restoring the signal handler. The code below takes advantage of |
* this (mis)feature by installing a signal handler for SIGCLD and |
* then checking to see whether it was called. If there are any |
* children to be waited for, it will be. |
* |
* If neither SYSV nor BSD is defined, we don't implement nonblocking |
* waits at all. In this case, the user will not be informed when |
* a background process until the next time she runs a real program |
* (as opposed to running a builtin command or just typing return), |
* and the jobs command may give out of date information. |
*/ |
#ifdef SYSV |
STATIC int gotsigchild; |
STATIC int onsigchild() { |
gotsigchild = 1; |
} |
#endif |
STATIC int |
waitproc(block, status) |
int block; |
int *status; |
{ |
#ifdef BSD |
int flags; |
flags = 0; |
#if JOBS |
if (jobctl) |
flags |= WUNTRACED; |
#endif |
if (block == 0) |
flags |= WNOHANG; |
return wait3(status, flags, (struct rusage *)NULL); |
#else |
#ifdef SYSV |
int (*save)(); |
if (block == 0) { |
gotsigchild = 0; |
save = signal(SIGCLD, onsigchild); |
signal(SIGCLD, save); |
if (gotsigchild == 0) |
return 0; |
} |
return wait(status); |
#else |
if (block == 0) |
return 0; |
return wait(status); |
#endif |
#endif |
} |
/* |
* return 1 if there are stopped jobs, otherwise 0 |
*/ |
int job_warning = 0; |
int |
stoppedjobs() |
{ |
int jobno; |
struct job *jp; |
if (job_warning) |
return (0); |
for (jobno = 1, jp = jobtab; jobno <= njobs; jobno++, jp++) { |
if (jp->used == 0) |
continue; |
if (jp->state == JOBSTOPPED) { |
out2str("You have stopped jobs.\n"); |
job_warning = 2; |
return (1); |
} |
} |
return (0); |
} |
/* |
* Return a string identifying a command (to be printed by the |
* jobs command. |
*/ |
STATIC char *cmdnextc; |
STATIC int cmdnleft; |
#define MAXCMDTEXT 200 |
char * |
commandtext(n) |
union node *n; |
{ |
char *name; |
cmdnextc = name = ckmalloc(MAXCMDTEXT); |
cmdnleft = MAXCMDTEXT - 4; |
cmdtxt(n); |
*cmdnextc = '\0'; |
return name; |
} |
STATIC void |
cmdtxt(n) |
union node *n; |
{ |
union node *np; |
struct nodelist *lp; |
const char *p; |
int i; |
char s[2]; |
if (n == NULL) |
return; |
switch (n->type) { |
case NSEMI: |
cmdtxt(n->nbinary.ch1); |
cmdputs("; "); |
cmdtxt(n->nbinary.ch2); |
break; |
case NAND: |
cmdtxt(n->nbinary.ch1); |
cmdputs(" && "); |
cmdtxt(n->nbinary.ch2); |
break; |
case NOR: |
cmdtxt(n->nbinary.ch1); |
cmdputs(" || "); |
cmdtxt(n->nbinary.ch2); |
break; |
case NPIPE: |
for (lp = n->npipe.cmdlist ; lp ; lp = lp->next) { |
cmdtxt(lp->n); |
if (lp->next) |
cmdputs(" | "); |
} |
break; |
case NSUBSHELL: |
cmdputs("("); |
cmdtxt(n->nredir.n); |
cmdputs(")"); |
break; |
case NREDIR: |
case NBACKGND: |
cmdtxt(n->nredir.n); |
break; |
case NIF: |
cmdputs("if "); |
cmdtxt(n->nif.test); |
cmdputs("; then "); |
cmdtxt(n->nif.ifpart); |
cmdputs("..."); |
break; |
case NWHILE: |
cmdputs("while "); |
goto until; |
case NUNTIL: |
cmdputs("until "); |
until: |
cmdtxt(n->nbinary.ch1); |
cmdputs("; do "); |
cmdtxt(n->nbinary.ch2); |
cmdputs("; done"); |
break; |
case NFOR: |
cmdputs("for "); |
cmdputs(n->nfor.var); |
cmdputs(" in ..."); |
break; |
case NCASE: |
cmdputs("case "); |
cmdputs(n->ncase.expr->narg.text); |
cmdputs(" in ..."); |
break; |
case NDEFUN: |
cmdputs(n->narg.text); |
cmdputs("() ..."); |
break; |
case NCMD: |
for (np = n->ncmd.args ; np ; np = np->narg.next) { |
cmdtxt(np); |
if (np->narg.next) |
cmdputs(" "); |
} |
for (np = n->ncmd.redirect ; np ; np = np->nfile.next) { |
cmdputs(" "); |
cmdtxt(np); |
} |
break; |
case NARG: |
cmdputs(n->narg.text); |
break; |
case NTO: |
p = ">"; i = 1; goto redir; |
case NAPPEND: |
p = ">>"; i = 1; goto redir; |
case NTOFD: |
p = ">&"; i = 1; goto redir; |
case NTOOV: |
p = ">|"; i = 1; goto redir; |
case NFROM: |
p = "<"; i = 0; goto redir; |
case NFROMFD: |
p = "<&"; i = 0; goto redir; |
case NFROMTO: |
p = "<>"; i = 0; goto redir; |
redir: |
if (n->nfile.fd != i) { |
s[0] = n->nfile.fd + '0'; |
s[1] = '\0'; |
cmdputs(s); |
} |
cmdputs(p); |
if (n->type == NTOFD || n->type == NFROMFD) { |
s[0] = n->ndup.dupfd + '0'; |
s[1] = '\0'; |
cmdputs(s); |
} else { |
cmdtxt(n->nfile.fname); |
} |
break; |
case NHERE: |
case NXHERE: |
cmdputs("<<..."); |
break; |
default: |
cmdputs("???"); |
break; |
} |
} |
STATIC void |
cmdputs(s) |
const char *s; |
{ |
const char *p; |
char *q; |
char c; |
int subtype = 0; |
if (cmdnleft <= 0) |
return; |
p = s; |
q = cmdnextc; |
while ((c = *p++) != '\0') { |
if (c == CTLESC) |
*q++ = *p++; |
else if (c == CTLVAR) { |
*q++ = '$'; |
if (--cmdnleft > 0) |
*q++ = '{'; |
subtype = *p++; |
} else if (c == '=' && subtype != 0) { |
*q++ = "}-+?="[(subtype & VSTYPE) - VSNORMAL]; |
subtype = 0; |
} else if (c == CTLENDVAR) { |
*q++ = '}'; |
} else if (c == CTLBACKQ || c == CTLBACKQ+CTLQUOTE) |
cmdnleft++; /* ignore it */ |
else |
*q++ = c; |
if (--cmdnleft <= 0) { |
*q++ = '.'; |
*q++ = '.'; |
*q++ = '.'; |
break; |
} |
} |
cmdnextc = q; |
} |
STATIC void waitonint(int sig) { |
intreceived = 1; |
return; |
} |
/tags/0.3.0/uspace/app/ash/memalloc.h |
---|
0,0 → 1,81 |
/* $NetBSD: memalloc.h,v 1.11 2000/11/01 19:56:01 christos Exp $ */ |
/*- |
* Copyright (c) 1991, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Kenneth Almquist. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
* |
* @(#)memalloc.h 8.2 (Berkeley) 5/4/95 |
*/ |
struct stackmark { |
struct stack_block *stackp; |
char *stacknxt; |
int stacknleft; |
struct stackmark *marknext; |
}; |
extern char *stacknxt; |
extern int stacknleft; |
extern int sstrnleft; |
extern int herefd; |
pointer ckmalloc (int); |
pointer ckrealloc (pointer, int); |
char *savestr (char *); |
pointer stalloc (int); |
void stunalloc (pointer); |
void setstackmark (struct stackmark *); |
void popstackmark (struct stackmark *); |
void growstackblock (void); |
void grabstackblock (int); |
char *growstackstr (void); |
char *makestrspace (void); |
void ungrabstackstr (char *, char *); |
#define stackblock() stacknxt |
#define stackblocksize() stacknleft |
#define STARTSTACKSTR(p) p = stackblock(), sstrnleft = stackblocksize() |
#define STPUTC(c, p) (--sstrnleft >= 0? (*p++ = (c)) : (p = growstackstr(), *p++ = (c))) |
#define CHECKSTRSPACE(n, p) { if (sstrnleft < n) p = makestrspace(); } |
#define USTPUTC(c, p) (--sstrnleft, *p++ = (c)) |
#define STACKSTRNUL(p) (sstrnleft == 0? (p = growstackstr(), *p = '\0') : (*p = '\0')) |
#define STUNPUTC(p) (++sstrnleft, --p) |
#define STTOPC(p) p[-1] |
#define STADJUST(amount, p) (p += (amount), sstrnleft -= (amount)) |
#define grabstackstr(p) stalloc(stackblocksize() - sstrnleft) |
#define ckfree(p) free((pointer)(p)) |
/tags/0.3.0/uspace/app/ash/alias.h |
---|
0,0 → 1,53 |
/* $NetBSD: alias.h,v 1.4 1995/05/11 21:28:42 christos Exp $ */ |
/*- |
* Copyright (c) 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Kenneth Almquist. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
* |
* @(#)alias.h 8.2 (Berkeley) 5/4/95 |
*/ |
#define ALIASINUSE 1 |
struct alias { |
struct alias *next; |
char *name; |
char *val; |
int flag; |
}; |
struct alias *lookupalias (char *, int); |
int aliascmd (int, char **); |
int unaliascmd (int, char **); |
void rmaliases (void); |
/tags/0.3.0/uspace/app/ash/output.c |
---|
0,0 → 1,634 |
/* $NetBSD: output.c,v 1.23 2001/01/07 23:39:07 lukem Exp $ */ |
/*- |
* Copyright (c) 1991, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Kenneth Almquist. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
*/ |
#include <sys/cdefs.h> |
#ifndef lint |
#if 0 |
static char sccsid[] = "@(#)output.c 8.2 (Berkeley) 5/4/95"; |
#else |
__RCSID("$NetBSD: output.c,v 1.23 2001/01/07 23:39:07 lukem Exp $"); |
#endif |
#endif /* not lint */ |
/* |
* Shell output routines. We use our own output routines because: |
* When a builtin command is interrupted we have to discard |
* any pending output. |
* When a builtin command appears in back quotes, we want to |
* save the output of the command in a region obtained |
* via malloc, rather than doing a fork and reading the |
* output of the command via a pipe. |
* Our output routines may be smaller than the stdio routines. |
*/ |
#include <sys/types.h> /* quad_t */ |
#include <sys/param.h> /* BSD4_4 */ |
#include <sys/ioctl.h> |
#include <stdio.h> /* defines BUFSIZ */ |
#include <string.h> |
#include <errno.h> |
#include <unistd.h> |
#include <stdlib.h> |
#if defined(_GNU_SOURCE) && !defined(__UCLIBC__) |
#undef CEOF /* get rid of the redefine warning */ |
#include <fcntl.h> |
#endif |
#include "shell.h" |
#include "syntax.h" |
#include "output.h" |
#include "memalloc.h" |
#include "error.h" |
#define OUTBUFSIZ BUFSIZ |
#define BLOCK_OUT -2 /* output to a fixed block of memory */ |
#define MEM_OUT -3 /* output to dynamically allocated memory */ |
#define OUTPUT_ERR 01 /* error occurred on output */ |
#if defined(_GNU_SOURCE) && !defined(__UCLIBC__) |
struct output output = {NULL, NULL, 0, NULL, 0, 1, 0}; |
struct output errout = {NULL, NULL, 0, NULL, 0, 2, 0}; |
struct output memout = {NULL, NULL, 0, NULL, 0, MEM_OUT, 0}; |
#else |
struct output output = {NULL, 0, NULL, OUTBUFSIZ, 1, 0}; |
struct output errout = {NULL, 0, NULL, 100, 2, 0}; |
struct output memout = {NULL, 0, NULL, 0, MEM_OUT, 0}; |
#endif |
struct output *out1 = &output; |
struct output *out2 = &errout; |
#ifdef mkinit |
INCLUDE "output.h" |
INCLUDE "memalloc.h" |
INIT { |
#if defined(_GNU_SOURCE) && !defined(__UCLIBC__) |
initstreams(); |
#endif |
} |
RESET { |
out1 = &output; |
out2 = &errout; |
#if defined(_GNU_SOURCE) && !defined(__UCLIBC__) |
if (memout.stream != NULL) |
closememout(); |
#endif |
if (memout.buf != NULL) { |
ckfree(memout.buf); |
memout.buf = NULL; |
} |
} |
#endif |
#ifdef notdef /* no longer used */ |
/* |
* Set up an output file to write to memory rather than a file. |
*/ |
void |
open_mem(block, length, file) |
char *block; |
int length; |
struct output *file; |
{ |
file->nextc = block; |
file->nleft = --length; |
file->fd = BLOCK_OUT; |
file->flags = 0; |
} |
#endif |
void |
outstr(p, file) |
const char *p; |
struct output *file; |
{ |
#if defined(_GNU_SOURCE) && !defined(__UCLIBC__) |
fputs(p, file->stream); |
#else |
while (*p) |
outc(*p++, file); |
#endif |
if (file == out2) |
flushout(file); |
} |
#if !defined(_GNU_SOURCE) || defined(__UCLIBC__) |
char out_junk[16]; |
void |
emptyoutbuf(dest) |
struct output *dest; |
{ |
int offset; |
if (dest->fd == BLOCK_OUT) { |
dest->nextc = out_junk; |
dest->nleft = sizeof out_junk; |
dest->flags |= OUTPUT_ERR; |
} else if (dest->buf == NULL) { |
INTOFF; |
dest->buf = ckmalloc(dest->bufsize); |
dest->nextc = dest->buf; |
dest->nleft = dest->bufsize; |
INTON; |
} else if (dest->fd == MEM_OUT) { |
offset = dest->bufsize; |
INTOFF; |
dest->bufsize <<= 1; |
dest->buf = ckrealloc(dest->buf, dest->bufsize); |
dest->nleft = dest->bufsize - offset; |
dest->nextc = dest->buf + offset; |
INTON; |
} else { |
flushout(dest); |
} |
dest->nleft--; |
} |
#endif |
void |
flushall() { |
flushout(&output); |
flushout(&errout); |
} |
#if !defined(_GNU_SOURCE) || defined(__UCLIBC__) |
void |
flushout(dest) |
struct output *dest; |
{ |
if (dest->buf == NULL || dest->nextc == dest->buf || dest->fd < 0) |
return; |
if (xwrite(dest->fd, dest->buf, dest->nextc - dest->buf) < 0) |
dest->flags |= OUTPUT_ERR; |
dest->nextc = dest->buf; |
dest->nleft = dest->bufsize; |
} |
#endif |
void |
freestdout() { |
INTOFF; |
if (output.buf) { |
ckfree(output.buf); |
output.buf = NULL; |
output.nleft = 0; |
} |
INTON; |
} |
void |
#ifdef __STDC__ |
outfmt(struct output *file, const char *fmt, ...) |
#else |
void |
outfmt(va_alist) |
va_dcl |
#endif |
{ |
va_list ap; |
#ifndef __STDC__ |
struct output *file; |
const char *fmt; |
va_start(ap); |
file = va_arg(ap, struct output *); |
fmt = va_arg(ap, const char *); |
#else |
va_start(ap, fmt); |
#endif |
doformat(file, fmt, ap); |
va_end(ap); |
} |
void |
#ifdef __STDC__ |
out1fmt(const char *fmt, ...) |
#else |
out1fmt(va_alist) |
va_dcl |
#endif |
{ |
va_list ap; |
#ifndef __STDC__ |
const char *fmt; |
va_start(ap); |
fmt = va_arg(ap, const char *); |
#else |
va_start(ap, fmt); |
#endif |
doformat(out1, fmt, ap); |
va_end(ap); |
} |
#if !defined(__GLIBC__) && !defined(__UCLIBC__) |
void |
#ifdef __STDC__ |
dprintf(const char *fmt, ...) |
#else |
dprintf(va_alist) |
va_dcl |
#endif |
{ |
va_list ap; |
#ifndef __STDC__ |
const char *fmt; |
va_start(ap); |
fmt = va_arg(ap, const char *); |
#else |
va_start(ap, fmt); |
#endif |
doformat(out2, fmt, ap); |
va_end(ap); |
flushout(out2); |
} |
#endif |
void |
#ifdef __STDC__ |
fmtstr(char *outbuf, size_t length, const char *fmt, ...) |
#else |
fmtstr(va_alist) |
va_dcl |
#endif |
{ |
va_list ap; |
#if !defined(_GNU_SOURCE) || defined(__UCLIBC__) |
struct output strout; |
#endif |
#ifndef __STDC__ |
char *outbuf; |
size_t length; |
const char *fmt; |
va_start(ap); |
outbuf = va_arg(ap, char *); |
length = va_arg(ap, size_t); |
fmt = va_arg(ap, const char *); |
#else |
va_start(ap, fmt); |
#endif |
#if defined(_GNU_SOURCE) && !defined(__UCLIBC__) |
vsnprintf(outbuf, length, fmt, ap); |
#else |
strout.nextc = outbuf; |
strout.nleft = length; |
strout.fd = BLOCK_OUT; |
strout.flags = 0; |
doformat(&strout, fmt, ap); |
outc('\0', &strout); |
if (strout.flags & OUTPUT_ERR) |
outbuf[length - 1] = '\0'; |
#endif |
} |
#if !defined(_GNU_SOURCE) || defined(__UCLIBC__) |
/* |
* Formatted output. This routine handles a subset of the printf formats: |
* - Formats supported: d, u, o, p, X, s, and c. |
* - The x format is also accepted but is treated like X. |
* - The l, ll and q modifiers are accepted. |
* - The - and # flags are accepted; # only works with the o format. |
* - Width and precision may be specified with any format except c. |
* - An * may be given for the width or precision. |
* - The obsolete practice of preceding the width with a zero to get |
* zero padding is not supported; use the precision field. |
* - A % may be printed by writing %% in the format string. |
*/ |
#define TEMPSIZE 24 |
static const char digit[] = "0123456789ABCDEF"; |
#ifdef BSD4_4 |
#define HAVE_VASPRINTF 1 |
#endif |
void |
doformat(dest, f, ap) |
struct output *dest; |
const char *f; /* format string */ |
va_list ap; |
{ |
#if HAVE_VASPRINTF |
char *s; |
vasprintf(&s, f, ap); |
outstr(s, dest); |
free(s); |
#else /* !HAVE_VASPRINTF */ |
char c; |
char temp[TEMPSIZE]; |
int flushleft; |
int sharp; |
int width; |
int prec; |
int islong; |
int isquad; |
char *p; |
int sign; |
#ifdef BSD4_4 |
quad_t l; |
u_quad_t num; |
#else |
long l; |
u_long num; |
#endif |
unsigned base; |
int len; |
int size; |
int pad; |
while ((c = *f++) != '\0') { |
if (c != '%') { |
outc(c, dest); |
continue; |
} |
flushleft = 0; |
sharp = 0; |
width = 0; |
prec = -1; |
islong = 0; |
isquad = 0; |
for (;;) { |
if (*f == '-') |
flushleft++; |
else if (*f == '#') |
sharp++; |
else |
break; |
f++; |
} |
if (*f == '*') { |
width = va_arg(ap, int); |
f++; |
} else { |
while (is_digit(*f)) { |
width = 10 * width + digit_val(*f++); |
} |
} |
if (*f == '.') { |
if (*++f == '*') { |
prec = va_arg(ap, int); |
f++; |
} else { |
prec = 0; |
while (is_digit(*f)) { |
prec = 10 * prec + digit_val(*f++); |
} |
} |
} |
if (*f == 'l') { |
f++; |
if (*f == 'l') { |
isquad++; |
f++; |
} else |
islong++; |
} else if (*f == 'q') { |
isquad++; |
f++; |
} |
switch (*f) { |
case 'd': |
#ifdef BSD4_4 |
if (isquad) |
l = va_arg(ap, quad_t); |
else |
#endif |
if (islong) |
l = va_arg(ap, long); |
else |
l = va_arg(ap, int); |
sign = 0; |
num = l; |
if (l < 0) { |
num = -l; |
sign = 1; |
} |
base = 10; |
goto number; |
case 'u': |
base = 10; |
goto uns_number; |
case 'o': |
base = 8; |
goto uns_number; |
case 'p': |
outc('0', dest); |
outc('x', dest); |
/*FALLTHROUGH*/ |
case 'x': |
/* we don't implement 'x'; treat like 'X' */ |
case 'X': |
base = 16; |
uns_number: /* an unsigned number */ |
sign = 0; |
#ifdef BSD4_4 |
if (isquad) |
num = va_arg(ap, u_quad_t); |
else |
#endif |
if (islong) |
num = va_arg(ap, unsigned long); |
else |
num = va_arg(ap, unsigned int); |
number: /* process a number */ |
p = temp + TEMPSIZE - 1; |
*p = '\0'; |
while (num) { |
*--p = digit[num % base]; |
num /= base; |
} |
len = (temp + TEMPSIZE - 1) - p; |
if (prec < 0) |
prec = 1; |
if (sharp && *f == 'o' && prec <= len) |
prec = len + 1; |
pad = 0; |
if (width) { |
size = len; |
if (size < prec) |
size = prec; |
size += sign; |
pad = width - size; |
if (flushleft == 0) { |
while (--pad >= 0) |
outc(' ', dest); |
} |
} |
if (sign) |
outc('-', dest); |
prec -= len; |
while (--prec >= 0) |
outc('0', dest); |
while (*p) |
outc(*p++, dest); |
while (--pad >= 0) |
outc(' ', dest); |
break; |
case 's': |
p = va_arg(ap, char *); |
pad = 0; |
if (width) { |
len = strlen(p); |
if (prec >= 0 && len > prec) |
len = prec; |
pad = width - len; |
if (flushleft == 0) { |
while (--pad >= 0) |
outc(' ', dest); |
} |
} |
prec++; |
while (--prec != 0 && *p) |
outc(*p++, dest); |
while (--pad >= 0) |
outc(' ', dest); |
break; |
case 'c': |
c = va_arg(ap, int); |
outc(c, dest); |
break; |
default: |
outc(*f, dest); |
break; |
} |
f++; |
} |
#endif /* !HAVE_VASPRINTF */ |
} |
#endif |
/* |
* Version of write which resumes after a signal is caught. |
*/ |
int |
xwrite(fd, buf, nbytes) |
int fd; |
const char *buf; |
int nbytes; |
{ |
int ntry; |
int i; |
int n; |
n = nbytes; |
ntry = 0; |
for (;;) { |
i = write(fd, buf, n); |
if (i > 0) { |
if ((n -= i) <= 0) |
return nbytes; |
buf += i; |
ntry = 0; |
} else if (i == 0) { |
if (++ntry > 10) |
return nbytes - n; |
} else if (errno != EINTR) { |
return -1; |
} |
} |
} |
#ifdef notdef |
/* |
* Version of ioctl that retries after a signal is caught. |
* XXX unused function |
*/ |
int |
xioctl(fd, request, arg) |
int fd; |
unsigned long request; |
char * arg; |
{ |
int i; |
while ((i = ioctl(fd, request, arg)) == -1 && errno == EINTR); |
return i; |
} |
#endif |
#if defined(_GNU_SOURCE) && !defined(__UCLIBC__) |
void initstreams() { |
output.stream = stdout; |
errout.stream = stderr; |
} |
void |
openmemout() { |
memout.stream = open_memstream(&memout.buf, &memout.bufsize); |
} |
void |
closememout() { |
INTOFF; |
fclose(memout.stream); |
memout.stream = NULL; |
INTON; |
} |
#endif |
/tags/0.3.0/uspace/app/ash/parser.h |
---|
0,0 → 1,83 |
/* $NetBSD: parser.h,v 1.14 2000/07/27 04:09:28 cgd Exp $ */ |
/*- |
* Copyright (c) 1991, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Kenneth Almquist. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
* |
* @(#)parser.h 8.3 (Berkeley) 5/4/95 |
*/ |
/* control characters in argument strings */ |
#define CTLESC '\201' |
#define CTLVAR '\202' |
#define CTLENDVAR '\203' |
#define CTLBACKQ '\204' |
#define CTLQUOTE 01 /* ored with CTLBACKQ code if in quotes */ |
/* CTLBACKQ | CTLQUOTE == '\205' */ |
#define CTLARI '\206' |
#define CTLENDARI '\207' |
#define CTLQUOTEMARK '\210' |
/* variable substitution byte (follows CTLVAR) */ |
#define VSTYPE 0x0f /* type of variable substitution */ |
#define VSNUL 0x10 /* colon--treat the empty string as unset */ |
#define VSQUOTE 0x80 /* inside double quotes--suppress splitting */ |
/* values of VSTYPE field */ |
#define VSNORMAL 0x1 /* normal variable: $var or ${var} */ |
#define VSMINUS 0x2 /* ${var-text} */ |
#define VSPLUS 0x3 /* ${var+text} */ |
#define VSQUESTION 0x4 /* ${var?message} */ |
#define VSASSIGN 0x5 /* ${var=text} */ |
#define VSTRIMLEFT 0x6 /* ${var#pattern} */ |
#define VSTRIMLEFTMAX 0x7 /* ${var##pattern} */ |
#define VSTRIMRIGHT 0x8 /* ${var%pattern} */ |
#define VSTRIMRIGHTMAX 0x9 /* ${var%%pattern} */ |
#define VSLENGTH 0xa /* ${#var} */ |
/* |
* NEOF is returned by parsecmd when it encounters an end of file. It |
* must be distinct from NULL, so we use the address of a variable that |
* happens to be handy. |
*/ |
extern int tokpushback; |
#define NEOF ((union node *)&tokpushback) |
extern int whichprompt; /* 1 == PS1, 2 == PS2 */ |
union node *parsecmd(int); |
void fixredir(union node *, const char *, int); |
int goodname(char *); |
const char *getprompt(void *); |
/tags/0.3.0/uspace/app/ash/jobs.h |
---|
0,0 → 1,98 |
/* $NetBSD: jobs.h,v 1.12 2000/05/22 10:18:47 elric Exp $ */ |
/*- |
* Copyright (c) 1991, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Kenneth Almquist. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
* |
* @(#)jobs.h 8.2 (Berkeley) 5/4/95 |
*/ |
/* Mode argument to forkshell. Don't change FORK_FG or FORK_BG. */ |
#define FORK_FG 0 |
#define FORK_BG 1 |
#define FORK_NOJOB 2 |
/* |
* A job structure contains information about a job. A job is either a |
* single process or a set of processes contained in a pipeline. In the |
* latter case, pidlist will be non-NULL, and will point to a -1 terminated |
* array of pids. |
*/ |
struct procstat { |
pid_t pid; /* process id */ |
int status; /* status flags (defined above) */ |
char *cmd; /* text of command being run */ |
}; |
/* states */ |
#define JOBSTOPPED 1 /* all procs are stopped */ |
#define JOBDONE 2 /* all procs are completed */ |
struct job { |
struct procstat ps0; /* status of process */ |
struct procstat *ps; /* status or processes when more than one */ |
short nprocs; /* number of processes */ |
short pgrp; /* process group of this job */ |
char state; /* true if job is finished */ |
char used; /* true if this entry is in used */ |
char changed; /* true if status has changed */ |
#if JOBS |
char jobctl; /* job running under job control */ |
#endif |
}; |
extern short backgndpid; /* pid of last background process */ |
extern int job_warning; /* user was warned about stopped jobs */ |
void setjobctl (int); |
int killcmd (int, char **); |
int fgcmd (int, char **); |
int bgcmd (int, char **); |
int jobscmd (int, char **); |
void showjobs (int); |
int waitcmd (int, char **); |
int jobidcmd (int, char **); |
struct job *makejob (union node *, int); |
int forkshell (struct job *, union node *, int); |
int waitforjob (struct job *); |
int stoppedjobs (void); |
char *commandtext (union node *); |
#if ! JOBS |
#define setjobctl(on) /* do nothing */ |
#endif |
/tags/0.3.0/uspace/app/ash/output.h |
---|
0,0 → 1,110 |
/* $NetBSD: output.h,v 1.14 1998/01/31 12:37:55 christos Exp $ */ |
/*- |
* Copyright (c) 1991, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Kenneth Almquist. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
* |
* @(#)output.h 8.2 (Berkeley) 5/4/95 |
*/ |
#ifndef OUTPUT_INCL |
#ifdef __STDC__ |
#include <stdarg.h> |
#else |
#include <varargs.h> |
#endif |
#if defined(_GNU_SOURCE) && !defined(__UCLIBC__) |
#include <stdio.h> |
#endif |
struct output { |
#if defined(_GNU_SOURCE) && !defined(__UCLIBC__) |
FILE *stream; |
#endif |
char *nextc; |
int nleft; |
char *buf; |
int bufsize; |
int fd; |
short flags; |
}; |
extern struct output output; |
extern struct output errout; |
extern struct output memout; |
extern struct output *out1; |
extern struct output *out2; |
void outstr (const char *, struct output *); |
#ifndef _GNU_SOURCE |
void emptyoutbuf (struct output *); |
#endif |
void flushall (void); |
#ifndef _GNU_SOURCE |
void flushout (struct output *); |
#endif |
void freestdout (void); |
void outfmt (struct output *, const char *, ...) |
__attribute__((__format__(__printf__,2,3))); |
void out1fmt (const char *, ...) |
__attribute__((__format__(__printf__,1,2))); |
#if !defined(__GLIBC__) && !defined(__UCLIBC__) |
void dprintf (const char *, ...) |
__attribute__((__format__(__printf__,1,2))); |
#endif |
void fmtstr (char *, size_t, const char *, ...) |
__attribute__((__format__(__printf__,3,4))); |
#ifndef _GNU_SOURCE |
void doformat (struct output *, const char *, va_list); |
#endif |
int xwrite (int, const char *, int); |
#if defined(_GNU_SOURCE) && !defined(__UCLIBC__) |
void initstreams (void); |
void openmemout (void); |
void closememout (void); |
#define outc(c, o) putc(c, (o)->stream) |
#define flushout(o) fflush((o)->stream) |
#define doformat(d, f, a) vfprintf((d)->stream, f, a) |
#else |
#define outc(c, file) (--(file)->nleft < 0? (emptyoutbuf(file), *(file)->nextc++ = (c)) : (*(file)->nextc++ = (c))) |
#endif |
#define out1c(c) outc(c, out1) |
#define out2c(c) outc(c, out2) |
#define out1str(s) outstr(s, out1) |
#define out2str(s) outstr(s, out2) |
#define OUTPUT_INCL |
#endif |
/tags/0.3.0/uspace/app/ash/builtins.def |
---|
0,0 → 1,96 |
#!/bin/sh - |
# $NetBSD: builtins.def,v 1.15 2000/04/09 23:27:03 christos Exp $ |
# |
# Copyright (c) 1991, 1993 |
# The Regents of the University of California. All rights reserved. |
# |
# This code is derived from software contributed to Berkeley by |
# Kenneth Almquist. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# 1. Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# 2. Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# 3. All advertising materials mentioning features or use of this software |
# must display the following acknowledgement: |
# This product includes software developed by the University of |
# California, Berkeley and its contributors. |
# 4. Neither the name of the University nor the names of its contributors |
# may be used to endorse or promote products derived from this software |
# without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
# SUCH DAMAGE. |
# |
# @(#)builtins.def 8.4 (Berkeley) 5/4/95 |
# |
# This file lists all the builtin commands. The first column is the name |
# of a C routine. The -j flag, if present, specifies that this command |
# is to be excluded from systems without job control, and the -h flag, |
# if present specifies that this command is to be excluded from systems |
# based on the SMALL compile-time symbol. The rest of the line |
# specifies the command name or names used to run the command. The entry |
# for bltincmd, which is run when the user does not specify a command, must |
# come first. |
# |
# NOTE: bltincmd must come first! |
bltincmd builtin |
#alloccmd alloc |
bgcmd -j bg |
breakcmd break continue |
#catfcmd catf |
cdcmd cd chdir |
commandcmd command |
dotcmd . |
echocmd echo |
evalcmd eval |
execcmd exec |
exitcmd exit |
expcmd exp let |
exportcmd export readonly |
#exprcmd expr |
falsecmd false |
histcmd -h fc |
fgcmd -j fg |
getoptscmd getopts |
hashcmd hash |
jobidcmd jobid |
jobscmd jobs |
killcmd -j kill |
#linecmd line |
localcmd local |
#nlechocmd nlecho |
#printfcmd printf |
pwdcmd pwd |
readcmd read |
returncmd return |
setcmd set |
setvarcmd setvar |
shiftcmd shift |
trapcmd trap |
truecmd : true |
typecmd type |
umaskcmd umask |
unaliascmd unalias |
unsetcmd unset |
waitcmd wait |
#foocmd foo |
aliascmd alias |
ulimitcmd ulimit |
testcmd test [ |
timescmd times |
/tags/0.3.0/uspace/app/ash/mystring.c |
---|
0,0 → 1,144 |
/* $NetBSD: mystring.c,v 1.14 1999/07/09 03:05:50 christos Exp $ */ |
/*- |
* Copyright (c) 1991, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Kenneth Almquist. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
*/ |
#include <sys/cdefs.h> |
#ifndef lint |
#if 0 |
static char sccsid[] = "@(#)mystring.c 8.2 (Berkeley) 5/4/95"; |
#else |
__RCSID("$NetBSD: mystring.c,v 1.14 1999/07/09 03:05:50 christos Exp $"); |
#endif |
#endif /* not lint */ |
/* |
* String functions. |
* |
* equal(s1, s2) Return true if strings are equal. |
* scopy(from, to) Copy a string. |
* scopyn(from, to, n) Like scopy, but checks for overflow. |
* number(s) Convert a string of digits to an integer. |
* is_number(s) Return true if s is a string of digits. |
*/ |
#include <stdlib.h> |
#include "shell.h" |
#include "syntax.h" |
#include "error.h" |
#include "mystring.h" |
char nullstr[1]; /* zero length string */ |
/* |
* equal - #defined in mystring.h |
*/ |
/* |
* scopy - #defined in mystring.h |
*/ |
/* |
* scopyn - copy a string from "from" to "to", truncating the string |
* if necessary. "To" is always nul terminated, even if |
* truncation is performed. "Size" is the size of "to". |
*/ |
void |
scopyn(from, to, size) |
char const *from; |
char *to; |
int size; |
{ |
while (--size > 0) { |
if ((*to++ = *from++) == '\0') |
return; |
} |
*to = '\0'; |
} |
/* |
* prefix -- see if pfx is a prefix of string. |
*/ |
int |
prefix(pfx, string) |
char const *pfx; |
char const *string; |
{ |
while (*pfx) { |
if (*pfx++ != *string++) |
return 0; |
} |
return 1; |
} |
/* |
* Convert a string of digits to an integer, printing an error message on |
* failure. |
*/ |
int |
number(s) |
const char *s; |
{ |
if (! is_number(s)) |
error("Illegal number: %s", s); |
return atoi(s); |
} |
/* |
* Check for a valid number. This should be elsewhere. |
*/ |
int |
is_number(p) |
const char *p; |
{ |
do { |
if (! is_digit(*p)) |
return 0; |
} while (*++p != '\0'); |
return 1; |
} |
/tags/0.3.0/uspace/app/ash/tags |
---|
0,0 → 1,1207 |
!_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/ |
!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/ |
!_TAG_PROGRAM_AUTHOR Darren Hiebert /dhiebert@users.sourceforge.net/ |
!_TAG_PROGRAM_NAME Exuberant Ctags // |
!_TAG_PROGRAM_URL http://ctags.sourceforge.net /official site/ |
!_TAG_PROGRAM_VERSION 5.5.4 // |
ADDCMD setmode.c 170;" d file: |
ALIASINUSE alias.h 41;" d |
ALIGN machdep.h 52;" d |
ALL error.c 223;" d file: |
ARB exec.c 88;" d file: |
ARITH_ADD arith.c /^ ARITH_ADD = 275,$/;" e enum:yytokentype file: |
ARITH_ADD arith.c 114;" d file: |
ARITH_ADD arith.h /^ ARITH_ADD = 275,$/;" e enum:yytokentype |
ARITH_ADD arith.h 87;" d |
ARITH_AND arith.c /^ ARITH_AND = 262,$/;" e enum:yytokentype file: |
ARITH_AND arith.c 101;" d file: |
ARITH_AND arith.h /^ ARITH_AND = 262,$/;" e enum:yytokentype |
ARITH_AND arith.h 74;" d |
ARITH_BAND arith.c /^ ARITH_BAND = 265,$/;" e enum:yytokentype file: |
ARITH_BAND arith.c 104;" d file: |
ARITH_BAND arith.h /^ ARITH_BAND = 265,$/;" e enum:yytokentype |
ARITH_BAND arith.h 77;" d |
ARITH_BNOT arith.c /^ ARITH_BNOT = 279,$/;" e enum:yytokentype file: |
ARITH_BNOT arith.c 118;" d file: |
ARITH_BNOT arith.h /^ ARITH_BNOT = 279,$/;" e enum:yytokentype |
ARITH_BNOT arith.h 91;" d |
ARITH_BOR arith.c /^ ARITH_BOR = 263,$/;" e enum:yytokentype file: |
ARITH_BOR arith.c 102;" d file: |
ARITH_BOR arith.h /^ ARITH_BOR = 263,$/;" e enum:yytokentype |
ARITH_BOR arith.h 75;" d |
ARITH_BXOR arith.c /^ ARITH_BXOR = 264,$/;" e enum:yytokentype file: |
ARITH_BXOR arith.c 103;" d file: |
ARITH_BXOR arith.h /^ ARITH_BXOR = 264,$/;" e enum:yytokentype |
ARITH_BXOR arith.h 76;" d |
ARITH_DIV arith.c /^ ARITH_DIV = 277,$/;" e enum:yytokentype file: |
ARITH_DIV arith.c 116;" d file: |
ARITH_DIV arith.h /^ ARITH_DIV = 277,$/;" e enum:yytokentype |
ARITH_DIV arith.h 89;" d |
ARITH_EQ arith.c /^ ARITH_EQ = 267,$/;" e enum:yytokentype file: |
ARITH_EQ arith.c 106;" d file: |
ARITH_EQ arith.h /^ ARITH_EQ = 267,$/;" e enum:yytokentype |
ARITH_EQ arith.h 79;" d |
ARITH_GE arith.c /^ ARITH_GE = 269,$/;" e enum:yytokentype file: |
ARITH_GE arith.c 108;" d file: |
ARITH_GE arith.h /^ ARITH_GE = 269,$/;" e enum:yytokentype |
ARITH_GE arith.h 81;" d |
ARITH_GT arith.c /^ ARITH_GT = 270,$/;" e enum:yytokentype file: |
ARITH_GT arith.c 109;" d file: |
ARITH_GT arith.h /^ ARITH_GT = 270,$/;" e enum:yytokentype |
ARITH_GT arith.h 82;" d |
ARITH_LE arith.c /^ ARITH_LE = 268,$/;" e enum:yytokentype file: |
ARITH_LE arith.c 107;" d file: |
ARITH_LE arith.h /^ ARITH_LE = 268,$/;" e enum:yytokentype |
ARITH_LE arith.h 80;" d |
ARITH_LPAREN arith.c /^ ARITH_LPAREN = 259,$/;" e enum:yytokentype file: |
ARITH_LPAREN arith.c 98;" d file: |
ARITH_LPAREN arith.h /^ ARITH_LPAREN = 259,$/;" e enum:yytokentype |
ARITH_LPAREN arith.h 71;" d |
ARITH_LSHIFT arith.c /^ ARITH_LSHIFT = 273,$/;" e enum:yytokentype file: |
ARITH_LSHIFT arith.c 112;" d file: |
ARITH_LSHIFT arith.h /^ ARITH_LSHIFT = 273,$/;" e enum:yytokentype |
ARITH_LSHIFT arith.h 85;" d |
ARITH_LT arith.c /^ ARITH_LT = 271,$/;" e enum:yytokentype file: |
ARITH_LT arith.c 110;" d file: |
ARITH_LT arith.h /^ ARITH_LT = 271,$/;" e enum:yytokentype |
ARITH_LT arith.h 83;" d |
ARITH_MUL arith.c /^ ARITH_MUL = 278,$/;" e enum:yytokentype file: |
ARITH_MUL arith.c 117;" d file: |
ARITH_MUL arith.h /^ ARITH_MUL = 278,$/;" e enum:yytokentype |
ARITH_MUL arith.h 90;" d |
ARITH_NE arith.c /^ ARITH_NE = 266,$/;" e enum:yytokentype file: |
ARITH_NE arith.c 105;" d file: |
ARITH_NE arith.h /^ ARITH_NE = 266,$/;" e enum:yytokentype |
ARITH_NE arith.h 78;" d |
ARITH_NOT arith.c /^ ARITH_NOT = 280,$/;" e enum:yytokentype file: |
ARITH_NOT arith.c 119;" d file: |
ARITH_NOT arith.h /^ ARITH_NOT = 280,$/;" e enum:yytokentype |
ARITH_NOT arith.h 92;" d |
ARITH_NUM arith.c /^ ARITH_NUM = 258,$/;" e enum:yytokentype file: |
ARITH_NUM arith.c 97;" d file: |
ARITH_NUM arith.h /^ ARITH_NUM = 258,$/;" e enum:yytokentype |
ARITH_NUM arith.h 70;" d |
ARITH_OR arith.c /^ ARITH_OR = 261,$/;" e enum:yytokentype file: |
ARITH_OR arith.c 100;" d file: |
ARITH_OR arith.h /^ ARITH_OR = 261,$/;" e enum:yytokentype |
ARITH_OR arith.h 73;" d |
ARITH_REM arith.c /^ ARITH_REM = 276,$/;" e enum:yytokentype file: |
ARITH_REM arith.c 115;" d file: |
ARITH_REM arith.h /^ ARITH_REM = 276,$/;" e enum:yytokentype |
ARITH_REM arith.h 88;" d |
ARITH_RPAREN arith.c /^ ARITH_RPAREN = 260,$/;" e enum:yytokentype file: |
ARITH_RPAREN arith.c 99;" d file: |
ARITH_RPAREN arith.h /^ ARITH_RPAREN = 260,$/;" e enum:yytokentype |
ARITH_RPAREN arith.h 72;" d |
ARITH_RSHIFT arith.c /^ ARITH_RSHIFT = 272,$/;" e enum:yytokentype file: |
ARITH_RSHIFT arith.c 111;" d file: |
ARITH_RSHIFT arith.h /^ ARITH_RSHIFT = 272,$/;" e enum:yytokentype |
ARITH_RSHIFT arith.h 84;" d |
ARITH_SUB arith.c /^ ARITH_SUB = 274,$/;" e enum:yytokentype file: |
ARITH_SUB arith.c 113;" d file: |
ARITH_SUB arith.h /^ ARITH_SUB = 274,$/;" e enum:yytokentype |
ARITH_SUB arith.h 86;" d |
ARITH_UNARYMINUS arith.c /^ ARITH_UNARYMINUS = 282$/;" e enum:yytokentype file: |
ARITH_UNARYMINUS arith.c 121;" d file: |
ARITH_UNARYMINUS arith.h /^ ARITH_UNARYMINUS = 282$/;" e enum:yytokentype |
ARITH_UNARYMINUS arith.h 94;" d |
ARITH_UNARYPLUS arith.c /^ ARITH_UNARYPLUS = 281,$/;" e enum:yytokentype file: |
ARITH_UNARYPLUS arith.c 120;" d file: |
ARITH_UNARYPLUS arith.h /^ ARITH_UNARYPLUS = 281,$/;" e enum:yytokentype |
ARITH_UNARYPLUS arith.h 93;" d |
ATABSIZE alias.c 58;" d file: |
BAND bltin/test.c /^ BAND,$/;" e enum:token file: |
BBINOP bltin/test.c /^ BBINOP,$/;" e enum:token_types file: |
BINOP bltin/test.c /^ BINOP,$/;" e enum:token_types file: |
BITCMD setmode.c /^} BITCMD;$/;" t file: |
BLOCKSIZE mkinit.c 90;" d file: |
BLOCK_OUT output.c 81;" d file: |
BOR bltin/test.c /^ BOR,$/;" e enum:token file: |
BSD shell.h 57;" d |
BUFLEN mknodes.c 71;" d file: |
BUNOP bltin/test.c /^ BUNOP,$/;" e enum:token_types file: |
CEOF jobs.c 70;" d file: |
CEOF output.c 69;" d file: |
CHECKEND parser.c 839;" d file: |
CHECKSTRSPACE memalloc.h 73;" d |
CLEAR_PENDING_INT error.h 90;" d |
CMD2_CLR setmode.c 80;" d file: |
CMD2_GBITS setmode.c 82;" d file: |
CMD2_OBITS setmode.c 83;" d file: |
CMD2_SET setmode.c 81;" d file: |
CMD2_UBITS setmode.c 84;" d file: |
CMDBUILTIN exec.h 44;" d |
CMDFUNCTION exec.h 45;" d |
CMDNORMAL exec.h 43;" d |
CMDTABLESIZE exec.c 87;" d file: |
CMDUNKNOWN exec.h 42;" d |
CTLARI parser.h 48;" d |
CTLBACKQ parser.h 45;" d |
CTLENDARI parser.h 49;" d |
CTLENDVAR parser.h 44;" d |
CTLESC parser.h 42;" d |
CTLQUOTE parser.h 46;" d |
CTLQUOTEMARK parser.h 50;" d |
CTLVAR parser.h 43;" d |
Cflag options.h 62;" d |
DEFEDITOR histedit.c 70;" d file: |
DEFINE_OPTIONS options.c 53;" d file: |
DEFINE_OPTIONS options.c 55;" d file: |
DEL hetio.c 49;" d file: |
DO_ABS exec.h 58;" d |
DO_BRUTE exec.h 60;" d |
DO_ERR exec.h 57;" d |
DO_NOFUN exec.h 59;" d |
EMPTY redir.c 73;" d file: |
EOFMARKLEN parser.c 73;" d file: |
EOF_NLEFT input.c 77;" d file: |
EOI bltin/test.c /^ EOI,$/;" e enum:token file: |
ESC hetio.c 48;" d file: |
EV_BACKCMD eval.c 84;" d file: |
EV_EXIT eval.c 82;" d file: |
EV_TESTED eval.c 83;" d file: |
EXERROR error.h 71;" d |
EXEXEC error.h 73;" d |
EXINT error.h 70;" d |
EXP_CASE expand.h 59;" d |
EXP_FULL expand.h 55;" d |
EXP_RECORD expand.h 60;" d |
EXP_REDIR expand.h 58;" d |
EXP_TILDE expand.h 56;" d |
EXP_VARTILDE expand.h 57;" d |
EXSHELLPROC error.h 72;" d |
E_CREAT error.h 46;" d |
E_EXEC error.h 47;" d |
E_OPEN error.h 45;" d |
Eflag options.h 61;" d |
FILBDEV bltin/test.c /^ FILBDEV,$/;" e enum:token file: |
FILCDEV bltin/test.c /^ FILCDEV,$/;" e enum:token file: |
FILDIR bltin/test.c /^ FILDIR,$/;" e enum:token file: |
FILEQ bltin/test.c /^ FILEQ,$/;" e enum:token file: |
FILEX bltin/test.c /^ FILEX,$/;" e enum:token file: |
FILEXIST bltin/test.c /^ FILEXIST,$/;" e enum:token file: |
FILFIFO bltin/test.c /^ FILFIFO,$/;" e enum:token file: |
FILGID bltin/test.c /^ FILGID,$/;" e enum:token file: |
FILGZ bltin/test.c /^ FILGZ,$/;" e enum:token file: |
FILNT bltin/test.c /^ FILNT,$/;" e enum:token file: |
FILOT bltin/test.c /^ FILOT,$/;" e enum:token file: |
FILRD bltin/test.c /^ FILRD,$/;" e enum:token file: |
FILREG bltin/test.c /^ FILREG,$/;" e enum:token file: |
FILSGID bltin/test.c /^ FILSGID,$/;" e enum:token file: |
FILSOCK bltin/test.c /^ FILSOCK,$/;" e enum:token file: |
FILSTCK bltin/test.c /^ FILSTCK,$/;" e enum:token file: |
FILSUID bltin/test.c /^ FILSUID,$/;" e enum:token file: |
FILSYM bltin/test.c /^ FILSYM,$/;" e enum:token file: |
FILTT bltin/test.c /^ FILTT,$/;" e enum:token file: |
FILUID bltin/test.c /^ FILUID,$/;" e enum:token file: |
FILWR bltin/test.c /^ FILWR,$/;" e enum:token file: |
FORCEINTON error.h 89;" d |
FORK_BG jobs.h 43;" d |
FORK_FG jobs.h 42;" d |
FORK_NOJOB jobs.h 44;" d |
GENHEADERS Makefile /^GENHEADERS = \\$/;" m |
GENSRCS Makefile /^GENSRCS = builtins.c \\$/;" m |
HAVE_VASPRINTF output.c 359;" d file: |
INITARGS bltin/bltin.h 67;" d |
INITARGS bltin/bltin.h 73;" d |
INIT_DEPS Makefile /^INIT_DEPS = alias.c eval.c exec.c input.c jobs.c options.c parser.c \\$/;" m |
INTEQ bltin/test.c /^ INTEQ,$/;" e enum:token file: |
INTGE bltin/test.c /^ INTGE,$/;" e enum:token file: |
INTGT bltin/test.c /^ INTGT,$/;" e enum:token file: |
INTLE bltin/test.c /^ INTLE,$/;" e enum:token file: |
INTLT bltin/test.c /^ INTLT,$/;" e enum:token file: |
INTNE bltin/test.c /^ INTNE,$/;" e enum:token file: |
INTOFF error.h 87;" d |
INTON error.h 88;" d |
Iflag options.h 53;" d |
JOBDONE jobs.h 63;" d |
JOBS shell.h 55;" d |
JOBSTOPPED jobs.h 62;" d |
LIBC_PREFIX Makefile /^LIBC_PREFIX = ..\/..\/lib\/libc$/;" m |
LIBS Makefile /^LIBS = $(LIBC_PREFIX)\/libc.a$/;" m |
LPAREN bltin/test.c /^ LPAREN,$/;" e enum:token file: |
MAXCMDTEXT jobs.c 1073;" d file: |
MAXFIELDS mknodes.c 70;" d file: |
MAXHISTLOOPS histedit.c 69;" d file: |
MAXMBOXES mail.c 64;" d file: |
MAXPWD cd.c 299;" d file: |
MAXTYPES mknodes.c 69;" d file: |
MAX_HISTORY hetio.c 46;" d file: |
MEM_OUT output.c 82;" d file: |
MINSIZE memalloc.c 118;" d file: |
MKINIT shell.h 72;" d |
NEOF parser.h 76;" d |
NEWARGS exec.c 217;" d file: |
NOPTS options.h 68;" d |
NSIG mksignames.c 28;" d file: |
NULL bltin/bltin.h 70;" d |
NULL shell.h 63;" d |
NULL shell.h 68;" d |
OBJECTS Makefile /^OBJECTS := $(addsuffix .o,$(basename $(SOURCES)))$/;" m |
OPERAND bltin/test.c /^ OPERAND$/;" e enum:token file: |
OUTBUFSIZ output.c 80;" d file: |
OUTFILE mkinit.c 78;" d file: |
OUTPUT Makefile /^OUTPUT = sh$/;" m |
OUTPUT_ERR output.c 83;" d file: |
OUTPUT_INCL output.h 109;" d |
OUTTEMP mkinit.c 79;" d file: |
PAREN bltin/test.c /^ PAREN$/;" e enum:token_types file: |
PARSEARITH parser.c 844;" d file: |
PARSEBACKQNEW parser.c 843;" d file: |
PARSEBACKQOLD parser.c 842;" d file: |
PARSEREDIR parser.c 840;" d file: |
PARSESUB parser.c 841;" d file: |
PIPESIZE redir.c 75;" d file: |
PIPESIZE redir.c 77;" d file: |
PROFILE main.c 86;" d file: |
REDIR_BACKQ redir.h 43;" d |
REDIR_PUSH redir.h 42;" d |
RETURN parser.c 754;" d file: |
RETURN parser.c 822;" d file: |
RPAREN bltin/test.c /^ RPAREN,$/;" e enum:token file: |
RTLEN mksignames.c 36;" d file: |
RTLIM mksignames.c 37;" d file: |
SET_LEN setmode.c 71;" d file: |
SET_LEN_INCR setmode.c 72;" d file: |
SHSRCS Makefile /^SHSRCS = alias.c \\$/;" m |
SIGSSIZE main.c 217;" d file: |
SKIPBREAK eval.h 72;" d |
SKIPCONT eval.h 73;" d |
SKIPFILE eval.h 75;" d |
SKIPFUNC eval.h 74;" d |
SOFTINT_PREFIX Makefile /^SOFTINT_PREFIX = ..\/..\/lib\/softint$/;" m |
SOURCES Makefile /^SOURCES = ${SHSRCS} ${GENSRCS}$/;" m |
STACKSTRNUL memalloc.h 75;" d |
STADJUST memalloc.h 78;" d |
STANDARD_BITS setmode.c 186;" d file: |
STARTSTACKSTR memalloc.h 71;" d |
STATIC shell.h 71;" d |
STPUTC memalloc.h 72;" d |
STREQ bltin/test.c /^ STREQ,$/;" e enum:token file: |
STREZ bltin/test.c /^ STREZ,$/;" e enum:token file: |
STRGT bltin/test.c /^ STRGT,$/;" e enum:token file: |
STRLT bltin/test.c /^ STRLT,$/;" e enum:token file: |
STRNE bltin/test.c /^ STRNE,$/;" e enum:token file: |
STRNZ bltin/test.c /^ STRNZ,$/;" e enum:token file: |
STTOPC memalloc.h 77;" d |
STUNPUTC memalloc.h 76;" d |
S_CATCH trap.c 78;" d file: |
S_DFL trap.c 77;" d file: |
S_HARD_IGN trap.c 80;" d file: |
S_IGN trap.c 79;" d file: |
S_ISTXT setmode.c 68;" d file: |
S_RESET trap.c 81;" d file: |
TEMPSIZE output.c 354;" d file: |
TRACE shell.h 80;" d |
TRACE shell.h 82;" d |
T_INT mknodes.c 77;" d file: |
T_NODE mknodes.c 74;" d file: |
T_NODELIST mknodes.c 75;" d file: |
T_OTHER mknodes.c 78;" d file: |
T_STRING mknodes.c 76;" d file: |
T_TEMP mknodes.c 79;" d file: |
UNOP bltin/test.c /^ UNOP,$/;" e enum:token_types file: |
UNOT bltin/test.c /^ UNOT,$/;" e enum:token file: |
USTPUTC memalloc.h 74;" d |
VEXPORT var.h 46;" d |
VNOFUNC var.h 52;" d |
VREADONLY var.h 47;" d |
VSASSIGN parser.h 62;" d |
VSLENGTH parser.h 67;" d |
VSMINUS parser.h 59;" d |
VSNORMAL parser.h 58;" d |
VSNUL parser.h 54;" d |
VSPLUS parser.h 60;" d |
VSQUESTION parser.h 61;" d |
VSQUOTE parser.h 55;" d |
VSTACK var.h 50;" d |
VSTRFIXED var.h 48;" d |
VSTRIMLEFT parser.h 63;" d |
VSTRIMLEFTMAX parser.h 64;" d |
VSTRIMRIGHT parser.h 65;" d |
VSTRIMRIGHTMAX parser.h 66;" d |
VSTYPE parser.h 53;" d |
VTABSIZE var.c 75;" d file: |
VTEXTFIXED var.h 49;" d |
VUNSET var.h 51;" d |
Vflag options.h 60;" d |
YYABORT arith.c 744;" d file: |
YYACCEPT arith.c 743;" d file: |
YYBACKUP arith.c 756;" d file: |
YYBISON arith.c 47;" d file: |
YYBISON_VERSION arith.c 50;" d file: |
YYCOPY arith.c 477;" d file: |
YYCOPY arith.c 480;" d file: |
YYDEBUG arith.c 268;" d file: |
YYDPRINTF arith.c 836;" d file: |
YYDPRINTF arith.c 982;" d file: |
YYEMPTY arith.c 740;" d file: |
YYEOF arith.c 741;" d file: |
YYERRCODE arith.c 775;" d file: |
YYERROR arith.c 745;" d file: |
YYERROR_VERBOSE arith.c 273;" d file: |
YYERROR_VERBOSE arith.c 274;" d file: |
YYERROR_VERBOSE arith.c 276;" d file: |
YYFAIL arith.c 752;" d file: |
YYFINAL arith.c 510;" d file: |
YYFPRINTF arith.c 833;" d file: |
YYFREE arith.c 443;" d file: |
YYID arith.c /^YYID (i)$/;" f file: |
YYID arith.c 367;" d file: |
YYINITDEPTH arith.c 991;" d file: |
YYLAST arith.c 512;" d file: |
YYLEX arith.c 823;" d file: |
YYLEX arith.c 825;" d file: |
YYLLOC_DEFAULT arith.c 784;" d file: |
YYLSP_NEEDED arith.c 59;" d file: |
YYMALLOC arith.c 436;" d file: |
YYMAXDEPTH arith.c 1002;" d file: |
YYMAXUTOK arith.c 525;" d file: |
YYNNTS arith.c 517;" d file: |
YYNRULES arith.c 519;" d file: |
YYNSTATES arith.c 521;" d file: |
YYNTOKENS arith.c 515;" d file: |
YYPACT_NINF arith.c 660;" d file: |
YYPOPSTACK arith.c 1340;" d file: |
YYPURE arith.c 56;" d file: |
YYRECOVERING arith.c 754;" d file: |
YYRHSLOC arith.c 782;" d file: |
YYSIZE_MAXIMUM arith.c 344;" d file: |
YYSIZE_T arith.c 332;" d file: |
YYSIZE_T arith.c 334;" d file: |
YYSIZE_T arith.c 338;" d file: |
YYSIZE_T arith.c 340;" d file: |
YYSKELETON_NAME arith.c 53;" d file: |
YYSTACK_ALLOC arith.c 390;" d file: |
YYSTACK_ALLOC arith.c 394;" d file: |
YYSTACK_ALLOC arith.c 399;" d file: |
YYSTACK_ALLOC arith.c 422;" d file: |
YYSTACK_ALLOC_MAXIMUM arith.c 419;" d file: |
YYSTACK_ALLOC_MAXIMUM arith.c 425;" d file: |
YYSTACK_BYTES arith.c 469;" d file: |
YYSTACK_FREE arith.c 413;" d file: |
YYSTACK_FREE arith.c 423;" d file: |
YYSTACK_GAP_MAXIMUM arith.c 465;" d file: |
YYSTACK_RELOCATE arith.c 1428;" d file: |
YYSTACK_RELOCATE arith.c 496;" d file: |
YYSTYPE arith.c /^typedef int YYSTYPE;$/;" t file: |
YYSTYPE arith.h /^typedef int YYSTYPE;$/;" t |
YYSTYPE_IS_DECLARED arith.c 287;" d file: |
YYSTYPE_IS_DECLARED arith.h 102;" d |
YYSTYPE_IS_TRIVIAL arith.c 288;" d file: |
YYSTYPE_IS_TRIVIAL arith.h 103;" d |
YYTABLE_NINF arith.c 681;" d file: |
YYTERROR arith.c 774;" d file: |
YYTOKENTYPE arith.c 65;" d file: |
YYTOKENTYPE arith.h 38;" d |
YYTOKEN_TABLE arith.c 281;" d file: |
YYTRANSLATE arith.c 527;" d file: |
YYUNDEFTOK arith.c 524;" d file: |
YYUSE arith.c 360;" d file: |
YYUSE arith.c 362;" d file: |
YY_ arith.c 350;" d file: |
YY_ arith.c 354;" d file: |
YY_LOCATION_PRINT arith.c 810;" d file: |
YY_LOCATION_PRINT arith.c 815;" d file: |
YY_REDUCE_PRINT arith.c 972;" d file: |
YY_REDUCE_PRINT arith.c 985;" d file: |
YY_STACK_PRINT arith.c 934;" d file: |
YY_STACK_PRINT arith.c 984;" d file: |
YY_SYMBOL_PRINT arith.c 842;" d file: |
YY_SYMBOL_PRINT arith.c 983;" d file: |
_STDLIB_H arith.c 404;" d file: |
_STDLIB_H arith.c 432;" d file: |
_rmescapes expand.c /^_rmescapes(str, flag)$/;" f |
action error.c /^ short action; \/* operation which encountered the error *\/$/;" m struct:errname file: |
add mksyntax.c /^add(p, type)$/;" f file: |
addchar mkinit.c /^addchar(c, text)$/;" f |
addcmd setmode.c /^addcmd(set, op, who, oparg, mask)$/;" f file: |
addcmdentry exec.c /^addcmdentry(name, entry)$/;" f |
addfname expand.c /^addfname(name)$/;" f |
addglob expand.c /^addglob(pglob)$/;" f |
addstr mkinit.c /^addstr(s, text)$/;" f |
aexpr bltin/test.c /^aexpr(n)$/;" f file: |
aflag options.h 63;" d |
alias alias.h /^struct alias {$/;" s |
aliascmd alias.c /^aliascmd(argc, argv)$/;" f |
align machdep.h /^union align {$/;" u |
alloca arith.c 397;" d file: |
amiddecls mkinit.c /^int amiddecls; \/* for formatting *\/$/;" v |
andor parser.c /^andor() {$/;" f |
ap input.c /^ struct alias *ap; \/* if push was associated with an alias *\/$/;" m struct:strpush file: |
arg0 options.c /^char *arg0; \/* value of $0 *\/$/;" v |
argbackq expand.c /^struct nodelist *argbackq; \/* list of back quote expressions *\/$/;" v |
arglist expand.h /^struct arglist {$/;" s |
argptr options.c /^char **argptr; \/* argument list for builtin commands *\/$/;" v |
argstr expand.c /^argstr(p, flag)$/;" f |
arith arith.c /^arith(s)$/;" f |
arith_buf arith.c /^const char *arith_buf, *arith_startbuf;$/;" v |
arith_startbuf arith.c /^const char *arith_buf, *arith_startbuf;$/;" v |
atab alias.c /^struct alias *atab[ATABSIZE];$/;" v |
attyset var.h 110;" d |
backcmd eval.h /^struct backcmd { \/* result of evalbackcmd *\/$/;" s |
backgndpid jobs.c /^MKINIT short backgndpid = -1; \/* pid of last background process *\/$/;" v |
backquotelist parser.c /^struct nodelist *backquotelist;$/;" v |
base mksyntax.c /^static int base;$/;" v file: |
basebuf input.c /^char basebuf[BUFSIZ]; \/* buffer for top level input file *\/$/;" v |
basepf input.c /^MKINIT struct parsefile basepf; \/* top level input file *\/$/;" v |
basestrpush input.c /^ struct strpush basestrpush; \/* so pushing one is fast *\/$/;" m struct:parsefile file: |
bash_group_member bltin/test.c /^bash_group_member (gid)$/;" f file: |
begoff expand.c /^ int begoff; \/* offset of start of region *\/$/;" m struct:ifsregion file: |
bflag options.h 64;" d |
bgcmd jobs.c /^bgcmd(argc, argv)$/;" f |
binop bltin/test.c /^binop()$/;" f file: |
bitcmd setmode.c /^typedef struct bitcmd {$/;" s file: |
bits setmode.c /^ mode_t bits;$/;" m struct:bitcmd file: |
block mkinit.c /^struct block {$/;" s file: |
bltincmd eval.c /^bltincmd(argc, argv)$/;" f |
bltinlookup var.c /^bltinlookup(name, doall)$/;" f |
breakcmd eval.c /^breakcmd(argc, argv)$/;" f |
buf eval.h /^ char *buf; \/* buffer *\/$/;" m struct:backcmd |
buf input.c /^ char *buf; \/* input buffer *\/$/;" m struct:parsefile file: |
buf output.h /^ char *buf;$/;" m struct:output |
bufsize output.h /^ int bufsize;$/;" m struct:output |
builtinloc exec.c /^STATIC int builtinloc = -1; \/* index in path of %builtin, or -1 *\/$/;" v |
casematch expand.c /^casematch(pattern, val)$/;" f |
cdcmd cd.c /^cdcmd(argc, argv)$/;" f |
cdcomppath cd.c /^STATIC char *cdcomppath;$/;" v |
cfile mksyntax.c /^static FILE *cfile;$/;" v file: |
changed jobs.h /^ char changed; \/* true if status has changed *\/$/;" m struct:job |
changepath exec.c /^changepath(newval)$/;" f |
checkkwd parser.c /^MKINIT int checkkwd; \/* 1 == check for kwds, 2 == also eat newlines *\/$/;" v |
chkmail mail.c /^chkmail(silent)$/;" f |
ckfopen mkinit.c /^ckfopen(file, mode)$/;" f |
ckfree memalloc.h 81;" d |
ckmalloc memalloc.c /^ckmalloc(nbytes)$/;" f |
ckmalloc mkinit.c /^ckmalloc(nbytes)$/;" f |
ckrealloc memalloc.c /^ckrealloc(p, nbytes)$/;" f |
clear_traps trap.c /^clear_traps() {$/;" f |
clearcmdentry exec.c /^clearcmdentry(firstchange)$/;" f |
clearredir redir.c /^clearredir() {$/;" f |
closememout output.c /^closememout() {$/;" f |
closescript input.c /^closescript() {$/;" f |
cmd jobs.h /^ char *cmd; \/* text of command being run *\/$/;" m struct:procstat |
cmd miscbltin.c /^ int cmd;$/;" m struct:limits file: |
cmd setmode.c /^ char cmd;$/;" m struct:bitcmd file: |
cmd2 setmode.c /^ char cmd2;$/;" m struct:bitcmd file: |
cmdentry exec.h /^struct cmdentry {$/;" s |
cmdenviron eval.c /^struct strlist *cmdenviron;$/;" v |
cmdlookup exec.c /^cmdlookup(name, add)$/;" f |
cmdloop main.c /^cmdloop(top)$/;" f |
cmdname exec.c /^ char cmdname[ARB]; \/* name of command *\/$/;" m struct:tblentry file: |
cmdnextc jobs.c /^STATIC char *cmdnextc;$/;" v |
cmdnleft jobs.c /^STATIC int cmdnleft;$/;" v |
cmdputs jobs.c /^cmdputs(s)$/;" f |
cmdtable exec.c /^STATIC struct tblentry *cmdtable[CMDTABLESIZE];$/;" v |
cmdtxt jobs.c /^cmdtxt(n)$/;" f |
cmdtype exec.c /^ short cmdtype; \/* index identifying command *\/$/;" m struct:tblentry file: |
cmdtype exec.h /^ int cmdtype;$/;" m struct:cmdentry |
code mkinit.c /^ struct text code; \/* code for handling event *\/$/;" m struct:event file: |
command parser.c /^command() {$/;" f |
commandcmd exec.c /^commandcmd(argc, argv)$/;" f |
commandname error.c /^char *commandname;$/;" v |
commandname eval.c /^char *commandname;$/;" v |
commandtext jobs.c /^commandtext(n)$/;" f |
comment mkinit.c /^ char *comment; \/* comment describing routine *\/$/;" m struct:event file: |
comment mksyntax.c /^ char *comment;$/;" m struct:synclass file: |
compress_mode setmode.c /^compress_mode(set)$/;" f file: |
copyfd redir.c /^copyfd(from, to)$/;" f |
copyright mkinit.c /^static const char copyright[] =$/;" v file: |
copyright mknodes.c /^static const char copyright[] =$/;" v file: |
copyright mksyntax.c /^static const char copyright[] =$/;" v file: |
cp machdep.h /^ char *cp;$/;" m union:align |
curcmd main.c /^STATIC union node *curcmd;$/;" v |
curdir cd.c /^char *curdir = NULL; \/* current working directory *\/$/;" v |
curfile mkinit.c /^char *curfile; \/* current file *\/$/;" v |
curjob jobs.c /^short curjob; \/* current job *\/$/;" v |
curstr mknodes.c /^static struct str *curstr; \/* current structure *\/$/;" v file: |
cvtnum expand.c /^cvtnum(num, buf)$/;" f |
debug show.c /^int debug = 0;$/;" v |
debug show.c /^int debug = 1;$/;" v |
decl mknodes.c /^ char *decl; \/* declaration of field *\/$/;" m struct:field file: |
decls mkinit.c /^struct text decls; \/* declarations *\/$/;" v |
decode_signal trap.c /^int decode_signal(const char *string)$/;" f |
defines mkinit.c /^struct text defines; \/* #define statements *\/$/;" v |
defun exec.c /^defun(name, func)$/;" f |
delete_cmd_entry exec.c /^delete_cmd_entry() {$/;" f |
deletefuncs exec.c /^deletefuncs() {$/;" f |
describe_command exec.c /^describe_command(command, verbose)$/;" f |
digit output.c /^static const char digit[] = "0123456789ABCDEF";$/;" v file: |
digit_contig mksyntax.c /^static int digit_contig;\/* true if digits are contiguous *\/$/;" v file: |
digit_convert mksyntax.c /^digit_convert()$/;" f file: |
displayhist histedit.c /^int displayhist;$/;" v |
docd cd.c /^docd(dest, print)$/;" f |
dodecl mkinit.c /^dodecl(line1, fp)$/;" f |
doevent mkinit.c /^doevent(ep, fp, fname)$/;" f |
doformat output.c /^doformat(dest, f, ap)$/;" f |
doformat output.h 100;" d |
doinclude mkinit.c /^doinclude(line)$/;" f |
done mknodes.c /^ int done; \/* set if fully parsed *\/$/;" m struct:str file: |
doprompt parser.c /^int doprompt; \/* if set, prompt the user *\/$/;" v |
dotcmd main.c /^dotcmd(argc, argv)$/;" f |
dotrap trap.c /^dotrap() {$/;" f |
dowait jobs.c /^dowait(block, job)$/;" f |
dprintf output.c /^dprintf(const char *fmt, ...)$/;" f |
dumpmode setmode.c /^dumpmode(set)$/;" f file: |
dupredirect redir.c /^dupredirect(redir, f, memory)$/;" f |
editing histedit.c 87;" d file: |
eflag options.h 51;" d |
el histedit.c /^EditLine *el; \/* editline cookie *\/$/;" v |
el input.c /^EditLine *el; \/* cookie for editline package *\/$/;" v |
el_in histedit.c /^static FILE *el_in, *el_out;$/;" v file: |
el_out histedit.c /^static FILE *el_in, *el_out;$/;" v file: |
emptyoutbuf output.c /^emptyoutbuf(dest)$/;" f |
endoff expand.c /^ int endoff; \/* offset of end of region *\/$/;" m struct:ifsregion file: |
environment var.c /^environment() {$/;" f |
eofmark parser.c /^ char *eofmark; \/* string indicating end of input *\/$/;" m struct:heredoc file: |
equal mkinit.c 172;" d file: |
equal mystring.h 48;" d |
equalf bltin/test.c /^equalf (f1, f2)$/;" f file: |
errcode error.c /^ short errcode; \/* error number *\/$/;" m struct:errname file: |
errmsg error.c /^errmsg(e, action)$/;" f |
errname error.c /^struct errname {$/;" s file: |
error arith.c /^error(s)$/;" f |
error bltin/test.c /^error(const char *msg, ...)$/;" f file: |
error error.c /^error(const char *msg, ...)$/;" f |
error mkinit.c /^error(msg)$/;" f |
error mknodes.c /^error(const char *msg, ...)$/;" f file: |
errormsg error.c /^STATIC const struct errname errormsg[] = {$/;" v |
errout output.c /^struct output errout = {NULL, 0, NULL, 100, 2, 0};$/;" v |
errout output.c /^struct output errout = {NULL, NULL, 0, NULL, 0, 2, 0};$/;" v |
evalbackcmd eval.c /^evalbackcmd(n, result)$/;" f |
evalcase eval.c /^evalcase(n, flags)$/;" f |
evalcmd eval.c /^evalcmd(argc, argv)$/;" f |
evalcommand eval.c /^evalcommand(cmd, flags, backcmd)$/;" f |
evalfor eval.c /^evalfor(n, flags)$/;" f |
evalloop eval.c /^evalloop(n, flags)$/;" f |
evalpipe eval.c /^evalpipe(n)$/;" f |
evalskip eval.c /^MKINIT int evalskip; \/* set if we are skipping commands *\/$/;" v |
evalstring eval.c /^evalstring(s, flag)$/;" f |
evalsubshell eval.c /^evalsubshell(n, flags)$/;" f |
evaltree eval.c /^evaltree(n, flags)$/;" f |
evalvar expand.c /^evalvar(p, flag)$/;" f |
event mkinit.c /^struct event event[] = {$/;" v |
event mkinit.c /^struct event {$/;" s file: |
exception error.c /^int exception;$/;" v |
execcmd eval.c /^execcmd(argc, argv)$/;" f |
execinterp exec.c /^execinterp(argv, envp)$/;" f |
exerrno exec.c /^int exerrno = 0; \/* Last exec error *\/$/;" v |
exerror error.c /^exerror(int cond, const char *msg, ...)$/;" f |
exitcmd main.c /^exitcmd(argc, argv)$/;" f |
exitshell trap.c /^exitshell(status)$/;" f |
exitstatus eval.c /^int exitstatus; \/* exit status of last command *\/$/;" v |
exp arith.y /^exp: expr {$/;" l |
expandarg expand.c /^expandarg(arg, arglist, flag)$/;" f |
expandhere expand.c /^expandhere(arg, fd)$/;" f |
expandmeta expand.c /^expandmeta(str, flag)$/;" f |
exparg expand.c /^struct arglist exparg; \/* holds expanded arg list *\/$/;" v |
expari expand.c /^expari(flag)$/;" f |
expbackq expand.c /^expbackq(cmd, quoted, flag)$/;" f |
expcmd arith.c /^expcmd(argc, argv)$/;" f |
expdest expand.c /^char *expdest; \/* output of current string *\/$/;" v |
expdir expand.c /^char *expdir;$/;" v |
expmeta expand.c /^expmeta(enddir, name)$/;" f |
exportcmd var.c /^exportcmd(argc, argv)$/;" f |
expr arith.y /^expr: ARITH_LPAREN expr ARITH_RPAREN { $$ = $2; }$/;" l |
expredir eval.c /^expredir(n)$/;" f |
expsort expand.c /^expsort(str)$/;" f |
exptilde expand.c /^exptilde(p, flag)$/;" f |
exraise error.c /^exraise(e)$/;" f |
exverror error.c /^exverror(cond, msg, ap)$/;" f file: |
factor miscbltin.c /^ int factor; \/* multiply by to get rlim_{cur,max} values *\/$/;" m struct:limits file: |
falsecmd eval.c /^falsecmd(argc, argv)$/;" f |
fc_replace histedit.c /^fc_replace(s, p, r)$/;" f |
fd eval.h /^ int fd; \/* file descriptor to read from *\/$/;" m struct:backcmd |
fd input.c /^ int fd; \/* file descriptor (or -1 if string) *\/$/;" m struct:parsefile file: |
fd output.h /^ int fd;$/;" m struct:output |
fd0_redirected redir.c /^int fd0_redirected = 0;$/;" v |
fd0_redirected_p redir.c /^fd0_redirected_p () {$/;" f |
fd2 redir.c /^int fd2 = 2;$/;" v |
fflag options.h 52;" d |
fflush bltin/bltin.h 60;" d |
fgcmd jobs.c /^fgcmd(argc, argv)$/;" f |
field mknodes.c /^ struct field field[MAXFIELDS]; \/* the fields of the structure *\/$/;" m struct:str file: |
field mknodes.c /^struct field { \/* a structure field *\/$/;" s file: |
filltable mksyntax.c /^filltable(dftval)$/;" f file: |
filstat bltin/test.c /^filstat(nm, mode)$/;" f file: |
find_builtin exec.c /^find_builtin(name)$/;" f |
find_command exec.c /^find_command(name, entry, act, path)$/;" f |
find_dot_file main.c /^find_dot_file(basename)$/;" f |
fixredir parser.c /^void fixredir(union node *n, const char *text, int err)$/;" f |
flag alias.h /^ int flag;$/;" m struct:alias |
flags output.h /^ short flags;$/;" m struct:output |
flags var.c /^ int flags;$/;" m struct:varinit file: |
flags var.h /^ int flags; \/* flags are defined above *\/$/;" m struct:var |
flags var.h /^ int flags; \/* saved flags *\/$/;" m struct:localvar |
flushall output.c /^flushall() {$/;" f |
flushout output.c /^flushout(dest)$/;" f |
flushout output.h 99;" d |
fmtstr output.c /^fmtstr(char *outbuf, size_t length, const char *fmt, ...)$/;" f |
forkshell jobs.c /^forkshell(jp, n, mode)$/;" f |
fprintf bltin/bltin.h 58;" d |
fputs bltin/bltin.h 59;" d |
freejob jobs.c /^freejob(jp)$/;" f |
freeparam options.c /^freeparam(param)$/;" f |
freestdout output.c /^freestdout() {$/;" f |
func exec.h /^ union node *func;$/;" m union:cmdentry::param |
func var.c /^ void (*func) __P((const char *));$/;" m struct:varinit file: |
func var.h /^ void (*func) __P((const char *));$/;" m struct:var |
funcnest eval.c /^int funcnest; \/* depth of function calls *\/$/;" v |
get_standard_path eval.c /^get_standard_path()$/;" f |
getcmdentry exec.c /^getcmdentry(name, entry)$/;" f |
getcomponent cd.c /^getcomponent() {$/;" f |
getjob jobs.c /^getjob(name)$/;" f |
getmode setmode.c /^getmode(bbox, omode)$/;" f |
getn bltin/test.c /^getn(s)$/;" f file: |
getopts options.c /^getopts(optstr, optvar, optfirst, optind, optoff)$/;" f |
getoptscmd options.c /^getoptscmd(argc, argv)$/;" f |
getoptsreset options.c /^getoptsreset(value)$/;" f |
getprompt parser.c /^getprompt(void *unused)$/;" f |
getpwd cd.c /^getpwd()$/;" f |
gooddefine mkinit.c /^gooddefine(line)$/;" f |
goodname parser.c /^goodname(char *name)$/;" f |
gotsig trap.c /^char gotsig[NSIG]; \/* indicates specified signal received *\/$/;" v |
gotsigchild jobs.c /^STATIC int gotsigchild;$/;" v |
grabstackblock memalloc.c /^grabstackblock(len)$/;" f |
grabstackstr memalloc.h 79;" d |
group_array bltin/test.c /^static gid_t *group_array = NULL;$/;" v file: |
growstackblock memalloc.c /^growstackblock() {$/;" f |
growstackstr memalloc.c /^growstackstr() {$/;" f |
handler error.c /^struct jmploc *handler;$/;" v |
hashalias alias.c /^hashalias(p)$/;" f |
hashcd exec.c /^hashcd() {$/;" f |
hashcmd exec.c /^hashcmd(argc, argv)$/;" f |
hashvar var.c /^hashvar(p)$/;" f |
header_files mkinit.c /^char *header_files[200]; \/* list of header files *\/$/;" v |
here parser.c /^ union node *here; \/* redirection node *\/$/;" m struct:heredoc file: |
heredoc parser.c /^struct heredoc *heredoc;$/;" v |
heredoc parser.c /^struct heredoc {$/;" s file: |
heredoclist parser.c /^struct heredoc *heredoclist; \/* list of here documents to read *\/$/;" v |
herefd memalloc.c /^int herefd = -1;$/;" v |
hetio_init hetio.c /^void hetio_init(void)$/;" f |
hetio_inter hetio.c /^int hetio_inter = 0;$/;" v |
hetio_read_input hetio.c /^int hetio_read_input(int fd)$/;" f |
hetio_reset_term hetio.c /^void hetio_reset_term(void)$/;" f |
hfile mksyntax.c /^static FILE *hfile;$/;" v file: |
his_end hetio.c /^static struct history *his_end = NULL; \/* Last element in command line list *\/$/;" v file: |
his_front hetio.c /^static struct history *his_front = NULL; \/* First element in command line list *\/$/;" v file: |
hist histedit.c /^History *hist; \/* history cookie *\/$/;" v |
histcmd histedit.c /^histcmd(argc, argv)$/;" f |
histedit histedit.c /^histedit()$/;" f |
history hetio.c /^struct history$/;" s file: |
history_counter hetio.c /^static int history_counter = 0; \/* Number of commands in history list *\/$/;" v file: |
histsizeval var.h 105;" d |
i machdep.h /^ int i;$/;" m union:align |
iflag options.h 54;" d |
ifsbreakup expand.c /^ifsbreakup(string, arglist)$/;" f |
ifsfirst expand.c /^struct ifsregion ifsfirst; \/* first struct in list of ifs regions *\/$/;" v |
ifsfree expand.c /^ifsfree()$/;" f |
ifslastp expand.c /^struct ifsregion *ifslastp; \/* last struct in list *\/$/;" v |
ifsregion expand.c /^struct ifsregion {$/;" s file: |
ifsset var.h 97;" d |
ifsval var.h 96;" d |
ignoresig trap.c /^ignoresig(signo)$/;" f |
in_function eval.h 67;" d |
indent mknodes.c /^indent(amount, fp)$/;" f file: |
indent show.c /^indent(amount, pfx, fp)$/;" f file: |
index exec.h /^ int index;$/;" m union:cmdentry::param |
infp mknodes.c /^static FILE *infp;$/;" v file: |
init mkinit.c /^char init[] = "\\$/;" v |
init mksyntax.c /^init()$/;" f file: |
init_editline input.c /^int init_editline = 0; \/* editline library initialized? *\/$/;" v |
initialize_group_array bltin/test.c /^initialize_group_array ()$/;" f file: |
initialize_signames mksignames.c /^initialize_signames ()$/;" f |
initialpgrp jobs.c /^int initialpgrp; \/* pgrp of shell on invocation *\/$/;" v |
initstreams output.c /^void initstreams() {$/;" f |
initvar var.c /^initvar() {$/;" f |
input_backspace hetio.c /^input_backspace(int *cursor, int *len)$/;" f |
input_delete hetio.c /^void input_delete(int cursor)$/;" f |
input_end hetio.c /^void input_end(int *cursor, int len)$/;" f |
input_home hetio.c /^void input_home(int *cursor) \/* Command line input routines *\/$/;" f |
int_pending error.h 91;" d |
intpending error.c /^volatile int intpending;$/;" v |
intreceived jobs.c /^STATIC int intreceived;$/;" v |
is_assignment_builtin eval.c /^is_assignment_builtin (command)$/;" f |
is_entry mksyntax.c /^struct synclass is_entry[] = {$/;" v |
is_number mystring.c /^is_number(p)$/;" f |
is_regular_builtin exec.c /^is_regular_builtin(name)$/;" f |
is_special_builtin eval.c /^is_special_builtin(name)$/;" f |
isoperand bltin/test.c /^isoperand()$/;" f file: |
jmploc error.h /^struct jmploc {$/;" s |
job jobs.h /^struct job {$/;" s |
job_warning jobs.c /^int job_warning = 0;$/;" v |
jobctl jobs.c /^MKINIT int jobctl;$/;" v |
jobctl jobs.h /^ char jobctl; \/* job running under job control *\/$/;" m struct:job |
jobidcmd jobs.c /^jobidcmd(argc, argv)$/;" f |
jobscmd jobs.c /^jobscmd(argc, argv)$/;" f |
jobtab jobs.c /^struct job *jobtab; \/* array of jobs *\/$/;" v |
jp eval.h /^ struct job *jp; \/* job structure for command *\/$/;" m struct:backcmd |
killcmd jobs.c /^killcmd(argc, argv)$/;" f |
last mkinit.c /^ struct block *last;$/;" m struct:text file: |
lastcmdentry exec.c /^struct tblentry **lastcmdentry;$/;" v |
lastp expand.h /^ struct strlist **lastp;$/;" m struct:arglist |
lasttoken parser.c /^int lasttoken; \/* last token read *\/$/;" v |
letter options.h /^ const char letter;$/;" m struct:optent |
limits miscbltin.c /^static const struct limits limits[] = {$/;" v file: |
limits miscbltin.c /^struct limits {$/;" s file: |
line mknodes.c /^static char line[1024];$/;" v file: |
linep mknodes.c /^static char *linep;$/;" v file: |
linno input.c /^ int linno; \/* current line *\/$/;" m struct:parsefile file: |
linno mkinit.c /^int linno; \/* current line *\/$/;" v |
linno mknodes.c /^static int linno;$/;" v file: |
list expand.h /^ struct strlist *list;$/;" m struct:arglist |
list parser.c /^list(nlflag)$/;" f |
listsetvar var.c /^listsetvar(list)$/;" f |
lleft input.c /^ int lleft; \/* number of chars left in this buffer *\/$/;" m struct:parsefile file: |
loc error.h /^ jmp_buf loc;$/;" m struct:jmploc |
localcmd var.c /^localcmd(argc, argv)$/;" f |
localvar var.h /^struct localvar {$/;" s |
localvars var.h /^struct localvar *localvars;$/;" v |
longjmp error.h 107;" d |
lookupalias alias.c /^lookupalias(name, check)$/;" f |
lookupvar var.c /^lookupvar(name)$/;" f |
loopnest eval.c /^MKINIT int loopnest; \/* current loop nesting level *\/$/;" v |
macro mksyntax.c /^static char *macro[] = {$/;" v file: |
mailtime mail.c /^STATIC time_t mailtime[MAXMBOXES]; \/* times of mailboxes *\/$/;" v |
mailval var.h 98;" d |
main arith.c /^main(argc, argv)$/;" f |
main bltin/bltin.h 72;" d |
main bltin/echo.c /^main(argc, argv) char **argv; {$/;" f |
main bltin/echo.c 45;" d file: |
main bltin/times.c /^int main() {$/;" f |
main bltin/times.c 12;" d file: |
main main.c /^main(argc, argv)$/;" f |
main mkinit.c /^main(argc, argv)$/;" f |
main mknodes.c /^main(argc, argv)$/;" f |
main mksignames.c /^main (argc, argv)$/;" f |
main mksyntax.c /^main(argc, argv)$/;" f |
makejob jobs.c /^makejob(node, nprocs)$/;" f |
makename parser.c /^makename() {$/;" f |
makestrspace memalloc.c /^makestrspace() {$/;" f |
malloc options.h /^ unsigned char malloc; \/* if parameter list dynamically allocated *\/$/;" m struct:shparam |
marknext memalloc.h /^ struct stackmark *marknext;$/;" m struct:stackmark |
markp memalloc.c /^struct stackmark *markp;$/;" v |
match mkinit.c /^match(name, line)$/;" f |
memout output.c /^struct output memout = {NULL, 0, NULL, 0, MEM_OUT, 0};$/;" v |
memout output.c /^struct output memout = {NULL, NULL, 0, NULL, 0, MEM_OUT, 0};$/;" v |
mflag options.h 55;" d |
minus_o options.c /^minus_o(name, val)$/;" f |
minusc options.c /^char *minusc; \/* argument to -c option *\/$/;" v |
mklocal var.c /^mklocal(name)$/;" f |
mpathset var.h 112;" d |
mpathval var.h 99;" d |
msg error.c /^ const char *msg; \/* text describing the error *\/$/;" m struct:errname file: |
msort expand.c /^msort(list, len)$/;" f |
n hetio.c /^ struct history *n;$/;" m struct:history file: |
name alias.h /^ char *name;$/;" m struct:alias |
name miscbltin.c /^ const char *name;$/;" m struct:limits file: |
name mkinit.c /^ char *name; \/* name of event (e.g. INIT) *\/$/;" m struct:event file: |
name mknodes.c /^ char *name; \/* name of field *\/$/;" m struct:field file: |
name mksyntax.c /^ char *name;$/;" m struct:synclass file: |
name options.h /^ const char *name;$/;" m struct:optent |
nbits mksyntax.c /^static int nbits; \/* number of bits in a character *\/$/;" v file: |
needprompt parser.c /^int needprompt; \/* true if interactive and at start of line *\/$/;" v |
new_term hetio.c /^static struct termios old_term, new_term; \/* Current termio and the previous termio before starting ash *\/$/;" v file: |
newerf bltin/test.c /^newerf (f1, f2)$/;" f file: |
nexpr bltin/test.c /^nexpr(n)$/;" f file: |
next alias.h /^ struct alias *next;$/;" m struct:alias |
next exec.c /^ struct tblentry *next; \/* next entry in hash chain *\/$/;" m struct:tblentry file: |
next expand.c /^ struct ifsregion *next; \/* next region in list *\/$/;" m struct:ifsregion file: |
next expand.h /^ struct strlist *next;$/;" m struct:strlist |
next mkinit.c /^ struct block *next;$/;" m struct:block file: |
next parser.c /^ struct heredoc *next; \/* next here document in list *\/$/;" m struct:heredoc file: |
next redir.c /^ struct redirtab *next;$/;" m struct:redirtab file: |
next var.h /^ struct localvar *next; \/* next local variable in list *\/$/;" m struct:localvar |
next var.h /^ struct var *next; \/* next entry in hash list *\/$/;" m struct:var |
nextc input.c /^ char *nextc; \/* next char in buffer *\/$/;" m struct:parsefile file: |
nextc mkinit.c /^ char *nextc;$/;" m struct:text file: |
nextc output.h /^ char *nextc;$/;" m struct:output |
nextfield mknodes.c /^nextfield(buf)$/;" f file: |
nextopt options.c /^nextopt(optstring)$/;" f |
nfields mknodes.c /^ int nfields; \/* number of fields in the structure *\/$/;" m struct:str file: |
nflag options.h 56;" d |
ngroups bltin/test.c /^static int ngroups;$/;" v file: |
njobs jobs.c /^int njobs; \/* size of array *\/$/;" v |
nleft eval.h /^ int nleft; \/* number of chars in buffer *\/$/;" m struct:backcmd |
nleft input.c /^ int nleft; \/* number of chars left in this line *\/$/;" m struct:parsefile file: |
nleft mkinit.c /^ int nleft;$/;" m struct:text file: |
nleft output.h /^ int nleft;$/;" m struct:output |
nmboxes mail.c /^STATIC int nmboxes; \/* number of mailboxes *\/$/;" v |
noclobberopen redir.c /^noclobberopen(fname)$/;" f |
nodename mknodes.c /^static char *nodename[MAXTYPES]; \/* names of the nodes *\/$/;" v file: |
nodestr mknodes.c /^static struct str *nodestr[MAXTYPES]; \/* type of structure used by the node *\/$/;" v file: |
noexpand parser.c /^noexpand(text)$/;" f |
not_fcnumber histedit.c /^not_fcnumber(s)$/;" f |
nparam options.h /^ int nparam; \/* # of positional parameters (without $0) *\/$/;" m struct:shparam |
nprocs jobs.h /^ short nprocs; \/* number of processes *\/$/;" m struct:job |
nstr mknodes.c /^static int nstr; \/* number of structures *\/$/;" v file: |
ntypes mknodes.c /^static int ntypes; \/* number of node types *\/$/;" v file: |
nullstr mystring.c /^char nullstr[1]; \/* zero length string *\/$/;" v |
nulonly expand.c /^ int nulonly; \/* search for nul bytes only *\/$/;" m struct:ifsregion file: |
number mystring.c /^number(s)$/;" f |
oexitstatus eval.c /^int oexitstatus; \/* saved exit status *\/$/;" v |
oexpr bltin/test.c /^oexpr(n)$/;" f file: |
old_term hetio.c /^static struct termios old_term, new_term; \/* Current termio and the previous termio before starting ash *\/$/;" v file: |
olderf bltin/test.c /^olderf (f1, f2)$/;" f file: |
onint error.c /^onint() {$/;" f |
onsig trap.c /^onsig(signo)$/;" f |
onsigchild jobs.c /^STATIC int onsigchild() {$/;" f |
op_num bltin/test.c /^ short op_num, op_type;$/;" m struct:t_op file: |
op_text bltin/test.c /^ const char *op_text;$/;" m struct:t_op file: |
op_type bltin/test.c /^ short op_num, op_type;$/;" m struct:t_op file: |
open_mem output.c /^open_mem(block, length, file)$/;" f |
openhere redir.c /^openhere(redir)$/;" f |
openmemout output.c /^openmemout() {$/;" f |
openredirect redir.c /^openredirect(redir)$/;" f |
opentrace show.c /^opentrace() {$/;" f |
ops bltin/test.c /^} const ops [] = {$/;" v file: |
optarg options.c /^char *optarg; \/* set by nextopt (like getopt) *\/$/;" v |
optent options.h /^struct optent {$/;" s |
optind options.h /^ int optind; \/* next parameter to be processed by getopts *\/$/;" m struct:shparam |
optindval var.h 103;" d |
option miscbltin.c /^ char option;$/;" m struct:limits file: |
options options.c /^options(cmdline)$/;" f |
optlist options.h /^struct optent optlist[NOPTS] = {$/;" v |
optoff options.h /^ int optoff; \/* used by getopts *\/$/;" m struct:shparam |
optptr options.c /^char *optptr; \/* used by nextopt *\/$/;" v |
optschanged options.c /^optschanged()$/;" f |
out1 output.c /^struct output *out1 = &output;$/;" v |
out1c output.h 104;" d |
out1fmt output.c /^out1fmt(const char *fmt, ...)$/;" f |
out1str output.h 106;" d |
out2 output.c /^struct output *out2 = &errout;$/;" v |
out2c output.h 105;" d |
out2str output.h 107;" d |
out_junk output.c /^char out_junk[16];$/;" v |
outc output.h 102;" d |
outc output.h 98;" d |
outfmt output.c /^outfmt(struct output *file, const char *fmt, ...)$/;" f |
outfunc mknodes.c /^outfunc(cfile, calcsize)$/;" f file: |
output mkinit.c /^output() {$/;" f |
output mknodes.c /^output(file)$/;" f file: |
output output.c /^struct output output = {NULL, 0, NULL, OUTBUFSIZ, 1, 0};$/;" v |
output output.c /^struct output output = {NULL, NULL, 0, NULL, 0, 1, 0};$/;" v |
output output.h /^struct output {$/;" s |
output_type_macros mksyntax.c /^output_type_macros()$/;" f file: |
outsizes mknodes.c /^outsizes(cfile)$/;" f file: |
outstr output.c /^outstr(p, file)$/;" f |
p hetio.c /^ struct history *p;$/;" m struct:history file: |
p options.h /^ char **p; \/* parameter list *\/$/;" m struct:shparam |
padvance exec.c /^padvance(path, name)$/;" f |
param exec.c /^ union param param; \/* definition of builtin function *\/$/;" m struct:tblentry file: |
param exec.h /^ union param {$/;" u struct:cmdentry |
parsebackquote parser.c /^int parsebackquote; \/* nonzero if we are inside backquotes *\/$/;" v |
parsecmd parser.c /^parsecmd(int interact)$/;" f |
parsefield mknodes.c /^parsefield()$/;" f file: |
parsefile input.c /^struct parsefile *parsefile = &basepf; \/* current input file *\/$/;" v |
parsefile input.c /^struct parsefile {$/;" s file: |
parsefname parser.c /^parsefname() {$/;" f |
parseheredoc parser.c /^parseheredoc() {$/;" f |
parselleft input.c /^MKINIT int parselleft; \/* copy of parsefile->lleft *\/$/;" v |
parsenextc input.c /^char *parsenextc; \/* copy of parsefile->nextc *\/$/;" v |
parsenleft input.c /^MKINIT int parsenleft; \/* copy of parsefile->nleft *\/$/;" v |
parsenode mknodes.c /^parsenode()$/;" f file: |
path_change exec.c /^path_change(newval, bltin)$/;" f |
pathopt exec.c /^const char *pathopt;$/;" v |
pathval var.h 100;" d |
patmatch expand.c /^patmatch(pattern, string, squoted)$/;" f |
patmatch2 expand.c /^patmatch2(pattern, string, squoted)$/;" f |
patmatch2 expand.c 131;" d file: |
peektoken parser.c /^peektoken() {$/;" f |
pendingsigs trap.c /^int pendingsigs; \/* indicates some signal received *\/$/;" v |
pfgets input.c /^pfgets(line, len)$/;" f |
pgetc input.c /^pgetc()$/;" f |
pgetc_macro input.h 66;" d |
pgrp jobs.h /^ short pgrp; \/* process group of this job *\/$/;" m struct:job |
pid jobs.h /^ pid_t pid; \/* process id *\/$/;" m struct:procstat |
pipeline parser.c /^pipeline() {$/;" f |
plinno input.c /^int plinno = 1; \/* input line number *\/$/;" v |
pmatch expand.c /^pmatch(pattern, string, squoted)$/;" f |
pointer shell.h /^typedef char *pointer;$/;" t |
pointer shell.h /^typedef void *pointer;$/;" t |
popallfiles input.c /^popallfiles() {$/;" f |
popfile input.c /^popfile() {$/;" f |
poplocalvars var.c /^poplocalvars() {$/;" f |
popredir redir.c /^popredir() {$/;" f |
popstackmark memalloc.c /^popstackmark(mark)$/;" f |
popstring input.c /^popstring()$/;" f |
preadbuffer input.c /^preadbuffer()$/;" f |
preadfd input.c /^preadfd()$/;" f file: |
prefix mystring.c /^prefix(pfx, string)$/;" f |
preglob expand.c /^preglob(str)$/;" f |
prehash eval.c /^prehash(n)$/;" f |
prev input.c /^ struct parsefile *prev; \/* preceding file on stack *\/$/;" m struct:parsefile file: |
prev input.c /^ struct strpush *prev; \/* preceding string on stack *\/$/;" m struct:strpush file: |
prev memalloc.c /^ struct stack_block *prev;$/;" m struct:stack_block file: |
prevcmd main.c /^STATIC union node *prevcmd;$/;" v |
prevdir cd.c /^char *prevdir; \/* previous working directory *\/$/;" v |
prevlleft input.c /^ int prevlleft;$/;" m struct:strpush file: |
prevnleft input.c /^ int prevnleft;$/;" m struct:strpush file: |
prevstring input.c /^ char *prevstring;$/;" m struct:strpush file: |
primary bltin/test.c /^primary(n)$/;" f file: |
print mksyntax.c /^print(name)$/;" f file: |
printentry exec.c /^printentry(cmdp, verbose)$/;" f |
printf bltin/bltin.h 55;" d |
procargs options.c /^procargs(argc, argv)$/;" f |
procstat jobs.h /^struct procstat {$/;" s |
profile_buf main.c /^short profile_buf[16384];$/;" v |
progname mksignames.c /^char *progname;$/;" v |
ps jobs.h /^ struct procstat *ps; \/* status or processes when more than one *\/$/;" m struct:job |
ps0 jobs.h /^ struct procstat ps0; \/* status of process *\/$/;" m struct:job |
ps1val var.h 101;" d |
ps2val var.h 102;" d |
pungetc input.c /^pungetc() {$/;" f |
pushfile input.c /^pushfile() {$/;" f |
pushstring input.c /^pushstring(s, len, ap)$/;" f |
putc bltin/bltin.h 56;" d |
putchar bltin/bltin.h 57;" d |
pwdcmd cd.c /^pwdcmd(argc, argv)$/;" f |
qflag options.h 66;" d |
quoteflag parser.c /^int quoteflag; \/* set if (part of) last token was quoted *\/$/;" v |
rcsid mkinit.c /^static const char rcsid[] =$/;" v file: |
rcsid mknodes.c /^static const char rcsid[] =$/;" v file: |
rcsid mksyntax.c /^static const char rcsid[] =$/;" v file: |
read_profile main.c /^read_profile(name)$/;" f |
readcmd miscbltin.c /^readcmd(argc, argv)$/;" f |
readcmdfile main.c /^readcmdfile(name)$/;" f |
readfile mkinit.c /^readfile(fname)$/;" f |
readline mknodes.c /^readline()$/;" f file: |
readtoken parser.c /^readtoken() {$/;" f |
readtoken1 parser.c /^readtoken1(firstc, syntax, eofmark, striptabs)$/;" f |
recordregion expand.c /^recordregion(start, end, nulonly)$/;" f |
redirect redir.c /^redirect(redir, flags)$/;" f |
redirlist redir.c /^MKINIT struct redirtab *redirlist;$/;" v |
redirnode parser.c /^union node *redirnode;$/;" v |
redirtab redir.c /^struct redirtab {$/;" s file: |
rehash exec.c /^ char rehash; \/* if set, cd done since entry created *\/$/;" m struct:tblentry file: |
removerecordregions expand.c /^removerecordregions(endoff)$/;" f |
renamed redir.c /^ short renamed[10];$/;" m struct:redirtab file: |
reset mkinit.c /^char reset[] = "\\$/;" v |
reset_term hetio.c /^static int reset_term = 0; \/* Set to true if the terminal needs to be reset upon exit *\/$/;" v file: |
restartjob jobs.c /^restartjob(jp)$/;" f |
returncmd eval.c /^returncmd(argc, argv)$/;" f |
rflag miscbltin.c 71;" d file: |
rlim_t miscbltin.c /^typedef enum __rlimit_resource rlim_t;$/;" t file: |
rmaliases alias.c /^rmaliases() {$/;" f |
rmescapes expand.c /^rmescapes(str)$/;" f |
rootpid main.c /^int rootpid;$/;" v |
rootshell main.c /^int rootshell;$/;" v |
routine mkinit.c /^ char *routine; \/* name of routine called on event *\/$/;" m struct:event file: |
s hetio.c /^ char *s;$/;" m struct:history file: |
savestr memalloc.c /^savestr(s)$/;" f |
savestr mkinit.c /^savestr(s)$/;" f |
savestr mknodes.c /^savestr(s)$/;" f file: |
sccsid arith.c /^static char sccsid[] = "@(#)arith.y 8.3 (Berkeley) 5\/4\/95";$/;" v file: |
scopy mystring.h 49;" d |
scopyn mystring.c /^scopyn(from, to, size)$/;" f |
setIO hetio.c /^void setIO(struct termios *new, struct termios *old) \/* Set terminal IO to canonical mode, and save old term settings. *\/$/;" f |
setalias alias.c /^setalias(name, val)$/;" f |
setcmd options.c /^setcmd(argc, argv)$/;" f |
sethistsize histedit.c /^sethistsize(hs)$/;" f |
setinputfd input.c /^setinputfd(fd, push)$/;" f |
setinputfile input.c /^setinputfile(fname, push)$/;" f |
setinputstring input.c /^setinputstring(string, push)$/;" f |
setinteractive trap.c /^setinteractive(on)$/;" f |
setjmp error.h 106;" d |
setjobctl jobs.c /^setjobctl(on)$/;" f |
setjobctl jobs.h 97;" d |
setmode setmode.c /^setmode(p)$/;" f |
setoption options.c /^setoption(flag, val)$/;" f |
setparam options.c /^setparam(argv)$/;" f |
setprompt parser.c /^setprompt(which)$/;" f |
setsignal trap.c /^setsignal(signo)$/;" f |
setstackmark memalloc.c /^setstackmark(mark)$/;" f |
setterm histedit.c /^setterm(term)$/;" f |
setvar var.c /^setvar(name, val, flags)$/;" f |
setvarcmd var.c /^setvarcmd(argc, argv)$/;" f |
setvareq var.c /^setvareq(s, flags)$/;" f |
setvarsafe var.c /^setvarsafe(name, val, flags)$/;" f |
sflag options.h 57;" d |
sharg show.c /^sharg(arg, fp)$/;" f file: |
shcmd show.c /^shcmd(cmd, fp)$/;" f file: |
shellexec exec.c /^shellexec(argv, envp, path, idx)$/;" f |
shellparam options.c /^struct shparam shellparam; \/* current positional parameters *\/$/;" v |
shellproc mkinit.c /^char shellproc[] = "\\$/;" v |
shiftcmd options.c /^shiftcmd(argc, argv)$/;" f |
short arith.c 300;" d file: |
showjobs jobs.c /^showjobs(change)$/;" f |
showtree show.c /^showtree(n)$/;" f |
showvarscmd var.c /^showvarscmd(argc, argv)$/;" f |
shparam options.h /^struct shparam {$/;" s |
shprocvar var.c /^shprocvar() {$/;" f |
shtree show.c /^shtree(n, ind, pfx, fp)$/;" f file: |
sigmode trap.c /^MKINIT char sigmode[NSIG]; \/* current value of signal *\/$/;" v |
signal_names mksignames.c /^char *signal_names[2 * NSIG];$/;" v |
simplecmd parser.c /^simplecmd(rpp, redir)$/;" f |
size mksyntax.c /^static int size; \/* number of values which a char variable can have *\/$/;" v file: |
skipbl mknodes.c /^skipbl()$/;" f file: |
skipcount eval.c /^STATIC int skipcount; \/* number of levels to skip *\/$/;" v |
space memalloc.c /^ char space[MINSIZE];$/;" m struct:stack_block file: |
sstrnleft memalloc.c /^int sstrnleft;$/;" v |
stack_block memalloc.c /^struct stack_block {$/;" s file: |
stackbase memalloc.c /^struct stack_block stackbase;$/;" v |
stackblock memalloc.h 69;" d |
stackblocksize memalloc.h 70;" d |
stackmark memalloc.h /^struct stackmark {$/;" s |
stacknleft memalloc.c /^int stacknleft = MINSIZE;$/;" v |
stacknleft memalloc.h /^ int stacknleft;$/;" m struct:stackmark |
stacknxt memalloc.c /^char *stacknxt = stackbase.space;$/;" v |
stacknxt memalloc.h /^ char *stacknxt;$/;" m struct:stackmark |
stackp memalloc.c /^struct stack_block *stackp = &stackbase;$/;" v |
stackp memalloc.h /^ struct stack_block *stackp;$/;" m struct:stackmark |
stalloc memalloc.c /^stalloc(nbytes)$/;" f |
start mkinit.c /^ struct block *start;$/;" m struct:text file: |
startlinno parser.c /^int startlinno; \/* line # where last token started *\/$/;" v |
state jobs.h /^ char state; \/* true if job is finished *\/$/;" m struct:job |
status jobs.h /^ int status; \/* status flags (defined above) *\/$/;" m struct:procstat |
stderr bltin/bltin.h 54;" d |
stdout bltin/bltin.h 53;" d |
stoppedjobs jobs.c /^stoppedjobs()$/;" f |
str mknodes.c /^static struct str str[MAXTYPES]; \/* the structures *\/$/;" v file: |
str mknodes.c /^struct str { \/* struct representing a node structure *\/$/;" s file: |
str_to_event histedit.c /^str_to_event(str, last)$/;" f |
stream output.h /^ FILE *stream;$/;" m struct:output |
striptabs parser.c /^ int striptabs; \/* if set, strip leading tabs *\/$/;" m struct:heredoc file: |
strlist expand.h /^struct strlist {$/;" s |
strpush input.c /^ struct strpush *strpush; \/* for pushing strings at this level *\/$/;" m struct:parsefile file: |
strpush input.c /^struct strpush {$/;" s file: |
strtodest expand.c /^strtodest(p, quoted, allow_split)$/;" f |
stunalloc memalloc.c /^stunalloc(p)$/;" f |
subevalvar expand.c /^subevalvar(p, str, strloc, subtype, startloc, varflags)$/;" f |
suppressint error.c /^volatile int suppressint;$/;" v |
synclass mksyntax.c /^struct synclass synclass[] = {$/;" v |
synclass mksyntax.c /^struct synclass {$/;" s file: |
synerror parser.c /^synerror(msg)$/;" f |
synexpect parser.c /^synexpect(token)$/;" f |
syntax bltin/test.c /^syntax(op, msg)$/;" f file: |
syntax mksyntax.c /^static char *syntax[513];$/;" v file: |
t_lex bltin/test.c /^t_lex(s)$/;" f file: |
t_op bltin/test.c /^static struct t_op {$/;" s file: |
t_wp bltin/test.c /^static char **t_wp;$/;" v file: |
t_wp_op bltin/test.c /^static struct t_op const *t_wp_op;$/;" v file: |
tag mknodes.c /^ char *tag; \/* structure tag *\/$/;" m struct:str file: |
tblentry exec.c /^struct tblentry {$/;" s file: |
termval var.h 106;" d |
test_eaccess bltin/test.c /^test_eaccess (path, mode)$/;" f file: |
testcmd bltin/test.c /^testcmd(argc, argv)$/;" f |
text expand.h /^ char *text;$/;" m struct:strlist |
text mkinit.c /^ char text[BLOCKSIZE];$/;" m struct:block file: |
text mkinit.c /^struct text {$/;" s file: |
text var.c /^ const char *text;$/;" m struct:varinit file: |
text var.h /^ char *text; \/* name=value *\/$/;" m struct:var |
text var.h /^ char *text; \/* saved text *\/$/;" m struct:localvar |
token bltin/test.c /^enum token {$/;" g file: |
token_types bltin/test.c /^enum token_types {$/;" g file: |
tokpushback parser.c /^MKINIT int tokpushback; \/* last token pushed back *\/$/;" v |
trace show.c /^trace(const char *fmt, ...)$/;" f |
tracefile show.c /^FILE *tracefile;$/;" v |
trap trap.c /^char *trap[NSIG+1]; \/* trap handler commands *\/$/;" v |
trapcmd trap.c /^trapcmd(argc, argv)$/;" f |
trargs show.c /^trargs(ap)$/;" f |
trputc show.c /^trputc(c)$/;" f |
trputs show.c /^trputs(s)$/;" f |
trstring show.c /^trstring(s)$/;" f file: |
truecmd eval.c /^truecmd(argc, argv)$/;" f |
tryexec exec.c /^tryexec(cmd, argv, envp)$/;" f |
type mknodes.c /^ int type; \/* type of field *\/$/;" m struct:field file: |
typecmd exec.c /^typecmd(argc, argv)$/;" f |
u exec.h /^ } u;$/;" m struct:cmdentry |
uflag options.h 65;" d |
ulimitcmd miscbltin.c /^ulimitcmd(argc, argv)$/;" f |
umaskcmd miscbltin.c /^umaskcmd(argc, argv)$/;" f |
unalias alias.c /^unalias(name)$/;" f |
unaliascmd alias.c /^unaliascmd(argc, argv)$/;" f |
ungrabstackstr memalloc.c /^ungrabstackstr(s, p)$/;" f |
unsetcmd var.c /^unsetcmd(argc, argv)$/;" f |
unsetfunc exec.c /^unsetfunc(name)$/;" f |
unsetvar var.c /^unsetvar(s)$/;" f |
updatepwd cd.c /^updatepwd(dir)$/;" f |
used jobs.h /^ char used; \/* true if this entry is in used *\/$/;" m struct:job |
val alias.h /^ char *val;$/;" m struct:alias |
val options.h /^ char val;$/;" m struct:optent |
var var.c /^ struct var *var;$/;" m struct:varinit file: |
var var.h /^struct var {$/;" s |
varequal var.c /^varequal(p, q)$/;" f |
varinit var.c /^const struct varinit varinit[] = {$/;" v |
varinit var.c /^struct varinit {$/;" s file: |
varisset expand.c /^varisset(name, nulok)$/;" f |
vartab var.c /^struct var *vartab[VTABSIZE];$/;" v |
varvalue expand.c /^varvalue(name, quoted, allow_split)$/;" f |
vatty var.c /^struct var vatty;$/;" v |
vflag options.h 59;" d |
vhistsize var.c /^struct var vhistsize;$/;" v |
vifs var.c /^struct var vifs;$/;" v |
vmail var.c /^struct var vmail;$/;" v |
vmpath var.c /^struct var vmpath;$/;" v |
voptind var.c /^struct var voptind;$/;" v |
vp var.h /^ struct var *vp; \/* the variable that was made local *\/$/;" m struct:localvar |
vpath var.c /^struct var vpath;$/;" v |
vps1 var.c /^struct var vps1;$/;" v |
vps2 var.c /^struct var vps2;$/;" v |
vterm var.c /^struct var vterm;$/;" v |
vvers var.c /^struct var vvers;$/;" v |
waitcmd jobs.c /^waitcmd(argc, argv)$/;" f |
waitforjob jobs.c /^waitforjob(jp)$/;" f |
waitonint jobs.c /^STATIC void waitonint(int sig) {$/;" f |
waitproc jobs.c /^waitproc(block, status)$/;" f |
warnx bltin/bltin.h 61;" d |
whichprompt input.c /^int whichprompt; \/* 1 == PS1, 2 == PS2 *\/$/;" v |
wordtext parser.c /^char *wordtext; \/* text of last word returned by readtoken *\/$/;" v |
write_signames mksignames.c /^write_signames (stream)$/;" f |
writer mkinit.c /^char writer[] = "\\$/;" v |
writer mknodes.c /^char writer[] = "\\$/;" v |
writer mksyntax.c /^static char writer[] = "\\$/;" v file: |
writetext mkinit.c /^writetext(text, fp)$/;" f |
xflag options.h 58;" d |
xioctl output.c /^xioctl(fd, request, arg)$/;" f |
xwrite output.c /^xwrite(fd, buf, nbytes)$/;" f |
xxreadtoken parser.c /^xxreadtoken() {$/;" f |
yy_reduce_print arith.c /^yy_reduce_print (yyvsp, yyrule)$/;" f file: |
yy_stack_print arith.c /^yy_stack_print (bottom, top)$/;" f file: |
yy_symbol_print arith.c /^yy_symbol_print (yyoutput, yytype, yyvaluep)$/;" f file: |
yy_symbol_value_print arith.c /^yy_symbol_value_print (yyoutput, yytype, yyvaluep)$/;" f file: |
yyalloc arith.c /^union yyalloc$/;" u file: |
yychar arith.c /^int yychar;$/;" v |
yycheck arith.c /^static const yytype_int8 yycheck[] =$/;" v file: |
yyclearin arith.c 739;" d file: |
yydebug arith.c /^int yydebug;$/;" v |
yydefact arith.c /^static const yytype_uint8 yydefact[] =$/;" v file: |
yydefgoto arith.c /^static const yytype_int8 yydefgoto[] =$/;" v file: |
yydestruct arith.c /^yydestruct (yymsg, yytype, yyvaluep)$/;" f file: |
yyerrok arith.c 738;" d file: |
yyerror arith.c /^yyerror(s)$/;" f |
yylval arith.c /^YYSTYPE yylval;$/;" v |
yynerrs arith.c /^int yynerrs;$/;" v |
yypact arith.c /^static const yytype_int16 yypact[] =$/;" v file: |
yypgoto arith.c /^static const yytype_int8 yypgoto[] =$/;" v file: |
yyprhs arith.c /^static const yytype_uint8 yyprhs[] =$/;" v file: |
yyr1 arith.c /^static const yytype_uint8 yyr1[] =$/;" v file: |
yyr2 arith.c /^static const yytype_uint8 yyr2[] =$/;" v file: |
yyrhs arith.c /^static const yytype_int8 yyrhs[] =$/;" v file: |
yyrline arith.c /^static const yytype_uint8 yyrline[] =$/;" v file: |
yyss arith.c /^ yytype_int16 yyss;$/;" m union:yyalloc file: |
yystos arith.c /^static const yytype_uint8 yystos[] =$/;" v file: |
yystpcpy arith.c /^yystpcpy (yydest, yysrc)$/;" f file: |
yystpcpy arith.c 1034;" d file: |
yystrlen arith.c /^yystrlen (yystr)$/;" f file: |
yystrlen arith.c 1011;" d file: |
yystype arith.c 286;" d file: |
yystype arith.h 101;" d |
yysyntax_error arith.c /^yysyntax_error (char *yyresult, int yystate, int yychar)$/;" f file: |
yytable arith.c /^static const yytype_uint8 yytable[] =$/;" v file: |
yytname arith.c /^static const char *const yytname[] =$/;" v file: |
yytnamerr arith.c /^yytnamerr (char *yyres, const char *yystr)$/;" f file: |
yytokentype arith.c /^ enum yytokentype {$/;" g file: |
yytokentype arith.h /^ enum yytokentype {$/;" g |
yytoknum arith.c /^static const yytype_uint16 yytoknum[] =$/;" v file: |
yytranslate arith.c /^static const yytype_uint8 yytranslate[] =$/;" v file: |
yytype_int16 arith.c /^typedef YYTYPE_INT16 yytype_int16;$/;" t file: |
yytype_int16 arith.c /^typedef short int yytype_int16;$/;" t file: |
yytype_int8 arith.c /^typedef YYTYPE_INT8 yytype_int8;$/;" t file: |
yytype_int8 arith.c /^typedef short int yytype_int8;$/;" t file: |
yytype_int8 arith.c /^typedef signed char yytype_int8;$/;" t file: |
yytype_uint16 arith.c /^typedef YYTYPE_UINT16 yytype_uint16;$/;" t file: |
yytype_uint16 arith.c /^typedef unsigned short int yytype_uint16;$/;" t file: |
yytype_uint8 arith.c /^typedef YYTYPE_UINT8 yytype_uint8;$/;" t file: |
yytype_uint8 arith.c /^typedef unsigned char yytype_uint8;$/;" t file: |
yyvs arith.c /^ YYSTYPE yyvs;$/;" m union:yyalloc file: |
/tags/0.3.0/uspace/app/ash/histedit.c |
---|
0,0 → 1,513 |
/* $NetBSD: histedit.c,v 1.24 2000/11/06 04:21:14 mycroft Exp $ */ |
/*- |
* Copyright (c) 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Kenneth Almquist. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
*/ |
#include <sys/cdefs.h> |
#ifndef lint |
#if 0 |
static char sccsid[] = "@(#)histedit.c 8.2 (Berkeley) 5/4/95"; |
#else |
__RCSID("$NetBSD: histedit.c,v 1.24 2000/11/06 04:21:14 mycroft Exp $"); |
#endif |
#endif /* not lint */ |
#include <sys/param.h> |
#include <paths.h> |
#include <stdio.h> |
#include <stdlib.h> |
#include <unistd.h> |
/* |
* Editline and history functions (and glue). |
*/ |
#include "shell.h" |
#include "parser.h" |
#include "var.h" |
#include "options.h" |
#include "main.h" |
#include "output.h" |
#include "mystring.h" |
#include "error.h" |
#ifndef SMALL |
#include "myhistedit.h" |
#include "eval.h" |
#include "memalloc.h" |
#define MAXHISTLOOPS 4 /* max recursions through fc */ |
#define DEFEDITOR "ed" /* default editor *should* be $EDITOR */ |
History *hist; /* history cookie */ |
EditLine *el; /* editline cookie */ |
int displayhist; |
static FILE *el_in, *el_out; |
STATIC const char *fc_replace (const char *, char *, char *); |
/* |
* Set history and editing status. Called whenever the status may |
* have changed (figures out what to do). |
*/ |
void |
histedit() |
{ |
#define editing (Eflag || Vflag) |
if (iflag) { |
if (!hist) { |
/* |
* turn history on |
*/ |
INTOFF; |
hist = history_init(); |
INTON; |
if (hist != NULL) |
sethistsize(histsizeval()); |
else |
out2str("sh: can't initialize history\n"); |
} |
if (editing && !el && isatty(0)) { /* && isatty(2) ??? */ |
/* |
* turn editing on |
*/ |
INTOFF; |
if (el_in == NULL) |
el_in = fdopen(0, "r"); |
if (el_out == NULL) |
el_out = fdopen(2, "w"); |
if (el_in == NULL || el_out == NULL) |
goto bad; |
el = el_init(arg0, el_in, el_out, el_out); |
if (el != NULL) { |
if (hist) |
el_set(el, EL_HIST, history, hist); |
el_set(el, EL_PROMPT, getprompt); |
} else { |
bad: |
out2str("sh: can't initialize editing\n"); |
} |
INTON; |
} else if (!editing && el) { |
INTOFF; |
el_end(el); |
el = NULL; |
INTON; |
} |
if (el) { |
if (Vflag) |
el_set(el, EL_EDITOR, "vi"); |
else if (Eflag) |
el_set(el, EL_EDITOR, "emacs"); |
el_source(el, NULL); |
} |
} else { |
INTOFF; |
if (el) { /* no editing if not interactive */ |
el_end(el); |
el = NULL; |
} |
if (hist) { |
history_end(hist); |
hist = NULL; |
} |
INTON; |
} |
} |
void |
sethistsize(hs) |
const char *hs; |
{ |
int histsize; |
HistEvent he; |
if (hist != NULL) { |
if (hs == NULL || *hs == '\0' || |
(histsize = atoi(hs)) < 0) |
histsize = 100; |
history(hist, &he, H_SETSIZE, histsize); |
} |
} |
void |
setterm(term) |
const char *term; |
{ |
if (el != NULL && term != NULL) |
if (el_set(el, EL_TERMINAL, term) != 0) { |
outfmt(out2, "sh: Can't set terminal type %s\n", term); |
outfmt(out2, "sh: Using dumb terminal settings.\n"); |
} |
} |
/* |
* This command is provided since POSIX decided to standardize |
* the Korn shell fc command. Oh well... |
*/ |
int |
histcmd(argc, argv) |
int argc; |
char **argv; |
{ |
int ch; |
const char *editor = NULL; |
HistEvent he; |
int lflg = 0, nflg = 0, rflg = 0, sflg = 0; |
int i, retval; |
const char *firststr, *laststr; |
int first, last, direction; |
char *pat = NULL, *repl; /* ksh "fc old=new" crap */ |
static int active = 0; |
struct jmploc jmploc; |
struct jmploc *volatile savehandler; |
char editfile[MAXPATHLEN + 1]; |
FILE *efp; |
#ifdef __GNUC__ |
/* Avoid longjmp clobbering */ |
(void) &editor; |
(void) &lflg; |
(void) &nflg; |
(void) &rflg; |
(void) &sflg; |
(void) &firststr; |
(void) &laststr; |
(void) &pat; |
(void) &repl; |
(void) &efp; |
(void) &argc; |
(void) &argv; |
#endif |
if (hist == NULL) |
error("history not active"); |
if (argc == 1) |
error("missing history argument"); |
#ifdef __GLIBC__ |
optind = 1; |
#else |
optreset = 1; optind = 1; /* initialize getopt */ |
#endif |
while (not_fcnumber(argv[optind]) && |
(ch = getopt(argc, argv, ":e:lnrs")) != -1) |
switch ((char)ch) { |
case 'e': |
editor = optarg; |
break; |
case 'l': |
lflg = 1; |
break; |
case 'n': |
nflg = 1; |
break; |
case 'r': |
rflg = 1; |
break; |
case 's': |
sflg = 1; |
break; |
case ':': |
error("option -%c expects argument", optopt); |
/* NOTREACHED */ |
case '?': |
default: |
error("unknown option: -%c", optopt); |
/* NOTREACHED */ |
} |
argc -= optind, argv += optind; |
/* |
* If executing... |
*/ |
if (lflg == 0 || editor || sflg) { |
lflg = 0; /* ignore */ |
editfile[0] = '\0'; |
/* |
* Catch interrupts to reset active counter and |
* cleanup temp files. |
*/ |
if (setjmp(jmploc.loc)) { |
active = 0; |
if (*editfile) |
unlink(editfile); |
handler = savehandler; |
longjmp(handler->loc, 1); |
} |
savehandler = handler; |
handler = &jmploc; |
if (++active > MAXHISTLOOPS) { |
active = 0; |
displayhist = 0; |
error("called recursively too many times"); |
} |
/* |
* Set editor. |
*/ |
if (sflg == 0) { |
if (editor == NULL && |
(editor = bltinlookup("FCEDIT", 1)) == NULL && |
(editor = bltinlookup("EDITOR", 1)) == NULL) |
editor = DEFEDITOR; |
if (editor[0] == '-' && editor[1] == '\0') { |
sflg = 1; /* no edit */ |
editor = NULL; |
} |
} |
} |
/* |
* If executing, parse [old=new] now |
*/ |
if (lflg == 0 && argc > 0 && |
((repl = strchr(argv[0], '=')) != NULL)) { |
pat = argv[0]; |
*repl++ = '\0'; |
argc--, argv++; |
} |
/* |
* determine [first] and [last] |
*/ |
switch (argc) { |
case 0: |
firststr = lflg ? "-16" : "-1"; |
laststr = "-1"; |
break; |
case 1: |
firststr = argv[0]; |
laststr = lflg ? "-1" : argv[0]; |
break; |
case 2: |
firststr = argv[0]; |
laststr = argv[1]; |
break; |
default: |
error("too many args"); |
/* NOTREACHED */ |
} |
/* |
* Turn into event numbers. |
*/ |
first = str_to_event(firststr, 0); |
last = str_to_event(laststr, 1); |
if (rflg) { |
i = last; |
last = first; |
first = i; |
} |
/* |
* XXX - this should not depend on the event numbers |
* always increasing. Add sequence numbers or offset |
* to the history element in next (diskbased) release. |
*/ |
direction = first < last ? H_PREV : H_NEXT; |
/* |
* If editing, grab a temp file. |
*/ |
if (editor) { |
int fd; |
INTOFF; /* easier */ |
sprintf(editfile, "%s_shXXXXXX", _PATH_TMP); |
if ((fd = mkstemp(editfile)) < 0) |
error("can't create temporary file %s", editfile); |
if ((efp = fdopen(fd, "w")) == NULL) { |
close(fd); |
error("can't allocate stdio buffer for temp"); |
} |
} |
/* |
* Loop through selected history events. If listing or executing, |
* do it now. Otherwise, put into temp file and call the editor |
* after. |
* |
* The history interface needs rethinking, as the following |
* convolutions will demonstrate. |
*/ |
history(hist, &he, H_FIRST); |
retval = history(hist, &he, H_NEXT_EVENT, first); |
for (;retval != -1; retval = history(hist, &he, direction)) { |
if (lflg) { |
if (!nflg) |
out1fmt("%5d ", he.num); |
out1str(he.str); |
} else { |
const char *s = pat ? |
fc_replace(he.str, pat, repl) : he.str; |
char *sp; |
if (sflg) { |
if (displayhist) { |
out2str(s); |
} |
evalstring(strcpy(stalloc(strlen(s) + 1), s), 0); |
free(sp); |
if (displayhist && hist) { |
/* |
* XXX what about recursive and |
* relative histnums. |
*/ |
history(hist, &he, H_ENTER, s); |
} |
} else |
fputs(s, efp); |
} |
/* |
* At end? (if we were to lose last, we'd sure be |
* messed up). |
*/ |
if (he.num == last) |
break; |
} |
if (editor) { |
char *editcmd; |
fclose(efp); |
editcmd = stalloc(strlen(editor) + strlen(editfile) + 2); |
sprintf(editcmd, "%s %s", editor, editfile); |
evalstring(editcmd, 0); /* XXX - should use no JC command */ |
INTON; |
readcmdfile(editfile); /* XXX - should read back - quick tst */ |
unlink(editfile); |
} |
if (lflg == 0 && active > 0) |
--active; |
if (displayhist) |
displayhist = 0; |
return 0; |
} |
STATIC const char * |
fc_replace(s, p, r) |
const char *s; |
char *p, *r; |
{ |
char *dest; |
int plen = strlen(p); |
STARTSTACKSTR(dest); |
while (*s) { |
if (*s == *p && strncmp(s, p, plen) == 0) { |
while (*r) |
STPUTC(*r++, dest); |
s += plen; |
*p = '\0'; /* so no more matches */ |
} else |
STPUTC(*s++, dest); |
} |
STACKSTRNUL(dest); |
dest = grabstackstr(dest); |
return (dest); |
} |
int |
not_fcnumber(s) |
char *s; |
{ |
if (s == NULL) |
return 0; |
if (*s == '-') |
s++; |
return (!is_number(s)); |
} |
int |
str_to_event(str, last) |
const char *str; |
int last; |
{ |
HistEvent he; |
const char *s = str; |
int relative = 0; |
int i, retval; |
retval = history(hist, &he, H_FIRST); |
switch (*s) { |
case '-': |
relative = 1; |
/*FALLTHROUGH*/ |
case '+': |
s++; |
} |
if (is_number(s)) { |
i = atoi(s); |
if (relative) { |
while (retval != -1 && i--) { |
retval = history(hist, &he, H_NEXT); |
} |
if (retval == -1) |
retval = history(hist, &he, H_LAST); |
} else { |
retval = history(hist, &he, H_NEXT_EVENT, i); |
if (retval == -1) { |
/* |
* the notion of first and last is |
* backwards to that of the history package |
*/ |
retval = history(hist, &he, |
last ? H_FIRST : H_LAST); |
} |
} |
if (retval == -1) |
error("history number %s not found (internal error)", |
str); |
} else { |
/* |
* pattern |
*/ |
retval = history(hist, &he, H_PREV_STR, str); |
if (retval == -1) |
error("history pattern not found: %s", str); |
} |
return (he.num); |
} |
#else |
int |
histcmd(argc, argv) |
int argc; |
char **argv; |
{ |
error("not compiled with history support"); |
/* NOTREACHED */ |
} |
#endif |
/tags/0.3.0/uspace/app/ash/show.c |
---|
0,0 → 1,447 |
/* $NetBSD: show.c,v 1.18 1999/10/08 21:10:44 pk Exp $ */ |
/*- |
* Copyright (c) 1991, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Kenneth Almquist. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
*/ |
#include <sys/cdefs.h> |
#ifndef lint |
#if 0 |
static char sccsid[] = "@(#)show.c 8.3 (Berkeley) 5/4/95"; |
#else |
__RCSID("$NetBSD: show.c,v 1.18 1999/10/08 21:10:44 pk Exp $"); |
#endif |
#endif /* not lint */ |
#include <stdio.h> |
#ifdef __STDC__ |
#include <stdarg.h> |
#else |
#include <varargs.h> |
#endif |
#include "shell.h" |
#include "parser.h" |
#include "nodes.h" |
#include "mystring.h" |
#include "show.h" |
#ifdef DEBUG |
static void shtree (union node *, int, char *, FILE*); |
static void shcmd (union node *, FILE *); |
static void sharg (union node *, FILE *); |
static void indent (int, char *, FILE *); |
static void trstring (char *); |
void |
showtree(n) |
union node *n; |
{ |
trputs("showtree called\n"); |
shtree(n, 1, NULL, stdout); |
} |
static void |
shtree(n, ind, pfx, fp) |
union node *n; |
int ind; |
char *pfx; |
FILE *fp; |
{ |
struct nodelist *lp; |
const char *s; |
if (n == NULL) |
return; |
indent(ind, pfx, fp); |
switch(n->type) { |
case NSEMI: |
s = "; "; |
goto binop; |
case NAND: |
s = " && "; |
goto binop; |
case NOR: |
s = " || "; |
binop: |
shtree(n->nbinary.ch1, ind, NULL, fp); |
/* if (ind < 0) */ |
fputs(s, fp); |
shtree(n->nbinary.ch2, ind, NULL, fp); |
break; |
case NCMD: |
shcmd(n, fp); |
if (ind >= 0) |
putc('\n', fp); |
break; |
case NPIPE: |
for (lp = n->npipe.cmdlist ; lp ; lp = lp->next) { |
shcmd(lp->n, fp); |
if (lp->next) |
fputs(" | ", fp); |
} |
if (n->npipe.backgnd) |
fputs(" &", fp); |
if (ind >= 0) |
putc('\n', fp); |
break; |
default: |
fprintf(fp, "<node type %d>", n->type); |
if (ind >= 0) |
putc('\n', fp); |
break; |
} |
} |
static void |
shcmd(cmd, fp) |
union node *cmd; |
FILE *fp; |
{ |
union node *np; |
int first; |
const char *s; |
int dftfd; |
first = 1; |
for (np = cmd->ncmd.args ; np ; np = np->narg.next) { |
if (! first) |
putchar(' '); |
sharg(np, fp); |
first = 0; |
} |
for (np = cmd->ncmd.redirect ; np ; np = np->nfile.next) { |
if (! first) |
putchar(' '); |
switch (np->nfile.type) { |
case NTO: s = ">"; dftfd = 1; break; |
case NAPPEND: s = ">>"; dftfd = 1; break; |
case NTOFD: s = ">&"; dftfd = 1; break; |
case NTOOV: s = ">|"; dftfd = 1; break; |
case NFROM: s = "<"; dftfd = 0; break; |
case NFROMFD: s = "<&"; dftfd = 0; break; |
case NFROMTO: s = "<>"; dftfd = 0; break; |
default: s = "*error*"; dftfd = 0; break; |
} |
if (np->nfile.fd != dftfd) |
fprintf(fp, "%d", np->nfile.fd); |
fputs(s, fp); |
if (np->nfile.type == NTOFD || np->nfile.type == NFROMFD) { |
fprintf(fp, "%d", np->ndup.dupfd); |
} else { |
sharg(np->nfile.fname, fp); |
} |
first = 0; |
} |
} |
static void |
sharg(arg, fp) |
union node *arg; |
FILE *fp; |
{ |
char *p; |
struct nodelist *bqlist; |
int subtype; |
if (arg->type != NARG) { |
printf("<node type %d>\n", arg->type); |
fflush(stdout); |
abort(); |
} |
bqlist = arg->narg.backquote; |
for (p = arg->narg.text ; *p ; p++) { |
switch (*p) { |
case CTLESC: |
putc(*++p, fp); |
break; |
case CTLVAR: |
putc('$', fp); |
putc('{', fp); |
subtype = *++p; |
if (subtype == VSLENGTH) |
putc('#', fp); |
while (*p != '=') |
putc(*p++, fp); |
if (subtype & VSNUL) |
putc(':', fp); |
switch (subtype & VSTYPE) { |
case VSNORMAL: |
putc('}', fp); |
break; |
case VSMINUS: |
putc('-', fp); |
break; |
case VSPLUS: |
putc('+', fp); |
break; |
case VSQUESTION: |
putc('?', fp); |
break; |
case VSASSIGN: |
putc('=', fp); |
break; |
case VSTRIMLEFT: |
putc('#', fp); |
break; |
case VSTRIMLEFTMAX: |
putc('#', fp); |
putc('#', fp); |
break; |
case VSTRIMRIGHT: |
putc('%', fp); |
break; |
case VSTRIMRIGHTMAX: |
putc('%', fp); |
putc('%', fp); |
break; |
case VSLENGTH: |
break; |
default: |
printf("<subtype %d>", subtype); |
} |
break; |
case CTLENDVAR: |
putc('}', fp); |
break; |
case CTLBACKQ: |
case CTLBACKQ|CTLQUOTE: |
putc('$', fp); |
putc('(', fp); |
shtree(bqlist->n, -1, NULL, fp); |
putc(')', fp); |
break; |
default: |
putc(*p, fp); |
break; |
} |
} |
} |
static void |
indent(amount, pfx, fp) |
int amount; |
char *pfx; |
FILE *fp; |
{ |
int i; |
for (i = 0 ; i < amount ; i++) { |
if (pfx && i == amount - 1) |
fputs(pfx, fp); |
putc('\t', fp); |
} |
} |
#endif |
/* |
* Debugging stuff. |
*/ |
FILE *tracefile; |
#if DEBUG == 2 |
int debug = 1; |
#else |
int debug = 0; |
#endif |
#ifdef DEBUG |
void |
trputc(c) |
int c; |
{ |
if (tracefile == NULL) |
return; |
putc(c, tracefile); |
if (c == '\n') |
fflush(tracefile); |
} |
#endif |
void |
#ifdef __STDC__ |
trace(const char *fmt, ...) |
#else |
trace(va_alist) |
va_dcl |
#endif |
{ |
#ifdef DEBUG |
va_list va; |
#ifdef __STDC__ |
va_start(va, fmt); |
#else |
char *fmt; |
va_start(va); |
fmt = va_arg(va, char *); |
#endif |
if (tracefile != NULL) { |
(void) vfprintf(tracefile, fmt, va); |
if (strchr(fmt, '\n')) |
(void) fflush(tracefile); |
} |
va_end(va); |
#endif |
} |
#ifdef DEBUG |
void |
trputs(s) |
const char *s; |
{ |
if (tracefile == NULL) |
return; |
fputs(s, tracefile); |
if (strchr(s, '\n')) |
fflush(tracefile); |
} |
static void |
trstring(s) |
char *s; |
{ |
char *p; |
char c; |
if (tracefile == NULL) |
return; |
putc('"', tracefile); |
for (p = s ; *p ; p++) { |
switch (*p) { |
case '\n': c = 'n'; goto backslash; |
case '\t': c = 't'; goto backslash; |
case '\r': c = 'r'; goto backslash; |
case '"': c = '"'; goto backslash; |
case '\\': c = '\\'; goto backslash; |
case CTLESC: c = 'e'; goto backslash; |
case CTLVAR: c = 'v'; goto backslash; |
case CTLVAR+CTLQUOTE: c = 'V'; goto backslash; |
case CTLBACKQ: c = 'q'; goto backslash; |
case CTLBACKQ+CTLQUOTE: c = 'Q'; goto backslash; |
backslash: putc('\\', tracefile); |
putc(c, tracefile); |
break; |
default: |
if (*p >= ' ' && *p <= '~') |
putc(*p, tracefile); |
else { |
putc('\\', tracefile); |
putc(*p >> 6 & 03, tracefile); |
putc(*p >> 3 & 07, tracefile); |
putc(*p & 07, tracefile); |
} |
break; |
} |
} |
putc('"', tracefile); |
} |
#endif |
void |
trargs(ap) |
char **ap; |
{ |
#ifdef DEBUG |
if (tracefile == NULL) |
return; |
while (*ap) { |
trstring(*ap++); |
if (*ap) |
putc(' ', tracefile); |
else |
putc('\n', tracefile); |
} |
fflush(tracefile); |
#endif |
} |
#ifdef DEBUG |
void |
opentrace() { |
char s[100]; |
#ifdef O_APPEND |
int flags; |
#endif |
if (!debug) |
return; |
#ifdef not_this_way |
{ |
char *p; |
if ((p = getenv("HOME")) == NULL) { |
if (geteuid() == 0) |
p = "/"; |
else |
p = "/tmp"; |
} |
scopy(p, s); |
strcat(s, "/trace"); |
} |
#else |
scopy("./trace", s); |
#endif /* not_this_way */ |
if ((tracefile = fopen(s, "a")) == NULL) { |
fprintf(stderr, "Can't open %s\n", s); |
return; |
} |
#ifdef O_APPEND |
if ((flags = fcntl(fileno(tracefile), F_GETFL, 0)) >= 0) |
fcntl(fileno(tracefile), F_SETFL, flags | O_APPEND); |
#endif |
fputs("\nTracing started.\n", tracefile); |
fflush(tracefile); |
} |
#endif /* DEBUG */ |
/tags/0.3.0/uspace/app/ash/mystring.h |
---|
0,0 → 1,49 |
/* $NetBSD: mystring.h,v 1.9 1995/05/11 21:29:42 christos Exp $ */ |
/*- |
* Copyright (c) 1991, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Kenneth Almquist. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
* |
* @(#)mystring.h 8.2 (Berkeley) 5/4/95 |
*/ |
#include <string.h> |
void scopyn (const char *, char *, int); |
int prefix (const char *, const char *); |
int number (const char *); |
int is_number (const char *); |
#define equal(s1, s2) (strcmp(s1, s2) == 0) |
#define scopy(s1, s2) ((void)strcpy(s2, s1)) |
/tags/0.3.0/uspace/app/ash/show.h |
---|
0,0 → 1,46 |
/* $NetBSD: show.h,v 1.4 1999/10/08 21:10:44 pk Exp $ */ |
/*- |
* Copyright (c) 1995 |
* The Regents of the University of California. All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
* |
* @(#)show.h 1.1 (Berkeley) 5/4/95 |
*/ |
union node; |
void showtree (union node *); |
void trace (const char *, ...); |
void trargs (char **); |
#ifdef DEBUG |
void trputc (int); |
void trputs (const char *); |
void opentrace (void); |
#endif |
/tags/0.3.0/uspace/app/ash/myhistedit.h |
---|
0,0 → 1,50 |
/* $NetBSD: myhistedit.h,v 1.7 1999/07/09 03:05:50 christos Exp $ */ |
/*- |
* Copyright (c) 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
* |
* @(#)myhistedit.h 8.2 (Berkeley) 5/4/95 |
*/ |
#include <histedit.h> |
extern History *hist; |
extern EditLine *el; |
extern int displayhist; |
void histedit (void); |
void sethistsize (const char *); |
void setterm (const char *); |
int histcmd (int, char **); |
int not_fcnumber (char *); |
int str_to_event (const char *, int); |
/tags/0.3.0/uspace/app/ash/arith_lex.l |
---|
0,0 → 1,95 |
%{ |
/* $NetBSD: arith_lex.l,v 1.10 1999/02/05 07:52:52 christos Exp $ */ |
/*- |
* Copyright (c) 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Kenneth Almquist. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
*/ |
#include <sys/cdefs.h> |
#ifndef lint |
#if 0 |
static char sccsid[] = "@(#)arith_lex.l 8.3 (Berkeley) 5/4/95"; |
#else |
__RCSID("$NetBSD: arith_lex.l,v 1.10 1999/02/05 07:52:52 christos Exp $"); |
#endif |
#endif /* not lint */ |
#include <unistd.h> |
#include "arith.h" |
#include "error.h" |
#include "expand.h" |
extern int yylval; |
extern char *arith_buf, *arith_startbuf; |
#undef YY_INPUT |
#define YY_INPUT(buf,result,max) \ |
result = (*buf = *arith_buf++) ? 1 : YY_NULL; |
#define YY_NO_UNPUT |
%} |
%% |
[ \t\n] { ; } |
[0-9]+ { yylval = atol(yytext); return(ARITH_NUM); } |
"(" { return(ARITH_LPAREN); } |
")" { return(ARITH_RPAREN); } |
"||" { return(ARITH_OR); } |
"&&" { return(ARITH_AND); } |
"|" { return(ARITH_BOR); } |
"^" { return(ARITH_BXOR); } |
"&" { return(ARITH_BAND); } |
"==" { return(ARITH_EQ); } |
"!=" { return(ARITH_NE); } |
">" { return(ARITH_GT); } |
">=" { return(ARITH_GE); } |
"<" { return(ARITH_LT); } |
"<=" { return(ARITH_LE); } |
"<<" { return(ARITH_LSHIFT); } |
">>" { return(ARITH_RSHIFT); } |
"*" { return(ARITH_MUL); } |
"/" { return(ARITH_DIV); } |
"%" { return(ARITH_REM); } |
"+" { return(ARITH_ADD); } |
"-" { return(ARITH_SUB); } |
"~" { return(ARITH_BNOT); } |
"!" { return(ARITH_NOT); } |
. { error("arith: syntax error: \"%s\"\n", arith_startbuf); } |
%% |
void |
arith_lex_reset() { |
#ifdef YY_NEW_FILE |
YY_NEW_FILE; |
#endif |
} |
/tags/0.3.0/uspace/app/ash/funcs/dirs |
---|
0,0 → 1,74 |
# $NetBSD: dirs,v 1.7 1995/05/11 21:31:08 christos Exp $ |
# Copyright (c) 1991, 1993 |
# The Regents of the University of California. All rights reserved. |
# |
# This code is derived from software contributed to Berkeley by |
# Kenneth Almquist. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# 1. Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# 2. Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# 3. All advertising materials mentioning features or use of this software |
# must display the following acknowledgement: |
# This product includes software developed by the University of |
# California, Berkeley and its contributors. |
# 4. Neither the name of the University nor the names of its contributors |
# may be used to endorse or promote products derived from this software |
# without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
# SUCH DAMAGE. |
# |
# @(#)dirs 8.2 (Berkeley) 5/4/95 |
# pushd, popd, and dirs --- written by Chris Bertin |
# Pixel Computer Inc. ...!wjh12!pixel!pixutl!chris |
# as modified by Patrick Elam of GTRI and Kenneth Almquist at UW |
pushd () { |
SAVE=`pwd` |
if [ "$1" = "" ] |
then if [ "$DSTACK" = "" ] |
then echo "pushd: directory stack empty." |
return 1 |
fi |
set $DSTACK |
cd $1 || return |
shift 1 |
DSTACK="$*" |
else cd $1 > /dev/null || return |
fi |
DSTACK="$SAVE $DSTACK" |
dirs |
} |
popd () { |
if [ "$DSTACK" = "" ] |
then echo "popd: directory stack empty." |
return 1 |
fi |
set $DSTACK |
cd $1 |
shift |
DSTACK=$* |
dirs |
} |
dirs () { |
echo "`pwd` $DSTACK" |
return 0 |
} |
/tags/0.3.0/uspace/app/ash/funcs/suspend |
---|
0,0 → 1,42 |
# $NetBSD: suspend,v 1.7 1995/05/11 21:31:17 christos Exp $ |
# Copyright (c) 1991, 1993 |
# The Regents of the University of California. All rights reserved. |
# |
# This code is derived from software contributed to Berkeley by |
# Kenneth Almquist. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# 1. Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# 2. Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# 3. All advertising materials mentioning features or use of this software |
# must display the following acknowledgement: |
# This product includes software developed by the University of |
# California, Berkeley and its contributors. |
# 4. Neither the name of the University nor the names of its contributors |
# may be used to endorse or promote products derived from this software |
# without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
# SUCH DAMAGE. |
# |
# @(#)suspend 8.2 (Berkeley) 5/4/95 |
suspend() { |
local - |
set +j |
kill -TSTP 0 |
} |
/tags/0.3.0/uspace/app/ash/funcs/newgrp |
---|
0,0 → 1,38 |
# $NetBSD: newgrp,v 1.7 1995/05/11 21:31:12 christos Exp $ |
# Copyright (c) 1991, 1993 |
# The Regents of the University of California. All rights reserved. |
# |
# This code is derived from software contributed to Berkeley by |
# Kenneth Almquist. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# 1. Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# 2. Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# 3. All advertising materials mentioning features or use of this software |
# must display the following acknowledgement: |
# This product includes software developed by the University of |
# California, Berkeley and its contributors. |
# 4. Neither the name of the University nor the names of its contributors |
# may be used to endorse or promote products derived from this software |
# without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
# SUCH DAMAGE. |
# |
# @(#)newgrp 8.2 (Berkeley) 5/4/95 |
newgrp() exec newgrp "$@" |
/tags/0.3.0/uspace/app/ash/funcs/popd |
---|
0,0 → 1,74 |
# $NetBSD: popd,v 1.7 1995/05/11 21:31:13 christos Exp $ |
# Copyright (c) 1991, 1993 |
# The Regents of the University of California. All rights reserved. |
# |
# This code is derived from software contributed to Berkeley by |
# Kenneth Almquist. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# 1. Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# 2. Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# 3. All advertising materials mentioning features or use of this software |
# must display the following acknowledgement: |
# This product includes software developed by the University of |
# California, Berkeley and its contributors. |
# 4. Neither the name of the University nor the names of its contributors |
# may be used to endorse or promote products derived from this software |
# without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
# SUCH DAMAGE. |
# |
# @(#)popd 8.2 (Berkeley) 5/4/95 |
# pushd, popd, and dirs --- written by Chris Bertin |
# Pixel Computer Inc. ...!wjh12!pixel!pixutl!chris |
# as modified by Patrick Elam of GTRI and Kenneth Almquist at UW |
pushd () { |
SAVE=`pwd` |
if [ "$1" = "" ] |
then if [ "$DSTACK" = "" ] |
then echo "pushd: directory stack empty." |
return 1 |
fi |
set $DSTACK |
cd $1 || return |
shift 1 |
DSTACK="$*" |
else cd $1 > /dev/null || return |
fi |
DSTACK="$SAVE $DSTACK" |
dirs |
} |
popd () { |
if [ "$DSTACK" = "" ] |
then echo "popd: directory stack empty." |
return 1 |
fi |
set $DSTACK |
cd $1 |
shift |
DSTACK=$* |
dirs |
} |
dirs () { |
echo "`pwd` $DSTACK" |
return 0 |
} |
/tags/0.3.0/uspace/app/ash/funcs/pushd |
---|
0,0 → 1,74 |
# $NetBSD: pushd,v 1.7 1995/05/11 21:31:15 christos Exp $ |
# Copyright (c) 1991, 1993 |
# The Regents of the University of California. All rights reserved. |
# |
# This code is derived from software contributed to Berkeley by |
# Kenneth Almquist. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# 1. Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# 2. Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# 3. All advertising materials mentioning features or use of this software |
# must display the following acknowledgement: |
# This product includes software developed by the University of |
# California, Berkeley and its contributors. |
# 4. Neither the name of the University nor the names of its contributors |
# may be used to endorse or promote products derived from this software |
# without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
# SUCH DAMAGE. |
# |
# @(#)pushd 8.2 (Berkeley) 5/4/95 |
# pushd, popd, and dirs --- written by Chris Bertin |
# Pixel Computer Inc. ...!wjh12!pixel!pixutl!chris |
# as modified by Patrick Elam of GTRI and Kenneth Almquist at UW |
pushd () { |
SAVE=`pwd` |
if [ "$1" = "" ] |
then if [ "$DSTACK" = "" ] |
then echo "pushd: directory stack empty." |
return 1 |
fi |
set $DSTACK |
cd $1 || return |
shift 1 |
DSTACK="$*" |
else cd $1 > /dev/null || return |
fi |
DSTACK="$SAVE $DSTACK" |
dirs |
} |
popd () { |
if [ "$DSTACK" = "" ] |
then echo "popd: directory stack empty." |
return 1 |
fi |
set $DSTACK |
cd $1 |
shift |
DSTACK=$* |
dirs |
} |
dirs () { |
echo "`pwd` $DSTACK" |
return 0 |
} |
/tags/0.3.0/uspace/app/ash/funcs/cmv |
---|
0,0 → 1,50 |
# $NetBSD: cmv,v 1.7 1995/05/11 21:31:05 christos Exp $ |
# Copyright (c) 1991, 1993 |
# The Regents of the University of California. All rights reserved. |
# |
# This code is derived from software contributed to Berkeley by |
# Kenneth Almquist. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# 1. Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# 2. Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# 3. All advertising materials mentioning features or use of this software |
# must display the following acknowledgement: |
# This product includes software developed by the University of |
# California, Berkeley and its contributors. |
# 4. Neither the name of the University nor the names of its contributors |
# may be used to endorse or promote products derived from this software |
# without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
# SUCH DAMAGE. |
# |
# @(#)cmv 8.2 (Berkeley) 5/4/95 |
# Conditional move--don't replace an existing file. |
cmv() { |
if test $# != 2 |
then echo "cmv: arg count" |
return 2 |
fi |
if test -f "$2" -o -w "$2" |
then echo "$2 exists" |
return 2 |
fi |
/bin/mv "$1" "$2" |
} |
/tags/0.3.0/uspace/app/ash/funcs/login |
---|
0,0 → 1,39 |
# $NetBSD: login,v 1.7 1995/05/11 21:31:11 christos Exp $ |
# Copyright (c) 1991, 1993 |
# The Regents of the University of California. All rights reserved. |
# |
# This code is derived from software contributed to Berkeley by |
# Kenneth Almquist. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# 1. Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# 2. Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# 3. All advertising materials mentioning features or use of this software |
# must display the following acknowledgement: |
# This product includes software developed by the University of |
# California, Berkeley and its contributors. |
# 4. Neither the name of the University nor the names of its contributors |
# may be used to endorse or promote products derived from this software |
# without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
# SUCH DAMAGE. |
# |
# @(#)login 8.2 (Berkeley) 5/4/95 |
# replaces the login builtin in the BSD shell |
login () exec login "$@" |
/tags/0.3.0/uspace/app/ash/funcs/kill |
---|
0,0 → 1,50 |
# $NetBSD: kill,v 1.7 1995/05/11 21:31:10 christos Exp $ |
# Copyright (c) 1991, 1993 |
# The Regents of the University of California. All rights reserved. |
# |
# This code is derived from software contributed to Berkeley by |
# Kenneth Almquist. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# 1. Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# 2. Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# 3. All advertising materials mentioning features or use of this software |
# must display the following acknowledgement: |
# This product includes software developed by the University of |
# California, Berkeley and its contributors. |
# 4. Neither the name of the University nor the names of its contributors |
# may be used to endorse or promote products derived from this software |
# without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
# SUCH DAMAGE. |
# |
# @(#)kill 8.2 (Berkeley) 5/4/95 |
# Convert job names to process ids and then run /bin/kill. |
kill() { |
local args x |
args= |
for x in "$@" |
do case $x in |
%*) x=`jobid "$x"` ;; |
esac |
args="$args $x" |
done |
/bin/kill $args |
} |
/tags/0.3.0/uspace/app/ash/input.c |
---|
0,0 → 1,531 |
/* $NetBSD: input.c,v 1.34 2000/05/22 10:18:47 elric Exp $ */ |
/*- |
* Copyright (c) 1991, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Kenneth Almquist. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
*/ |
#include <sys/cdefs.h> |
#ifndef lint |
#if 0 |
static char sccsid[] = "@(#)input.c 8.3 (Berkeley) 6/9/95"; |
#else |
__RCSID("$NetBSD: input.c,v 1.34 2000/05/22 10:18:47 elric Exp $"); |
#endif |
#endif /* not lint */ |
#include <stdio.h> /* defines BUFSIZ */ |
#include <fcntl.h> |
#include <errno.h> |
#include <unistd.h> |
#include <stdlib.h> |
#include <string.h> |
/* |
* This file implements the input routines used by the parser. |
*/ |
#include "shell.h" |
#include "redir.h" |
#include "syntax.h" |
#include "input.h" |
#include "output.h" |
#include "options.h" |
#include "memalloc.h" |
#include "error.h" |
#include "alias.h" |
#include "parser.h" |
#ifndef SMALL |
#include "myhistedit.h" |
#endif |
#ifdef HETIO |
#include "hetio.h" |
#endif |
#define EOF_NLEFT -99 /* value of parsenleft when EOF pushed back */ |
MKINIT |
struct strpush { |
struct strpush *prev; /* preceding string on stack */ |
char *prevstring; |
int prevnleft; |
int prevlleft; |
struct alias *ap; /* if push was associated with an alias */ |
}; |
/* |
* The parsefile structure pointed to by the global variable parsefile |
* contains information about the current file being read. |
*/ |
MKINIT |
struct parsefile { |
struct parsefile *prev; /* preceding file on stack */ |
int linno; /* current line */ |
int fd; /* file descriptor (or -1 if string) */ |
int nleft; /* number of chars left in this line */ |
int lleft; /* number of chars left in this buffer */ |
char *nextc; /* next char in buffer */ |
char *buf; /* input buffer */ |
struct strpush *strpush; /* for pushing strings at this level */ |
struct strpush basestrpush; /* so pushing one is fast */ |
}; |
int plinno = 1; /* input line number */ |
MKINIT int parsenleft; /* copy of parsefile->nleft */ |
MKINIT int parselleft; /* copy of parsefile->lleft */ |
char *parsenextc; /* copy of parsefile->nextc */ |
MKINIT struct parsefile basepf; /* top level input file */ |
char basebuf[BUFSIZ]; /* buffer for top level input file */ |
struct parsefile *parsefile = &basepf; /* current input file */ |
int init_editline = 0; /* editline library initialized? */ |
int whichprompt; /* 1 == PS1, 2 == PS2 */ |
#ifndef SMALL |
EditLine *el; /* cookie for editline package */ |
#endif |
STATIC void pushfile (void); |
static int preadfd (void); |
#ifdef mkinit |
INCLUDE "input.h" |
INCLUDE "error.h" |
INIT { |
extern char basebuf[]; |
basepf.nextc = basepf.buf = basebuf; |
} |
RESET { |
if (exception != EXSHELLPROC) |
parselleft = parsenleft = 0; /* clear input buffer */ |
popallfiles(); |
} |
SHELLPROC { |
popallfiles(); |
} |
#endif |
/* |
* Read a line from the script. |
*/ |
char * |
pfgets(line, len) |
char *line; |
int len; |
{ |
char *p = line; |
int nleft = len; |
int c; |
while (--nleft > 0) { |
c = pgetc_macro(); |
if (c == PEOF) { |
if (p == line) |
return NULL; |
break; |
} |
*p++ = c; |
if (c == '\n') |
break; |
} |
*p = '\0'; |
return line; |
} |
/* |
* Read a character from the script, returning PEOF on end of file. |
* Nul characters in the input are silently discarded. |
*/ |
int |
pgetc() |
{ |
return pgetc_macro(); |
} |
static int |
preadfd() |
{ |
int nr; |
char *buf = parsefile->buf; |
parsenextc = buf; |
retry: |
#ifndef SMALL |
if (parsefile->fd == 0 && el) { |
const char *rl_cp; |
rl_cp = el_gets(el, &nr); |
if (rl_cp == NULL) |
nr = 0; |
else { |
/* XXX - BUFSIZE should redesign so not necessary */ |
(void) strcpy(buf, rl_cp); |
} |
} else |
#endif |
#ifdef HETIO |
nr = hetio_read_input(parsefile->fd); |
if (nr == -255) |
#endif |
nr = read(parsefile->fd, buf, BUFSIZ - 1); |
if (nr <= 0) { |
if (nr < 0) { |
if (errno == EINTR) |
goto retry; |
if (parsefile->fd == 0 && errno == EWOULDBLOCK) { |
int flags = fcntl(0, F_GETFL, 0); |
if (flags >= 0 && flags & O_NONBLOCK) { |
flags &=~ O_NONBLOCK; |
if (fcntl(0, F_SETFL, flags) >= 0) { |
out2str("sh: turning off NDELAY mode\n"); |
goto retry; |
} |
} |
} |
} |
nr = -1; |
} |
return nr; |
} |
/* |
* Refill the input buffer and return the next input character: |
* |
* 1) If a string was pushed back on the input, pop it; |
* 2) If an EOF was pushed back (parsenleft == EOF_NLEFT) or we are reading |
* from a string so we can't refill the buffer, return EOF. |
* 3) If the is more stuff in this buffer, use it else call read to fill it. |
* 4) Process input up to the next newline, deleting nul characters. |
*/ |
int |
preadbuffer() |
{ |
char *p, *q; |
int more; |
int something; |
char savec; |
if (parsefile->strpush) { |
popstring(); |
if (--parsenleft >= 0) |
return (*parsenextc++); |
} |
if (parsenleft == EOF_NLEFT || parsefile->buf == NULL) |
return PEOF; |
flushout(&output); |
flushout(&errout); |
again: |
if (parselleft <= 0) { |
if ((parselleft = preadfd()) == -1) { |
parselleft = parsenleft = EOF_NLEFT; |
return PEOF; |
} |
} |
q = p = parsenextc; |
/* delete nul characters */ |
something = 0; |
for (more = 1; more;) { |
switch (*p) { |
case '\0': |
p++; /* Skip nul */ |
goto check; |
case '\t': |
case ' ': |
break; |
case '\n': |
parsenleft = q - parsenextc; |
more = 0; /* Stop processing here */ |
break; |
default: |
something = 1; |
break; |
} |
*q++ = *p++; |
check: |
if (--parselleft <= 0) { |
parsenleft = q - parsenextc - 1; |
if (parsenleft < 0) |
goto again; |
*q = '\0'; |
more = 0; |
} |
} |
savec = *q; |
*q = '\0'; |
#ifndef SMALL |
if (parsefile->fd == 0 && hist && something) { |
HistEvent he; |
INTOFF; |
history(hist, &he, whichprompt == 1? H_ENTER : H_APPEND, |
parsenextc); |
INTON; |
} |
#endif |
if (vflag) { |
out2str(parsenextc); |
flushout(out2); |
} |
*q = savec; |
return *parsenextc++; |
} |
/* |
* Undo the last call to pgetc. Only one character may be pushed back. |
* PEOF may be pushed back. |
*/ |
void |
pungetc() { |
parsenleft++; |
parsenextc--; |
} |
/* |
* Push a string back onto the input at this current parsefile level. |
* We handle aliases this way. |
*/ |
void |
pushstring(s, len, ap) |
char *s; |
int len; |
void *ap; |
{ |
struct strpush *sp; |
INTOFF; |
/*dprintf("*** calling pushstring: %s, %d\n", s, len);*/ |
if (parsefile->strpush) { |
sp = ckmalloc(sizeof (struct strpush)); |
sp->prev = parsefile->strpush; |
parsefile->strpush = sp; |
} else |
sp = parsefile->strpush = &(parsefile->basestrpush); |
sp->prevstring = parsenextc; |
sp->prevnleft = parsenleft; |
sp->prevlleft = parselleft; |
sp->ap = (struct alias *)ap; |
if (ap) |
((struct alias *)ap)->flag |= ALIASINUSE; |
parsenextc = s; |
parsenleft = len; |
INTON; |
} |
void |
popstring() |
{ |
struct strpush *sp = parsefile->strpush; |
INTOFF; |
parsenextc = sp->prevstring; |
parsenleft = sp->prevnleft; |
parselleft = sp->prevlleft; |
/*dprintf("*** calling popstring: restoring to '%s'\n", parsenextc);*/ |
if (sp->ap) |
sp->ap->flag &= ~ALIASINUSE; |
parsefile->strpush = sp->prev; |
if (sp != &(parsefile->basestrpush)) |
ckfree(sp); |
INTON; |
} |
/* |
* Set the input to take input from a file. If push is set, push the |
* old input onto the stack first. |
*/ |
void |
setinputfile(fname, push) |
const char *fname; |
int push; |
{ |
int fd; |
int fd2; |
INTOFF; |
if ((fd = open(fname, O_RDONLY)) < 0) |
error("Can't open %s", fname); |
if (fd < 10) { |
fd2 = copyfd(fd, 10); |
close(fd); |
if (fd2 < 0) |
error("Out of file descriptors"); |
fd = fd2; |
} |
setinputfd(fd, push); |
INTON; |
} |
/* |
* Like setinputfile, but takes an open file descriptor. Call this with |
* interrupts off. |
*/ |
void |
setinputfd(fd, push) |
int fd, push; |
{ |
(void) fcntl(fd, F_SETFD, FD_CLOEXEC); |
if (push) { |
pushfile(); |
parsefile->buf = ckmalloc(BUFSIZ); |
} |
if (parsefile->fd > 0) |
close(parsefile->fd); |
parsefile->fd = fd; |
if (parsefile->buf == NULL) |
parsefile->buf = ckmalloc(BUFSIZ); |
parselleft = parsenleft = 0; |
plinno = 1; |
} |
/* |
* Like setinputfile, but takes input from a string. |
*/ |
void |
setinputstring(string, push) |
char *string; |
int push; |
{ |
INTOFF; |
if (push) |
pushfile(); |
parsenextc = string; |
parselleft = parsenleft = strlen(string); |
parsefile->buf = NULL; |
plinno = 1; |
INTON; |
} |
/* |
* To handle the "." command, a stack of input files is used. Pushfile |
* adds a new entry to the stack and popfile restores the previous level. |
*/ |
STATIC void |
pushfile() { |
struct parsefile *pf; |
parsefile->nleft = parsenleft; |
parsefile->lleft = parselleft; |
parsefile->nextc = parsenextc; |
parsefile->linno = plinno; |
pf = (struct parsefile *)ckmalloc(sizeof (struct parsefile)); |
pf->prev = parsefile; |
pf->fd = -1; |
pf->strpush = NULL; |
pf->basestrpush.prev = NULL; |
parsefile = pf; |
} |
void |
popfile() { |
struct parsefile *pf = parsefile; |
INTOFF; |
if (pf->fd >= 0) |
close(pf->fd); |
if (pf->buf) |
ckfree(pf->buf); |
while (pf->strpush) |
popstring(); |
parsefile = pf->prev; |
ckfree(pf); |
parsenleft = parsefile->nleft; |
parselleft = parsefile->lleft; |
parsenextc = parsefile->nextc; |
plinno = parsefile->linno; |
INTON; |
} |
/* |
* Return to top level. |
*/ |
void |
popallfiles() { |
while (parsefile != &basepf) |
popfile(); |
} |
/* |
* Close the file(s) that the shell is reading commands from. Called |
* after a fork is done. |
*/ |
void |
closescript() { |
popallfiles(); |
if (parsefile->fd > 0) { |
close(parsefile->fd); |
parsefile->fd = 0; |
} |
} |
/tags/0.3.0/uspace/app/ash/input.h |
---|
0,0 → 1,66 |
/* $NetBSD: input.h,v 1.12 2000/05/22 10:18:47 elric Exp $ */ |
/*- |
* Copyright (c) 1991, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Kenneth Almquist. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
* |
* @(#)input.h 8.2 (Berkeley) 5/4/95 |
*/ |
/* PEOF (the end of file marker) is defined in syntax.h */ |
/* |
* The input line number. Input.c just defines this variable, and saves |
* and restores it when files are pushed and popped. The user of this |
* package must set its value. |
*/ |
extern int plinno; |
extern int parsenleft; /* number of characters left in input buffer */ |
extern char *parsenextc; /* next character in input buffer */ |
extern int init_editline; /* 0 == not setup, 1 == OK, -1 == failed */ |
char *pfgets (char *, int); |
int pgetc (void); |
int preadbuffer (void); |
void pungetc (void); |
void pushstring (char *, int, void *); |
void popstring (void); |
void setinputfile (const char *, int); |
void setinputfd (int, int); |
void setinputstring (char *, int); |
void popfile (void); |
void popallfiles (void); |
void closescript (void); |
#define pgetc_macro() (--parsenleft >= 0? *parsenextc++ : preadbuffer()) |
/tags/0.3.0/uspace/app/ash/redir.c |
---|
0,0 → 1,492 |
/* $NetBSD: redir.c,v 1.22 2000/05/22 10:18:47 elric Exp $ */ |
/*- |
* Copyright (c) 1991, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Kenneth Almquist. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
*/ |
#include <sys/cdefs.h> |
#ifndef lint |
#if 0 |
static char sccsid[] = "@(#)redir.c 8.2 (Berkeley) 5/4/95"; |
#else |
__RCSID("$NetBSD: redir.c,v 1.22 2000/05/22 10:18:47 elric Exp $"); |
#endif |
#endif /* not lint */ |
#include <sys/stat.h> |
#include <sys/types.h> |
#include <sys/param.h> /* PIPE_BUF */ |
#include <signal.h> |
#include <string.h> |
#include <fcntl.h> |
#include <errno.h> |
#include <unistd.h> |
#include <stdlib.h> |
/* |
* Code for dealing with input/output redirection. |
*/ |
#include "shell.h" |
#include "nodes.h" |
#include "jobs.h" |
#include "expand.h" |
#include "redir.h" |
#include "output.h" |
#include "memalloc.h" |
#include "error.h" |
#include "options.h" |
#define EMPTY -2 /* marks an unused slot in redirtab */ |
#ifndef PIPE_BUF |
# define PIPESIZE 4096 /* amount of buffering in a pipe */ |
#else |
# define PIPESIZE PIPE_BUF |
#endif |
MKINIT |
struct redirtab { |
struct redirtab *next; |
short renamed[10]; |
}; |
MKINIT struct redirtab *redirlist; |
/* |
* We keep track of whether or not fd0 has been redirected. This is for |
* background commands, where we want to redirect fd0 to /dev/null only |
* if it hasn't already been redirected. |
*/ |
int fd0_redirected = 0; |
/* |
* We also keep track of where fd2 goes. |
*/ |
int fd2 = 2; |
STATIC int openredirect (union node *); |
STATIC void dupredirect (union node *, int, char[10 ]); |
STATIC int openhere (union node *); |
STATIC int noclobberopen (const char *); |
/* |
* Process a list of redirection commands. If the REDIR_PUSH flag is set, |
* old file descriptors are stashed away so that the redirection can be |
* undone by calling popredir. If the REDIR_BACKQ flag is set, then the |
* standard output, and the standard error if it becomes a duplicate of |
* stdout, is saved in memory. |
*/ |
void |
redirect(redir, flags) |
union node *redir; |
int flags; |
{ |
union node *n; |
struct redirtab *sv = NULL; |
int i; |
int fd; |
int newfd; |
int try; |
char memory[10]; /* file descriptors to write to memory */ |
for (i = 10 ; --i >= 0 ; ) |
memory[i] = 0; |
memory[1] = flags & REDIR_BACKQ; |
if (flags & REDIR_PUSH) { |
sv = ckmalloc(sizeof (struct redirtab)); |
for (i = 0 ; i < 10 ; i++) |
sv->renamed[i] = EMPTY; |
sv->next = redirlist; |
redirlist = sv; |
} |
for (n = redir ; n ; n = n->nfile.next) { |
fd = n->nfile.fd; |
try = 0; |
if ((n->nfile.type == NTOFD || n->nfile.type == NFROMFD) && |
n->ndup.dupfd == fd) |
continue; /* redirect from/to same file descriptor */ |
INTOFF; |
newfd = openredirect(n); |
if (((flags & REDIR_PUSH) && sv->renamed[fd] == EMPTY) || |
(fd == fd2)) { |
if (newfd == fd) { |
try++; |
} else if ((i = fcntl(fd, F_DUPFD, 10)) == -1) { |
switch (errno) { |
case EBADF: |
if (!try) { |
dupredirect(n, newfd, memory); |
try++; |
break; |
} |
/* FALLTHROUGH*/ |
default: |
if (newfd >= 0) { |
close(newfd); |
} |
INTON; |
error("%d: %s", fd, strerror(errno)); |
/* NOTREACHED */ |
} |
} |
if (!try) { |
close(fd); |
if (flags & REDIR_PUSH) { |
sv->renamed[fd] = i; |
} |
if (fd == fd2) { |
fd2 = i; |
} |
} |
} else if (fd != newfd) { |
close(fd); |
} |
if (fd == 0) |
fd0_redirected++; |
if (!try) |
dupredirect(n, newfd, memory); |
INTON; |
} |
if (memory[1]) |
out1 = &memout; |
if (memory[2]) |
out2 = &memout; |
} |
STATIC int |
openredirect(redir) |
union node *redir; |
{ |
char *fname; |
int f; |
switch (redir->nfile.type) { |
case NFROM: |
fname = redir->nfile.expfname; |
if ((f = open(fname, O_RDONLY)) < 0) |
goto eopen; |
break; |
case NFROMTO: |
fname = redir->nfile.expfname; |
if ((f = open(fname, O_RDWR|O_CREAT|O_TRUNC, 0666)) < 0) |
goto ecreate; |
break; |
case NTO: |
/* Take care of noclobber mode. */ |
if (Cflag) { |
fname = redir->nfile.expfname; |
if ((f = noclobberopen(fname)) < 0) |
goto ecreate; |
break; |
} |
case NTOOV: |
fname = redir->nfile.expfname; |
#ifdef O_CREAT |
if ((f = open(fname, O_WRONLY|O_CREAT|O_TRUNC, 0666)) < 0) |
goto ecreate; |
#else |
if ((f = creat(fname, 0666)) < 0) |
goto ecreate; |
#endif |
break; |
case NAPPEND: |
fname = redir->nfile.expfname; |
#ifdef O_APPEND |
if ((f = open(fname, O_WRONLY|O_CREAT|O_APPEND, 0666)) < 0) |
goto ecreate; |
#else |
if ((f = open(fname, O_WRONLY)) < 0 |
&& (f = creat(fname, 0666)) < 0) |
goto ecreate; |
lseek(f, (off_t)0, 2); |
#endif |
break; |
case NTOFD: |
case NFROMFD: |
f = -1; |
break; |
case NHERE: |
case NXHERE: |
f = openhere(redir); |
break; |
default: |
abort(); |
} |
return f; |
ecreate: |
error("cannot create %s: %s", fname, errmsg(errno, E_CREAT)); |
eopen: |
error("cannot open %s: %s", fname, errmsg(errno, E_OPEN)); |
} |
STATIC void |
dupredirect(redir, f, memory) |
union node *redir; |
int f; |
char memory[10]; |
{ |
int fd = redir->nfile.fd; |
memory[fd] = 0; |
if (redir->nfile.type == NTOFD || redir->nfile.type == NFROMFD) { |
if (redir->ndup.dupfd >= 0) { /* if not ">&-" */ |
if (memory[redir->ndup.dupfd]) |
memory[fd] = 1; |
else |
copyfd(redir->ndup.dupfd, fd); |
} |
return; |
} |
if (f != fd) { |
copyfd(f, fd); |
close(f); |
} |
return; |
} |
/* |
* Handle here documents. Normally we fork off a process to write the |
* data to a pipe. If the document is short, we can stuff the data in |
* the pipe without forking. |
*/ |
STATIC int |
openhere(redir) |
union node *redir; |
{ |
int pip[2]; |
int len = 0; |
if (pipe(pip) < 0) |
error("Pipe call failed"); |
if (redir->type == NHERE) { |
len = strlen(redir->nhere.doc->narg.text); |
if (len <= PIPESIZE) { |
xwrite(pip[1], redir->nhere.doc->narg.text, len); |
goto out; |
} |
} |
if (forkshell((struct job *)NULL, (union node *)NULL, FORK_NOJOB) == 0) { |
close(pip[0]); |
signal(SIGINT, SIG_IGN); |
signal(SIGQUIT, SIG_IGN); |
signal(SIGHUP, SIG_IGN); |
#ifdef SIGTSTP |
signal(SIGTSTP, SIG_IGN); |
#endif |
signal(SIGPIPE, SIG_DFL); |
if (redir->type == NHERE) |
xwrite(pip[1], redir->nhere.doc->narg.text, len); |
else |
expandhere(redir->nhere.doc, pip[1]); |
_exit(0); |
} |
out: |
close(pip[1]); |
return pip[0]; |
} |
/* |
* Undo the effects of the last redirection. |
*/ |
void |
popredir() { |
struct redirtab *rp = redirlist; |
int i; |
INTOFF; |
for (i = 0 ; i < 10 ; i++) { |
if (rp->renamed[i] != EMPTY) { |
if (i == 0) |
fd0_redirected--; |
close(i); |
if (rp->renamed[i] >= 0) { |
copyfd(rp->renamed[i], i); |
close(rp->renamed[i]); |
} |
if (rp->renamed[i] == fd2) { |
fd2 = i; |
} |
} |
} |
redirlist = rp->next; |
ckfree(rp); |
INTON; |
} |
/* |
* Undo all redirections. Called on error or interrupt. |
*/ |
#ifdef mkinit |
INCLUDE "redir.h" |
RESET { |
while (redirlist) |
popredir(); |
} |
SHELLPROC { |
clearredir(); |
} |
#endif |
/* Return true if fd 0 has already been redirected at least once. */ |
int |
fd0_redirected_p () { |
return fd0_redirected != 0; |
} |
/* |
* Discard all saved file descriptors. |
*/ |
void |
clearredir() { |
struct redirtab *rp; |
int i; |
for (rp = redirlist ; rp ; rp = rp->next) { |
for (i = 0 ; i < 10 ; i++) { |
if (rp->renamed[i] >= 0) { |
close(rp->renamed[i]); |
if (rp->renamed[i] == fd2) { |
fd2 = -1; |
} |
} |
rp->renamed[i] = EMPTY; |
} |
} |
} |
/* |
* Copy a file descriptor to be >= to. Returns -1 |
* if the source file descriptor is closed, EMPTY if there are no unused |
* file descriptors left. |
*/ |
int |
copyfd(from, to) |
int from; |
int to; |
{ |
int newfd; |
newfd = fcntl(from, F_DUPFD, to); |
if (newfd < 0) { |
if (errno == EMFILE) |
return EMPTY; |
else |
error("%d: %s", from, strerror(errno)); |
} |
return newfd; |
} |
/* |
* Open a file in noclobber mode. |
* The code was copied from bash. |
*/ |
int |
noclobberopen(fname) |
const char *fname; |
{ |
int r, fd; |
struct stat finfo, finfo2; |
/* |
* If the file exists and is a regular file, return an error |
* immediately. |
*/ |
r = stat(fname, &finfo); |
if (r == 0 && S_ISREG(finfo.st_mode)) { |
errno = EEXIST; |
return -1; |
} |
/* |
* If the file was not present (r != 0), make sure we open it |
* exclusively so that if it is created before we open it, our open |
* will fail. Make sure that we do not truncate an existing file. |
* Note that we don't turn on O_EXCL unless the stat failed -- if the |
* file was not a regular file, we leave O_EXCL off. |
*/ |
if (r != 0) |
return open(fname, O_WRONLY|O_CREAT|O_EXCL, 0666); |
fd = open(fname, O_WRONLY|O_CREAT, 0666); |
/* If the open failed, return the file descriptor right away. */ |
if (fd < 0) |
return fd; |
/* |
* OK, the open succeeded, but the file may have been changed from a |
* non-regular file to a regular file between the stat and the open. |
* We are assuming that the O_EXCL open handles the case where FILENAME |
* did not exist and is symlinked to an existing file between the stat |
* and open. |
*/ |
/* |
* If we can open it and fstat the file descriptor, and neither check |
* revealed that it was a regular file, and the file has not been |
* replaced, return the file descriptor. |
*/ |
if (fstat(fd, &finfo2) == 0 && !S_ISREG(finfo2.st_mode) && |
finfo.st_dev == finfo2.st_dev && finfo.st_ino == finfo2.st_ino) |
return fd; |
/* The file has been replaced. badness. */ |
close(fd); |
errno = EEXIST; |
return -1; |
} |
/tags/0.3.0/uspace/app/ash/trap.c |
---|
0,0 → 1,401 |
/* $NetBSD: trap.c,v 1.24 2000/05/22 10:18:47 elric Exp $ */ |
/*- |
* Copyright (c) 1991, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Kenneth Almquist. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
*/ |
#include <sys/cdefs.h> |
#ifndef lint |
#if 0 |
static char sccsid[] = "@(#)trap.c 8.5 (Berkeley) 6/5/95"; |
#else |
__RCSID("$NetBSD: trap.c,v 1.24 2000/05/22 10:18:47 elric Exp $"); |
#endif |
#endif /* not lint */ |
#include <signal.h> |
#include <unistd.h> |
#include <stdlib.h> |
#include "shell.h" |
#include "main.h" |
#include "nodes.h" /* for other headers */ |
#include "eval.h" |
#include "jobs.h" |
#include "show.h" |
#include "options.h" |
#include "syntax.h" |
#include "output.h" |
#include "memalloc.h" |
#include "error.h" |
#include "trap.h" |
#include "mystring.h" |
#include "mail.h" |
#ifdef HETIO |
#include "hetio.h" |
#endif |
/* |
* Sigmode records the current value of the signal handlers for the various |
* modes. A value of zero means that the current handler is not known. |
* S_HARD_IGN indicates that the signal was ignored on entry to the shell, |
*/ |
#define S_DFL 1 /* default signal handling (SIG_DFL) */ |
#define S_CATCH 2 /* signal is caught */ |
#define S_IGN 3 /* signal is ignored (SIG_IGN) */ |
#define S_HARD_IGN 4 /* signal is ignored permenantly */ |
#define S_RESET 5 /* temporary - to reset a hard ignored sig */ |
extern char nullstr[1]; /* null string */ |
char *trap[NSIG+1]; /* trap handler commands */ |
MKINIT char sigmode[NSIG]; /* current value of signal */ |
char gotsig[NSIG]; /* indicates specified signal received */ |
int pendingsigs; /* indicates some signal received */ |
extern char *signal_names[]; |
/* |
* The trap builtin. |
*/ |
int |
trapcmd(argc, argv) |
int argc; |
char **argv; |
{ |
char *action; |
char **ap; |
int signo; |
if (argc <= 1) { |
for (signo = 0 ; signo <= NSIG ; signo++) { |
if (trap[signo] != NULL) |
out1fmt("%d: %s\n", signo, trap[signo]); |
} |
return 0; |
} |
ap = argv + 1; |
if (argc == 2) |
action = NULL; |
else |
action = *ap++; |
while (*ap) { |
if ((signo = decode_signal(*ap)) < 0) |
error("%s: bad trap", *ap); |
INTOFF; |
if (action) { |
if (action[0] == '-' && action[1] == '\0') |
action = NULL; |
else |
action = savestr(action); |
} |
if (trap[signo]) |
ckfree(trap[signo]); |
trap[signo] = action; |
if (signo != 0) |
setsignal(signo); |
INTON; |
ap++; |
} |
return 0; |
} |
/* |
* Clear traps on a fork. |
*/ |
void |
clear_traps() { |
char **tp; |
for (tp = trap ; tp <= &trap[NSIG] ; tp++) { |
if (*tp && **tp) { /* trap not NULL or SIG_IGN */ |
INTOFF; |
ckfree(*tp); |
*tp = NULL; |
if (tp != &trap[0]) |
setsignal(tp - trap); |
INTON; |
} |
} |
} |
/* |
* Set the signal handler for the specified signal. The routine figures |
* out what it should be set to. |
*/ |
void |
setsignal(signo) |
int signo; |
{ |
int action; |
char *t; |
struct sigaction act; |
if ((t = trap[signo]) == NULL) |
action = S_DFL; |
else if (*t != '\0') |
action = S_CATCH; |
else |
action = S_IGN; |
if (rootshell && action == S_DFL) { |
switch (signo) { |
case SIGINT: |
if (iflag || minusc || sflag == 0) |
action = S_CATCH; |
break; |
case SIGQUIT: |
#ifdef DEBUG |
{ |
extern int debug; |
if (debug) |
break; |
} |
#endif |
/* FALLTHROUGH */ |
case SIGTERM: |
if (iflag) |
action = S_IGN; |
break; |
#if JOBS |
case SIGTSTP: |
case SIGTTOU: |
if (mflag) |
action = S_IGN; |
break; |
#endif |
} |
} |
t = &sigmode[signo - 1]; |
if (*t == 0) { |
/* |
* current setting unknown |
*/ |
if (sigaction(signo, 0, &act) == -1) { |
/* |
* Pretend it worked; maybe we should give a warning |
* here, but other shells don't. We don't alter |
* sigmode, so that we retry every time. |
*/ |
return; |
} |
if (act.sa_handler == SIG_IGN) { |
if (mflag && (signo == SIGTSTP || |
signo == SIGTTIN || signo == SIGTTOU)) { |
*t = S_IGN; /* don't hard ignore these */ |
} else |
*t = S_HARD_IGN; |
} else { |
*t = S_RESET; /* force to be set */ |
} |
} |
if (*t == S_HARD_IGN || *t == action) |
return; |
switch (action) { |
case S_CATCH: |
act.sa_handler = onsig; |
break; |
case S_IGN: |
act.sa_handler = SIG_IGN; |
break; |
default: |
act.sa_handler = SIG_DFL; |
} |
*t = action; |
act.sa_flags = 0; |
sigemptyset(&act.sa_mask); |
sigaction(signo, &act, 0); |
} |
/* |
* Ignore a signal. |
*/ |
void |
ignoresig(signo) |
int signo; |
{ |
if (sigmode[signo - 1] != S_IGN && sigmode[signo - 1] != S_HARD_IGN) { |
signal(signo, SIG_IGN); |
} |
sigmode[signo - 1] = S_HARD_IGN; |
} |
#ifdef mkinit |
INCLUDE <signal.h> |
INCLUDE "trap.h" |
SHELLPROC { |
char *sm; |
clear_traps(); |
for (sm = sigmode ; sm < sigmode + NSIG ; sm++) { |
if (*sm == S_IGN) |
*sm = S_HARD_IGN; |
} |
} |
#endif |
/* |
* Signal handler. |
*/ |
void |
onsig(signo) |
int signo; |
{ |
signal(signo, onsig); |
if (signo == SIGINT && trap[SIGINT] == NULL) { |
onint(); |
return; |
} |
gotsig[signo - 1] = 1; |
pendingsigs++; |
} |
/* |
* Called to execute a trap. Perhaps we should avoid entering new trap |
* handlers while we are executing a trap handler. |
*/ |
void |
dotrap() { |
int i; |
int savestatus; |
for (;;) { |
for (i = 1 ; ; i++) { |
if (gotsig[i - 1]) |
break; |
if (i >= NSIG) |
goto done; |
} |
gotsig[i - 1] = 0; |
savestatus=exitstatus; |
evalstring(trap[i], 0); |
exitstatus=savestatus; |
} |
done: |
pendingsigs = 0; |
} |
/* |
* Controls whether the shell is interactive or not. |
*/ |
void |
setinteractive(on) |
int on; |
{ |
static int is_interactive; |
if (on == is_interactive) |
return; |
setsignal(SIGINT); |
setsignal(SIGQUIT); |
setsignal(SIGTERM); |
chkmail(1); |
is_interactive = on; |
} |
/* |
* Called to exit the shell. |
*/ |
void |
exitshell(status) |
int status; |
{ |
struct jmploc loc1, loc2; |
char *p; |
TRACE(("exitshell(%d) pid=%d\n", status, getpid())); |
#ifdef HETIO |
hetio_reset_term(); |
#endif |
if (setjmp(loc1.loc)) { |
goto l1; |
} |
if (setjmp(loc2.loc)) { |
goto l2; |
} |
handler = &loc1; |
if ((p = trap[0]) != NULL && *p != '\0') { |
trap[0] = NULL; |
evalstring(p, 0); |
} |
l1: handler = &loc2; /* probably unnecessary */ |
flushall(); |
#if JOBS |
setjobctl(0); |
#endif |
l2: _exit(status); |
/* NOTREACHED */ |
} |
int decode_signal(const char *string) |
{ |
int signo; |
if (is_number(string)) return atoi(string); |
for (signo=0; signo < NSIG; signo++) |
if (strcasecmp(string, signal_names[signo]) == 0 || |
strcasecmp(string, &(signal_names[signo])[3]) == 0) |
return signo; |
return -1; |
} |
/tags/0.3.0/uspace/app/ash/arith.c |
---|
0,0 → 1,1907 |
/* A Bison parser, made by GNU Bison 2.3. */ |
/* Skeleton implementation for Bison's Yacc-like parsers in C |
Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 |
Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 2, or (at your option) |
any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street, Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
/* As a special exception, you may create a larger work that contains |
part or all of the Bison parser skeleton and distribute that work |
under terms of your choice, so long as that work isn't itself a |
parser generator using the skeleton or a modified version thereof |
as a parser skeleton. Alternatively, if you modify or redistribute |
the parser skeleton itself, you may (at your option) remove this |
special exception, which will cause the skeleton and the resulting |
Bison output files to be licensed under the GNU General Public |
License without this special exception. |
This special exception was added by the Free Software Foundation in |
version 2.2 of Bison. */ |
/* C LALR(1) parser skeleton written by Richard Stallman, by |
simplifying the original so-called "semantic" parser. */ |
/* All symbols defined below should begin with yy or YY, to avoid |
infringing on user name space. This should be done even for local |
variables, as they might otherwise be expanded by user macros. |
There are some unavoidable exceptions within include files to |
define necessary library symbols; they are noted "INFRINGES ON |
USER NAME SPACE" below. */ |
/* Identify Bison output. */ |
#define YYBISON 1 |
/* Bison version. */ |
#define YYBISON_VERSION "2.3" |
/* Skeleton name. */ |
#define YYSKELETON_NAME "yacc.c" |
/* Pure parsers. */ |
#define YYPURE 0 |
/* Using locations. */ |
#define YYLSP_NEEDED 0 |
/* Tokens. */ |
#ifndef YYTOKENTYPE |
# define YYTOKENTYPE |
/* Put the tokens into the symbol table, so that GDB and other debuggers |
know about them. */ |
enum yytokentype { |
ARITH_NUM = 258, |
ARITH_LPAREN = 259, |
ARITH_RPAREN = 260, |
ARITH_OR = 261, |
ARITH_AND = 262, |
ARITH_BOR = 263, |
ARITH_BXOR = 264, |
ARITH_BAND = 265, |
ARITH_NE = 266, |
ARITH_EQ = 267, |
ARITH_LE = 268, |
ARITH_GE = 269, |
ARITH_GT = 270, |
ARITH_LT = 271, |
ARITH_RSHIFT = 272, |
ARITH_LSHIFT = 273, |
ARITH_SUB = 274, |
ARITH_ADD = 275, |
ARITH_REM = 276, |
ARITH_DIV = 277, |
ARITH_MUL = 278, |
ARITH_BNOT = 279, |
ARITH_NOT = 280, |
ARITH_UNARYPLUS = 281, |
ARITH_UNARYMINUS = 282 |
}; |
#endif |
/* Tokens. */ |
#define ARITH_NUM 258 |
#define ARITH_LPAREN 259 |
#define ARITH_RPAREN 260 |
#define ARITH_OR 261 |
#define ARITH_AND 262 |
#define ARITH_BOR 263 |
#define ARITH_BXOR 264 |
#define ARITH_BAND 265 |
#define ARITH_NE 266 |
#define ARITH_EQ 267 |
#define ARITH_LE 268 |
#define ARITH_GE 269 |
#define ARITH_GT 270 |
#define ARITH_LT 271 |
#define ARITH_RSHIFT 272 |
#define ARITH_LSHIFT 273 |
#define ARITH_SUB 274 |
#define ARITH_ADD 275 |
#define ARITH_REM 276 |
#define ARITH_DIV 277 |
#define ARITH_MUL 278 |
#define ARITH_BNOT 279 |
#define ARITH_NOT 280 |
#define ARITH_UNARYPLUS 281 |
#define ARITH_UNARYMINUS 282 |
/* Copy the first part of user declarations. */ |
#line 1 "arith.y" |
/* $NetBSD: arith.y,v 1.13 1999/07/09 03:05:49 christos Exp $ */ |
/*- |
* Copyright (c) 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Kenneth Almquist. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
*/ |
#include <sys/cdefs.h> |
#ifndef lint |
#if 0 |
static char sccsid[] = "@(#)arith.y 8.3 (Berkeley) 5/4/95"; |
#else |
__RCSID("$NetBSD: arith.y,v 1.13 1999/07/09 03:05:49 christos Exp $"); |
#endif |
#endif /* not lint */ |
#include <stdlib.h> |
#include "expand.h" |
#include "shell.h" |
#include "error.h" |
#include "output.h" |
#include "memalloc.h" |
const char *arith_buf, *arith_startbuf; |
void yyerror (const char *); |
int yyparse (void); |
#ifdef TESTARITH |
int main (int , char *[]); |
int error (char *); |
#endif |
int |
arith(s) |
const char *s; |
{ |
long result; |
arith_buf = arith_startbuf = s; |
INTOFF; |
result = yyparse(); |
arith_lex_reset(); /* reprime lex */ |
INTON; |
return (result); |
} |
/* |
* The exp(1) builtin. |
*/ |
int |
expcmd(argc, argv) |
int argc; |
char **argv; |
{ |
const char *p; |
char *concat; |
char **ap; |
long i; |
if (argc > 1) { |
p = argv[1]; |
if (argc > 2) { |
/* |
* concatenate arguments |
*/ |
STARTSTACKSTR(concat); |
ap = argv + 2; |
for (;;) { |
while (*p) |
STPUTC(*p++, concat); |
if ((p = *ap++) == NULL) |
break; |
STPUTC(' ', concat); |
} |
STPUTC('\0', concat); |
p = grabstackstr(concat); |
} |
} else |
p = ""; |
i = arith(p); |
out1fmt("%ld\n", i); |
return (! i); |
} |
/*************************/ |
#ifdef TEST_ARITH |
#include <stdio.h> |
main(argc, argv) |
char *argv[]; |
{ |
printf("%d\n", exp(argv[1])); |
} |
error(s) |
char *s; |
{ |
fprintf(stderr, "exp: %s\n", s); |
exit(1); |
} |
#endif |
/* Enabling traces. */ |
#ifndef YYDEBUG |
# define YYDEBUG 0 |
#endif |
/* Enabling verbose error messages. */ |
#ifdef YYERROR_VERBOSE |
# undef YYERROR_VERBOSE |
# define YYERROR_VERBOSE 1 |
#else |
# define YYERROR_VERBOSE 0 |
#endif |
/* Enabling the token table. */ |
#ifndef YYTOKEN_TABLE |
# define YYTOKEN_TABLE 0 |
#endif |
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED |
typedef int YYSTYPE; |
# define yystype YYSTYPE /* obsolescent; will be withdrawn */ |
# define YYSTYPE_IS_DECLARED 1 |
# define YYSTYPE_IS_TRIVIAL 1 |
#endif |
/* Copy the second part of user declarations. */ |
/* Line 216 of yacc.c. */ |
#line 298 "y.tab.c" |
#ifdef short |
# undef short |
#endif |
#ifdef YYTYPE_UINT8 |
typedef YYTYPE_UINT8 yytype_uint8; |
#else |
typedef unsigned char yytype_uint8; |
#endif |
#ifdef YYTYPE_INT8 |
typedef YYTYPE_INT8 yytype_int8; |
#elif (defined __STDC__ || defined __C99__FUNC__ \ |
|| defined __cplusplus || defined _MSC_VER) |
typedef signed char yytype_int8; |
#else |
typedef short int yytype_int8; |
#endif |
#ifdef YYTYPE_UINT16 |
typedef YYTYPE_UINT16 yytype_uint16; |
#else |
typedef unsigned short int yytype_uint16; |
#endif |
#ifdef YYTYPE_INT16 |
typedef YYTYPE_INT16 yytype_int16; |
#else |
typedef short int yytype_int16; |
#endif |
#ifndef YYSIZE_T |
# ifdef __SIZE_TYPE__ |
# define YYSIZE_T __SIZE_TYPE__ |
# elif defined size_t |
# define YYSIZE_T size_t |
# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ |
|| defined __cplusplus || defined _MSC_VER) |
# include <stddef.h> /* INFRINGES ON USER NAME SPACE */ |
# define YYSIZE_T size_t |
# else |
# define YYSIZE_T unsigned int |
# endif |
#endif |
#define YYSIZE_MAXIMUM ((YYSIZE_T) -1) |
#ifndef YY_ |
# if YYENABLE_NLS |
# if ENABLE_NLS |
# include <libintl.h> /* INFRINGES ON USER NAME SPACE */ |
# define YY_(msgid) dgettext ("bison-runtime", msgid) |
# endif |
# endif |
# ifndef YY_ |
# define YY_(msgid) msgid |
# endif |
#endif |
/* Suppress unused-variable warnings by "using" E. */ |
#if ! defined lint || defined __GNUC__ |
# define YYUSE(e) ((void) (e)) |
#else |
# define YYUSE(e) /* empty */ |
#endif |
/* Identity function, used to suppress warnings about constant conditions. */ |
#ifndef lint |
# define YYID(n) (n) |
#else |
#if (defined __STDC__ || defined __C99__FUNC__ \ |
|| defined __cplusplus || defined _MSC_VER) |
static int |
YYID (int i) |
#else |
static int |
YYID (i) |
int i; |
#endif |
{ |
return i; |
} |
#endif |
#if ! defined yyoverflow || YYERROR_VERBOSE |
/* The parser invokes alloca or malloc; define the necessary symbols. */ |
# ifdef YYSTACK_USE_ALLOCA |
# if YYSTACK_USE_ALLOCA |
# ifdef __GNUC__ |
# define YYSTACK_ALLOC __builtin_alloca |
# elif defined __BUILTIN_VA_ARG_INCR |
# include <alloca.h> /* INFRINGES ON USER NAME SPACE */ |
# elif defined _AIX |
# define YYSTACK_ALLOC __alloca |
# elif defined _MSC_VER |
# include <malloc.h> /* INFRINGES ON USER NAME SPACE */ |
# define alloca _alloca |
# else |
# define YYSTACK_ALLOC alloca |
# if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ |
|| defined __cplusplus || defined _MSC_VER) |
# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */ |
# ifndef _STDLIB_H |
# define _STDLIB_H 1 |
# endif |
# endif |
# endif |
# endif |
# endif |
# ifdef YYSTACK_ALLOC |
/* Pacify GCC's `empty if-body' warning. */ |
# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) |
# ifndef YYSTACK_ALLOC_MAXIMUM |
/* The OS might guarantee only one guard page at the bottom of the stack, |
and a page size can be as small as 4096 bytes. So we cannot safely |
invoke alloca (N) if N exceeds 4096. Use a slightly smaller number |
to allow for a few compiler-allocated temporary stack slots. */ |
# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ |
# endif |
# else |
# define YYSTACK_ALLOC YYMALLOC |
# define YYSTACK_FREE YYFREE |
# ifndef YYSTACK_ALLOC_MAXIMUM |
# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM |
# endif |
# if (defined __cplusplus && ! defined _STDLIB_H \ |
&& ! ((defined YYMALLOC || defined malloc) \ |
&& (defined YYFREE || defined free))) |
# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */ |
# ifndef _STDLIB_H |
# define _STDLIB_H 1 |
# endif |
# endif |
# ifndef YYMALLOC |
# define YYMALLOC malloc |
# if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ |
|| defined __cplusplus || defined _MSC_VER) |
void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ |
# endif |
# endif |
# ifndef YYFREE |
# define YYFREE free |
# if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ |
|| defined __cplusplus || defined _MSC_VER) |
void free (void *); /* INFRINGES ON USER NAME SPACE */ |
# endif |
# endif |
# endif |
#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ |
#if (! defined yyoverflow \ |
&& (! defined __cplusplus \ |
|| (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) |
/* A type that is properly aligned for any stack member. */ |
union yyalloc |
{ |
yytype_int16 yyss; |
YYSTYPE yyvs; |
}; |
/* The size of the maximum gap between one aligned stack and the next. */ |
# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) |
/* The size of an array large to enough to hold all stacks, each with |
N elements. */ |
# define YYSTACK_BYTES(N) \ |
((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ |
+ YYSTACK_GAP_MAXIMUM) |
/* Copy COUNT objects from FROM to TO. The source and destination do |
not overlap. */ |
# ifndef YYCOPY |
# if defined __GNUC__ && 1 < __GNUC__ |
# define YYCOPY(To, From, Count) \ |
__builtin_memcpy (To, From, (Count) * sizeof (*(From))) |
# else |
# define YYCOPY(To, From, Count) \ |
do \ |
{ \ |
YYSIZE_T yyi; \ |
for (yyi = 0; yyi < (Count); yyi++) \ |
(To)[yyi] = (From)[yyi]; \ |
} \ |
while (YYID (0)) |
# endif |
# endif |
/* Relocate STACK from its old location to the new one. The |
local variables YYSIZE and YYSTACKSIZE give the old and new number of |
elements in the stack, and YYPTR gives the new location of the |
stack. Advance YYPTR to a properly aligned location for the next |
stack. */ |
# define YYSTACK_RELOCATE(Stack) \ |
do \ |
{ \ |
YYSIZE_T yynewbytes; \ |
YYCOPY (&yyptr->Stack, Stack, yysize); \ |
Stack = &yyptr->Stack; \ |
yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ |
yyptr += yynewbytes / sizeof (*yyptr); \ |
} \ |
while (YYID (0)) |
#endif |
/* YYFINAL -- State number of the termination state. */ |
#define YYFINAL 14 |
/* YYLAST -- Last index in YYTABLE. */ |
#define YYLAST 170 |
/* YYNTOKENS -- Number of terminals. */ |
#define YYNTOKENS 28 |
/* YYNNTS -- Number of nonterminals. */ |
#define YYNNTS 3 |
/* YYNRULES -- Number of rules. */ |
#define YYNRULES 26 |
/* YYNRULES -- Number of states. */ |
#define YYNSTATES 52 |
/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ |
#define YYUNDEFTOK 2 |
#define YYMAXUTOK 282 |
#define YYTRANSLATE(YYX) \ |
((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) |
/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ |
static const yytype_uint8 yytranslate[] = |
{ |
0, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
2, 2, 2, 2, 2, 2, 1, 2, 3, 4, |
5, 6, 7, 8, 9, 10, 11, 12, 13, 14, |
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, |
25, 26, 27 |
}; |
#if YYDEBUG |
/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in |
YYRHS. */ |
static const yytype_uint8 yyprhs[] = |
{ |
0, 0, 3, 5, 9, 13, 17, 21, 25, 29, |
33, 37, 41, 45, 49, 53, 57, 61, 65, 69, |
73, 77, 81, 84, 87, 90, 93 |
}; |
/* YYRHS -- A `-1'-separated list of the rules' RHS. */ |
static const yytype_int8 yyrhs[] = |
{ |
29, 0, -1, 30, -1, 4, 30, 5, -1, 30, |
6, 30, -1, 30, 7, 30, -1, 30, 8, 30, |
-1, 30, 9, 30, -1, 30, 10, 30, -1, 30, |
12, 30, -1, 30, 15, 30, -1, 30, 14, 30, |
-1, 30, 16, 30, -1, 30, 13, 30, -1, 30, |
11, 30, -1, 30, 18, 30, -1, 30, 17, 30, |
-1, 30, 20, 30, -1, 30, 19, 30, -1, 30, |
23, 30, -1, 30, 22, 30, -1, 30, 21, 30, |
-1, 25, 30, -1, 24, 30, -1, 19, 30, -1, |
20, 30, -1, 3, -1 |
}; |
/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ |
static const yytype_uint8 yyrline[] = |
{ |
0, 153, 153, 159, 160, 161, 162, 163, 164, 165, |
166, 167, 168, 169, 170, 171, 172, 173, 174, 175, |
176, 181, 186, 187, 188, 189, 190 |
}; |
#endif |
#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE |
/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. |
First, the terminals, then, starting at YYNTOKENS, nonterminals. */ |
static const char *const yytname[] = |
{ |
"$end", "error", "$undefined", "ARITH_NUM", "ARITH_LPAREN", |
"ARITH_RPAREN", "ARITH_OR", "ARITH_AND", "ARITH_BOR", "ARITH_BXOR", |
"ARITH_BAND", "ARITH_NE", "ARITH_EQ", "ARITH_LE", "ARITH_GE", "ARITH_GT", |
"ARITH_LT", "ARITH_RSHIFT", "ARITH_LSHIFT", "ARITH_SUB", "ARITH_ADD", |
"ARITH_REM", "ARITH_DIV", "ARITH_MUL", "ARITH_BNOT", "ARITH_NOT", |
"ARITH_UNARYPLUS", "ARITH_UNARYMINUS", "$accept", "exp", "expr", 0 |
}; |
#endif |
# ifdef YYPRINT |
/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to |
token YYLEX-NUM. */ |
static const yytype_uint16 yytoknum[] = |
{ |
0, 256, 257, 258, 259, 260, 261, 262, 263, 264, |
265, 266, 267, 268, 269, 270, 271, 272, 273, 274, |
275, 276, 277, 278, 279, 280, 281, 282 |
}; |
# endif |
/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ |
static const yytype_uint8 yyr1[] = |
{ |
0, 28, 29, 30, 30, 30, 30, 30, 30, 30, |
30, 30, 30, 30, 30, 30, 30, 30, 30, 30, |
30, 30, 30, 30, 30, 30, 30 |
}; |
/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ |
static const yytype_uint8 yyr2[] = |
{ |
0, 2, 1, 3, 3, 3, 3, 3, 3, 3, |
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, |
3, 3, 2, 2, 2, 2, 1 |
}; |
/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state |
STATE-NUM when YYTABLE doesn't specify something else to do. Zero |
means the default is an error. */ |
static const yytype_uint8 yydefact[] = |
{ |
0, 26, 0, 0, 0, 0, 0, 0, 2, 0, |
24, 25, 23, 22, 1, 0, 0, 0, 0, 0, |
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
0, 0, 0, 3, 4, 5, 6, 7, 8, 14, |
9, 13, 11, 10, 12, 16, 15, 18, 17, 21, |
20, 19 |
}; |
/* YYDEFGOTO[NTERM-NUM]. */ |
static const yytype_int8 yydefgoto[] = |
{ |
-1, 7, 8 |
}; |
/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing |
STATE-NUM. */ |
#define YYPACT_NINF -13 |
static const yytype_int16 yypact[] = |
{ |
28, -13, 28, 28, 28, 28, 28, 12, 67, 49, |
-13, -13, -13, -13, -13, 28, 28, 28, 28, 28, |
28, 28, 28, 28, 28, 28, 28, 28, 28, 28, |
28, 28, 28, -13, 84, 100, 115, 23, 128, 139, |
139, -12, -12, -12, -12, 144, 144, 147, 147, -13, |
-13, -13 |
}; |
/* YYPGOTO[NTERM-NUM]. */ |
static const yytype_int8 yypgoto[] = |
{ |
-13, -13, -2 |
}; |
/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If |
positive, shift that token. If negative, reduce the rule which |
number is the opposite. If zero, do what YYDEFACT says. |
If YYTABLE_NINF, syntax error. */ |
#define YYTABLE_NINF -1 |
static const yytype_uint8 yytable[] = |
{ |
9, 10, 11, 12, 13, 26, 27, 28, 29, 30, |
31, 32, 14, 34, 35, 36, 37, 38, 39, 40, |
41, 42, 43, 44, 45, 46, 47, 48, 49, 50, |
51, 1, 2, 19, 20, 21, 22, 23, 24, 25, |
26, 27, 28, 29, 30, 31, 32, 3, 4, 0, |
0, 0, 5, 6, 33, 15, 16, 17, 18, 19, |
20, 21, 22, 23, 24, 25, 26, 27, 28, 29, |
30, 31, 32, 15, 16, 17, 18, 19, 20, 21, |
22, 23, 24, 25, 26, 27, 28, 29, 30, 31, |
32, 16, 17, 18, 19, 20, 21, 22, 23, 24, |
25, 26, 27, 28, 29, 30, 31, 32, 17, 18, |
19, 20, 21, 22, 23, 24, 25, 26, 27, 28, |
29, 30, 31, 32, 18, 19, 20, 21, 22, 23, |
24, 25, 26, 27, 28, 29, 30, 31, 32, 20, |
21, 22, 23, 24, 25, 26, 27, 28, 29, 30, |
31, 32, 22, 23, 24, 25, 26, 27, 28, 29, |
30, 31, 32, 28, 29, 30, 31, 32, 30, 31, |
32 |
}; |
static const yytype_int8 yycheck[] = |
{ |
2, 3, 4, 5, 6, 17, 18, 19, 20, 21, |
22, 23, 0, 15, 16, 17, 18, 19, 20, 21, |
22, 23, 24, 25, 26, 27, 28, 29, 30, 31, |
32, 3, 4, 10, 11, 12, 13, 14, 15, 16, |
17, 18, 19, 20, 21, 22, 23, 19, 20, -1, |
-1, -1, 24, 25, 5, 6, 7, 8, 9, 10, |
11, 12, 13, 14, 15, 16, 17, 18, 19, 20, |
21, 22, 23, 6, 7, 8, 9, 10, 11, 12, |
13, 14, 15, 16, 17, 18, 19, 20, 21, 22, |
23, 7, 8, 9, 10, 11, 12, 13, 14, 15, |
16, 17, 18, 19, 20, 21, 22, 23, 8, 9, |
10, 11, 12, 13, 14, 15, 16, 17, 18, 19, |
20, 21, 22, 23, 9, 10, 11, 12, 13, 14, |
15, 16, 17, 18, 19, 20, 21, 22, 23, 11, |
12, 13, 14, 15, 16, 17, 18, 19, 20, 21, |
22, 23, 13, 14, 15, 16, 17, 18, 19, 20, |
21, 22, 23, 19, 20, 21, 22, 23, 21, 22, |
23 |
}; |
/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing |
symbol of state STATE-NUM. */ |
static const yytype_uint8 yystos[] = |
{ |
0, 3, 4, 19, 20, 24, 25, 29, 30, 30, |
30, 30, 30, 30, 0, 6, 7, 8, 9, 10, |
11, 12, 13, 14, 15, 16, 17, 18, 19, 20, |
21, 22, 23, 5, 30, 30, 30, 30, 30, 30, |
30, 30, 30, 30, 30, 30, 30, 30, 30, 30, |
30, 30 |
}; |
#define yyerrok (yyerrstatus = 0) |
#define yyclearin (yychar = YYEMPTY) |
#define YYEMPTY (-2) |
#define YYEOF 0 |
#define YYACCEPT goto yyacceptlab |
#define YYABORT goto yyabortlab |
#define YYERROR goto yyerrorlab |
/* Like YYERROR except do call yyerror. This remains here temporarily |
to ease the transition to the new meaning of YYERROR, for GCC. |
Once GCC version 2 has supplanted version 1, this can go. */ |
#define YYFAIL goto yyerrlab |
#define YYRECOVERING() (!!yyerrstatus) |
#define YYBACKUP(Token, Value) \ |
do \ |
if (yychar == YYEMPTY && yylen == 1) \ |
{ \ |
yychar = (Token); \ |
yylval = (Value); \ |
yytoken = YYTRANSLATE (yychar); \ |
YYPOPSTACK (1); \ |
goto yybackup; \ |
} \ |
else \ |
{ \ |
yyerror (YY_("syntax error: cannot back up")); \ |
YYERROR; \ |
} \ |
while (YYID (0)) |
#define YYTERROR 1 |
#define YYERRCODE 256 |
/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. |
If N is 0, then set CURRENT to the empty location which ends |
the previous symbol: RHS[0] (always defined). */ |
#define YYRHSLOC(Rhs, K) ((Rhs)[K]) |
#ifndef YYLLOC_DEFAULT |
# define YYLLOC_DEFAULT(Current, Rhs, N) \ |
do \ |
if (YYID (N)) \ |
{ \ |
(Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ |
(Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ |
(Current).last_line = YYRHSLOC (Rhs, N).last_line; \ |
(Current).last_column = YYRHSLOC (Rhs, N).last_column; \ |
} \ |
else \ |
{ \ |
(Current).first_line = (Current).last_line = \ |
YYRHSLOC (Rhs, 0).last_line; \ |
(Current).first_column = (Current).last_column = \ |
YYRHSLOC (Rhs, 0).last_column; \ |
} \ |
while (YYID (0)) |
#endif |
/* YY_LOCATION_PRINT -- Print the location on the stream. |
This macro was not mandated originally: define only if we know |
we won't break user code: when these are the locations we know. */ |
#ifndef YY_LOCATION_PRINT |
# if YYLTYPE_IS_TRIVIAL |
# define YY_LOCATION_PRINT(File, Loc) \ |
fprintf (File, "%d.%d-%d.%d", \ |
(Loc).first_line, (Loc).first_column, \ |
(Loc).last_line, (Loc).last_column) |
# else |
# define YY_LOCATION_PRINT(File, Loc) ((void) 0) |
# endif |
#endif |
/* YYLEX -- calling `yylex' with the right arguments. */ |
#ifdef YYLEX_PARAM |
# define YYLEX yylex (YYLEX_PARAM) |
#else |
# define YYLEX yylex () |
#endif |
/* Enable debugging if requested. */ |
#if YYDEBUG |
# ifndef YYFPRINTF |
# include <stdio.h> /* INFRINGES ON USER NAME SPACE */ |
# define YYFPRINTF fprintf |
# endif |
# define YYDPRINTF(Args) \ |
do { \ |
if (yydebug) \ |
YYFPRINTF Args; \ |
} while (YYID (0)) |
# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ |
do { \ |
if (yydebug) \ |
{ \ |
YYFPRINTF (stderr, "%s ", Title); \ |
yy_symbol_print (stderr, \ |
Type, Value); \ |
YYFPRINTF (stderr, "\n"); \ |
} \ |
} while (YYID (0)) |
/*--------------------------------. |
| Print this symbol on YYOUTPUT. | |
`--------------------------------*/ |
/*ARGSUSED*/ |
#if (defined __STDC__ || defined __C99__FUNC__ \ |
|| defined __cplusplus || defined _MSC_VER) |
static void |
yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) |
#else |
static void |
yy_symbol_value_print (yyoutput, yytype, yyvaluep) |
FILE *yyoutput; |
int yytype; |
YYSTYPE const * const yyvaluep; |
#endif |
{ |
if (!yyvaluep) |
return; |
# ifdef YYPRINT |
if (yytype < YYNTOKENS) |
YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); |
# else |
YYUSE (yyoutput); |
# endif |
switch (yytype) |
{ |
default: |
break; |
} |
} |
/*--------------------------------. |
| Print this symbol on YYOUTPUT. | |
`--------------------------------*/ |
#if (defined __STDC__ || defined __C99__FUNC__ \ |
|| defined __cplusplus || defined _MSC_VER) |
static void |
yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) |
#else |
static void |
yy_symbol_print (yyoutput, yytype, yyvaluep) |
FILE *yyoutput; |
int yytype; |
YYSTYPE const * const yyvaluep; |
#endif |
{ |
if (yytype < YYNTOKENS) |
YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); |
else |
YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); |
yy_symbol_value_print (yyoutput, yytype, yyvaluep); |
YYFPRINTF (yyoutput, ")"); |
} |
/*------------------------------------------------------------------. |
| yy_stack_print -- Print the state stack from its BOTTOM up to its | |
| TOP (included). | |
`------------------------------------------------------------------*/ |
#if (defined __STDC__ || defined __C99__FUNC__ \ |
|| defined __cplusplus || defined _MSC_VER) |
static void |
yy_stack_print (yytype_int16 *bottom, yytype_int16 *top) |
#else |
static void |
yy_stack_print (bottom, top) |
yytype_int16 *bottom; |
yytype_int16 *top; |
#endif |
{ |
YYFPRINTF (stderr, "Stack now"); |
for (; bottom <= top; ++bottom) |
YYFPRINTF (stderr, " %d", *bottom); |
YYFPRINTF (stderr, "\n"); |
} |
# define YY_STACK_PRINT(Bottom, Top) \ |
do { \ |
if (yydebug) \ |
yy_stack_print ((Bottom), (Top)); \ |
} while (YYID (0)) |
/*------------------------------------------------. |
| Report that the YYRULE is going to be reduced. | |
`------------------------------------------------*/ |
#if (defined __STDC__ || defined __C99__FUNC__ \ |
|| defined __cplusplus || defined _MSC_VER) |
static void |
yy_reduce_print (YYSTYPE *yyvsp, int yyrule) |
#else |
static void |
yy_reduce_print (yyvsp, yyrule) |
YYSTYPE *yyvsp; |
int yyrule; |
#endif |
{ |
int yynrhs = yyr2[yyrule]; |
int yyi; |
unsigned long int yylno = yyrline[yyrule]; |
YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", |
yyrule - 1, yylno); |
/* The symbols being reduced. */ |
for (yyi = 0; yyi < yynrhs; yyi++) |
{ |
fprintf (stderr, " $%d = ", yyi + 1); |
yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], |
&(yyvsp[(yyi + 1) - (yynrhs)]) |
); |
fprintf (stderr, "\n"); |
} |
} |
# define YY_REDUCE_PRINT(Rule) \ |
do { \ |
if (yydebug) \ |
yy_reduce_print (yyvsp, Rule); \ |
} while (YYID (0)) |
/* Nonzero means print parse trace. It is left uninitialized so that |
multiple parsers can coexist. */ |
int yydebug; |
#else /* !YYDEBUG */ |
# define YYDPRINTF(Args) |
# define YY_SYMBOL_PRINT(Title, Type, Value, Location) |
# define YY_STACK_PRINT(Bottom, Top) |
# define YY_REDUCE_PRINT(Rule) |
#endif /* !YYDEBUG */ |
/* YYINITDEPTH -- initial size of the parser's stacks. */ |
#ifndef YYINITDEPTH |
# define YYINITDEPTH 200 |
#endif |
/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only |
if the built-in stack extension method is used). |
Do not make this value too large; the results are undefined if |
YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) |
evaluated with infinite-precision integer arithmetic. */ |
#ifndef YYMAXDEPTH |
# define YYMAXDEPTH 10000 |
#endif |
#if YYERROR_VERBOSE |
# ifndef yystrlen |
# if defined __GLIBC__ && defined _STRING_H |
# define yystrlen strlen |
# else |
/* Return the length of YYSTR. */ |
#if (defined __STDC__ || defined __C99__FUNC__ \ |
|| defined __cplusplus || defined _MSC_VER) |
static YYSIZE_T |
yystrlen (const char *yystr) |
#else |
static YYSIZE_T |
yystrlen (yystr) |
const char *yystr; |
#endif |
{ |
YYSIZE_T yylen; |
for (yylen = 0; yystr[yylen]; yylen++) |
continue; |
return yylen; |
} |
# endif |
# endif |
# ifndef yystpcpy |
# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE |
# define yystpcpy stpcpy |
# else |
/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in |
YYDEST. */ |
#if (defined __STDC__ || defined __C99__FUNC__ \ |
|| defined __cplusplus || defined _MSC_VER) |
static char * |
yystpcpy (char *yydest, const char *yysrc) |
#else |
static char * |
yystpcpy (yydest, yysrc) |
char *yydest; |
const char *yysrc; |
#endif |
{ |
char *yyd = yydest; |
const char *yys = yysrc; |
while ((*yyd++ = *yys++) != '\0') |
continue; |
return yyd - 1; |
} |
# endif |
# endif |
# ifndef yytnamerr |
/* Copy to YYRES the contents of YYSTR after stripping away unnecessary |
quotes and backslashes, so that it's suitable for yyerror. The |
heuristic is that double-quoting is unnecessary unless the string |
contains an apostrophe, a comma, or backslash (other than |
backslash-backslash). YYSTR is taken from yytname. If YYRES is |
null, do not copy; instead, return the length of what the result |
would have been. */ |
static YYSIZE_T |
yytnamerr (char *yyres, const char *yystr) |
{ |
if (*yystr == '"') |
{ |
YYSIZE_T yyn = 0; |
char const *yyp = yystr; |
for (;;) |
switch (*++yyp) |
{ |
case '\'': |
case ',': |
goto do_not_strip_quotes; |
case '\\': |
if (*++yyp != '\\') |
goto do_not_strip_quotes; |
/* Fall through. */ |
default: |
if (yyres) |
yyres[yyn] = *yyp; |
yyn++; |
break; |
case '"': |
if (yyres) |
yyres[yyn] = '\0'; |
return yyn; |
} |
do_not_strip_quotes: ; |
} |
if (! yyres) |
return yystrlen (yystr); |
return yystpcpy (yyres, yystr) - yyres; |
} |
# endif |
/* Copy into YYRESULT an error message about the unexpected token |
YYCHAR while in state YYSTATE. Return the number of bytes copied, |
including the terminating null byte. If YYRESULT is null, do not |
copy anything; just return the number of bytes that would be |
copied. As a special case, return 0 if an ordinary "syntax error" |
message will do. Return YYSIZE_MAXIMUM if overflow occurs during |
size calculation. */ |
static YYSIZE_T |
yysyntax_error (char *yyresult, int yystate, int yychar) |
{ |
int yyn = yypact[yystate]; |
if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) |
return 0; |
else |
{ |
int yytype = YYTRANSLATE (yychar); |
YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); |
YYSIZE_T yysize = yysize0; |
YYSIZE_T yysize1; |
int yysize_overflow = 0; |
enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; |
char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; |
int yyx; |
# if 0 |
/* This is so xgettext sees the translatable formats that are |
constructed on the fly. */ |
YY_("syntax error, unexpected %s"); |
YY_("syntax error, unexpected %s, expecting %s"); |
YY_("syntax error, unexpected %s, expecting %s or %s"); |
YY_("syntax error, unexpected %s, expecting %s or %s or %s"); |
YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); |
# endif |
char *yyfmt; |
char const *yyf; |
static char const yyunexpected[] = "syntax error, unexpected %s"; |
static char const yyexpecting[] = ", expecting %s"; |
static char const yyor[] = " or %s"; |
char yyformat[sizeof yyunexpected |
+ sizeof yyexpecting - 1 |
+ ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) |
* (sizeof yyor - 1))]; |
char const *yyprefix = yyexpecting; |
/* Start YYX at -YYN if negative to avoid negative indexes in |
YYCHECK. */ |
int yyxbegin = yyn < 0 ? -yyn : 0; |
/* Stay within bounds of both yycheck and yytname. */ |
int yychecklim = YYLAST - yyn + 1; |
int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; |
int yycount = 1; |
yyarg[0] = yytname[yytype]; |
yyfmt = yystpcpy (yyformat, yyunexpected); |
for (yyx = yyxbegin; yyx < yyxend; ++yyx) |
if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) |
{ |
if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) |
{ |
yycount = 1; |
yysize = yysize0; |
yyformat[sizeof yyunexpected - 1] = '\0'; |
break; |
} |
yyarg[yycount++] = yytname[yyx]; |
yysize1 = yysize + yytnamerr (0, yytname[yyx]); |
yysize_overflow |= (yysize1 < yysize); |
yysize = yysize1; |
yyfmt = yystpcpy (yyfmt, yyprefix); |
yyprefix = yyor; |
} |
yyf = YY_(yyformat); |
yysize1 = yysize + yystrlen (yyf); |
yysize_overflow |= (yysize1 < yysize); |
yysize = yysize1; |
if (yysize_overflow) |
return YYSIZE_MAXIMUM; |
if (yyresult) |
{ |
/* Avoid sprintf, as that infringes on the user's name space. |
Don't have undefined behavior even if the translation |
produced a string with the wrong number of "%s"s. */ |
char *yyp = yyresult; |
int yyi = 0; |
while ((*yyp = *yyf) != '\0') |
{ |
if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) |
{ |
yyp += yytnamerr (yyp, yyarg[yyi++]); |
yyf += 2; |
} |
else |
{ |
yyp++; |
yyf++; |
} |
} |
} |
return yysize; |
} |
} |
#endif /* YYERROR_VERBOSE */ |
/*-----------------------------------------------. |
| Release the memory associated to this symbol. | |
`-----------------------------------------------*/ |
/*ARGSUSED*/ |
#if (defined __STDC__ || defined __C99__FUNC__ \ |
|| defined __cplusplus || defined _MSC_VER) |
static void |
yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) |
#else |
static void |
yydestruct (yymsg, yytype, yyvaluep) |
const char *yymsg; |
int yytype; |
YYSTYPE *yyvaluep; |
#endif |
{ |
YYUSE (yyvaluep); |
if (!yymsg) |
yymsg = "Deleting"; |
YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); |
switch (yytype) |
{ |
default: |
break; |
} |
} |
/* Prevent warnings from -Wmissing-prototypes. */ |
#ifdef YYPARSE_PARAM |
#if defined __STDC__ || defined __cplusplus |
int yyparse (void *YYPARSE_PARAM); |
#else |
int yyparse (); |
#endif |
#else /* ! YYPARSE_PARAM */ |
#if defined __STDC__ || defined __cplusplus |
int yyparse (void); |
#else |
int yyparse (); |
#endif |
#endif /* ! YYPARSE_PARAM */ |
/* The look-ahead symbol. */ |
int yychar; |
/* The semantic value of the look-ahead symbol. */ |
YYSTYPE yylval; |
/* Number of syntax errors so far. */ |
int yynerrs; |
/*----------. |
| yyparse. | |
`----------*/ |
#ifdef YYPARSE_PARAM |
#if (defined __STDC__ || defined __C99__FUNC__ \ |
|| defined __cplusplus || defined _MSC_VER) |
int |
yyparse (void *YYPARSE_PARAM) |
#else |
int |
yyparse (YYPARSE_PARAM) |
void *YYPARSE_PARAM; |
#endif |
#else /* ! YYPARSE_PARAM */ |
#if (defined __STDC__ || defined __C99__FUNC__ \ |
|| defined __cplusplus || defined _MSC_VER) |
int |
yyparse (void) |
#else |
int |
yyparse () |
#endif |
#endif |
{ |
int yystate; |
int yyn; |
int yyresult; |
/* Number of tokens to shift before error messages enabled. */ |
int yyerrstatus; |
/* Look-ahead token as an internal (translated) token number. */ |
int yytoken = 0; |
#if YYERROR_VERBOSE |
/* Buffer for error messages, and its allocated size. */ |
char yymsgbuf[128]; |
char *yymsg = yymsgbuf; |
YYSIZE_T yymsg_alloc = sizeof yymsgbuf; |
#endif |
/* Three stacks and their tools: |
`yyss': related to states, |
`yyvs': related to semantic values, |
`yyls': related to locations. |
Refer to the stacks thru separate pointers, to allow yyoverflow |
to reallocate them elsewhere. */ |
/* The state stack. */ |
yytype_int16 yyssa[YYINITDEPTH]; |
yytype_int16 *yyss = yyssa; |
yytype_int16 *yyssp; |
/* The semantic value stack. */ |
YYSTYPE yyvsa[YYINITDEPTH]; |
YYSTYPE *yyvs = yyvsa; |
YYSTYPE *yyvsp; |
#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) |
YYSIZE_T yystacksize = YYINITDEPTH; |
/* The variables used to return semantic value and location from the |
action routines. */ |
YYSTYPE yyval; |
/* The number of symbols on the RHS of the reduced rule. |
Keep to zero when no symbol should be popped. */ |
int yylen = 0; |
YYDPRINTF ((stderr, "Starting parse\n")); |
yystate = 0; |
yyerrstatus = 0; |
yynerrs = 0; |
yychar = YYEMPTY; /* Cause a token to be read. */ |
/* Initialize stack pointers. |
Waste one element of value and location stack |
so that they stay on the same level as the state stack. |
The wasted elements are never initialized. */ |
yyssp = yyss; |
yyvsp = yyvs; |
goto yysetstate; |
/*------------------------------------------------------------. |
| yynewstate -- Push a new state, which is found in yystate. | |
`------------------------------------------------------------*/ |
yynewstate: |
/* In all cases, when you get here, the value and location stacks |
have just been pushed. So pushing a state here evens the stacks. */ |
yyssp++; |
yysetstate: |
*yyssp = yystate; |
if (yyss + yystacksize - 1 <= yyssp) |
{ |
/* Get the current used size of the three stacks, in elements. */ |
YYSIZE_T yysize = yyssp - yyss + 1; |
#ifdef yyoverflow |
{ |
/* Give user a chance to reallocate the stack. Use copies of |
these so that the &'s don't force the real ones into |
memory. */ |
YYSTYPE *yyvs1 = yyvs; |
yytype_int16 *yyss1 = yyss; |
/* Each stack pointer address is followed by the size of the |
data in use in that stack, in bytes. This used to be a |
conditional around just the two extra args, but that might |
be undefined if yyoverflow is a macro. */ |
yyoverflow (YY_("memory exhausted"), |
&yyss1, yysize * sizeof (*yyssp), |
&yyvs1, yysize * sizeof (*yyvsp), |
&yystacksize); |
yyss = yyss1; |
yyvs = yyvs1; |
} |
#else /* no yyoverflow */ |
# ifndef YYSTACK_RELOCATE |
goto yyexhaustedlab; |
# else |
/* Extend the stack our own way. */ |
if (YYMAXDEPTH <= yystacksize) |
goto yyexhaustedlab; |
yystacksize *= 2; |
if (YYMAXDEPTH < yystacksize) |
yystacksize = YYMAXDEPTH; |
{ |
yytype_int16 *yyss1 = yyss; |
union yyalloc *yyptr = |
(union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); |
if (! yyptr) |
goto yyexhaustedlab; |
YYSTACK_RELOCATE (yyss); |
YYSTACK_RELOCATE (yyvs); |
# undef YYSTACK_RELOCATE |
if (yyss1 != yyssa) |
YYSTACK_FREE (yyss1); |
} |
# endif |
#endif /* no yyoverflow */ |
yyssp = yyss + yysize - 1; |
yyvsp = yyvs + yysize - 1; |
YYDPRINTF ((stderr, "Stack size increased to %lu\n", |
(unsigned long int) yystacksize)); |
if (yyss + yystacksize - 1 <= yyssp) |
YYABORT; |
} |
YYDPRINTF ((stderr, "Entering state %d\n", yystate)); |
goto yybackup; |
/*-----------. |
| yybackup. | |
`-----------*/ |
yybackup: |
/* Do appropriate processing given the current state. Read a |
look-ahead token if we need one and don't already have one. */ |
/* First try to decide what to do without reference to look-ahead token. */ |
yyn = yypact[yystate]; |
if (yyn == YYPACT_NINF) |
goto yydefault; |
/* Not known => get a look-ahead token if don't already have one. */ |
/* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ |
if (yychar == YYEMPTY) |
{ |
YYDPRINTF ((stderr, "Reading a token: ")); |
yychar = YYLEX; |
} |
if (yychar <= YYEOF) |
{ |
yychar = yytoken = YYEOF; |
YYDPRINTF ((stderr, "Now at end of input.\n")); |
} |
else |
{ |
yytoken = YYTRANSLATE (yychar); |
YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); |
} |
/* If the proper action on seeing token YYTOKEN is to reduce or to |
detect an error, take that action. */ |
yyn += yytoken; |
if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) |
goto yydefault; |
yyn = yytable[yyn]; |
if (yyn <= 0) |
{ |
if (yyn == 0 || yyn == YYTABLE_NINF) |
goto yyerrlab; |
yyn = -yyn; |
goto yyreduce; |
} |
if (yyn == YYFINAL) |
YYACCEPT; |
/* Count tokens shifted since error; after three, turn off error |
status. */ |
if (yyerrstatus) |
yyerrstatus--; |
/* Shift the look-ahead token. */ |
YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); |
/* Discard the shifted token unless it is eof. */ |
if (yychar != YYEOF) |
yychar = YYEMPTY; |
yystate = yyn; |
*++yyvsp = yylval; |
goto yynewstate; |
/*-----------------------------------------------------------. |
| yydefault -- do the default action for the current state. | |
`-----------------------------------------------------------*/ |
yydefault: |
yyn = yydefact[yystate]; |
if (yyn == 0) |
goto yyerrlab; |
goto yyreduce; |
/*-----------------------------. |
| yyreduce -- Do a reduction. | |
`-----------------------------*/ |
yyreduce: |
/* yyn is the number of a rule to reduce with. */ |
yylen = yyr2[yyn]; |
/* If YYLEN is nonzero, implement the default value of the action: |
`$$ = $1'. |
Otherwise, the following line sets YYVAL to garbage. |
This behavior is undocumented and Bison |
users should not rely upon it. Assigning to YYVAL |
unconditionally makes the parser a bit smaller, and it avoids a |
GCC warning that YYVAL may be used uninitialized. */ |
yyval = yyvsp[1-yylen]; |
YY_REDUCE_PRINT (yyn); |
switch (yyn) |
{ |
case 2: |
#line 153 "arith.y" |
{ |
return ((yyvsp[(1) - (1)])); |
} |
break; |
case 3: |
#line 159 "arith.y" |
{ (yyval) = (yyvsp[(2) - (3)]); } |
break; |
case 4: |
#line 160 "arith.y" |
{ (yyval) = (yyvsp[(1) - (3)]) ? (yyvsp[(1) - (3)]) : (yyvsp[(3) - (3)]) ? (yyvsp[(3) - (3)]) : 0; } |
break; |
case 5: |
#line 161 "arith.y" |
{ (yyval) = (yyvsp[(1) - (3)]) ? ( (yyvsp[(3) - (3)]) ? (yyvsp[(3) - (3)]) : 0 ) : 0; } |
break; |
case 6: |
#line 162 "arith.y" |
{ (yyval) = (yyvsp[(1) - (3)]) | (yyvsp[(3) - (3)]); } |
break; |
case 7: |
#line 163 "arith.y" |
{ (yyval) = (yyvsp[(1) - (3)]) ^ (yyvsp[(3) - (3)]); } |
break; |
case 8: |
#line 164 "arith.y" |
{ (yyval) = (yyvsp[(1) - (3)]) & (yyvsp[(3) - (3)]); } |
break; |
case 9: |
#line 165 "arith.y" |
{ (yyval) = (yyvsp[(1) - (3)]) == (yyvsp[(3) - (3)]); } |
break; |
case 10: |
#line 166 "arith.y" |
{ (yyval) = (yyvsp[(1) - (3)]) > (yyvsp[(3) - (3)]); } |
break; |
case 11: |
#line 167 "arith.y" |
{ (yyval) = (yyvsp[(1) - (3)]) >= (yyvsp[(3) - (3)]); } |
break; |
case 12: |
#line 168 "arith.y" |
{ (yyval) = (yyvsp[(1) - (3)]) < (yyvsp[(3) - (3)]); } |
break; |
case 13: |
#line 169 "arith.y" |
{ (yyval) = (yyvsp[(1) - (3)]) <= (yyvsp[(3) - (3)]); } |
break; |
case 14: |
#line 170 "arith.y" |
{ (yyval) = (yyvsp[(1) - (3)]) != (yyvsp[(3) - (3)]); } |
break; |
case 15: |
#line 171 "arith.y" |
{ (yyval) = (yyvsp[(1) - (3)]) << (yyvsp[(3) - (3)]); } |
break; |
case 16: |
#line 172 "arith.y" |
{ (yyval) = (yyvsp[(1) - (3)]) >> (yyvsp[(3) - (3)]); } |
break; |
case 17: |
#line 173 "arith.y" |
{ (yyval) = (yyvsp[(1) - (3)]) + (yyvsp[(3) - (3)]); } |
break; |
case 18: |
#line 174 "arith.y" |
{ (yyval) = (yyvsp[(1) - (3)]) - (yyvsp[(3) - (3)]); } |
break; |
case 19: |
#line 175 "arith.y" |
{ (yyval) = (yyvsp[(1) - (3)]) * (yyvsp[(3) - (3)]); } |
break; |
case 20: |
#line 176 "arith.y" |
{ |
if ((yyvsp[(3) - (3)]) == 0) |
yyerror("division by zero"); |
(yyval) = (yyvsp[(1) - (3)]) / (yyvsp[(3) - (3)]); |
} |
break; |
case 21: |
#line 181 "arith.y" |
{ |
if ((yyvsp[(3) - (3)]) == 0) |
yyerror("division by zero"); |
(yyval) = (yyvsp[(1) - (3)]) % (yyvsp[(3) - (3)]); |
} |
break; |
case 22: |
#line 186 "arith.y" |
{ (yyval) = !((yyvsp[(2) - (2)])); } |
break; |
case 23: |
#line 187 "arith.y" |
{ (yyval) = ~((yyvsp[(2) - (2)])); } |
break; |
case 24: |
#line 188 "arith.y" |
{ (yyval) = -((yyvsp[(2) - (2)])); } |
break; |
case 25: |
#line 189 "arith.y" |
{ (yyval) = (yyvsp[(2) - (2)]); } |
break; |
/* Line 1267 of yacc.c. */ |
#line 1682 "y.tab.c" |
default: break; |
} |
YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); |
YYPOPSTACK (yylen); |
yylen = 0; |
YY_STACK_PRINT (yyss, yyssp); |
*++yyvsp = yyval; |
/* Now `shift' the result of the reduction. Determine what state |
that goes to, based on the state we popped back to and the rule |
number reduced by. */ |
yyn = yyr1[yyn]; |
yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; |
if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) |
yystate = yytable[yystate]; |
else |
yystate = yydefgoto[yyn - YYNTOKENS]; |
goto yynewstate; |
/*------------------------------------. |
| yyerrlab -- here on detecting error | |
`------------------------------------*/ |
yyerrlab: |
/* If not already recovering from an error, report this error. */ |
if (!yyerrstatus) |
{ |
++yynerrs; |
#if ! YYERROR_VERBOSE |
yyerror (YY_("syntax error")); |
#else |
{ |
YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); |
if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) |
{ |
YYSIZE_T yyalloc = 2 * yysize; |
if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) |
yyalloc = YYSTACK_ALLOC_MAXIMUM; |
if (yymsg != yymsgbuf) |
YYSTACK_FREE (yymsg); |
yymsg = (char *) YYSTACK_ALLOC (yyalloc); |
if (yymsg) |
yymsg_alloc = yyalloc; |
else |
{ |
yymsg = yymsgbuf; |
yymsg_alloc = sizeof yymsgbuf; |
} |
} |
if (0 < yysize && yysize <= yymsg_alloc) |
{ |
(void) yysyntax_error (yymsg, yystate, yychar); |
yyerror (yymsg); |
} |
else |
{ |
yyerror (YY_("syntax error")); |
if (yysize != 0) |
goto yyexhaustedlab; |
} |
} |
#endif |
} |
if (yyerrstatus == 3) |
{ |
/* If just tried and failed to reuse look-ahead token after an |
error, discard it. */ |
if (yychar <= YYEOF) |
{ |
/* Return failure if at end of input. */ |
if (yychar == YYEOF) |
YYABORT; |
} |
else |
{ |
yydestruct ("Error: discarding", |
yytoken, &yylval); |
yychar = YYEMPTY; |
} |
} |
/* Else will try to reuse look-ahead token after shifting the error |
token. */ |
goto yyerrlab1; |
/*---------------------------------------------------. |
| yyerrorlab -- error raised explicitly by YYERROR. | |
`---------------------------------------------------*/ |
yyerrorlab: |
/* Pacify compilers like GCC when the user code never invokes |
YYERROR and the label yyerrorlab therefore never appears in user |
code. */ |
if (/*CONSTCOND*/ 0) |
goto yyerrorlab; |
/* Do not reclaim the symbols of the rule which action triggered |
this YYERROR. */ |
YYPOPSTACK (yylen); |
yylen = 0; |
YY_STACK_PRINT (yyss, yyssp); |
yystate = *yyssp; |
goto yyerrlab1; |
/*-------------------------------------------------------------. |
| yyerrlab1 -- common code for both syntax error and YYERROR. | |
`-------------------------------------------------------------*/ |
yyerrlab1: |
yyerrstatus = 3; /* Each real token shifted decrements this. */ |
for (;;) |
{ |
yyn = yypact[yystate]; |
if (yyn != YYPACT_NINF) |
{ |
yyn += YYTERROR; |
if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) |
{ |
yyn = yytable[yyn]; |
if (0 < yyn) |
break; |
} |
} |
/* Pop the current state because it cannot handle the error token. */ |
if (yyssp == yyss) |
YYABORT; |
yydestruct ("Error: popping", |
yystos[yystate], yyvsp); |
YYPOPSTACK (1); |
yystate = *yyssp; |
YY_STACK_PRINT (yyss, yyssp); |
} |
if (yyn == YYFINAL) |
YYACCEPT; |
*++yyvsp = yylval; |
/* Shift the error token. */ |
YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); |
yystate = yyn; |
goto yynewstate; |
/*-------------------------------------. |
| yyacceptlab -- YYACCEPT comes here. | |
`-------------------------------------*/ |
yyacceptlab: |
yyresult = 0; |
goto yyreturn; |
/*-----------------------------------. |
| yyabortlab -- YYABORT comes here. | |
`-----------------------------------*/ |
yyabortlab: |
yyresult = 1; |
goto yyreturn; |
#ifndef yyoverflow |
/*-------------------------------------------------. |
| yyexhaustedlab -- memory exhaustion comes here. | |
`-------------------------------------------------*/ |
yyexhaustedlab: |
yyerror (YY_("memory exhausted")); |
yyresult = 2; |
/* Fall through. */ |
#endif |
yyreturn: |
if (yychar != YYEOF && yychar != YYEMPTY) |
yydestruct ("Cleanup: discarding lookahead", |
yytoken, &yylval); |
/* Do not reclaim the symbols of the rule which action triggered |
this YYABORT or YYACCEPT. */ |
YYPOPSTACK (yylen); |
YY_STACK_PRINT (yyss, yyssp); |
while (yyssp != yyss) |
{ |
yydestruct ("Cleanup: popping", |
yystos[*yyssp], yyvsp); |
YYPOPSTACK (1); |
} |
#ifndef yyoverflow |
if (yyss != yyssa) |
YYSTACK_FREE (yyss); |
#endif |
#if YYERROR_VERBOSE |
if (yymsg != yymsgbuf) |
YYSTACK_FREE (yymsg); |
#endif |
/* Make sure YYID is used. */ |
return YYID (yyresult); |
} |
#line 192 "arith.y" |
void |
yyerror(s) |
const char *s; |
{ |
yyclearin; |
arith_lex_reset(); /* reprime lex */ |
error("arithmetic expression: %s: \"%s\"", s, arith_startbuf); |
/* NOTREACHED */ |
} |
/tags/0.3.0/uspace/app/ash/redir.h |
---|
0,0 → 1,53 |
/* $NetBSD: redir.h,v 1.12 2000/05/22 10:18:47 elric Exp $ */ |
/*- |
* Copyright (c) 1991, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Kenneth Almquist. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
* |
* @(#)redir.h 8.2 (Berkeley) 5/4/95 |
*/ |
/* flags passed to redirect */ |
#define REDIR_PUSH 01 /* save previous values of file descriptors */ |
#define REDIR_BACKQ 02 /* save the command output in memory */ |
extern int fd2; |
union node; |
void redirect (union node *, int); |
void popredir (void); |
int fd0_redirected_p (void); |
void clearredir (void); |
int copyfd (int, int); |
/tags/0.3.0/uspace/app/ash/trap.h |
---|
0,0 → 1,51 |
/* $NetBSD: trap.h,v 1.14 2000/05/22 10:18:47 elric Exp $ */ |
/*- |
* Copyright (c) 1991, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Kenneth Almquist. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
* |
* @(#)trap.h 8.3 (Berkeley) 6/5/95 |
*/ |
extern int pendingsigs; |
int trapcmd (int, char **); |
void clear_traps (void); |
void setsignal (int); |
void ignoresig (int); |
void onsig (int); |
void dotrap (void); |
void setinteractive (int); |
void exitshell (int) __attribute__((noreturn)); |
int decode_signal (const char *); |
/tags/0.3.0/uspace/app/ash/arith.h |
---|
0,0 → 1,107 |
/* A Bison parser, made by GNU Bison 2.3. */ |
/* Skeleton interface for Bison's Yacc-like parsers in C |
Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 |
Free Software Foundation, Inc. |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 2, or (at your option) |
any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 51 Franklin Street, Fifth Floor, |
Boston, MA 02110-1301, USA. */ |
/* As a special exception, you may create a larger work that contains |
part or all of the Bison parser skeleton and distribute that work |
under terms of your choice, so long as that work isn't itself a |
parser generator using the skeleton or a modified version thereof |
as a parser skeleton. Alternatively, if you modify or redistribute |
the parser skeleton itself, you may (at your option) remove this |
special exception, which will cause the skeleton and the resulting |
Bison output files to be licensed under the GNU General Public |
License without this special exception. |
This special exception was added by the Free Software Foundation in |
version 2.2 of Bison. */ |
/* Tokens. */ |
#ifndef YYTOKENTYPE |
# define YYTOKENTYPE |
/* Put the tokens into the symbol table, so that GDB and other debuggers |
know about them. */ |
enum yytokentype { |
ARITH_NUM = 258, |
ARITH_LPAREN = 259, |
ARITH_RPAREN = 260, |
ARITH_OR = 261, |
ARITH_AND = 262, |
ARITH_BOR = 263, |
ARITH_BXOR = 264, |
ARITH_BAND = 265, |
ARITH_NE = 266, |
ARITH_EQ = 267, |
ARITH_LE = 268, |
ARITH_GE = 269, |
ARITH_GT = 270, |
ARITH_LT = 271, |
ARITH_RSHIFT = 272, |
ARITH_LSHIFT = 273, |
ARITH_SUB = 274, |
ARITH_ADD = 275, |
ARITH_REM = 276, |
ARITH_DIV = 277, |
ARITH_MUL = 278, |
ARITH_BNOT = 279, |
ARITH_NOT = 280, |
ARITH_UNARYPLUS = 281, |
ARITH_UNARYMINUS = 282 |
}; |
#endif |
/* Tokens. */ |
#define ARITH_NUM 258 |
#define ARITH_LPAREN 259 |
#define ARITH_RPAREN 260 |
#define ARITH_OR 261 |
#define ARITH_AND 262 |
#define ARITH_BOR 263 |
#define ARITH_BXOR 264 |
#define ARITH_BAND 265 |
#define ARITH_NE 266 |
#define ARITH_EQ 267 |
#define ARITH_LE 268 |
#define ARITH_GE 269 |
#define ARITH_GT 270 |
#define ARITH_LT 271 |
#define ARITH_RSHIFT 272 |
#define ARITH_LSHIFT 273 |
#define ARITH_SUB 274 |
#define ARITH_ADD 275 |
#define ARITH_REM 276 |
#define ARITH_DIV 277 |
#define ARITH_MUL 278 |
#define ARITH_BNOT 279 |
#define ARITH_NOT 280 |
#define ARITH_UNARYPLUS 281 |
#define ARITH_UNARYMINUS 282 |
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED |
typedef int YYSTYPE; |
# define yystype YYSTYPE /* obsolescent; will be withdrawn */ |
# define YYSTYPE_IS_DECLARED 1 |
# define YYSTYPE_IS_TRIVIAL 1 |
#endif |
extern YYSTYPE yylval; |
/tags/0.3.0/uspace/app/ash/expand.c |
---|
0,0 → 1,1750 |
/* $NetBSD: expand.c,v 1.49 2000/03/13 22:47:19 soren Exp $ */ |
/*- |
* Copyright (c) 1991, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Kenneth Almquist. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
*/ |
#include <sys/cdefs.h> |
#ifndef lint |
#if 0 |
static char sccsid[] = "@(#)expand.c 8.5 (Berkeley) 5/15/95"; |
#else |
__RCSID("$NetBSD: expand.c,v 1.49 2000/03/13 22:47:19 soren Exp $"); |
#endif |
#endif /* not lint */ |
#include <sys/types.h> |
#include <sys/time.h> |
#include <sys/stat.h> |
#include <errno.h> |
#include <dirent.h> |
#include <unistd.h> |
#include <pwd.h> |
#include <stdlib.h> |
#include <stdio.h> |
#if defined(__GLIBC__) && !defined(GLOB_BROKEN) |
#include <fnmatch.h> |
#include <glob.h> |
#endif |
/* |
* Routines to expand arguments to commands. We have to deal with |
* backquotes, shell variables, and file metacharacters. |
*/ |
#include "shell.h" |
#include "main.h" |
#include "nodes.h" |
#include "eval.h" |
#include "expand.h" |
#include "syntax.h" |
#include "parser.h" |
#include "jobs.h" |
#include "options.h" |
#include "var.h" |
#include "input.h" |
#include "output.h" |
#include "memalloc.h" |
#include "error.h" |
#include "mystring.h" |
#include "show.h" |
/* |
* Structure specifying which parts of the string should be searched |
* for IFS characters. |
*/ |
struct ifsregion { |
struct ifsregion *next; /* next region in list */ |
int begoff; /* offset of start of region */ |
int endoff; /* offset of end of region */ |
int nulonly; /* search for nul bytes only */ |
}; |
char *expdest; /* output of current string */ |
struct nodelist *argbackq; /* list of back quote expressions */ |
struct ifsregion ifsfirst; /* first struct in list of ifs regions */ |
struct ifsregion *ifslastp; /* last struct in list */ |
struct arglist exparg; /* holds expanded arg list */ |
STATIC void argstr (char *, int); |
STATIC char *exptilde (char *, int); |
STATIC void expbackq (union node *, int, int); |
STATIC int subevalvar (char *, char *, int, int, int, int); |
STATIC char *evalvar (char *, int); |
STATIC int varisset (char *, int); |
STATIC char *strtodest (char *, int, int); |
STATIC void varvalue (char *, int, int); |
STATIC void recordregion (int, int, int); |
STATIC void removerecordregions (int); |
STATIC void ifsbreakup (char *, struct arglist *); |
STATIC void ifsfree (void); |
STATIC void expandmeta (struct strlist *, int); |
#if defined(__GLIBC__) && !defined(GLOB_BROKEN) |
STATIC const char *preglob (const char *); |
STATIC void addglob (const glob_t *); |
#else |
STATIC void expmeta (char *, char *); |
#endif |
STATIC void addfname (char *); |
#if defined(__GLIBC__) && !defined(GLOB_BROKEN) |
STATIC int patmatch (char *, char *, int); |
STATIC int patmatch2 (char *, char *, int); |
STATIC char * _rmescapes (char *, int); |
#else |
STATIC struct strlist *expsort (struct strlist *); |
STATIC struct strlist *msort (struct strlist *, int); |
STATIC int pmatch (char *, char *, int); |
#define patmatch2 patmatch |
#endif |
STATIC char *cvtnum (int, char *); |
/* |
* Expand shell variables and backquotes inside a here document. |
*/ |
void |
expandhere(arg, fd) |
union node *arg; /* the document */ |
int fd; /* where to write the expanded version */ |
{ |
herefd = fd; |
expandarg(arg, (struct arglist *)NULL, 0); |
xwrite(fd, stackblock(), expdest - stackblock()); |
} |
/* |
* Perform variable substitution and command substitution on an argument, |
* placing the resulting list of arguments in arglist. If EXP_FULL is true, |
* perform splitting and file name expansion. When arglist is NULL, perform |
* here document expansion. |
*/ |
void |
expandarg(arg, arglist, flag) |
union node *arg; |
struct arglist *arglist; |
int flag; |
{ |
struct strlist *sp; |
char *p; |
argbackq = arg->narg.backquote; |
STARTSTACKSTR(expdest); |
ifsfirst.next = NULL; |
ifslastp = NULL; |
argstr(arg->narg.text, flag); |
if (arglist == NULL) { |
return; /* here document expanded */ |
} |
STPUTC('\0', expdest); |
p = grabstackstr(expdest); |
exparg.lastp = &exparg.list; |
/* |
* TODO - EXP_REDIR |
*/ |
if (flag & EXP_FULL) { |
ifsbreakup(p, &exparg); |
*exparg.lastp = NULL; |
exparg.lastp = &exparg.list; |
expandmeta(exparg.list, flag); |
} else { |
if (flag & EXP_REDIR) /*XXX - for now, just remove escapes */ |
rmescapes(p); |
sp = (struct strlist *)stalloc(sizeof (struct strlist)); |
sp->text = p; |
*exparg.lastp = sp; |
exparg.lastp = &sp->next; |
} |
ifsfree(); |
*exparg.lastp = NULL; |
if (exparg.list) { |
*arglist->lastp = exparg.list; |
arglist->lastp = exparg.lastp; |
} |
} |
/* |
* Perform variable and command substitution. If EXP_FULL is set, output CTLESC |
* characters to allow for further processing. Otherwise treat |
* $@ like $* since no splitting will be performed. |
*/ |
STATIC void |
argstr(p, flag) |
char *p; |
int flag; |
{ |
char c; |
int quotes = flag & (EXP_FULL | EXP_CASE); /* do CTLESC */ |
int firsteq = 1; |
if (*p == '~' && (flag & (EXP_TILDE | EXP_VARTILDE))) |
p = exptilde(p, flag); |
for (;;) { |
switch (c = *p++) { |
case '\0': |
case CTLENDVAR: /* ??? */ |
goto breakloop; |
case CTLQUOTEMARK: |
/* "$@" syntax adherence hack */ |
if (p[0] == CTLVAR && p[2] == '@' && p[3] == '=') |
break; |
if ((flag & EXP_FULL) != 0) |
STPUTC(c, expdest); |
break; |
case CTLESC: |
if (quotes) |
STPUTC(c, expdest); |
c = *p++; |
STPUTC(c, expdest); |
break; |
case CTLVAR: |
p = evalvar(p, flag); |
break; |
case CTLBACKQ: |
case CTLBACKQ|CTLQUOTE: |
expbackq(argbackq->n, c & CTLQUOTE, flag); |
argbackq = argbackq->next; |
break; |
case CTLENDARI: |
expari(flag); |
break; |
case ':': |
case '=': |
/* |
* sort of a hack - expand tildes in variable |
* assignments (after the first '=' and after ':'s). |
*/ |
STPUTC(c, expdest); |
if (flag & EXP_VARTILDE && *p == '~') { |
if (c == '=') { |
if (firsteq) |
firsteq = 0; |
else |
break; |
} |
p = exptilde(p, flag); |
} |
break; |
default: |
STPUTC(c, expdest); |
} |
} |
breakloop:; |
return; |
} |
STATIC char * |
exptilde(p, flag) |
char *p; |
int flag; |
{ |
char c, *startp = p; |
struct passwd *pw; |
const char *home; |
int quotes = flag & (EXP_FULL | EXP_CASE); |
while ((c = *p) != '\0') { |
switch(c) { |
case CTLESC: |
return (startp); |
case CTLQUOTEMARK: |
return (startp); |
case ':': |
if (flag & EXP_VARTILDE) |
goto done; |
break; |
case '/': |
goto done; |
} |
p++; |
} |
done: |
*p = '\0'; |
if (*(startp+1) == '\0') { |
if ((home = lookupvar("HOME")) == NULL) |
goto lose; |
} else { |
if ((pw = getpwnam(startp+1)) == NULL) |
goto lose; |
home = pw->pw_dir; |
} |
if (*home == '\0') |
goto lose; |
*p = c; |
while ((c = *home++) != '\0') { |
if (quotes && SQSYNTAX[(int)c] == CCTL) |
STPUTC(CTLESC, expdest); |
STPUTC(c, expdest); |
} |
return (p); |
lose: |
*p = c; |
return (startp); |
} |
STATIC void |
removerecordregions(endoff) |
int endoff; |
{ |
if (ifslastp == NULL) |
return; |
if (ifsfirst.endoff > endoff) { |
while (ifsfirst.next != NULL) { |
struct ifsregion *ifsp; |
INTOFF; |
ifsp = ifsfirst.next->next; |
ckfree(ifsfirst.next); |
ifsfirst.next = ifsp; |
INTON; |
} |
if (ifsfirst.begoff > endoff) |
ifslastp = NULL; |
else { |
ifslastp = &ifsfirst; |
ifsfirst.endoff = endoff; |
} |
return; |
} |
ifslastp = &ifsfirst; |
while (ifslastp->next && ifslastp->next->begoff < endoff) |
ifslastp=ifslastp->next; |
while (ifslastp->next != NULL) { |
struct ifsregion *ifsp; |
INTOFF; |
ifsp = ifslastp->next->next; |
ckfree(ifslastp->next); |
ifslastp->next = ifsp; |
INTON; |
} |
if (ifslastp->endoff > endoff) |
ifslastp->endoff = endoff; |
} |
/* |
* Expand arithmetic expression. Backup to start of expression, |
* evaluate, place result in (backed up) result, adjust string position. |
*/ |
void |
expari(flag) |
int flag; |
{ |
char *p, *start; |
int result; |
int begoff; |
int quotes = flag & (EXP_FULL | EXP_CASE); |
int quoted; |
/* ifsfree(); */ |
/* |
* This routine is slightly over-complicated for |
* efficiency. First we make sure there is |
* enough space for the result, which may be bigger |
* than the expression if we add exponentation. Next we |
* scan backwards looking for the start of arithmetic. If the |
* next previous character is a CTLESC character, then we |
* have to rescan starting from the beginning since CTLESC |
* characters have to be processed left to right. |
*/ |
CHECKSTRSPACE(10, expdest); |
USTPUTC('\0', expdest); |
start = stackblock(); |
p = expdest - 1; |
while (*p != CTLARI && p >= start) |
--p; |
if (*p != CTLARI) |
error("missing CTLARI (shouldn't happen)"); |
if (p > start && *(p-1) == CTLESC) |
for (p = start; *p != CTLARI; p++) |
if (*p == CTLESC) |
p++; |
if (p[1] == '"') |
quoted=1; |
else |
quoted=0; |
begoff = p - start; |
removerecordregions(begoff); |
if (quotes) |
rmescapes(p+2); |
result = arith(p+2); |
fmtstr(p, 12, "%d", result); |
while (*p++) |
; |
if (quoted == 0) |
recordregion(begoff, p - 1 - start, 0); |
result = expdest - p + 1; |
STADJUST(-result, expdest); |
} |
/* |
* Expand stuff in backwards quotes. |
*/ |
STATIC void |
expbackq(cmd, quoted, flag) |
union node *cmd; |
int quoted; |
int flag; |
{ |
struct backcmd in; |
int i; |
char buf[128]; |
char *p; |
char *dest = expdest; |
struct ifsregion saveifs, *savelastp; |
struct nodelist *saveargbackq; |
char lastc; |
int startloc = dest - stackblock(); |
char const *syntax = quoted? DQSYNTAX : BASESYNTAX; |
int saveherefd; |
int quotes = flag & (EXP_FULL | EXP_CASE); |
INTOFF; |
saveifs = ifsfirst; |
savelastp = ifslastp; |
saveargbackq = argbackq; |
saveherefd = herefd; |
herefd = -1; |
p = grabstackstr(dest); |
evalbackcmd(cmd, &in); |
ungrabstackstr(p, dest); |
ifsfirst = saveifs; |
ifslastp = savelastp; |
argbackq = saveargbackq; |
herefd = saveherefd; |
p = in.buf; |
lastc = '\0'; |
for (;;) { |
if (--in.nleft < 0) { |
if (in.fd < 0) |
break; |
while ((i = read(in.fd, buf, sizeof buf)) < 0 && errno == EINTR); |
TRACE(("expbackq: read returns %d\n", i)); |
if (i <= 0) |
break; |
p = buf; |
in.nleft = i - 1; |
} |
lastc = *p++; |
if (lastc != '\0') { |
if (quotes && syntax[(int)lastc] == CCTL) |
STPUTC(CTLESC, dest); |
STPUTC(lastc, dest); |
} |
} |
/* Eat all trailing newlines */ |
for (p--; lastc == '\n'; lastc = *--p) |
STUNPUTC(dest); |
if (in.fd >= 0) |
close(in.fd); |
if (in.buf) |
ckfree(in.buf); |
if (in.jp) |
exitstatus = waitforjob(in.jp); |
if (quoted == 0) |
recordregion(startloc, dest - stackblock(), 0); |
TRACE(("evalbackq: size=%d: \"%.*s\"\n", |
(dest - stackblock()) - startloc, |
(dest - stackblock()) - startloc, |
stackblock() + startloc)); |
expdest = dest; |
INTON; |
} |
STATIC int |
subevalvar(p, str, strloc, subtype, startloc, varflags) |
char *p; |
char *str; |
int strloc; |
int subtype; |
int startloc; |
int varflags; |
{ |
char *startp; |
char *loc = NULL; |
char *q; |
int c = 0; |
int saveherefd = herefd; |
struct nodelist *saveargbackq = argbackq; |
int amount; |
herefd = -1; |
argstr(p, subtype != VSASSIGN && subtype != VSQUESTION ? EXP_CASE : 0); |
STACKSTRNUL(expdest); |
herefd = saveherefd; |
argbackq = saveargbackq; |
startp = stackblock() + startloc; |
if (str == NULL) |
str = stackblock() + strloc; |
switch (subtype) { |
case VSASSIGN: |
setvar(str, startp, 0); |
amount = startp - expdest; |
STADJUST(amount, expdest); |
varflags &= ~VSNUL; |
if (c != 0) |
*loc = c; |
return 1; |
case VSQUESTION: |
if (*p != CTLENDVAR) { |
outfmt(&errout, "%s\n", startp); |
error((char *)NULL); |
} |
error("%.*s: parameter %snot set", p - str - 1, |
str, (varflags & VSNUL) ? "null or " |
: nullstr); |
/* NOTREACHED */ |
case VSTRIMLEFT: |
for (loc = startp; loc < str; loc++) { |
c = *loc; |
*loc = '\0'; |
if (patmatch2(str, startp, varflags & VSQUOTE)) |
goto recordleft; |
*loc = c; |
if ((varflags & VSQUOTE) && *loc == CTLESC) |
loc++; |
} |
return 0; |
case VSTRIMLEFTMAX: |
for (loc = str - 1; loc >= startp;) { |
c = *loc; |
*loc = '\0'; |
if (patmatch2(str, startp, varflags & VSQUOTE)) |
goto recordleft; |
*loc = c; |
loc--; |
if ((varflags & VSQUOTE) && loc > startp && |
*(loc - 1) == CTLESC) { |
for (q = startp; q < loc; q++) |
if (*q == CTLESC) |
q++; |
if (q > loc) |
loc--; |
} |
} |
return 0; |
case VSTRIMRIGHT: |
for (loc = str - 1; loc >= startp;) { |
if (patmatch2(str, loc, varflags & VSQUOTE)) |
goto recordright; |
loc--; |
if ((varflags & VSQUOTE) && loc > startp && |
*(loc - 1) == CTLESC) { |
for (q = startp; q < loc; q++) |
if (*q == CTLESC) |
q++; |
if (q > loc) |
loc--; |
} |
} |
return 0; |
case VSTRIMRIGHTMAX: |
for (loc = startp; loc < str - 1; loc++) { |
if (patmatch2(str, loc, varflags & VSQUOTE)) |
goto recordright; |
if ((varflags & VSQUOTE) && *loc == CTLESC) |
loc++; |
} |
return 0; |
default: |
abort(); |
} |
recordleft: |
*loc = c; |
amount = ((str - 1) - (loc - startp)) - expdest; |
STADJUST(amount, expdest); |
while (loc != str - 1) |
*startp++ = *loc++; |
return 1; |
recordright: |
amount = loc - expdest; |
STADJUST(amount, expdest); |
STPUTC('\0', expdest); |
STADJUST(-1, expdest); |
return 1; |
} |
/* |
* Expand a variable, and return a pointer to the next character in the |
* input string. |
*/ |
STATIC char * |
evalvar(p, flag) |
char *p; |
int flag; |
{ |
int subtype; |
int varflags; |
char *var; |
char *val; |
int patloc; |
int c; |
int set; |
int special; |
int startloc; |
int varlen; |
int easy; |
int quotes = flag & (EXP_FULL | EXP_CASE); |
varflags = *p++; |
subtype = varflags & VSTYPE; |
var = p; |
special = 0; |
if (! is_name(*p)) |
special = 1; |
p = strchr(p, '=') + 1; |
again: /* jump here after setting a variable with ${var=text} */ |
if (special) { |
set = varisset(var, varflags & VSNUL); |
val = NULL; |
} else { |
val = lookupvar(var); |
if (val == NULL || ((varflags & VSNUL) && val[0] == '\0')) { |
val = NULL; |
set = 0; |
} else |
set = 1; |
} |
varlen = 0; |
startloc = expdest - stackblock(); |
if (set && subtype != VSPLUS) { |
/* insert the value of the variable */ |
if (special) { |
varvalue(var, varflags & VSQUOTE, flag & EXP_FULL); |
if (subtype == VSLENGTH) { |
varlen = expdest - stackblock() - startloc; |
STADJUST(-varlen, expdest); |
} |
} else { |
char const *syntax = (varflags & VSQUOTE) ? DQSYNTAX |
: BASESYNTAX; |
if (subtype == VSLENGTH) { |
for (;*val; val++) |
varlen++; |
} |
else { |
while (*val) { |
if (quotes && syntax[(int)*val] == CCTL) |
STPUTC(CTLESC, expdest); |
STPUTC(*val++, expdest); |
} |
} |
} |
} |
if (subtype == VSPLUS) |
set = ! set; |
easy = ((varflags & VSQUOTE) == 0 || |
(*var == '@' && shellparam.nparam != 1)); |
switch (subtype) { |
case VSLENGTH: |
expdest = cvtnum(varlen, expdest); |
goto record; |
case VSNORMAL: |
if (!easy) |
break; |
record: |
recordregion(startloc, expdest - stackblock(), |
varflags & VSQUOTE); |
break; |
case VSPLUS: |
case VSMINUS: |
if (!set) { |
argstr(p, flag); |
break; |
} |
if (easy) |
goto record; |
break; |
case VSTRIMLEFT: |
case VSTRIMLEFTMAX: |
case VSTRIMRIGHT: |
case VSTRIMRIGHTMAX: |
if (!set) |
break; |
/* |
* Terminate the string and start recording the pattern |
* right after it |
*/ |
STPUTC('\0', expdest); |
patloc = expdest - stackblock(); |
if (subevalvar(p, NULL, patloc, subtype, |
startloc, varflags) == 0) { |
int amount = (expdest - stackblock() - patloc) + 1; |
STADJUST(-amount, expdest); |
} |
/* Remove any recorded regions beyond start of variable */ |
removerecordregions(startloc); |
goto record; |
case VSASSIGN: |
case VSQUESTION: |
if (!set) { |
if (subevalvar(p, var, 0, subtype, startloc, |
varflags)) { |
varflags &= ~VSNUL; |
/* |
* Remove any recorded regions beyond |
* start of variable |
*/ |
removerecordregions(startloc); |
goto again; |
} |
break; |
} |
if (easy) |
goto record; |
break; |
default: |
abort(); |
} |
if (subtype != VSNORMAL) { /* skip to end of alternative */ |
int nesting = 1; |
for (;;) { |
if ((c = *p++) == CTLESC) |
p++; |
else if (c == CTLBACKQ || c == (CTLBACKQ|CTLQUOTE)) { |
if (set) |
argbackq = argbackq->next; |
} else if (c == CTLVAR) { |
if ((*p++ & VSTYPE) != VSNORMAL) |
nesting++; |
} else if (c == CTLENDVAR) { |
if (--nesting == 0) |
break; |
} |
} |
} |
return p; |
} |
/* |
* Test whether a specialized variable is set. |
*/ |
STATIC int |
varisset(name, nulok) |
char *name; |
int nulok; |
{ |
if (*name == '!') |
return backgndpid != -1; |
else if (*name == '@' || *name == '*') { |
if (*shellparam.p == NULL) |
return 0; |
if (nulok) { |
char **av; |
for (av = shellparam.p; *av; av++) |
if (**av != '\0') |
return 1; |
return 0; |
} |
} else if (is_digit(*name)) { |
char *ap; |
int num = atoi(name); |
if (num > shellparam.nparam) |
return 0; |
if (num == 0) |
ap = arg0; |
else |
ap = shellparam.p[num - 1]; |
if (nulok && (ap == NULL || *ap == '\0')) |
return 0; |
} |
return 1; |
} |
/* |
* Put a string on the stack. |
*/ |
STATIC char * |
strtodest(p, quoted, allow_split) |
char *p; |
int quoted; |
int allow_split; |
{ |
char const *syntax; |
if (allow_split) { |
syntax = quoted ? DQSYNTAX : BASESYNTAX; |
while (*p) { |
if (syntax[(int) *p] == CCTL) |
STPUTC(CTLESC, expdest); |
STPUTC(*p++, expdest); |
} |
} else |
while (*p) |
STPUTC(*p++, expdest); |
return p; |
} |
/* |
* Add the value of a specialized variable to the stack string. |
*/ |
STATIC void |
varvalue(name, quoted, allow_split) |
char *name; |
int quoted; |
int allow_split; |
{ |
int num; |
char *p; |
int i; |
extern int oexitstatus; |
char sep; |
char **ap; |
switch (*name) { |
case '$': |
num = rootpid; |
goto numvar; |
case '?': |
num = oexitstatus; |
goto numvar; |
case '#': |
num = shellparam.nparam; |
goto numvar; |
case '!': |
num = backgndpid; |
numvar: |
expdest = cvtnum(num, expdest); |
break; |
case '-': |
for (i = 0 ; i < NOPTS ; i++) { |
if (optlist[i].val) |
STPUTC(optlist[i].letter, expdest); |
} |
break; |
case '@': |
if (allow_split && quoted) { |
for (ap = shellparam.p ; (p = *ap++) != NULL ; ) { |
p = strtodest(p, quoted, allow_split); |
if (*ap) |
STPUTC('\0', expdest); |
} |
break; |
} |
/* fall through */ |
case '*': |
if (ifsset() != 0) |
sep = ifsval()[0]; |
else |
sep = ' '; |
for (ap = shellparam.p ; (p = *ap++) != NULL ; ) { |
p = strtodest(p, quoted, allow_split); |
if (*ap && sep) |
STPUTC(sep, expdest); |
} |
break; |
case '0': |
p = strtodest(arg0, quoted, allow_split); |
break; |
default: |
if (is_digit(*name)) { |
num = atoi(name); |
if (num > 0 && num <= shellparam.nparam) { |
p = strtodest(shellparam.p[num - 1], quoted, |
allow_split); |
} |
} |
break; |
} |
} |
/* |
* Record the fact that we have to scan this region of the |
* string for IFS characters. |
*/ |
STATIC void |
recordregion(start, end, nulonly) |
int start; |
int end; |
int nulonly; |
{ |
struct ifsregion *ifsp; |
if (ifslastp == NULL) { |
ifsp = &ifsfirst; |
} else { |
ifsp = (struct ifsregion *)ckmalloc(sizeof (struct ifsregion)); |
ifslastp->next = ifsp; |
} |
ifslastp = ifsp; |
ifslastp->next = NULL; |
ifslastp->begoff = start; |
ifslastp->endoff = end; |
ifslastp->nulonly = nulonly; |
} |
/* |
* Break the argument string into pieces based upon IFS and add the |
* strings to the argument list. The regions of the string to be |
* searched for IFS characters have been stored by recordregion. |
*/ |
STATIC void |
ifsbreakup(string, arglist) |
char *string; |
struct arglist *arglist; |
{ |
struct ifsregion *ifsp; |
struct strlist *sp; |
char *start; |
char *p; |
char *q; |
const char *ifs; |
int ifsspc; |
int nulonly; |
start = string; |
ifsspc = 0; |
nulonly = 0; |
if (ifslastp != NULL) { |
ifsp = &ifsfirst; |
do { |
p = string + ifsp->begoff; |
nulonly = ifsp->nulonly; |
ifs = nulonly ? nullstr : |
( ifsset() ? ifsval() : " \t\n" ); |
ifsspc = 0; |
while (p < string + ifsp->endoff) { |
q = p; |
if (*p == CTLESC) |
p++; |
if (strchr(ifs, *p)) { |
if (!nulonly) |
ifsspc = (strchr(" \t\n", *p) != NULL); |
/* Ignore IFS whitespace at start */ |
if (q == start && ifsspc) { |
p++; |
start = p; |
continue; |
} |
*q = '\0'; |
sp = (struct strlist *)stalloc(sizeof *sp); |
sp->text = start; |
*arglist->lastp = sp; |
arglist->lastp = &sp->next; |
p++; |
if (!nulonly) { |
for (;;) { |
if (p >= string + ifsp->endoff) { |
break; |
} |
q = p; |
if (*p == CTLESC) |
p++; |
if (strchr(ifs, *p) == NULL ) { |
p = q; |
break; |
} else if (strchr(" \t\n",*p) == NULL) { |
if (ifsspc) { |
p++; |
ifsspc = 0; |
} else { |
p = q; |
break; |
} |
} else |
p++; |
} |
} |
start = p; |
} else |
p++; |
} |
} while ((ifsp = ifsp->next) != NULL); |
if (*start || (!ifsspc && start > string && |
(nulonly || 1))) { |
sp = (struct strlist *)stalloc(sizeof *sp); |
sp->text = start; |
*arglist->lastp = sp; |
arglist->lastp = &sp->next; |
} |
} else { |
sp = (struct strlist *)stalloc(sizeof *sp); |
sp->text = start; |
*arglist->lastp = sp; |
arglist->lastp = &sp->next; |
} |
} |
STATIC void |
ifsfree() |
{ |
while (ifsfirst.next != NULL) { |
struct ifsregion *ifsp; |
INTOFF; |
ifsp = ifsfirst.next->next; |
ckfree(ifsfirst.next); |
ifsfirst.next = ifsp; |
INTON; |
} |
ifslastp = NULL; |
ifsfirst.next = NULL; |
} |
/* |
* Expand shell metacharacters. At this point, the only control characters |
* should be escapes. The results are stored in the list exparg. |
*/ |
#if defined(__GLIBC__) && !defined(GLOB_BROKEN) |
STATIC void |
expandmeta(str, flag) |
struct strlist *str; |
int flag; |
{ |
const char *p; |
glob_t pglob; |
/* TODO - EXP_REDIR */ |
while (str) { |
if (fflag) |
goto nometa; |
p = preglob(str->text); |
INTOFF; |
switch (glob(p, GLOB_NOMAGIC, 0, &pglob)) { |
case 0: |
if (!(pglob.gl_flags & GLOB_MAGCHAR)) |
goto nometa2; |
addglob(&pglob); |
globfree(&pglob); |
INTON; |
break; |
case GLOB_NOMATCH: |
nometa2: |
globfree(&pglob); |
INTON; |
nometa: |
*exparg.lastp = str; |
rmescapes(str->text); |
exparg.lastp = &str->next; |
break; |
default: /* GLOB_NOSPACE */ |
error("Out of space"); |
} |
str = str->next; |
} |
} |
/* |
* Prepare the string for glob(3). |
*/ |
STATIC const char * |
preglob(str) |
const char *str; |
{ |
const char *p; |
char *q, *r; |
size_t len; |
p = str; |
while (*p != CTLQUOTEMARK && *p != CTLESC) { |
if (*p++ == '\0') |
return str; |
} |
len = p - str; |
q = r = stalloc(strlen(str) + 1); |
if (len > 0) { |
memcpy(q, str, len); |
q += len; |
} |
do { |
if (*p == CTLQUOTEMARK) |
continue; |
if (*p == CTLESC) { |
if (*++p != '/') |
*q++ = '\\'; |
} |
*q++ = *p; |
} while (*++p); |
*q = '\0'; |
return r; |
} |
/* |
* Add the result of glob(3) to the list. |
*/ |
STATIC void |
addglob(pglob) |
const glob_t *pglob; |
{ |
char **p = pglob->gl_pathv; |
do { |
addfname(*p); |
} while (*++p); |
} |
#else |
char *expdir; |
STATIC void |
expandmeta(str, flag) |
struct strlist *str; |
int flag; |
{ |
char *p; |
struct strlist **savelastp; |
struct strlist *sp; |
char c; |
/* TODO - EXP_REDIR */ |
while (str) { |
if (fflag) |
goto nometa; |
p = str->text; |
for (;;) { /* fast check for meta chars */ |
if ((c = *p++) == '\0') |
goto nometa; |
if (c == '*' || c == '?' || c == '[' || c == '!') |
break; |
} |
savelastp = exparg.lastp; |
INTOFF; |
if (expdir == NULL) { |
int i = strlen(str->text); |
expdir = ckmalloc(i < 2048 ? 2048 : i); /* XXX */ |
} |
expmeta(expdir, str->text); |
ckfree(expdir); |
expdir = NULL; |
INTON; |
if (exparg.lastp == savelastp) { |
/* |
* no matches |
*/ |
nometa: |
*exparg.lastp = str; |
rmescapes(str->text); |
exparg.lastp = &str->next; |
} else { |
*exparg.lastp = NULL; |
*savelastp = sp = expsort(*savelastp); |
while (sp->next != NULL) |
sp = sp->next; |
exparg.lastp = &sp->next; |
} |
str = str->next; |
} |
} |
/* |
* Do metacharacter (i.e. *, ?, [...]) expansion. |
*/ |
STATIC void |
expmeta(enddir, name) |
char *enddir; |
char *name; |
{ |
char *p; |
const char *cp; |
char *q; |
char *start; |
char *endname; |
int metaflag; |
struct stat statb; |
DIR *dirp; |
struct dirent *dp; |
int atend; |
int matchdot; |
metaflag = 0; |
start = name; |
for (p = name ; ; p++) { |
if (*p == '*' || *p == '?') |
metaflag = 1; |
else if (*p == '[') { |
q = p + 1; |
if (*q == '!') |
q++; |
for (;;) { |
while (*q == CTLQUOTEMARK) |
q++; |
if (*q == CTLESC) |
q++; |
if (*q == '/' || *q == '\0') |
break; |
if (*++q == ']') { |
metaflag = 1; |
break; |
} |
} |
} else if (*p == '!' && p[1] == '!' && (p == name || p[-1] == '/')) { |
metaflag = 1; |
} else if (*p == '\0') |
break; |
else if (*p == CTLQUOTEMARK) |
continue; |
else if (*p == CTLESC) |
p++; |
if (*p == '/') { |
if (metaflag) |
break; |
start = p + 1; |
} |
} |
if (metaflag == 0) { /* we've reached the end of the file name */ |
if (enddir != expdir) |
metaflag++; |
for (p = name ; ; p++) { |
if (*p == CTLQUOTEMARK) |
continue; |
if (*p == CTLESC) |
p++; |
*enddir++ = *p; |
if (*p == '\0') |
break; |
} |
if (metaflag == 0 || stat(expdir, &statb) >= 0) |
addfname(expdir); |
return; |
} |
endname = p; |
if (start != name) { |
p = name; |
while (p < start) { |
while (*p == CTLQUOTEMARK) |
p++; |
if (*p == CTLESC) |
p++; |
*enddir++ = *p++; |
} |
} |
if (enddir == expdir) { |
cp = "."; |
} else if (enddir == expdir + 1 && *expdir == '/') { |
cp = "/"; |
} else { |
cp = expdir; |
enddir[-1] = '\0'; |
} |
if ((dirp = opendir(cp)) == NULL) |
return; |
if (enddir != expdir) |
enddir[-1] = '/'; |
if (*endname == 0) { |
atend = 1; |
} else { |
atend = 0; |
*endname++ = '\0'; |
} |
matchdot = 0; |
p = start; |
while (*p == CTLQUOTEMARK) |
p++; |
if (*p == CTLESC) |
p++; |
if (*p == '.') |
matchdot++; |
while (! int_pending() && (dp = readdir(dirp)) != NULL) { |
if (dp->d_name[0] == '.' && ! matchdot) |
continue; |
if (patmatch(start, dp->d_name, 0)) { |
if (atend) { |
scopy(dp->d_name, enddir); |
addfname(expdir); |
} else { |
for (p = enddir, cp = dp->d_name; |
(*p++ = *cp++) != '\0';) |
continue; |
p[-1] = '/'; |
expmeta(p, endname); |
} |
} |
} |
closedir(dirp); |
if (! atend) |
endname[-1] = '/'; |
} |
#endif |
/* |
* Add a file name to the list. |
*/ |
STATIC void |
addfname(name) |
char *name; |
{ |
char *p; |
struct strlist *sp; |
p = stalloc(strlen(name) + 1); |
scopy(name, p); |
sp = (struct strlist *)stalloc(sizeof *sp); |
sp->text = p; |
*exparg.lastp = sp; |
exparg.lastp = &sp->next; |
} |
#if !(defined(__GLIBC__) && !defined(GLOB_BROKEN)) |
/* |
* Sort the results of file name expansion. It calculates the number of |
* strings to sort and then calls msort (short for merge sort) to do the |
* work. |
*/ |
STATIC struct strlist * |
expsort(str) |
struct strlist *str; |
{ |
int len; |
struct strlist *sp; |
len = 0; |
for (sp = str ; sp ; sp = sp->next) |
len++; |
return msort(str, len); |
} |
STATIC struct strlist * |
msort(list, len) |
struct strlist *list; |
int len; |
{ |
struct strlist *p, *q = NULL; |
struct strlist **lpp; |
int half; |
int n; |
if (len <= 1) |
return list; |
half = len >> 1; |
p = list; |
for (n = half ; --n >= 0 ; ) { |
q = p; |
p = p->next; |
} |
q->next = NULL; /* terminate first half of list */ |
q = msort(list, half); /* sort first half of list */ |
p = msort(p, len - half); /* sort second half */ |
lpp = &list; |
for (;;) { |
if (strcmp(p->text, q->text) < 0) { |
*lpp = p; |
lpp = &p->next; |
if ((p = *lpp) == NULL) { |
*lpp = q; |
break; |
} |
} else { |
*lpp = q; |
lpp = &q->next; |
if ((q = *lpp) == NULL) { |
*lpp = p; |
break; |
} |
} |
} |
return list; |
} |
#endif |
/* |
* Returns true if the pattern matches the string. |
*/ |
#if defined(__GLIBC__) && !defined(GLOB_BROKEN) |
STATIC int |
patmatch(pattern, string, squoted) |
char *pattern; |
char *string; |
int squoted; /* string might have quote chars */ |
{ |
const char *p; |
char *q; |
p = preglob(pattern); |
q = squoted ? _rmescapes(string, 1) : string; |
return !fnmatch(p, q, 0); |
} |
STATIC int |
patmatch2(pattern, string, squoted) |
char *pattern; |
char *string; |
int squoted; /* string might have quote chars */ |
{ |
char *p; |
int res; |
sstrnleft--; |
p = grabstackstr(expdest); |
res = patmatch(pattern, string, squoted); |
ungrabstackstr(p, expdest); |
return res; |
} |
#else |
int |
patmatch(pattern, string, squoted) |
char *pattern; |
char *string; |
int squoted; /* string might have quote chars */ |
{ |
#ifdef notdef |
if (pattern[0] == '!' && pattern[1] == '!') |
return 1 - pmatch(pattern + 2, string); |
else |
#endif |
return pmatch(pattern, string, squoted); |
} |
STATIC int |
pmatch(pattern, string, squoted) |
char *pattern; |
char *string; |
int squoted; |
{ |
char *p, *q; |
char c; |
p = pattern; |
q = string; |
for (;;) { |
switch (c = *p++) { |
case '\0': |
goto breakloop; |
case CTLESC: |
if (squoted && *q == CTLESC) |
q++; |
if (*q++ != *p++) |
return 0; |
break; |
case CTLQUOTEMARK: |
continue; |
case '?': |
if (squoted && *q == CTLESC) |
q++; |
if (*q++ == '\0') |
return 0; |
break; |
case '*': |
c = *p; |
while (c == CTLQUOTEMARK || c == '*') |
c = *++p; |
if (c != CTLESC && c != CTLQUOTEMARK && |
c != '?' && c != '*' && c != '[') { |
while (*q != c) { |
if (squoted && *q == CTLESC && |
q[1] == c) |
break; |
if (*q == '\0') |
return 0; |
if (squoted && *q == CTLESC) |
q++; |
q++; |
} |
} |
do { |
if (pmatch(p, q, squoted)) |
return 1; |
if (squoted && *q == CTLESC) |
q++; |
} while (*q++ != '\0'); |
return 0; |
case '[': { |
char *endp; |
int invert, found; |
char chr; |
endp = p; |
if (*endp == '!') |
endp++; |
for (;;) { |
while (*endp == CTLQUOTEMARK) |
endp++; |
if (*endp == '\0') |
goto dft; /* no matching ] */ |
if (*endp == CTLESC) |
endp++; |
if (*++endp == ']') |
break; |
} |
invert = 0; |
if (*p == '!') { |
invert++; |
p++; |
} |
found = 0; |
chr = *q++; |
if (squoted && chr == CTLESC) |
chr = *q++; |
if (chr == '\0') |
return 0; |
c = *p++; |
do { |
if (c == CTLQUOTEMARK) |
continue; |
if (c == CTLESC) |
c = *p++; |
if (*p == '-' && p[1] != ']') { |
p++; |
while (*p == CTLQUOTEMARK) |
p++; |
if (*p == CTLESC) |
p++; |
if (chr >= c && chr <= *p) |
found = 1; |
p++; |
} else { |
if (chr == c) |
found = 1; |
} |
} while ((c = *p++) != ']'); |
if (found == invert) |
return 0; |
break; |
} |
dft: default: |
if (squoted && *q == CTLESC) |
q++; |
if (*q++ != c) |
return 0; |
break; |
} |
} |
breakloop: |
if (*q != '\0') |
return 0; |
return 1; |
} |
#endif |
/* |
* Remove any CTLESC characters from a string. |
*/ |
#if defined(__GLIBC__) && !defined(GLOB_BROKEN) |
void |
rmescapes(str) |
char *str; |
{ |
_rmescapes(str, 0); |
} |
STATIC char * |
_rmescapes(str, flag) |
char *str; |
int flag; |
{ |
char *p, *q, *r; |
p = str; |
while (*p != CTLESC && *p != CTLQUOTEMARK) { |
if (*p++ == '\0') |
return str; |
} |
q = p; |
r = str; |
if (flag) { |
size_t len = p - str; |
q = r = stalloc(strlen(p) + len + 1); |
if (len > 0) { |
memcpy(q, str, len); |
q += len; |
} |
} |
while (*p) { |
if (*p == CTLQUOTEMARK) { |
p++; |
continue; |
} |
if (*p == CTLESC) |
p++; |
*q++ = *p++; |
} |
*q = '\0'; |
return r; |
} |
#else |
void |
rmescapes(str) |
char *str; |
{ |
char *p, *q; |
p = str; |
while (*p != CTLESC && *p != CTLQUOTEMARK) { |
if (*p++ == '\0') |
return; |
} |
q = p; |
while (*p) { |
if (*p == CTLQUOTEMARK) { |
p++; |
continue; |
} |
if (*p == CTLESC) |
p++; |
*q++ = *p++; |
} |
*q = '\0'; |
} |
#endif |
/* |
* See if a pattern matches in a case statement. |
*/ |
int |
casematch(pattern, val) |
union node *pattern; |
char *val; |
{ |
struct stackmark smark; |
int result; |
char *p; |
setstackmark(&smark); |
argbackq = pattern->narg.backquote; |
STARTSTACKSTR(expdest); |
ifslastp = NULL; |
argstr(pattern->narg.text, EXP_TILDE | EXP_CASE); |
STPUTC('\0', expdest); |
p = grabstackstr(expdest); |
result = patmatch(p, val, 0); |
popstackmark(&smark); |
return result; |
} |
/* |
* Our own itoa(). |
*/ |
STATIC char * |
cvtnum(num, buf) |
int num; |
char *buf; |
{ |
char temp[32]; |
int neg = num < 0; |
char *p = temp + 31; |
temp[31] = '\0'; |
do { |
*--p = num % 10 + '0'; |
} while ((num /= 10) != 0); |
if (neg) |
*--p = '-'; |
while (*p) |
STPUTC(*p++, buf); |
return buf; |
} |
/tags/0.3.0/uspace/app/ash/mail.c |
---|
0,0 → 1,125 |
/* $NetBSD: mail.c,v 1.14 2000/07/03 03:26:19 matt Exp $ */ |
/*- |
* Copyright (c) 1991, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Kenneth Almquist. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
*/ |
#include <sys/cdefs.h> |
#ifndef lint |
#if 0 |
static char sccsid[] = "@(#)mail.c 8.2 (Berkeley) 5/4/95"; |
#else |
__RCSID("$NetBSD: mail.c,v 1.14 2000/07/03 03:26:19 matt Exp $"); |
#endif |
#endif /* not lint */ |
/* |
* Routines to check for mail. (Perhaps make part of main.c?) |
*/ |
#include <sys/types.h> |
#include <sys/stat.h> |
#include <stdlib.h> |
#include "shell.h" |
#include "exec.h" /* defines padvance() */ |
#include "var.h" |
#include "output.h" |
#include "memalloc.h" |
#include "error.h" |
#include "mail.h" |
#define MAXMBOXES 10 |
STATIC int nmboxes; /* number of mailboxes */ |
STATIC time_t mailtime[MAXMBOXES]; /* times of mailboxes */ |
/* |
* Print appropriate message(s) if mail has arrived. If the argument is |
* nozero, then the value of MAIL has changed, so we just update the |
* values. |
*/ |
void |
chkmail(silent) |
int silent; |
{ |
int i; |
const char *mpath; |
char *p; |
char *q; |
struct stackmark smark; |
struct stat statb; |
if (silent) |
nmboxes = 10; |
if (nmboxes == 0) |
return; |
setstackmark(&smark); |
mpath = mpathset()? mpathval() : mailval(); |
for (i = 0 ; i < nmboxes ; i++) { |
p = padvance(&mpath, nullstr); |
if (p == NULL) |
break; |
if (*p == '\0') |
continue; |
for (q = p ; *q ; q++); |
if (q[-1] != '/') |
abort(); |
q[-1] = '\0'; /* delete trailing '/' */ |
#ifdef notdef /* this is what the System V shell claims to do (it lies) */ |
if (stat(p, &statb) < 0) |
statb.st_mtime = 0; |
if (statb.st_mtime > mailtime[i] && ! silent) { |
out2str(pathopt? pathopt : "you have mail"); |
out2c('\n'); |
} |
mailtime[i] = statb.st_mtime; |
#else /* this is what it should do */ |
if (stat(p, &statb) < 0) |
statb.st_size = 0; |
if (statb.st_size > mailtime[i] && ! silent) { |
out2str(pathopt? pathopt : "you have mail"); |
out2c('\n'); |
} |
mailtime[i] = statb.st_size; |
#endif |
} |
nmboxes = i; |
popstackmark(&smark); |
} |
/tags/0.3.0/uspace/app/ash/miscbltin.c |
---|
0,0 → 1,422 |
/* $NetBSD: miscbltin.c,v 1.29 2001/01/04 15:39:51 lukem Exp $ */ |
/*- |
* Copyright (c) 1991, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Kenneth Almquist. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
*/ |
#include <sys/cdefs.h> |
#ifndef lint |
#if 0 |
static char sccsid[] = "@(#)miscbltin.c 8.4 (Berkeley) 5/4/95"; |
#else |
__RCSID("$NetBSD: miscbltin.c,v 1.29 2001/01/04 15:39:51 lukem Exp $"); |
#endif |
#endif /* not lint */ |
/* |
* Miscelaneous builtins. |
*/ |
#include <sys/types.h> /* quad_t */ |
#include <sys/param.h> /* BSD4_4 */ |
#include <sys/stat.h> |
#include <sys/time.h> |
#include <sys/resource.h> |
#include <unistd.h> |
#include <stdlib.h> |
#include <ctype.h> |
#include <errno.h> |
#include "shell.h" |
#include "options.h" |
#include "var.h" |
#include "output.h" |
#include "memalloc.h" |
#include "error.h" |
#include "miscbltin.h" |
#include "mystring.h" |
#undef rflag |
#ifdef __GLIBC__ |
mode_t getmode(const void *, mode_t); |
void *setmode(const char *); |
#if !defined(__GLIBC__) || __GLIBC__ == 2 && __GLIBC_MINOR__ < 1 |
typedef enum __rlimit_resource rlim_t; |
#endif |
#endif |
extern char **argptr; /* argument list for builtin command */ |
/* |
* The read builtin. The -e option causes backslashes to escape the |
* following character. |
* |
* This uses unbuffered input, which may be avoidable in some cases. |
*/ |
int |
readcmd(argc, argv) |
int argc; |
char **argv; |
{ |
char **ap; |
int backslash; |
char c; |
int rflag; |
char *prompt; |
char *ifs; |
char *p; |
int startword; |
int status; |
int i; |
rflag = 0; |
prompt = NULL; |
while ((i = nextopt("p:r")) != '\0') { |
if (i == 'p') |
prompt = optarg; |
else |
rflag = 1; |
} |
if (prompt && isatty(0)) { |
out2str(prompt); |
flushall(); |
} |
if (*(ap = argptr) == NULL) |
error("arg count"); |
if ((ifs = bltinlookup("IFS", 1)) == NULL) |
ifs = nullstr; |
status = 0; |
startword = 1; |
backslash = 0; |
STARTSTACKSTR(p); |
for (;;) { |
if (read(0, &c, 1) != 1) { |
status = 1; |
break; |
} |
if (c == '\0') |
continue; |
if (backslash) { |
backslash = 0; |
if (c != '\n') |
STPUTC(c, p); |
continue; |
} |
if (!rflag && c == '\\') { |
backslash++; |
continue; |
} |
if (c == '\n') |
break; |
if (startword && *ifs == ' ' && strchr(ifs, c)) { |
continue; |
} |
startword = 0; |
if (backslash && c == '\\') { |
if (read(0, &c, 1) != 1) { |
status = 1; |
break; |
} |
STPUTC(c, p); |
} else if (ap[1] != NULL && strchr(ifs, c) != NULL) { |
STACKSTRNUL(p); |
setvar(*ap, stackblock(), 0); |
ap++; |
startword = 1; |
STARTSTACKSTR(p); |
} else { |
STPUTC(c, p); |
} |
} |
STACKSTRNUL(p); |
/* Remove trailing blanks */ |
while (stackblock() <= --p && strchr(ifs, *p) != NULL) |
*p = '\0'; |
setvar(*ap, stackblock(), 0); |
while (*++ap != NULL) |
setvar(*ap, nullstr, 0); |
return status; |
} |
int |
umaskcmd(argc, argv) |
int argc; |
char **argv; |
{ |
char *ap; |
int mask; |
int i; |
int symbolic_mode = 0; |
while ((i = nextopt("S")) != '\0') { |
symbolic_mode = 1; |
} |
INTOFF; |
mask = umask(0); |
umask(mask); |
INTON; |
if ((ap = *argptr) == NULL) { |
if (symbolic_mode) { |
char u[4], g[4], o[4]; |
i = 0; |
if ((mask & S_IRUSR) == 0) |
u[i++] = 'r'; |
if ((mask & S_IWUSR) == 0) |
u[i++] = 'w'; |
if ((mask & S_IXUSR) == 0) |
u[i++] = 'x'; |
u[i] = '\0'; |
i = 0; |
if ((mask & S_IRGRP) == 0) |
g[i++] = 'r'; |
if ((mask & S_IWGRP) == 0) |
g[i++] = 'w'; |
if ((mask & S_IXGRP) == 0) |
g[i++] = 'x'; |
g[i] = '\0'; |
i = 0; |
if ((mask & S_IROTH) == 0) |
o[i++] = 'r'; |
if ((mask & S_IWOTH) == 0) |
o[i++] = 'w'; |
if ((mask & S_IXOTH) == 0) |
o[i++] = 'x'; |
o[i] = '\0'; |
out1fmt("u=%s,g=%s,o=%s\n", u, g, o); |
} else { |
out1fmt("%.4o\n", mask); |
} |
} else { |
if (isdigit((unsigned char)*ap)) { |
mask = 0; |
do { |
if (*ap >= '8' || *ap < '0') |
error("Illegal number: %s", argv[1]); |
mask = (mask << 3) + (*ap - '0'); |
} while (*++ap != '\0'); |
umask(mask); |
} else { |
void *set; |
INTOFF; |
if ((set = setmode(ap)) != 0) { |
mask = getmode(set, ~mask & 0777); |
ckfree(set); |
} |
INTON; |
if (!set) |
error("Illegal mode: %s", ap); |
umask(~mask & 0777); |
} |
} |
return 0; |
} |
/* |
* ulimit builtin |
* |
* This code, originally by Doug Gwyn, Doug Kingston, Eric Gisin, and |
* Michael Rendell was ripped from pdksh 5.0.8 and hacked for use with |
* ash by J.T. Conklin. |
* |
* Public domain. |
*/ |
struct limits { |
const char *name; |
int cmd; |
int factor; /* multiply by to get rlim_{cur,max} values */ |
char option; |
}; |
static const struct limits limits[] = { |
#ifdef RLIMIT_CPU |
{ "time(seconds)", RLIMIT_CPU, 1, 't' }, |
#endif |
#ifdef RLIMIT_FSIZE |
{ "file(blocks)", RLIMIT_FSIZE, 512, 'f' }, |
#endif |
#ifdef RLIMIT_DATA |
{ "data(kbytes)", RLIMIT_DATA, 1024, 'd' }, |
#endif |
#ifdef RLIMIT_STACK |
{ "stack(kbytes)", RLIMIT_STACK, 1024, 's' }, |
#endif |
#ifdef RLIMIT_CORE |
{ "coredump(blocks)", RLIMIT_CORE, 512, 'c' }, |
#endif |
#ifdef RLIMIT_RSS |
{ "memory(kbytes)", RLIMIT_RSS, 1024, 'm' }, |
#endif |
#ifdef RLIMIT_MEMLOCK |
{ "locked memory(kbytes)", RLIMIT_MEMLOCK, 1024, 'l' }, |
#endif |
#ifdef RLIMIT_NPROC |
{ "process(processes)", RLIMIT_NPROC, 1, 'p' }, |
#endif |
#ifdef RLIMIT_NOFILE |
{ "nofiles(descriptors)", RLIMIT_NOFILE, 1, 'n' }, |
#endif |
#ifdef RLIMIT_VMEM |
{ "vmemory(kbytes)", RLIMIT_VMEM, 1024, 'v' }, |
#endif |
#ifdef RLIMIT_SWAP |
{ "swap(kbytes)", RLIMIT_SWAP, 1024, 'w' }, |
#endif |
{ (char *) 0, 0, 0, '\0' } |
}; |
int |
ulimitcmd(argc, argv) |
int argc; |
char **argv; |
{ |
int c; |
rlim_t val = 0; |
enum { SOFT = 0x1, HARD = 0x2 } |
how = SOFT | HARD; |
const struct limits *l; |
int set, all = 0; |
int optc, what; |
struct rlimit limit; |
what = 'f'; |
while ((optc = nextopt("HSatfdsmcnpl")) != '\0') |
switch (optc) { |
case 'H': |
how = HARD; |
break; |
case 'S': |
how = SOFT; |
break; |
case 'a': |
all = 1; |
break; |
default: |
what = optc; |
} |
for (l = limits; l->name && l->option != what; l++) |
; |
if (!l->name) |
error("internal error (%c)", what); |
set = *argptr ? 1 : 0; |
if (set) { |
char *p = *argptr; |
if (all || argptr[1]) |
error("too many arguments"); |
if (strcmp(p, "unlimited") == 0) |
val = RLIM_INFINITY; |
else { |
val = (rlim_t) 0; |
while ((c = *p++) >= '0' && c <= '9') |
{ |
val = (val * 10) + (long)(c - '0'); |
if (val < (rlim_t) 0) |
break; |
} |
if (c) |
error("bad number"); |
val *= l->factor; |
} |
} |
if (all) { |
for (l = limits; l->name; l++) { |
getrlimit(l->cmd, &limit); |
if (how & SOFT) |
val = limit.rlim_cur; |
else if (how & HARD) |
val = limit.rlim_max; |
out1fmt("%-20s ", l->name); |
if (val == RLIM_INFINITY) |
out1fmt("unlimited\n"); |
else |
{ |
val /= l->factor; |
#ifdef BSD4_4 |
out1fmt("%lld\n", (long long) val); |
#else |
out1fmt("%ld\n", (long) val); |
#endif |
} |
} |
return 0; |
} |
getrlimit(l->cmd, &limit); |
if (set) { |
if (how & HARD) |
limit.rlim_max = val; |
if (how & SOFT) |
limit.rlim_cur = val; |
if (setrlimit(l->cmd, &limit) < 0) |
error("error setting limit (%s)", strerror(errno)); |
} else { |
if (how & SOFT) |
val = limit.rlim_cur; |
else if (how & HARD) |
val = limit.rlim_max; |
if (val == RLIM_INFINITY) |
out1fmt("unlimited\n"); |
else |
{ |
val /= l->factor; |
#ifdef BSD4_4 |
out1fmt("%lld\n", (long long) val); |
#else |
out1fmt("%ld\n", (long) val); |
#endif |
} |
} |
return 0; |
} |
/tags/0.3.0/uspace/app/ash/main.c |
---|
0,0 → 1,432 |
/* $NetBSD: main.c,v 1.39 2000/11/01 19:56:01 christos Exp $ */ |
/*- |
* Copyright (c) 1991, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Kenneth Almquist. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
*/ |
#include <sys/cdefs.h> |
#ifndef lint |
__COPYRIGHT("@(#) Copyright (c) 1991, 1993\n\ |
The Regents of the University of California. All rights reserved.\n"); |
#endif /* not lint */ |
#ifndef lint |
#if 0 |
static char sccsid[] = "@(#)main.c 8.7 (Berkeley) 7/19/95"; |
#else |
__RCSID("$NetBSD: main.c,v 1.39 2000/11/01 19:56:01 christos Exp $"); |
#endif |
#endif /* not lint */ |
#include <errno.h> |
#include <stdio.h> |
#include <signal.h> |
#include <sys/stat.h> |
#include <unistd.h> |
#include <fcntl.h> |
#include "shell.h" |
#include "main.h" |
#include "mail.h" |
#include "options.h" |
#include "output.h" |
#include "parser.h" |
#include "nodes.h" |
#include "expand.h" |
#include "eval.h" |
#include "jobs.h" |
#include "input.h" |
#include "trap.h" |
#include "var.h" |
#include "show.h" |
#include "memalloc.h" |
#include "error.h" |
#include "init.h" |
#include "mystring.h" |
#include "exec.h" |
#include "cd.h" |
#ifdef HETIO |
#include "hetio.h" |
#endif |
#define PROFILE 0 |
int rootpid; |
int rootshell; |
STATIC union node *curcmd; |
STATIC union node *prevcmd; |
#if PROFILE |
short profile_buf[16384]; |
extern int etext(); |
#endif |
STATIC void read_profile (const char *); |
STATIC char *find_dot_file (char *); |
int main (int, char **); |
/* |
* Main routine. We initialize things, parse the arguments, execute |
* profiles if we're a login shell, and then call cmdloop to execute |
* commands. The setjmp call sets up the location to jump to when an |
* exception occurs. When an exception occurs the variable "state" |
* is used to figure out how far we had gotten. |
*/ |
int |
main(argc, argv) |
int argc; |
char **argv; |
{ |
struct jmploc jmploc; |
struct stackmark smark; |
volatile int state; |
char *shinit; |
int priviliged; |
priviliged = getuid() != geteuid() || getgid() != getegid(); |
#if PROFILE |
monitor(4, etext, profile_buf, sizeof profile_buf, 50); |
#endif |
#if defined(linux) || defined(__GNU__) |
signal(SIGCHLD, SIG_DFL); |
#endif |
state = 0; |
if (setjmp(jmploc.loc)) { |
/* |
* When a shell procedure is executed, we raise the |
* exception EXSHELLPROC to clean up before executing |
* the shell procedure. |
*/ |
switch (exception) { |
case EXSHELLPROC: |
rootpid = getpid(); |
rootshell = 1; |
minusc = NULL; |
state = 3; |
break; |
case EXEXEC: |
exitstatus = exerrno; |
break; |
case EXERROR: |
exitstatus = 2; |
break; |
default: |
break; |
} |
if (exception != EXSHELLPROC) { |
if (state == 0 || iflag == 0 || ! rootshell) |
exitshell(exitstatus); |
} |
reset(); |
if (exception == EXINT |
#if ATTY |
&& (! attyset() || equal(termval(), "emacs")) |
#endif |
) { |
out2c('\n'); |
flushout(&errout); |
} |
popstackmark(&smark); |
FORCEINTON; /* enable interrupts */ |
if (state == 1) |
goto state1; |
else if (state == 2) |
goto state2; |
else if (state == 3) |
goto state3; |
else |
goto state4; |
} |
handler = &jmploc; |
#ifdef DEBUG |
opentrace(); |
trputs("Shell args: "); trargs(argv); |
#endif |
rootpid = getpid(); |
rootshell = 1; |
init(); |
setstackmark(&smark); |
procargs(argc, argv); |
if (argv[0] && argv[0][0] == '-') { |
state = 1; |
read_profile("/etc/profile"); |
state1: |
state = 2; |
if (priviliged == 0) |
read_profile(".profile"); |
else |
read_profile("/etc/suid_profile"); |
} |
state2: |
state = 3; |
if (iflag && !priviliged) { |
if ((shinit = lookupvar("ENV")) != NULL && *shinit != '\0') { |
state = 3; |
read_profile(shinit); |
} |
} |
state3: |
state = 4; |
if (sflag == 0 || minusc) { |
static int sigs[] = { |
SIGINT, SIGQUIT, SIGHUP, |
#ifdef SIGTSTP |
SIGTSTP, |
#endif |
SIGPIPE |
}; |
#define SIGSSIZE (sizeof(sigs)/sizeof(sigs[0])) |
int i; |
for (i = 0; i < SIGSSIZE; i++) |
setsignal(sigs[i]); |
} |
if (minusc) |
evalstring(minusc, 0); |
if (sflag || minusc == NULL) { |
state4: /* XXX ??? - why isn't this before the "if" statement */ |
cmdloop(1); |
} |
#if PROFILE |
monitor(0); |
#endif |
exitshell(exitstatus); |
/* NOTREACHED */ |
} |
/* |
* Read and execute commands. "Top" is nonzero for the top level command |
* loop; it turns on prompting if the shell is interactive. |
*/ |
void |
cmdloop(top) |
int top; |
{ |
union node *n; |
struct stackmark smark; |
int inter; |
int numeof = 0; |
TRACE(("cmdloop(%d) called\n", top)); |
setstackmark(&smark); |
#ifdef HETIO |
if(iflag && top) |
hetio_init(); |
#endif |
for (;;) { |
if (pendingsigs) |
dotrap(); |
inter = 0; |
if (iflag && top) { |
inter++; |
showjobs(1); |
chkmail(0); |
flushout(&output); |
} |
n = parsecmd(inter); |
/* showtree(n); DEBUG */ |
if (n == NEOF) { |
if (!top || numeof >= 50) |
break; |
if (!stoppedjobs()) { |
if (!Iflag) |
break; |
out2str("\nUse \"exit\" to leave shell.\n"); |
} |
numeof++; |
} else if (n != NULL && nflag == 0) { |
job_warning = (job_warning == 2) ? 1 : 0; |
numeof = 0; |
evaltree(n, 0); |
} |
popstackmark(&smark); |
setstackmark(&smark); |
if (evalskip == SKIPFILE) { |
evalskip = 0; |
break; |
} |
} |
popstackmark(&smark); |
} |
/* |
* Read /etc/profile or .profile. Return on error. |
*/ |
STATIC void |
read_profile(name) |
const char *name; |
{ |
int fd; |
int xflag_set = 0; |
int vflag_set = 0; |
INTOFF; |
if ((fd = open(name, O_RDONLY)) >= 0) |
setinputfd(fd, 1); |
INTON; |
if (fd < 0) |
return; |
/* -q turns off -x and -v just when executing init files */ |
if (qflag) { |
if (xflag) |
xflag = 0, xflag_set = 1; |
if (vflag) |
vflag = 0, vflag_set = 1; |
} |
cmdloop(0); |
if (qflag) { |
if (xflag_set) |
xflag = 1; |
if (vflag_set) |
vflag = 1; |
} |
popfile(); |
} |
/* |
* Read a file containing shell functions. |
*/ |
void |
readcmdfile(name) |
char *name; |
{ |
int fd; |
INTOFF; |
if ((fd = open(name, O_RDONLY)) >= 0) |
setinputfd(fd, 1); |
else |
error("Can't open %s", name); |
INTON; |
cmdloop(0); |
popfile(); |
} |
/* |
* Take commands from a file. To be compatable we should do a path |
* search for the file, which is necessary to find sub-commands. |
*/ |
STATIC char * |
find_dot_file(basename) |
char *basename; |
{ |
char *fullname; |
const char *path = pathval(); |
struct stat statb; |
/* don't try this for absolute or relative paths */ |
if (strchr(basename, '/')) |
return basename; |
while ((fullname = padvance(&path, basename)) != NULL) { |
if ((stat(fullname, &statb) == 0) && S_ISREG(statb.st_mode)) { |
/* |
* Don't bother freeing here, since it will |
* be freed by the caller. |
*/ |
return fullname; |
} |
stunalloc(fullname); |
} |
/* not found in the PATH */ |
error("%s: not found", basename); |
/* NOTREACHED */ |
} |
int |
dotcmd(argc, argv) |
int argc; |
char **argv; |
{ |
struct strlist *sp; |
exitstatus = 0; |
for (sp = cmdenviron; sp ; sp = sp->next) |
setvareq(savestr(sp->text), VSTRFIXED|VTEXTFIXED); |
if (argc >= 2) { /* That's what SVR2 does */ |
char *fullname; |
struct stackmark smark; |
setstackmark(&smark); |
fullname = find_dot_file(argv[1]); |
setinputfile(fullname, 1); |
commandname = fullname; |
cmdloop(0); |
popfile(); |
popstackmark(&smark); |
} |
return exitstatus; |
} |
int |
exitcmd(argc, argv) |
int argc; |
char **argv; |
{ |
extern int oexitstatus; |
if (stoppedjobs()) |
return 0; |
if (argc > 1) |
exitstatus = number(argv[1]); |
else |
exitstatus = oexitstatus; |
exitshell(exitstatus); |
/* NOTREACHED */ |
} |
/tags/0.3.0/uspace/app/ash/expand.h |
---|
0,0 → 1,77 |
/* $NetBSD: expand.h,v 1.12 1999/07/09 03:05:50 christos Exp $ */ |
/*- |
* Copyright (c) 1991, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Kenneth Almquist. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
* |
* @(#)expand.h 8.2 (Berkeley) 5/4/95 |
*/ |
struct strlist { |
struct strlist *next; |
char *text; |
}; |
struct arglist { |
struct strlist *list; |
struct strlist **lastp; |
}; |
/* |
* expandarg() flags |
*/ |
#define EXP_FULL 0x1 /* perform word splitting & file globbing */ |
#define EXP_TILDE 0x2 /* do normal tilde expansion */ |
#define EXP_VARTILDE 0x4 /* expand tildes in an assignment */ |
#define EXP_REDIR 0x8 /* file glob for a redirection (1 match only) */ |
#define EXP_CASE 0x10 /* keeps quotes around for CASE pattern */ |
#define EXP_RECORD 0x20 /* need to record arguments for ifs breakup */ |
union node; |
void expandhere (union node *, int); |
void expandarg (union node *, struct arglist *, int); |
void expari (int); |
#if !(defined(__GLIBC__) && !defined(GLOB_BROKEN)) |
int patmatch (char *, char *, int); |
#endif |
void rmescapes (char *); |
int casematch (union node *, char *); |
/* From arith.y */ |
int arith (const char *); |
int expcmd (int , char **); |
void arith_lex_reset (void); |
int yylex (void); |
/tags/0.3.0/uspace/app/ash/mail.h |
---|
0,0 → 1,41 |
/* $NetBSD: mail.h,v 1.8 1995/05/11 21:29:23 christos Exp $ */ |
/*- |
* Copyright (c) 1991, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Kenneth Almquist. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
* |
* @(#)mail.h 8.2 (Berkeley) 5/4/95 |
*/ |
void chkmail (int); |
/tags/0.3.0/uspace/app/ash/eval.c |
---|
0,0 → 1,1159 |
/* $NetBSD: eval.c,v 1.56 2000/05/22 10:18:46 elric Exp $ */ |
/*- |
* Copyright (c) 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Kenneth Almquist. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
*/ |
#include <sys/cdefs.h> |
#ifndef lint |
#if 0 |
static char sccsid[] = "@(#)eval.c 8.9 (Berkeley) 6/8/95"; |
#else |
__RCSID("$NetBSD: eval.c,v 1.56 2000/05/22 10:18:46 elric Exp $"); |
#endif |
#endif /* not lint */ |
#include <sys/types.h> |
#include <signal.h> |
#include <malloc.h> |
#include <unistd.h> |
/* |
* Evaluate a command. |
*/ |
#include "shell.h" |
#include "nodes.h" |
#include "syntax.h" |
#include "expand.h" |
#include "parser.h" |
#include "jobs.h" |
#include "eval.h" |
#include "builtins.h" |
#include "options.h" |
#include "exec.h" |
#include "redir.h" |
#include "input.h" |
#include "output.h" |
#include "trap.h" |
#include "var.h" |
#include "memalloc.h" |
#include "error.h" |
#include "show.h" |
#include "mystring.h" |
#ifndef SMALL |
#include "myhistedit.h" |
#endif |
/* flags in argument to evaltree */ |
#define EV_EXIT 01 /* exit after evaluating tree */ |
#define EV_TESTED 02 /* exit status is checked; ignore -e flag */ |
#define EV_BACKCMD 04 /* command executing within back quotes */ |
MKINIT int evalskip; /* set if we are skipping commands */ |
STATIC int skipcount; /* number of levels to skip */ |
MKINIT int loopnest; /* current loop nesting level */ |
int funcnest; /* depth of function calls */ |
char *commandname; |
struct strlist *cmdenviron; |
int exitstatus; /* exit status of last command */ |
int oexitstatus; /* saved exit status */ |
STATIC void evalloop (union node *, int); |
STATIC void evalfor (union node *, int); |
STATIC void evalcase (union node *, int); |
STATIC void evalsubshell (union node *, int); |
STATIC void expredir (union node *); |
STATIC void evalpipe (union node *); |
STATIC void evalcommand (union node *, int, struct backcmd *); |
STATIC void prehash (union node *); |
STATIC int is_assignment_builtin (const char *); |
STATIC const char *get_standard_path (void); |
/* |
* Called to reset things after an exception. |
*/ |
#ifdef mkinit |
INCLUDE "eval.h" |
RESET { |
evalskip = 0; |
loopnest = 0; |
funcnest = 0; |
} |
SHELLPROC { |
exitstatus = 0; |
} |
#endif |
/* |
* The eval commmand. |
*/ |
int |
evalcmd(argc, argv) |
int argc; |
char **argv; |
{ |
char *p; |
char *concat; |
char **ap; |
if (argc > 1) { |
p = argv[1]; |
if (argc > 2) { |
STARTSTACKSTR(concat); |
ap = argv + 2; |
for (;;) { |
while (*p) |
STPUTC(*p++, concat); |
if ((p = *ap++) == NULL) |
break; |
STPUTC(' ', concat); |
} |
STPUTC('\0', concat); |
p = grabstackstr(concat); |
} |
evalstring(p, EV_TESTED); |
} |
return exitstatus; |
} |
/* |
* Execute a command or commands contained in a string. |
*/ |
void |
evalstring(s, flag) |
char *s; |
int flag; |
{ |
union node *n; |
struct stackmark smark; |
setstackmark(&smark); |
setinputstring(s, 1); |
while ((n = parsecmd(0)) != NEOF) { |
evaltree(n, flag); |
popstackmark(&smark); |
} |
popfile(); |
popstackmark(&smark); |
} |
/* |
* Evaluate a parse tree. The value is left in the global variable |
* exitstatus. |
*/ |
void |
evaltree(n, flags) |
union node *n; |
int flags; |
{ |
if (n == NULL) { |
TRACE(("evaltree(NULL) called\n")); |
exitstatus = 0; |
goto out; |
} |
#ifndef SMALL |
displayhist = 1; /* show history substitutions done with fc */ |
#endif |
TRACE(("evaltree(0x%lx: %d) called\n", (long)n, n->type)); |
switch (n->type) { |
case NSEMI: |
evaltree(n->nbinary.ch1, flags & EV_TESTED); |
if (evalskip) |
goto out; |
evaltree(n->nbinary.ch2, flags); |
break; |
case NAND: |
evaltree(n->nbinary.ch1, EV_TESTED); |
if (evalskip || exitstatus != 0) { |
/* don't bomb out on "set -e; false && true" */ |
flags |= EV_TESTED; |
goto out; |
} |
evaltree(n->nbinary.ch2, flags | EV_TESTED); |
break; |
case NOR: |
evaltree(n->nbinary.ch1, EV_TESTED); |
if (evalskip || exitstatus == 0) |
goto out; |
evaltree(n->nbinary.ch2, flags | EV_TESTED); |
break; |
case NREDIR: |
expredir(n->nredir.redirect); |
redirect(n->nredir.redirect, REDIR_PUSH); |
evaltree(n->nredir.n, flags); |
popredir(); |
break; |
case NSUBSHELL: |
evalsubshell(n, flags); |
break; |
case NBACKGND: |
evalsubshell(n, flags); |
break; |
case NIF: { |
evaltree(n->nif.test, EV_TESTED); |
if (evalskip) |
goto out; |
if (exitstatus == 0) |
evaltree(n->nif.ifpart, flags); |
else if (n->nif.elsepart) |
evaltree(n->nif.elsepart, flags); |
else |
exitstatus = 0; |
break; |
} |
case NWHILE: |
case NUNTIL: |
evalloop(n, flags); |
break; |
case NFOR: |
evalfor(n, flags); |
break; |
case NCASE: |
evalcase(n, flags); |
break; |
case NDEFUN: |
if (is_special_builtin(n->narg.text)) { |
outfmt(out2, "%s is a special built-in\n", n->narg.text); |
exitstatus = 1; |
break; |
} |
defun(n->narg.text, n->narg.next); |
exitstatus = 0; |
break; |
case NNOT: |
evaltree(n->nnot.com, EV_TESTED); |
exitstatus = !exitstatus; |
break; |
case NPIPE: |
evalpipe(n); |
break; |
case NCMD: |
evalcommand(n, flags, (struct backcmd *)NULL); |
break; |
default: |
out1fmt("Node type = %d\n", n->type); |
flushout(&output); |
break; |
} |
out: |
if (pendingsigs) |
dotrap(); |
if ((flags & EV_EXIT) || (eflag && exitstatus && !(flags & EV_TESTED))) |
exitshell(exitstatus); |
} |
STATIC void |
evalloop(n, flags) |
union node *n; |
int flags; |
{ |
int status; |
loopnest++; |
status = 0; |
for (;;) { |
evaltree(n->nbinary.ch1, EV_TESTED); |
if (evalskip) { |
skipping: if (evalskip == SKIPCONT && --skipcount <= 0) { |
evalskip = 0; |
continue; |
} |
if (evalskip == SKIPBREAK && --skipcount <= 0) |
evalskip = 0; |
break; |
} |
if (n->type == NWHILE) { |
if (exitstatus != 0) |
break; |
} else { |
if (exitstatus == 0) |
break; |
} |
evaltree(n->nbinary.ch2, flags & EV_TESTED); |
status = exitstatus; |
if (evalskip) |
goto skipping; |
} |
loopnest--; |
exitstatus = status; |
} |
STATIC void |
evalfor(n, flags) |
union node *n; |
int flags; |
{ |
struct arglist arglist; |
union node *argp; |
struct strlist *sp; |
struct stackmark smark; |
setstackmark(&smark); |
arglist.lastp = &arglist.list; |
for (argp = n->nfor.args ; argp ; argp = argp->narg.next) { |
oexitstatus = exitstatus; |
expandarg(argp, &arglist, EXP_FULL | EXP_TILDE | EXP_RECORD); |
if (evalskip) |
goto out; |
} |
*arglist.lastp = NULL; |
exitstatus = 0; |
loopnest++; |
for (sp = arglist.list ; sp ; sp = sp->next) { |
setvar(n->nfor.var, sp->text, 0); |
evaltree(n->nfor.body, flags & EV_TESTED); |
if (evalskip) { |
if (evalskip == SKIPCONT && --skipcount <= 0) { |
evalskip = 0; |
continue; |
} |
if (evalskip == SKIPBREAK && --skipcount <= 0) |
evalskip = 0; |
break; |
} |
} |
loopnest--; |
out: |
popstackmark(&smark); |
} |
STATIC void |
evalcase(n, flags) |
union node *n; |
int flags; |
{ |
union node *cp; |
union node *patp; |
struct arglist arglist; |
struct stackmark smark; |
setstackmark(&smark); |
arglist.lastp = &arglist.list; |
oexitstatus = exitstatus; |
expandarg(n->ncase.expr, &arglist, EXP_TILDE); |
for (cp = n->ncase.cases ; cp && evalskip == 0 ; cp = cp->nclist.next) { |
for (patp = cp->nclist.pattern ; patp ; patp = patp->narg.next) { |
if (casematch(patp, arglist.list->text)) { |
if (evalskip == 0) { |
evaltree(cp->nclist.body, flags); |
} |
goto out; |
} |
} |
} |
out: |
popstackmark(&smark); |
} |
/* |
* Kick off a subshell to evaluate a tree. |
*/ |
STATIC void |
evalsubshell(n, flags) |
union node *n; |
int flags; |
{ |
struct job *jp; |
int backgnd = (n->type == NBACKGND); |
expredir(n->nredir.redirect); |
jp = makejob(n, 1); |
if (forkshell(jp, n, backgnd) == 0) { |
if (backgnd) |
flags &=~ EV_TESTED; |
redirect(n->nredir.redirect, 0); |
evaltree(n->nredir.n, flags | EV_EXIT); /* never returns */ |
} |
if (! backgnd) { |
INTOFF; |
exitstatus = waitforjob(jp); |
INTON; |
} |
} |
/* |
* Compute the names of the files in a redirection list. |
*/ |
STATIC void |
expredir(n) |
union node *n; |
{ |
union node *redir; |
for (redir = n ; redir ; redir = redir->nfile.next) { |
struct arglist fn; |
fn.lastp = &fn.list; |
oexitstatus = exitstatus; |
switch (redir->type) { |
case NFROMTO: |
case NFROM: |
case NTO: |
case NAPPEND: |
case NTOOV: |
expandarg(redir->nfile.fname, &fn, EXP_TILDE | EXP_REDIR); |
redir->nfile.expfname = fn.list->text; |
break; |
case NFROMFD: |
case NTOFD: |
if (redir->ndup.vname) { |
expandarg(redir->ndup.vname, &fn, EXP_FULL | EXP_TILDE); |
fixredir(redir, fn.list->text, 1); |
} |
break; |
} |
} |
} |
/* |
* Evaluate a pipeline. All the processes in the pipeline are children |
* of the process creating the pipeline. (This differs from some versions |
* of the shell, which make the last process in a pipeline the parent |
* of all the rest.) |
*/ |
STATIC void |
evalpipe(n) |
union node *n; |
{ |
struct job *jp; |
struct nodelist *lp; |
int pipelen; |
int prevfd; |
int pip[2]; |
TRACE(("evalpipe(0x%lx) called\n", (long)n)); |
pipelen = 0; |
for (lp = n->npipe.cmdlist ; lp ; lp = lp->next) |
pipelen++; |
INTOFF; |
jp = makejob(n, pipelen); |
prevfd = -1; |
for (lp = n->npipe.cmdlist ; lp ; lp = lp->next) { |
prehash(lp->n); |
pip[1] = -1; |
if (lp->next) { |
if (pipe(pip) < 0) { |
close(prevfd); |
error("Pipe call failed"); |
} |
} |
if (forkshell(jp, lp->n, n->npipe.backgnd) == 0) { |
INTON; |
if (prevfd > 0) { |
close(0); |
copyfd(prevfd, 0); |
close(prevfd); |
if (pip[0] == 0) { |
pip[0] = -1; |
} |
} |
if (pip[1] >= 0) { |
if (pip[0] >= 0) { |
close(pip[0]); |
} |
if (pip[1] != 1) { |
close(1); |
copyfd(pip[1], 1); |
close(pip[1]); |
} |
} |
evaltree(lp->n, EV_EXIT); |
} |
if (prevfd >= 0) |
close(prevfd); |
prevfd = pip[0]; |
close(pip[1]); |
} |
INTON; |
if (n->npipe.backgnd == 0) { |
INTOFF; |
exitstatus = waitforjob(jp); |
TRACE(("evalpipe: job done exit status %d\n", exitstatus)); |
INTON; |
} |
} |
/* |
* Execute a command inside back quotes. If it's a builtin command, we |
* want to save its output in a block obtained from malloc. Otherwise |
* we fork off a subprocess and get the output of the command via a pipe. |
* Should be called with interrupts off. |
*/ |
void |
evalbackcmd(n, result) |
union node *n; |
struct backcmd *result; |
{ |
int pip[2]; |
struct job *jp; |
struct stackmark smark; /* unnecessary */ |
setstackmark(&smark); |
result->fd = -1; |
result->buf = NULL; |
result->nleft = 0; |
result->jp = NULL; |
if (n == NULL) { |
exitstatus = 0; |
goto out; |
} |
#ifdef notyet |
/* |
* For now we disable executing builtins in the same |
* context as the shell, because we are not keeping |
* enough state to recover from changes that are |
* supposed only to affect subshells. eg. echo "`cd /`" |
*/ |
if (n->type == NCMD) { |
exitstatus = oexitstatus; |
evalcommand(n, EV_BACKCMD, result); |
} else |
#endif |
{ |
exitstatus = 0; |
if (pipe(pip) < 0) |
error("Pipe call failed"); |
jp = makejob(n, 1); |
if (forkshell(jp, n, FORK_NOJOB) == 0) { |
FORCEINTON; |
close(pip[0]); |
if (pip[1] != 1) { |
close(1); |
copyfd(pip[1], 1); |
close(pip[1]); |
} |
eflag = 0; |
evaltree(n, EV_EXIT); |
} |
close(pip[1]); |
result->fd = pip[0]; |
result->jp = jp; |
} |
out: |
popstackmark(&smark); |
TRACE(("evalbackcmd done: fd=%d buf=0x%x nleft=%d jp=0x%x\n", |
result->fd, result->buf, result->nleft, result->jp)); |
} |
/* |
* Execute a simple command. |
*/ |
STATIC void |
evalcommand(cmd, flags, backcmd) |
union node *cmd; |
int flags; |
struct backcmd *backcmd; |
{ |
struct stackmark smark; |
union node *argp; |
struct arglist arglist; |
struct arglist varlist; |
char **argv; |
int argc; |
char **envp; |
int varflag; |
int pseudovarflag; |
struct strlist *sp; |
int mode; |
int pip[2]; |
struct cmdentry cmdentry; |
struct job *jp; |
struct jmploc jmploc; |
struct jmploc *volatile savehandler; |
char *volatile savecmdname; |
volatile struct shparam saveparam; |
struct localvar *volatile savelocalvars; |
volatile int e; |
char *lastarg; |
int not_special; |
const char *path; |
const char *standard_path; |
#if __GNUC__ |
/* Avoid longjmp clobbering */ |
(void) &argv; |
(void) &argc; |
(void) &lastarg; |
(void) &flags; |
(void) ¬_special; |
(void) &standard_path; |
#endif |
/* First expand the arguments. */ |
TRACE(("evalcommand(0x%lx, %d) called\n", (long)cmd, flags)); |
setstackmark(&smark); |
arglist.lastp = &arglist.list; |
varlist.lastp = &varlist.list; |
arglist.list = 0; |
varflag = 1; |
pseudovarflag = 0; |
oexitstatus = exitstatus; |
exitstatus = 0; |
not_special = 0; |
path = pathval(); |
standard_path = NULL; |
for (argp = cmd->ncmd.args ; argp ; argp = argp->narg.next) { |
char *p = argp->narg.text; |
if ((varflag || pseudovarflag) && is_name(*p)) { |
do { |
p++; |
} while (is_in_name(*p)); |
if (*p == '=') { |
if (varflag) |
expandarg(argp, &varlist, EXP_VARTILDE); |
else |
expandarg(argp, &arglist, EXP_VARTILDE); |
continue; |
} |
} |
expandarg(argp, &arglist, EXP_FULL | EXP_TILDE); |
if (varflag && arglist.list && is_assignment_builtin(arglist.list->text)) |
pseudovarflag = 1; |
varflag = 0; |
} |
*arglist.lastp = NULL; |
*varlist.lastp = NULL; |
expredir(cmd->ncmd.redirect); |
argc = 0; |
for (sp = arglist.list ; sp ; sp = sp->next) |
argc++; |
argv = stalloc(sizeof (char *) * (argc + 1)); |
for (sp = arglist.list ; sp ; sp = sp->next) { |
TRACE(("evalcommand arg: %s\n", sp->text)); |
*argv++ = sp->text; |
} |
*argv = NULL; |
lastarg = NULL; |
if (iflag && funcnest == 0 && argc > 0) |
lastarg = argv[-1]; |
argv -= argc; |
/* Print the command if xflag is set. */ |
if (xflag) { |
outc('+', &errout); |
for (sp = varlist.list ; sp ; sp = sp->next) { |
outc(' ', &errout); |
out2str(sp->text); |
} |
for (sp = arglist.list ; sp ; sp = sp->next) { |
outc(' ', &errout); |
out2str(sp->text); |
} |
outc('\n', &errout); |
flushout(&errout); |
} |
/* Now locate the command. */ |
if (argc == 0) { |
cmdentry.cmdtype = CMDBUILTIN; |
cmdentry.u.index = BLTINCMD; |
} else { |
static const char PATH[] = "PATH="; |
const char *oldpath = NULL; |
int findflag = DO_ERR; |
/* |
* Modify the command lookup path, if a PATH= assignment |
* is present |
*/ |
for (sp = varlist.list ; sp ; sp = sp->next) |
if (strncmp(sp->text, PATH, sizeof(PATH) - 1) == 0) { |
path = sp->text + sizeof(PATH) - 1; |
findflag |= DO_BRUTE; |
} |
for(;;) { |
find_command(argv[0], &cmdentry, findflag, path); |
if (oldpath) { |
path = oldpath; |
oldpath = NULL; |
} |
if (cmdentry.cmdtype == CMDUNKNOWN) { /* command not found */ |
exitstatus = 127; |
flushout(&errout); |
goto out; |
} |
/* implement the bltin builtin here */ |
if (cmdentry.cmdtype == CMDBUILTIN && cmdentry.u.index == BLTINCMD) { |
not_special = 1; |
for(;;) { |
argv++; |
if (--argc == 0) |
break; |
if ((cmdentry.u.index = find_builtin(*argv)) < 0) { |
outfmt(&errout, "%s: not found\n", *argv); |
exitstatus = 127; |
flushout(&errout); |
goto out; |
} |
if (cmdentry.u.index != BLTINCMD) |
break; |
} |
} |
if (cmdentry.cmdtype == CMDBUILTIN && cmdentry.u.index == COMMANDCMD) { |
not_special = 1; |
argv++; |
if (--argc == 0) { |
exitstatus = 0; |
goto out; |
} |
if (*argv[0] == '-') { |
if (!equal(argv[0], "-p")) { |
argv--; |
argc++; |
break; |
} |
argv++; |
if (--argc == 0) { |
exitstatus = 0; |
goto out; |
} |
if (!standard_path) { |
standard_path = get_standard_path(); |
} |
oldpath = path; |
path = standard_path; |
findflag |= DO_BRUTE; |
} |
findflag |= DO_NOFUN; |
continue; |
} |
break; |
} |
} |
/* Fork off a child process if necessary. */ |
if (cmd->ncmd.backgnd |
|| (cmdentry.cmdtype == CMDNORMAL && (flags & EV_EXIT) == 0) |
|| ((flags & EV_BACKCMD) != 0 |
&& (cmdentry.cmdtype != CMDBUILTIN |
|| cmdentry.u.index == DOTCMD |
|| cmdentry.u.index == EVALCMD))) { |
jp = makejob(cmd, 1); |
mode = cmd->ncmd.backgnd; |
if (flags & EV_BACKCMD) { |
mode = FORK_NOJOB; |
if (pipe(pip) < 0) |
error("Pipe call failed"); |
} |
if (forkshell(jp, cmd, mode) != 0) |
goto parent; /* at end of routine */ |
if (flags & EV_BACKCMD) { |
FORCEINTON; |
close(pip[0]); |
if (pip[1] != 1) { |
close(1); |
copyfd(pip[1], 1); |
close(pip[1]); |
} |
} |
flags |= EV_EXIT; |
} |
/* This is the child process if a fork occurred. */ |
/* Execute the command. */ |
if (cmdentry.cmdtype == CMDFUNCTION) { |
#ifdef DEBUG |
trputs("Shell function: "); trargs(argv); |
#endif |
exitstatus = oexitstatus; |
redirect(cmd->ncmd.redirect, REDIR_PUSH); |
saveparam = shellparam; |
shellparam.malloc = 0; |
shellparam.nparam = argc - 1; |
shellparam.p = argv + 1; |
INTOFF; |
savelocalvars = localvars; |
localvars = NULL; |
INTON; |
if (setjmp(jmploc.loc)) { |
if (exception == EXSHELLPROC) { |
freeparam((volatile struct shparam *) |
&saveparam); |
} else { |
saveparam.optind = shellparam.optind; |
saveparam.optoff = shellparam.optoff; |
freeparam(&shellparam); |
shellparam = saveparam; |
} |
poplocalvars(); |
localvars = savelocalvars; |
handler = savehandler; |
longjmp(handler->loc, 1); |
} |
savehandler = handler; |
handler = &jmploc; |
for (sp = varlist.list ; sp ; sp = sp->next) |
mklocal(sp->text); |
funcnest++; |
evaltree(cmdentry.u.func, flags & EV_TESTED); |
funcnest--; |
INTOFF; |
poplocalvars(); |
localvars = savelocalvars; |
saveparam.optind = shellparam.optind; |
saveparam.optoff = shellparam.optoff; |
freeparam(&shellparam); |
shellparam = saveparam; |
handler = savehandler; |
popredir(); |
INTON; |
if (evalskip == SKIPFUNC) { |
evalskip = 0; |
skipcount = 0; |
} |
if (flags & EV_EXIT) |
exitshell(exitstatus); |
} else if (cmdentry.cmdtype == CMDBUILTIN) { |
#ifdef DEBUG |
trputs("builtin command: "); trargs(argv); |
#endif |
mode = (cmdentry.u.index == EXECCMD)? 0 : REDIR_PUSH; |
if (flags == EV_BACKCMD) { |
#if defined(_GNU_SOURCE) && !defined(__UCLIBC__) |
openmemout(); |
#else |
memout.nleft = 0; |
memout.nextc = memout.buf; |
memout.bufsize = 64; |
#endif |
mode |= REDIR_BACKQ; |
} |
redirect(cmd->ncmd.redirect, mode); |
savecmdname = commandname; |
cmdenviron = varlist.list; |
e = -1; |
if (setjmp(jmploc.loc)) { |
e = exception; |
exitstatus = (e == EXINT)? SIGINT+128 : 2; |
goto cmddone; |
} |
savehandler = handler; |
handler = &jmploc; |
commandname = argv[0]; |
argptr = argv + 1; |
optptr = NULL; /* initialize nextopt */ |
exitstatus = (*builtinfunc[cmdentry.u.index])(argc, argv); |
flushall(); |
cmddone: |
out1 = &output; |
out2 = &errout; |
freestdout(); |
if (!not_special && is_special_builtin(commandname)) |
listsetvar(cmdenviron); |
cmdenviron = NULL; |
if (e != EXSHELLPROC) { |
commandname = savecmdname; |
if (flags & EV_EXIT) |
exitshell(exitstatus); |
} |
handler = savehandler; |
if (e != -1) { |
if ((e != EXERROR && e != EXEXEC) |
|| cmdentry.u.index == BLTINCMD |
|| cmdentry.u.index == DOTCMD |
|| cmdentry.u.index == EVALCMD |
#ifndef SMALL |
|| cmdentry.u.index == HISTCMD |
#endif |
|| cmdentry.u.index == EXECCMD) |
exraise(e); |
FORCEINTON; |
} |
if (cmdentry.u.index != EXECCMD) |
popredir(); |
if (flags == EV_BACKCMD) { |
#if defined(_GNU_SOURCE) && !defined(__UCLIBC__) |
closememout(); |
#endif |
backcmd->buf = memout.buf; |
#if defined(_GNU_SOURCE) && !defined(__UCLIBC__) |
backcmd->nleft = memout.bufsize; |
#else |
backcmd->nleft = memout.nextc - memout.buf; |
#endif |
memout.buf = NULL; |
} |
cmdenviron = NULL; |
} else { |
#ifdef DEBUG |
trputs("normal command: "); trargs(argv); |
#endif |
clearredir(); |
redirect(cmd->ncmd.redirect, 0); |
for (sp = varlist.list ; sp ; sp = sp->next) |
setvareq(sp->text, VEXPORT|VSTACK); |
envp = environment(); |
shellexec(argv, envp, path, cmdentry.u.index); |
} |
goto out; |
parent: /* parent process gets here (if we forked) */ |
if (mode == 0) { /* argument to fork */ |
INTOFF; |
exitstatus = waitforjob(jp); |
INTON; |
} else if (mode == 2) { |
backcmd->fd = pip[0]; |
close(pip[1]); |
backcmd->jp = jp; |
} |
out: |
if (lastarg) |
setvar("_", lastarg, 0); |
popstackmark(&smark); |
if (eflag && exitstatus && !(flags & EV_TESTED)) |
exitshell(exitstatus); |
} |
/* |
* Search for a command. This is called before we fork so that the |
* location of the command will be available in the parent as well as |
* the child. The check for "goodname" is an overly conservative |
* check that the name will not be subject to expansion. |
*/ |
STATIC void |
prehash(n) |
union node *n; |
{ |
struct cmdentry entry; |
if (n->type == NCMD && n->ncmd.args) |
if (goodname(n->ncmd.args->narg.text)) |
find_command(n->ncmd.args->narg.text, &entry, 0, |
pathval()); |
} |
/* |
* Builtin commands. Builtin commands whose functions are closely |
* tied to evaluation are implemented here. |
*/ |
/* |
* No command given, or a bltin command with no arguments. Set the |
* specified variables. |
*/ |
int |
bltincmd(argc, argv) |
int argc; |
char **argv; |
{ |
listsetvar(cmdenviron); |
/* |
* Preserve exitstatus of a previous possible redirection |
* as POSIX mandates |
*/ |
return exitstatus; |
} |
/* |
* Handle break and continue commands. Break, continue, and return are |
* all handled by setting the evalskip flag. The evaluation routines |
* above all check this flag, and if it is set they start skipping |
* commands rather than executing them. The variable skipcount is |
* the number of loops to break/continue, or the number of function |
* levels to return. (The latter is always 1.) It should probably |
* be an error to break out of more loops than exist, but it isn't |
* in the standard shell so we don't make it one here. |
*/ |
int |
breakcmd(argc, argv) |
int argc; |
char **argv; |
{ |
int n = argc > 1 ? number(argv[1]) : 1; |
if (n > loopnest) |
n = loopnest; |
if (n > 0) { |
evalskip = (**argv == 'c')? SKIPCONT : SKIPBREAK; |
skipcount = n; |
} |
return 0; |
} |
/* |
* The return command. |
*/ |
int |
returncmd(argc, argv) |
int argc; |
char **argv; |
{ |
int ret = argc > 1 ? number(argv[1]) : oexitstatus; |
if (funcnest) { |
evalskip = SKIPFUNC; |
skipcount = 1; |
return ret; |
} |
else { |
/* Do what ksh does; skip the rest of the file */ |
evalskip = SKIPFILE; |
skipcount = 1; |
return ret; |
} |
} |
int |
falsecmd(argc, argv) |
int argc; |
char **argv; |
{ |
return 1; |
} |
int |
truecmd(argc, argv) |
int argc; |
char **argv; |
{ |
return 0; |
} |
int |
execcmd(argc, argv) |
int argc; |
char **argv; |
{ |
if (argc > 1) { |
struct strlist *sp; |
iflag = 0; /* exit on error */ |
mflag = 0; |
optschanged(); |
for (sp = cmdenviron; sp ; sp = sp->next) |
setvareq(sp->text, VEXPORT|VSTACK); |
shellexec(argv + 1, environment(), pathval(), 0); |
} |
return 0; |
} |
STATIC int |
is_assignment_builtin (command) |
const char *command; |
{ |
static const char *assignment_builtins[] = { |
"alias", "declare", "export", "local", "readonly", "typeset", |
(char *)NULL |
}; |
int i; |
for (i = 0; assignment_builtins[i]; i++) |
if (strcmp(command, assignment_builtins[i]) == 0) return 1; |
return 0; |
} |
int |
is_special_builtin(name) |
const char *name; |
{ |
static const char *special_builtins[] = { |
"break", ":", ".", "continue", "eval", "exec", "exit", |
"export", "readonly", "return", "set", "shift", "times", |
"trap", "unset", (char *)NULL |
}; |
int i; |
if (!name) return 0; |
for (i = 0; special_builtins[i]; i++) |
if (equal(name, special_builtins[i])) return 1; |
return 0; |
} |
STATIC const char * |
get_standard_path() |
{ |
char *p; |
size_t len; |
len = confstr(_CS_PATH, NULL, 0); |
p = stalloc(len + 2); |
*p = '\0'; |
confstr(_CS_PATH, p, len); |
return p; |
} |
/tags/0.3.0/uspace/app/ash/var.c |
---|
0,0 → 1,777 |
/* $NetBSD: var.c,v 1.26 2000/12/20 00:15:10 cgd Exp $ */ |
/*- |
* Copyright (c) 1991, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Kenneth Almquist. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
*/ |
#include <sys/cdefs.h> |
#ifndef lint |
#if 0 |
static char sccsid[] = "@(#)var.c 8.3 (Berkeley) 5/4/95"; |
#else |
__RCSID("$NetBSD: var.c,v 1.26 2000/12/20 00:15:10 cgd Exp $"); |
#endif |
#endif /* not lint */ |
#include <unistd.h> |
#include <stdlib.h> |
#include <paths.h> |
/* |
* Shell variables. |
*/ |
#include "shell.h" |
#include "output.h" |
#include "expand.h" |
#include "nodes.h" /* for other headers */ |
#include "eval.h" /* defines cmdenviron */ |
#include "exec.h" |
#include "syntax.h" |
#include "options.h" |
#include "mail.h" |
#include "var.h" |
#include "memalloc.h" |
#include "error.h" |
#include "mystring.h" |
#include "parser.h" |
#ifndef SMALL |
#include "myhistedit.h" |
#endif |
#define VTABSIZE 39 |
struct varinit { |
struct var *var; |
int flags; |
const char *text; |
void (*func) (const char *); |
}; |
#if ATTY |
struct var vatty; |
#endif |
#ifndef SMALL |
struct var vhistsize; |
struct var vterm; |
#endif |
struct var vifs; |
struct var vmail; |
struct var vmpath; |
struct var vpath; |
struct var vps1; |
struct var vps2; |
struct var vvers; |
struct var voptind; |
const struct varinit varinit[] = { |
#if ATTY |
{ &vatty, VSTRFIXED|VTEXTFIXED|VUNSET, "ATTY=", |
NULL }, |
#endif |
#ifndef SMALL |
{ &vhistsize, VSTRFIXED|VTEXTFIXED|VUNSET, "HISTSIZE=", |
sethistsize }, |
#endif |
{ &vifs, VSTRFIXED|VTEXTFIXED, "IFS= \t\n", |
NULL }, |
{ &vmail, VSTRFIXED|VTEXTFIXED|VUNSET, "MAIL=", |
NULL }, |
{ &vmpath, VSTRFIXED|VTEXTFIXED|VUNSET, "MAILPATH=", |
NULL }, |
{ &vpath, VSTRFIXED|VTEXTFIXED, "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", |
changepath }, |
/* |
* vps1 depends on uid |
*/ |
{ &vps2, VSTRFIXED|VTEXTFIXED, "PS2=> ", |
NULL }, |
#ifndef SMALL |
{ &vterm, VSTRFIXED|VTEXTFIXED|VUNSET, "TERM=", |
setterm }, |
#endif |
{ &voptind, VSTRFIXED|VTEXTFIXED, "OPTIND=1", |
getoptsreset }, |
{ NULL, 0, NULL, |
NULL } |
}; |
struct var *vartab[VTABSIZE]; |
STATIC struct var **hashvar (const char *); |
STATIC int varequal (const char *, const char *); |
/* |
* Initialize the varable symbol tables and import the environment |
* Setting PWD added by herbert |
*/ |
#ifdef mkinit |
INCLUDE "cd.h" |
INCLUDE "var.h" |
INIT { |
char **envp; |
extern char **environ; |
extern char *curdir; |
initvar(); |
for (envp = environ ; *envp ; envp++) { |
if (strchr(*envp, '=')) { |
setvareq(*envp, VEXPORT|VTEXTFIXED); |
} |
} |
getpwd(); |
setvar("PWD", curdir, VEXPORT|VTEXTFIXED); |
} |
#endif |
/* |
* This routine initializes the builtin variables. It is called when the |
* shell is initialized and again when a shell procedure is spawned. |
*/ |
void |
initvar() { |
const struct varinit *ip; |
struct var *vp; |
struct var **vpp; |
char ppid[30]; |
for (ip = varinit ; (vp = ip->var) != NULL ; ip++) { |
if ((vp->flags & VEXPORT) == 0) { |
vpp = hashvar(ip->text); |
vp->next = *vpp; |
*vpp = vp; |
vp->text = strdup(ip->text); |
vp->flags = ip->flags; |
vp->func = ip->func; |
} |
} |
/* |
* PS1 depends on uid |
*/ |
if ((vps1.flags & VEXPORT) == 0) { |
vpp = hashvar("PS1="); |
vps1.next = *vpp; |
*vpp = &vps1; |
vps1.text = strdup(geteuid() ? "PS1=$ " : "PS1=# "); |
vps1.flags = VSTRFIXED|VTEXTFIXED; |
} |
snprintf(ppid, 29, "%ld", (long)getppid()); |
setvar("PPID", ppid, VREADONLY|VNOFUNC); |
} |
/* |
* Safe version of setvar, returns 1 on success 0 on failure. |
*/ |
int |
setvarsafe(name, val, flags) |
const char *name, *val; |
int flags; |
{ |
struct jmploc jmploc; |
struct jmploc *volatile savehandler = handler; |
int err = 0; |
#ifdef __GNUC__ |
(void) &err; |
#endif |
if (setjmp(jmploc.loc)) |
err = 1; |
else { |
handler = &jmploc; |
setvar(name, val, flags); |
} |
handler = savehandler; |
return err; |
} |
/* |
* Set the value of a variable. The flags argument is ored with the |
* flags of the variable. If val is NULL, the variable is unset. |
*/ |
void |
setvar(name, val, flags) |
const char *name, *val; |
int flags; |
{ |
const char *p; |
const char *q; |
char *d; |
int len; |
int namelen; |
char *nameeq; |
int isbad; |
isbad = 0; |
p = name; |
if (! is_name(*p)) |
isbad = 1; |
p++; |
for (;;) { |
if (! is_in_name(*p)) { |
if (*p == '\0' || *p == '=') |
break; |
isbad = 1; |
} |
p++; |
} |
namelen = p - name; |
if (isbad) |
error("%.*s: bad variable name", namelen, name); |
len = namelen + 2; /* 2 is space for '=' and '\0' */ |
if (val == NULL) { |
flags |= VUNSET; |
} else { |
len += strlen(val); |
} |
d = nameeq = ckmalloc(len); |
q = name; |
while (--namelen >= 0) |
*d++ = *q++; |
*d++ = '='; |
*d = '\0'; |
if (val) |
scopy(val, d); |
setvareq(nameeq, flags); |
} |
/* |
* Same as setvar except that the variable and value are passed in |
* the first argument as name=value. Since the first argument will |
* be actually stored in the table, it should not be a string that |
* will go away. |
*/ |
void |
setvareq(s, flags) |
char *s; |
int flags; |
{ |
struct var *vp, **vpp; |
vpp = hashvar(s); |
flags |= (VEXPORT & (((unsigned) (1 - aflag)) - 1)); |
for (vp = *vpp ; vp ; vp = vp->next) { |
if (varequal(s, vp->text)) { |
if (vp->flags & VREADONLY) { |
size_t len = strchr(s, '=') - s; |
error("%.*s: is read only", len, s); |
} |
INTOFF; |
if (vp->func && (flags & VNOFUNC) == 0) |
(*vp->func)(strchr(s, '=') + 1); |
if ((vp->flags & (VTEXTFIXED|VSTACK)) == 0) |
ckfree(vp->text); |
vp->flags &= ~(VTEXTFIXED|VSTACK|VUNSET); |
vp->flags |= flags; |
vp->text = s; |
/* |
* We could roll this to a function, to handle it as |
* a regular variable function callback, but why bother? |
*/ |
if (iflag && |
(vp == &vmpath || (vp == &vmail && ! mpathset()))) |
chkmail(1); |
INTON; |
return; |
} |
} |
/* not found */ |
vp = ckmalloc(sizeof (*vp)); |
vp->flags = flags; |
vp->text = s; |
vp->next = *vpp; |
vp->func = NULL; |
*vpp = vp; |
} |
/* |
* Process a linked list of variable assignments. |
*/ |
void |
listsetvar(list) |
struct strlist *list; |
{ |
struct strlist *lp; |
INTOFF; |
for (lp = list ; lp ; lp = lp->next) { |
setvareq(savestr(lp->text), 0); |
} |
INTON; |
} |
/* |
* Find the value of a variable. Returns NULL if not set. |
*/ |
char * |
lookupvar(name) |
const char *name; |
{ |
struct var *v; |
for (v = *hashvar(name) ; v ; v = v->next) { |
if (varequal(v->text, name)) { |
if (v->flags & VUNSET) |
return NULL; |
return strchr(v->text, '=') + 1; |
} |
} |
return NULL; |
} |
/* |
* Search the environment of a builtin command. If the second argument |
* is nonzero, return the value of a variable even if it hasn't been |
* exported. |
*/ |
char * |
bltinlookup(name, doall) |
const char *name; |
int doall; |
{ |
struct strlist *sp; |
struct var *v; |
for (sp = cmdenviron ; sp ; sp = sp->next) { |
if (varequal(sp->text, name)) |
return strchr(sp->text, '=') + 1; |
} |
for (v = *hashvar(name) ; v ; v = v->next) { |
if (varequal(v->text, name)) { |
if ((v->flags & VUNSET) |
|| (!doall && (v->flags & VEXPORT) == 0)) |
return NULL; |
return strchr(v->text, '=') + 1; |
} |
} |
return NULL; |
} |
/* |
* Generate a list of exported variables. This routine is used to construct |
* the third argument to execve when executing a program. |
*/ |
char ** |
environment() { |
int nenv; |
struct var **vpp; |
struct var *vp; |
char **env; |
char **ep; |
nenv = 0; |
for (vpp = vartab ; vpp < vartab + VTABSIZE ; vpp++) { |
for (vp = *vpp ; vp ; vp = vp->next) |
if (vp->flags & VEXPORT) |
nenv++; |
} |
ep = env = stalloc((nenv + 1) * sizeof *env); |
for (vpp = vartab ; vpp < vartab + VTABSIZE ; vpp++) { |
for (vp = *vpp ; vp ; vp = vp->next) |
if (vp->flags & VEXPORT) |
*ep++ = vp->text; |
} |
*ep = NULL; |
return env; |
} |
/* |
* Called when a shell procedure is invoked to clear out nonexported |
* variables. It is also necessary to reallocate variables of with |
* VSTACK set since these are currently allocated on the stack. |
*/ |
#ifdef mkinit |
MKINIT void shprocvar (void); |
SHELLPROC { |
shprocvar(); |
} |
#endif |
void |
shprocvar() { |
struct var **vpp; |
struct var *vp, **prev; |
for (vpp = vartab ; vpp < vartab + VTABSIZE ; vpp++) { |
for (prev = vpp ; (vp = *prev) != NULL ; ) { |
if ((vp->flags & VEXPORT) == 0) { |
*prev = vp->next; |
if ((vp->flags & VTEXTFIXED) == 0) |
ckfree(vp->text); |
if ((vp->flags & VSTRFIXED) == 0) |
ckfree(vp); |
} else { |
if (vp->flags & VSTACK) { |
vp->text = savestr(vp->text); |
vp->flags &=~ VSTACK; |
} |
prev = &vp->next; |
} |
} |
} |
initvar(); |
} |
/* |
* Command to list all variables which are set. Currently this command |
* is invoked from the set command when the set command is called without |
* any variables. |
*/ |
int |
showvarscmd(argc, argv) |
int argc; |
char **argv; |
{ |
struct var **vpp; |
struct var *vp; |
for (vpp = vartab ; vpp < vartab + VTABSIZE ; vpp++) { |
for (vp = *vpp ; vp ; vp = vp->next) { |
if ((vp->flags & VUNSET) == 0) |
out1fmt("%s\n", vp->text); |
} |
} |
return 0; |
} |
/* |
* The export and readonly commands. |
*/ |
int |
exportcmd(argc, argv) |
int argc; |
char **argv; |
{ |
struct var **vpp; |
struct var *vp; |
char *name; |
const char *p; |
int flag = argv[0][0] == 'r'? VREADONLY : VEXPORT; |
int pflag; |
listsetvar(cmdenviron); |
pflag = (nextopt("p") == 'p'); |
if (argc > 1 && !pflag) { |
while ((name = *argptr++) != NULL) { |
if ((p = strchr(name, '=')) != NULL) { |
p++; |
} else { |
vpp = hashvar(name); |
for (vp = *vpp ; vp ; vp = vp->next) { |
if (varequal(vp->text, name)) { |
vp->flags |= flag; |
goto found; |
} |
} |
} |
setvar(name, p, flag); |
found:; |
} |
} else { |
for (vpp = vartab ; vpp < vartab + VTABSIZE ; vpp++) { |
for (vp = *vpp ; vp ; vp = vp->next) { |
if ((vp->flags & flag) == 0) |
continue; |
if (pflag) { |
out1fmt("%s %s\n", argv[0], vp->text); |
} else { |
for (p = vp->text ; *p != '=' ; p++) |
out1c(*p); |
out1c('\n'); |
} |
} |
} |
} |
return 0; |
} |
/* |
* The "local" command. |
*/ |
int |
localcmd(argc, argv) |
int argc; |
char **argv; |
{ |
char *name; |
if (! in_function()) |
error("Not in a function"); |
while ((name = *argptr++) != NULL) { |
mklocal(name); |
} |
return 0; |
} |
/* |
* Make a variable a local variable. When a variable is made local, it's |
* value and flags are saved in a localvar structure. The saved values |
* will be restored when the shell function returns. We handle the name |
* "-" as a special case. |
*/ |
void |
mklocal(name) |
char *name; |
{ |
struct localvar *lvp; |
struct var **vpp; |
struct var *vp; |
INTOFF; |
lvp = ckmalloc(sizeof (struct localvar)); |
if (name[0] == '-' && name[1] == '\0') { |
char *p; |
p = ckmalloc(sizeof optlist); |
lvp->text = memcpy(p, optlist, sizeof optlist); |
vp = NULL; |
} else { |
vpp = hashvar(name); |
for (vp = *vpp ; vp && ! varequal(vp->text, name) ; vp = vp->next); |
if (vp == NULL) { |
if (strchr(name, '=')) |
setvareq(savestr(name), VSTRFIXED); |
else |
setvar(name, NULL, VSTRFIXED); |
vp = *vpp; /* the new variable */ |
lvp->text = NULL; |
lvp->flags = VUNSET; |
} else { |
lvp->text = vp->text; |
lvp->flags = vp->flags; |
vp->flags |= VSTRFIXED|VTEXTFIXED; |
if (strchr(name, '=')) |
setvareq(savestr(name), 0); |
} |
} |
lvp->vp = vp; |
lvp->next = localvars; |
localvars = lvp; |
INTON; |
} |
/* |
* Called after a function returns. |
*/ |
void |
poplocalvars() { |
struct localvar *lvp; |
struct var *vp; |
while ((lvp = localvars) != NULL) { |
localvars = lvp->next; |
vp = lvp->vp; |
if (vp == NULL) { /* $- saved */ |
memcpy(optlist, lvp->text, sizeof optlist); |
ckfree(lvp->text); |
} else if ((lvp->flags & (VUNSET|VSTRFIXED)) == VUNSET) { |
(void)unsetvar(vp->text); |
} else { |
if ((vp->flags & VTEXTFIXED) == 0) |
ckfree(vp->text); |
vp->flags = lvp->flags; |
vp->text = lvp->text; |
} |
ckfree(lvp); |
} |
} |
int |
setvarcmd(argc, argv) |
int argc; |
char **argv; |
{ |
if (argc <= 2) |
return unsetcmd(argc, argv); |
else if (argc == 3) |
setvar(argv[1], argv[2], 0); |
else |
error("List assignment not implemented"); |
return 0; |
} |
/* |
* The unset builtin command. We unset the function before we unset the |
* variable to allow a function to be unset when there is a readonly variable |
* with the same name. |
*/ |
int |
unsetcmd(argc, argv) |
int argc; |
char **argv; |
{ |
char **ap; |
int i; |
int flg_func = 0; |
int flg_var = 0; |
int ret = 0; |
while ((i = nextopt("vf")) != '\0') { |
if (i == 'f') |
flg_func = 1; |
else |
flg_var = 1; |
} |
if (flg_func == 0 && flg_var == 0) |
flg_var = 1; |
for (ap = argptr; *ap ; ap++) { |
if (flg_func) |
ret |= unsetfunc(*ap); |
if (flg_var) |
ret |= unsetvar(*ap); |
} |
return ret; |
} |
/* |
* Unset the specified variable. |
*/ |
int |
unsetvar(s) |
const char *s; |
{ |
struct var **vpp; |
struct var *vp; |
vpp = hashvar(s); |
for (vp = *vpp ; vp ; vpp = &vp->next, vp = *vpp) { |
if (varequal(vp->text, s)) { |
if (vp->flags & VREADONLY) |
return (1); |
INTOFF; |
if (*(strchr(vp->text, '=') + 1) != '\0') |
setvar(s, nullstr, 0); |
vp->flags &= ~VEXPORT; |
vp->flags |= VUNSET; |
if ((vp->flags & VSTRFIXED) == 0) { |
if ((vp->flags & VTEXTFIXED) == 0) |
ckfree(vp->text); |
*vpp = vp->next; |
ckfree(vp); |
} |
INTON; |
return (0); |
} |
} |
return (1); |
} |
/* |
* Find the appropriate entry in the hash table from the name. |
*/ |
STATIC struct var ** |
hashvar(p) |
const char *p; |
{ |
unsigned int hashval; |
hashval = ((unsigned char) *p) << 4; |
while (*p && *p != '=') |
hashval += (unsigned char) *p++; |
return &vartab[hashval % VTABSIZE]; |
} |
/* |
* Returns true if the two strings specify the same varable. The first |
* variable name is terminated by '='; the second may be terminated by |
* either '=' or '\0'. |
*/ |
STATIC int |
varequal(p, q) |
const char *p, *q; |
{ |
while (*p == *q++) { |
if (*p++ == '=') |
return 1; |
} |
if (*p == '=' && *(q - 1) == '\0') |
return 1; |
return 0; |
} |
/tags/0.3.0/uspace/app/ash/miscbltin.h |
---|
0,0 → 1,34 |
/* $NetBSD: miscbltin.h,v 1.1 1997/07/04 21:02:10 christos Exp $ */ |
/* |
* Copyright (c) 1997 Christos Zoulas. All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by Christos Zoulas. |
* 4. The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
int readcmd (int, char **); |
int umaskcmd (int, char **); |
int ulimitcmd (int, char **); |
/tags/0.3.0/uspace/app/ash/main.h |
---|
0,0 → 1,48 |
/* $NetBSD: main.h,v 1.8 1995/05/11 21:29:27 christos Exp $ */ |
/*- |
* Copyright (c) 1991, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Kenneth Almquist. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
* |
* @(#)main.h 8.2 (Berkeley) 5/4/95 |
*/ |
extern int rootpid; /* pid of main shell */ |
extern int rootshell; /* true if we aren't a child of the main shell */ |
void readcmdfile (char *); |
void cmdloop (int); |
int dotcmd (int, char **); |
int exitcmd (int, char **); |
/tags/0.3.0/uspace/app/ash/options.c |
---|
0,0 → 1,551 |
/* $NetBSD: options.c,v 1.29 1999/07/09 03:05:50 christos Exp $ */ |
/*- |
* Copyright (c) 1991, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Kenneth Almquist. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
*/ |
#include <sys/cdefs.h> |
#ifndef lint |
#if 0 |
static char sccsid[] = "@(#)options.c 8.2 (Berkeley) 5/4/95"; |
#else |
__RCSID("$NetBSD: options.c,v 1.29 1999/07/09 03:05:50 christos Exp $"); |
#endif |
#endif /* not lint */ |
#include <signal.h> |
#include <unistd.h> |
#include <stdlib.h> |
#include "shell.h" |
#define DEFINE_OPTIONS |
#include "options.h" |
#undef DEFINE_OPTIONS |
#include "nodes.h" /* for other header files */ |
#include "eval.h" |
#include "jobs.h" |
#include "input.h" |
#include "output.h" |
#include "trap.h" |
#include "var.h" |
#include "memalloc.h" |
#include "error.h" |
#include "mystring.h" |
#ifndef SMALL |
#include "myhistedit.h" |
#endif |
char *arg0; /* value of $0 */ |
struct shparam shellparam; /* current positional parameters */ |
char **argptr; /* argument list for builtin commands */ |
char *optarg; /* set by nextopt (like getopt) */ |
char *optptr; /* used by nextopt */ |
char *minusc; /* argument to -c option */ |
STATIC void options (int); |
STATIC void minus_o (char *, int); |
STATIC void setoption (int, int); |
STATIC int getopts (char *, char *, char **, int *, int *); |
/* |
* Process the shell command line arguments. |
*/ |
void |
procargs(argc, argv) |
int argc; |
char **argv; |
{ |
int i; |
argptr = argv; |
if (argc > 0) |
argptr++; |
for (i = 0; i < NOPTS; i++) |
optlist[i].val = 2; |
options(1); |
if (*argptr == NULL && minusc == NULL) |
sflag = 1; |
if (iflag == 2 && sflag == 1 && isatty(0) && isatty(1)) |
iflag = 1; |
if (mflag == 2) |
mflag = iflag; |
for (i = 0; i < NOPTS; i++) |
if (optlist[i].val == 2) |
optlist[i].val = 0; |
arg0 = argv[0]; |
if (sflag == 0 && minusc == NULL) { |
commandname = arg0 = *argptr++; |
setinputfile(commandname, 0); |
} |
/* POSIX 1003.2: first arg after -c cmd is $0, remainder $1... */ |
if (argptr && minusc && *argptr) |
arg0 = *argptr++; |
shellparam.p = argptr; |
shellparam.optind = 1; |
shellparam.optoff = -1; |
/* assert(shellparam.malloc == 0 && shellparam.nparam == 0); */ |
while (*argptr) { |
shellparam.nparam++; |
argptr++; |
} |
optschanged(); |
} |
void |
optschanged() |
{ |
setinteractive(iflag); |
#ifndef SMALL |
histedit(); |
#endif |
setjobctl(mflag); |
} |
/* |
* Process shell options. The global variable argptr contains a pointer |
* to the argument list; we advance it past the options. |
*/ |
STATIC void |
options(cmdline) |
int cmdline; |
{ |
char *p; |
int val; |
int c; |
if (cmdline) |
minusc = NULL; |
while ((p = *argptr) != NULL) { |
argptr++; |
if ((c = *p++) == '-') { |
val = 1; |
if (p[0] == '\0' || (p[0] == '-' && p[1] == '\0')) { |
if (!cmdline) { |
/* "-" means turn off -x and -v */ |
if (p[0] == '\0') |
xflag = vflag = 0; |
/* "--" means reset params */ |
else if (*argptr == NULL) |
setparam(argptr); |
} |
break; /* "-" or "--" terminates options */ |
} |
} else if (c == '+') { |
val = 0; |
} else { |
argptr--; |
break; |
} |
while ((c = *p++) != '\0') { |
if (c == 'c' && cmdline) { |
char *q; |
#ifdef NOHACK /* removing this code allows sh -ce 'foo' for compat */ |
if (*p == '\0') |
#endif |
q = *argptr++; |
if (q == NULL || minusc != NULL) |
error("Bad -c option"); |
minusc = q; |
#ifdef NOHACK |
break; |
#endif |
} else if (c == 'o') { |
minus_o(*argptr, val); |
if (*argptr) |
argptr++; |
} else { |
setoption(c, val); |
} |
} |
} |
} |
STATIC void |
minus_o(name, val) |
char *name; |
int val; |
{ |
int i; |
if (name == NULL) { |
out1str("Current option settings\n"); |
for (i = 0; i < NOPTS; i++) |
out1fmt("%-16s%s\n", optlist[i].name, |
optlist[i].val ? "on" : "off"); |
} else { |
for (i = 0; i < NOPTS; i++) |
if (equal(name, optlist[i].name)) { |
setoption(optlist[i].letter, val); |
return; |
} |
error("Illegal option -o %s", name); |
} |
} |
STATIC void |
setoption(flag, val) |
char flag; |
int val; |
{ |
int i; |
for (i = 0; i < NOPTS; i++) |
if (optlist[i].letter == flag) { |
optlist[i].val = val; |
if (val) { |
/* #%$ hack for ksh semantics */ |
if (flag == 'V') |
Eflag = 0; |
else if (flag == 'E') |
Vflag = 0; |
} |
return; |
} |
error("Illegal option -%c", flag); |
/* NOTREACHED */ |
} |
#ifdef mkinit |
INCLUDE "options.h" |
SHELLPROC { |
int i; |
for (i = 0; i < NOPTS; i++) |
optlist[i].val = 0; |
optschanged(); |
} |
#endif |
/* |
* Set the shell parameters. |
*/ |
void |
setparam(argv) |
char **argv; |
{ |
char **newparam; |
char **ap; |
int nparam; |
for (nparam = 0 ; argv[nparam] ; nparam++); |
ap = newparam = ckmalloc((nparam + 1) * sizeof *ap); |
while (*argv) { |
*ap++ = savestr(*argv++); |
} |
*ap = NULL; |
freeparam(&shellparam); |
shellparam.malloc = 1; |
shellparam.nparam = nparam; |
shellparam.p = newparam; |
shellparam.optind = 1; |
shellparam.optoff = -1; |
} |
/* |
* Free the list of positional parameters. |
*/ |
void |
freeparam(param) |
volatile struct shparam *param; |
{ |
char **ap; |
if (param->malloc) { |
for (ap = param->p ; *ap ; ap++) |
ckfree(*ap); |
ckfree(param->p); |
} |
} |
/* |
* The shift builtin command. |
*/ |
int |
shiftcmd(argc, argv) |
int argc; |
char **argv; |
{ |
int n; |
char **ap1, **ap2; |
n = 1; |
if (argc > 1) |
n = number(argv[1]); |
if (n > shellparam.nparam) |
error("can't shift that many"); |
INTOFF; |
shellparam.nparam -= n; |
for (ap1 = shellparam.p ; --n >= 0 ; ap1++) { |
if (shellparam.malloc) |
ckfree(*ap1); |
} |
ap2 = shellparam.p; |
while ((*ap2++ = *ap1++) != NULL); |
shellparam.optind = 1; |
shellparam.optoff = -1; |
INTON; |
return 0; |
} |
/* |
* The set command builtin. |
*/ |
int |
setcmd(argc, argv) |
int argc; |
char **argv; |
{ |
if (argc == 1) |
return showvarscmd(argc, argv); |
INTOFF; |
options(0); |
optschanged(); |
if (*argptr != NULL) { |
setparam(argptr); |
} |
INTON; |
return 0; |
} |
void |
getoptsreset(value) |
const char *value; |
{ |
shellparam.optind = number(value); |
shellparam.optoff = -1; |
} |
/* |
* The getopts builtin. Shellparam.optnext points to the next argument |
* to be processed. Shellparam.optptr points to the next character to |
* be processed in the current argument. If shellparam.optnext is NULL, |
* then it's the first time getopts has been called. |
*/ |
int |
getoptscmd(argc, argv) |
int argc; |
char **argv; |
{ |
char **optbase; |
if (argc < 3) |
error("Usage: getopts optstring var [arg]"); |
else if (argc == 3) { |
optbase = shellparam.p; |
if (shellparam.optind > shellparam.nparam + 1) { |
shellparam.optind = 1; |
shellparam.optoff = -1; |
} |
} |
else { |
optbase = &argv[3]; |
if (shellparam.optind > argc - 2) { |
shellparam.optind = 1; |
shellparam.optoff = -1; |
} |
} |
return getopts(argv[1], argv[2], optbase, &shellparam.optind, |
&shellparam.optoff); |
} |
STATIC int |
getopts(optstr, optvar, optfirst, optind, optoff) |
char *optstr; |
char *optvar; |
char **optfirst; |
int *optind; |
int *optoff; |
{ |
char *p, *q; |
char c = '?'; |
int done = 0; |
int err = 0; |
char s[10]; |
char **optnext = optfirst + *optind - 1; |
if (*optind <= 1 || *optoff < 0 || !(*(optnext - 1)) || |
strlen(*(optnext - 1)) < *optoff) |
p = NULL; |
else |
p = *(optnext - 1) + *optoff; |
if (p == NULL || *p == '\0') { |
/* Current word is done, advance */ |
if (optnext == NULL) |
return 1; |
p = *optnext; |
if (p == NULL || *p != '-' || *++p == '\0') { |
atend: |
*optind = optnext - optfirst + 1; |
p = NULL; |
done = 1; |
goto out; |
} |
optnext++; |
if (p[0] == '-' && p[1] == '\0') /* check for "--" */ |
goto atend; |
} |
c = *p++; |
for (q = optstr; *q != c; ) { |
if (*q == '\0') { |
if (optstr[0] == ':') { |
s[0] = c; |
s[1] = '\0'; |
err |= setvarsafe("OPTARG", s, 0); |
} |
else { |
outfmt(&errout, "Illegal option -%c\n", c); |
(void) unsetvar("OPTARG"); |
} |
c = '?'; |
goto bad; |
} |
if (*++q == ':') |
q++; |
} |
if (*++q == ':') { |
if (*p == '\0' && (p = *optnext) == NULL) { |
if (optstr[0] == ':') { |
s[0] = c; |
s[1] = '\0'; |
err |= setvarsafe("OPTARG", s, 0); |
c = ':'; |
} |
else { |
outfmt(&errout, "No arg for -%c option\n", c); |
(void) unsetvar("OPTARG"); |
c = '?'; |
} |
goto bad; |
} |
if (p == *optnext) |
optnext++; |
setvarsafe("OPTARG", p, 0); |
p = NULL; |
} |
else |
setvarsafe("OPTARG", "", 0); |
*optind = optnext - optfirst + 1; |
goto out; |
bad: |
*optind = 1; |
p = NULL; |
out: |
*optoff = p ? p - *(optnext - 1) : -1; |
fmtstr(s, sizeof(s), "%d", *optind); |
err |= setvarsafe("OPTIND", s, VNOFUNC); |
s[0] = c; |
s[1] = '\0'; |
err |= setvarsafe(optvar, s, 0); |
if (err) { |
*optind = 1; |
*optoff = -1; |
flushall(); |
exraise(EXERROR); |
} |
return done; |
} |
/* |
* XXX - should get rid of. have all builtins use getopt(3). the |
* library getopt must have the BSD extension static variable "optreset" |
* otherwise it can't be used within the shell safely. |
* |
* Standard option processing (a la getopt) for builtin routines. The |
* only argument that is passed to nextopt is the option string; the |
* other arguments are unnecessary. It return the character, or '\0' on |
* end of input. |
*/ |
int |
nextopt(optstring) |
const char *optstring; |
{ |
char *p; |
const char *q; |
char c; |
if ((p = optptr) == NULL || *p == '\0') { |
p = *argptr; |
if (p == NULL || *p != '-' || *++p == '\0') |
return '\0'; |
argptr++; |
if (p[0] == '-' && p[1] == '\0') /* check for "--" */ |
return '\0'; |
} |
c = *p++; |
for (q = optstring ; *q != c ; ) { |
if (*q == '\0') |
error("Illegal option -%c", c); |
if (*++q == ':') |
q++; |
} |
if (*++q == ':') { |
if (*p == '\0' && (p = *argptr++) == NULL) |
error("No arg for -%c option", c); |
optarg = p; |
p = NULL; |
} |
optptr = p; |
return c; |
} |
/tags/0.3.0/uspace/app/ash/eval.h |
---|
0,0 → 1,75 |
/* $NetBSD: eval.h,v 1.10 2000/01/27 23:39:40 christos Exp $ */ |
/*- |
* Copyright (c) 1991, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Kenneth Almquist. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
* |
* @(#)eval.h 8.2 (Berkeley) 5/4/95 |
*/ |
extern char *commandname; /* currently executing command */ |
extern int exitstatus; /* exit status of last command */ |
extern struct strlist *cmdenviron; /* environment for builtin command */ |
struct backcmd { /* result of evalbackcmd */ |
int fd; /* file descriptor to read from */ |
char *buf; /* buffer */ |
int nleft; /* number of chars in buffer */ |
struct job *jp; /* job structure for command */ |
}; |
int evalcmd (int, char **); |
void evalstring (char *, int); |
union node; /* BLETCH for ansi C */ |
void evaltree (union node *, int); |
void evalbackcmd (union node *, struct backcmd *); |
int bltincmd (int, char **); |
int breakcmd (int, char **); |
int returncmd (int, char **); |
int falsecmd (int, char **); |
int truecmd (int, char **); |
int execcmd (int, char **); |
int is_special_builtin (const char *); |
/* in_function returns nonzero if we are currently evaluating a function */ |
#define in_function() funcnest |
extern int funcnest; |
extern int evalskip; |
/* reasons for skipping commands (see comment on breakcmd routine) */ |
#define SKIPBREAK 1 |
#define SKIPCONT 2 |
#define SKIPFUNC 3 |
#define SKIPFILE 4 |
/tags/0.3.0/uspace/app/ash/arith.y |
---|
0,0 → 1,202 |
%{ |
/* $NetBSD: arith.y,v 1.13 1999/07/09 03:05:49 christos Exp $ */ |
/*- |
* Copyright (c) 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Kenneth Almquist. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
*/ |
#include <sys/cdefs.h> |
#ifndef lint |
#if 0 |
static char sccsid[] = "@(#)arith.y 8.3 (Berkeley) 5/4/95"; |
#else |
__RCSID("$NetBSD: arith.y,v 1.13 1999/07/09 03:05:49 christos Exp $"); |
#endif |
#endif /* not lint */ |
#include <stdlib.h> |
#include "expand.h" |
#include "shell.h" |
#include "error.h" |
#include "output.h" |
#include "memalloc.h" |
const char *arith_buf, *arith_startbuf; |
void yyerror (const char *); |
int yyparse (void); |
#ifdef TESTARITH |
int main (int , char *[]); |
int error (char *); |
#endif |
int |
arith(s) |
const char *s; |
{ |
long result; |
arith_buf = arith_startbuf = s; |
INTOFF; |
result = yyparse(); |
arith_lex_reset(); /* reprime lex */ |
INTON; |
return (result); |
} |
/* |
* The exp(1) builtin. |
*/ |
int |
expcmd(argc, argv) |
int argc; |
char **argv; |
{ |
const char *p; |
char *concat; |
char **ap; |
long i; |
if (argc > 1) { |
p = argv[1]; |
if (argc > 2) { |
/* |
* concatenate arguments |
*/ |
STARTSTACKSTR(concat); |
ap = argv + 2; |
for (;;) { |
while (*p) |
STPUTC(*p++, concat); |
if ((p = *ap++) == NULL) |
break; |
STPUTC(' ', concat); |
} |
STPUTC('\0', concat); |
p = grabstackstr(concat); |
} |
} else |
p = ""; |
i = arith(p); |
out1fmt("%ld\n", i); |
return (! i); |
} |
/*************************/ |
#ifdef TEST_ARITH |
#include <stdio.h> |
main(argc, argv) |
char *argv[]; |
{ |
printf("%d\n", exp(argv[1])); |
} |
error(s) |
char *s; |
{ |
fprintf(stderr, "exp: %s\n", s); |
exit(1); |
} |
#endif |
%} |
%token ARITH_NUM ARITH_LPAREN ARITH_RPAREN |
%left ARITH_OR |
%left ARITH_AND |
%left ARITH_BOR |
%left ARITH_BXOR |
%left ARITH_BAND |
%left ARITH_EQ ARITH_NE |
%left ARITH_LT ARITH_GT ARITH_GE ARITH_LE |
%left ARITH_LSHIFT ARITH_RSHIFT |
%left ARITH_ADD ARITH_SUB |
%left ARITH_MUL ARITH_DIV ARITH_REM |
%left ARITH_UNARYMINUS ARITH_UNARYPLUS ARITH_NOT ARITH_BNOT |
%% |
exp: expr { |
return ($1); |
} |
; |
expr: ARITH_LPAREN expr ARITH_RPAREN { $$ = $2; } |
| expr ARITH_OR expr { $$ = $1 ? $1 : $3 ? $3 : 0; } |
| expr ARITH_AND expr { $$ = $1 ? ( $3 ? $3 : 0 ) : 0; } |
| expr ARITH_BOR expr { $$ = $1 | $3; } |
| expr ARITH_BXOR expr { $$ = $1 ^ $3; } |
| expr ARITH_BAND expr { $$ = $1 & $3; } |
| expr ARITH_EQ expr { $$ = $1 == $3; } |
| expr ARITH_GT expr { $$ = $1 > $3; } |
| expr ARITH_GE expr { $$ = $1 >= $3; } |
| expr ARITH_LT expr { $$ = $1 < $3; } |
| expr ARITH_LE expr { $$ = $1 <= $3; } |
| expr ARITH_NE expr { $$ = $1 != $3; } |
| expr ARITH_LSHIFT expr { $$ = $1 << $3; } |
| expr ARITH_RSHIFT expr { $$ = $1 >> $3; } |
| expr ARITH_ADD expr { $$ = $1 + $3; } |
| expr ARITH_SUB expr { $$ = $1 - $3; } |
| expr ARITH_MUL expr { $$ = $1 * $3; } |
| expr ARITH_DIV expr { |
if ($3 == 0) |
yyerror("division by zero"); |
$$ = $1 / $3; |
} |
| expr ARITH_REM expr { |
if ($3 == 0) |
yyerror("division by zero"); |
$$ = $1 % $3; |
} |
| ARITH_NOT expr { $$ = !($2); } |
| ARITH_BNOT expr { $$ = ~($2); } |
| ARITH_SUB expr %prec ARITH_UNARYMINUS { $$ = -($2); } |
| ARITH_ADD expr %prec ARITH_UNARYPLUS { $$ = $2; } |
| ARITH_NUM |
; |
%% |
void |
yyerror(s) |
const char *s; |
{ |
yyclearin; |
arith_lex_reset(); /* reprime lex */ |
error("arithmetic expression: %s: \"%s\"", s, arith_startbuf); |
/* NOTREACHED */ |
} |
/tags/0.3.0/uspace/app/ash/var.h |
---|
0,0 → 1,131 |
/* $NetBSD: var.h,v 1.18 2000/05/22 10:18:47 elric Exp $ */ |
/*- |
* Copyright (c) 1991, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Kenneth Almquist. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* California, Berkeley and its contributors. |
* 4. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
* |
* @(#)var.h 8.2 (Berkeley) 5/4/95 |
*/ |
/* |
* Shell variables. |
*/ |
/* flags */ |
#define VEXPORT 0x01 /* variable is exported */ |
#define VREADONLY 0x02 /* variable cannot be modified */ |
#define VSTRFIXED 0x04 /* variable struct is staticly allocated */ |
#define VTEXTFIXED 0x08 /* text is staticly allocated */ |
#define VSTACK 0x10 /* text is allocated on the stack */ |
#define VUNSET 0x20 /* the variable is not set */ |
#define VNOFUNC 0x40 /* don't call the callback function */ |
struct var { |
struct var *next; /* next entry in hash list */ |
int flags; /* flags are defined above */ |
char *text; /* name=value */ |
void (*func) (const char *); |
/* function to be called when */ |
/* the variable gets set/unset */ |
}; |
struct localvar { |
struct localvar *next; /* next local variable in list */ |
struct var *vp; /* the variable that was made local */ |
int flags; /* saved flags */ |
char *text; /* saved text */ |
}; |
struct localvar *localvars; |
#if ATTY |
extern struct var vatty; |
#endif |
extern struct var vifs; |
extern struct var vmail; |
extern struct var vmpath; |
extern struct var vpath; |
extern struct var vps1; |
extern struct var vps2; |
#ifndef SMALL |
extern struct var vterm; |
extern struct var vtermcap; |
extern struct var vhistsize; |
#endif |
/* |
* The following macros access the values of the above variables. |
* They have to skip over the name. They return the null string |
* for unset variables. |
*/ |
#define ifsval() (vifs.text + 4) |
#define ifsset() ((vifs.flags & VUNSET) == 0) |
#define mailval() (vmail.text + 5) |
#define mpathval() (vmpath.text + 9) |
#define pathval() (vpath.text + 5) |
#define ps1val() (vps1.text + 4) |
#define ps2val() (vps2.text + 4) |
#define optindval() (voptind.text + 7) |
#ifndef SMALL |
#define histsizeval() (vhistsize.text + 9) |
#define termval() (vterm.text + 5) |
#endif |
#if ATTY |
#define attyset() ((vatty.flags & VUNSET) == 0) |
#endif |
#define mpathset() ((vmpath.flags & VUNSET) == 0) |
void initvar (void); |
void setvar (const char *, const char *, int); |
void setvareq (char *, int); |
struct strlist; |
void listsetvar (struct strlist *); |
char *lookupvar (const char *); |
char *bltinlookup (const char *, int); |
char **environment (void); |
void shprocvar (void); |
int showvarscmd (int, char **); |
int exportcmd (int, char **); |
int localcmd (int, char **); |
void mklocal (char *); |
void poplocalvars (void); |
int setvarcmd (int, char **); |
int unsetcmd (int, char **); |
int unsetvar (const char *); |
int setvarsafe (const char *, const char *, int); |
/tags/0.3.0/uspace/app/klog/klog.c |
---|
0,0 → 1,89 |
/* |
* Copyright (c) 2006 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup klog KLog |
* @brief HelenOS KLog |
* @{ |
*/ |
/** |
* @file |
*/ |
#include <stdio.h> |
#include <ipc/ipc.h> |
#include <async.h> |
#include <ipc/services.h> |
#include <as.h> |
#include <sysinfo.h> |
/* Pointer to klog area */ |
static char *klog; |
static void interrupt_received(ipc_callid_t callid, ipc_call_t *call) |
{ |
int i; |
async_serialize_start(); |
for (i=0; klog[i + IPC_GET_ARG1(*call)] && i < IPC_GET_ARG2(*call); i++) |
putchar(klog[i + IPC_GET_ARG1(*call)]); |
putchar('\n'); |
async_serialize_end(); |
} |
int main(int argc, char *argv[]) |
{ |
int res; |
void *mapping; |
printf("Kernel console output.\n"); |
mapping = as_get_mappable_page(PAGE_SIZE); |
res = ipc_share_in_start_1_0(PHONE_NS, mapping, PAGE_SIZE, |
SERVICE_MEM_KLOG); |
if (res) { |
printf("Failed to initialize klog memarea\n"); |
_exit(1); |
} |
klog = mapping; |
int inr = sysinfo_value("klog.inr"); |
int devno = sysinfo_value("klog.devno"); |
if (ipc_register_irq(inr, devno, 0, NULL)) { |
printf("Error registering for klog service.\n"); |
return 0; |
} |
async_set_interrupt_received(interrupt_received); |
async_manager(); |
return 0; |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/app/klog/Makefile |
---|
0,0 → 1,73 |
# |
# Copyright (c) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
## Setup toolchain |
# |
LIBC_PREFIX = ../../lib/libc |
SOFTINT_PREFIX = ../../lib/softint |
include $(LIBC_PREFIX)/Makefile.toolchain |
LIBS = $(LIBC_PREFIX)/libc.a |
## Sources |
# |
OUTPUT = klog |
SOURCES = \ |
klog.c |
OBJECTS := $(addsuffix .o,$(basename $(SOURCES))) |
.PHONY: all clean depend disasm |
all: $(OUTPUT) disasm |
-include Makefile.depend |
clean: |
-rm -f $(OUTPUT) $(OUTPUT).map $(OUTPUT).disasm Makefile.depend |
depend: |
$(CC) $(DEFS) $(CFLAGS) -M $(SOURCES) > Makefile.depend |
$(OUTPUT): $(OBJECTS) $(LIBS) |
$(LD) -T $(LIBC_PREFIX)/arch/$(ARCH)/_link.ld $(OBJECTS) $(LIBS) $(LFLAGS) -o $@ -Map $(OUTPUT).map |
disasm: |
$(OBJDUMP) -d $(OUTPUT) >$(OUTPUT).disasm |
%.o: %.S |
$(CC) $(DEFS) $(AFLAGS) $(CFLAGS) -D__ASM__ -c $< -o $@ |
%.o: %.s |
$(AS) $(AFLAGS) $< -o $@ |
%.o: %.c |
$(CC) $(DEFS) $(CFLAGS) -c $< -o $@ |
/tags/0.3.0/uspace/app/tetris/screen.c |
---|
0,0 → 1,313 |
/* $OpenBSD: screen.c,v 1.13 2006/04/20 03:25:36 ray Exp $ */ |
/* $NetBSD: screen.c,v 1.4 1995/04/29 01:11:36 mycroft Exp $ */ |
/*- |
* Copyright (c) 1992, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Chris Torek and Darren F. Provine. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
* |
* @(#)screen.c 8.1 (Berkeley) 5/31/93 |
*/ |
/** @addtogroup tetris |
* @{ |
*/ |
/** @file |
*/ |
/* |
* Tetris screen control. |
*/ |
#include <err.h> |
#include <stdio.h> |
#include <stdlib.h> |
#include <string.h> |
#include <unistd.h> |
#include <io/stream.h> |
#include <async.h> |
#include "screen.h" |
#include "tetris.h" |
#include "../../srv/console/console.h" |
static cell curscreen[B_SIZE]; /* 1 => standout (or otherwise marked) */ |
static int curscore; |
static int isset; /* true => terminal is in game mode */ |
/* |
* putstr() is for unpadded strings (either as in termcap(5) or |
* simply literal strings); |
*/ |
static inline void putstr(char *s) |
{ |
while (*s) |
putchar(*(s++)); |
} |
static int con_phone; |
static void set_style(int fgcolor, int bgcolor) |
{ |
async_msg_2(con_phone, CONSOLE_SET_STYLE, fgcolor, bgcolor); |
} |
static void start_standout(void) |
{ |
set_style(0xf0f0f0, 0); |
} |
static void resume_normal(void) |
{ |
set_style(0, 0xf0f0f0); |
} |
void clear_screen(void) |
{ |
async_msg_0(con_phone, CONSOLE_CLEAR); |
moveto(0, 0); |
} |
/* |
* Clear the screen, forgetting the current contents in the process. |
*/ |
void |
scr_clear(void) |
{ |
resume_normal(); |
async_msg_0(con_phone, CONSOLE_CLEAR); |
curscore = -1; |
memset((char *)curscreen, 0, sizeof(curscreen)); |
} |
/* |
* Set up screen |
*/ |
void |
scr_init(void) |
{ |
con_phone = get_cons_phone(); |
async_msg_1(con_phone, CONSOLE_CURSOR_VISIBILITY, 0); |
resume_normal(); |
scr_clear(); |
} |
void moveto(int r, int c) |
{ |
async_msg_2(con_phone, CONSOLE_GOTO, r, c); |
} |
static void fflush(void) |
{ |
async_msg_0(con_phone, CONSOLE_FLUSH); |
} |
winsize_t winsize; |
static int get_display_size(winsize_t *ws) |
{ |
return async_req_0_2(con_phone, CONSOLE_GETSIZE, &ws->ws_row, |
&ws->ws_col); |
} |
/* |
* Set up screen mode. |
*/ |
void |
scr_set(void) |
{ |
winsize_t ws; |
Rows = 0, Cols = 0; |
if (get_display_size(&ws) == 0) { |
Rows = ws.ws_row; |
Cols = ws.ws_col; |
} |
if (Rows < MINROWS || Cols < MINCOLS) { |
char smallscr[55]; |
snprintf(smallscr, sizeof(smallscr), |
"the screen is too small (must be at least %dx%d)", |
MINROWS, MINCOLS); |
stop(smallscr); |
} |
isset = 1; |
scr_clear(); |
} |
/* |
* End screen mode. |
*/ |
void |
scr_end(void) |
{ |
} |
void |
stop(char *why) |
{ |
if (isset) |
scr_end(); |
errx(1, "aborting: %s", why); |
} |
/* |
* Update the screen. |
*/ |
void |
scr_update(void) |
{ |
cell *bp, *sp; |
cell so, cur_so = 0; |
int i, ccol, j; |
static const struct shape *lastshape; |
/* always leave cursor after last displayed point */ |
curscreen[D_LAST * B_COLS - 1] = -1; |
if (score != curscore) { |
moveto(0, 0); |
printf("Score: %d", score); |
curscore = score; |
} |
/* draw preview of next pattern */ |
if (showpreview && (nextshape != lastshape)) { |
int i; |
static int r=5, c=2; |
int tr, tc, t; |
lastshape = nextshape; |
/* clean */ |
resume_normal(); |
moveto(r-1, c-1); putstr(" "); |
moveto(r, c-1); putstr(" "); |
moveto(r+1, c-1); putstr(" "); |
moveto(r+2, c-1); putstr(" "); |
moveto(r-3, c-2); |
putstr("Next shape:"); |
/* draw */ |
start_standout(); |
moveto(r, 2 * c); |
putstr(" "); |
for (i = 0; i < 3; i++) { |
t = c + r * B_COLS; |
t += nextshape->off[i]; |
tr = t / B_COLS; |
tc = t % B_COLS; |
moveto(tr, 2*tc); |
putstr(" "); |
} |
resume_normal(); |
} |
bp = &board[D_FIRST * B_COLS]; |
sp = &curscreen[D_FIRST * B_COLS]; |
for (j = D_FIRST; j < D_LAST; j++) { |
ccol = -1; |
for (i = 0; i < B_COLS; bp++, sp++, i++) { |
if (*sp == (so = *bp)) |
continue; |
*sp = so; |
if (i != ccol) { |
if (cur_so) { |
resume_normal(); |
cur_so = 0; |
} |
moveto(RTOD(j), CTOD(i)); |
} |
if (so != cur_so) { |
if (so) |
start_standout(); |
else |
resume_normal(); |
cur_so = so; |
} |
putstr(" "); |
ccol = i + 1; |
/* |
* Look ahead a bit, to avoid extra motion if |
* we will be redrawing the cell after the next. |
* Motion probably takes four or more characters, |
* so we save even if we rewrite two cells |
* `unnecessarily'. Skip it all, though, if |
* the next cell is a different color. |
*/ |
#define STOP (B_COLS - 3) |
if (i > STOP || sp[1] != bp[1] || so != bp[1]) |
continue; |
if (sp[2] != bp[2]) |
sp[1] = -1; |
else if (i < STOP && so == bp[2] && sp[3] != bp[3]) { |
sp[2] = -1; |
sp[1] = -1; |
} |
} |
} |
if (cur_so) |
resume_normal(); |
fflush(); |
} |
/* |
* Write a message (set!=0), or clear the same message (set==0). |
* (We need its length in case we have to overwrite with blanks.) |
*/ |
void |
scr_msg(char *s, int set) |
{ |
int l = strlen(s); |
moveto(Rows - 2, ((Cols - l) >> 1) - 1); |
if (set) |
putstr(s); |
else |
while (--l >= 0) |
(void) putchar(' '); |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/app/tetris/input.c |
---|
0,0 → 1,187 |
/* $OpenBSD: input.c,v 1.12 2005/04/13 02:33:08 deraadt Exp $ */ |
/* $NetBSD: input.c,v 1.3 1996/02/06 22:47:33 jtc Exp $ */ |
/*- |
* Copyright (c) 1992, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Chris Torek and Darren F. Provine. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
* |
* @(#)input.c 8.1 (Berkeley) 5/31/93 |
*/ |
/** @addtogroup tetris |
* @{ |
*/ |
/** @file |
*/ |
/* |
* Tetris input. |
*/ |
#include <sys/types.h> |
#include <sys/time.h> |
#include <stdio.h> |
#include <errno.h> |
#include <unistd.h> |
#include <string.h> |
#include "input.h" |
#include "tetris.h" |
#include <async.h> |
#include "../../srv/console/console.h" |
/* return true iff the given timeval is positive */ |
#define TV_POS(tv) \ |
((tv)->tv_sec > 0 || ((tv)->tv_sec == 0 && (tv)->tv_usec > 0)) |
/* subtract timeval `sub' from `res' */ |
#define TV_SUB(res, sub) \ |
(res)->tv_sec -= (sub)->tv_sec; \ |
(res)->tv_usec -= (sub)->tv_usec; \ |
if ((res)->tv_usec < 0) { \ |
(res)->tv_usec += 1000000; \ |
(res)->tv_sec--; \ |
} |
/* We will use a hack here - if lastchar is non-zero, it is |
* the last character read. We will somehow simulate the select |
* semantics. |
*/ |
static aid_t getchar_inprog = 0; |
static char lastchar = '\0'; |
/* |
* Do a `read wait': select for reading from stdin, with timeout *tvp. |
* On return, modify *tvp to reflect the amount of time spent waiting. |
* It will be positive only if input appeared before the time ran out; |
* otherwise it will be zero or perhaps negative. |
* |
* If tvp is nil, wait forever, but return if select is interrupted. |
* |
* Return 0 => no input, 1 => can read() from stdin |
* |
*/ |
int |
rwait(struct timeval *tvp) |
{ |
struct timeval starttv, endtv, *s; |
static ipc_call_t charcall; |
ipcarg_t rc; |
/* |
* Someday, select() will do this for us. |
* Just in case that day is now, and no one has |
* changed this, we use a temporary. |
*/ |
if (tvp) { |
(void) gettimeofday(&starttv, NULL); |
endtv = *tvp; |
s = &endtv; |
} else |
s = NULL; |
if (!lastchar) { |
if (!getchar_inprog) |
getchar_inprog = async_send_2(1,CONSOLE_GETCHAR,0,0,&charcall); |
if (!s) |
async_wait_for(getchar_inprog, &rc); |
else if (async_wait_timeout(getchar_inprog, &rc, s->tv_usec) == ETIMEOUT) { |
tvp->tv_sec = 0; |
tvp->tv_usec = 0; |
return (0); |
} |
getchar_inprog = 0; |
if (rc) { |
stop("end of file, help"); |
} |
lastchar = IPC_GET_ARG1(charcall); |
} |
if (tvp) { |
/* since there is input, we may not have timed out */ |
(void) gettimeofday(&endtv, NULL); |
TV_SUB(&endtv, &starttv); |
TV_SUB(tvp, &endtv); /* adjust *tvp by elapsed time */ |
} |
return (1); |
} |
/* |
* `sleep' for the current turn time (using select). |
* Eat any input that might be available. |
*/ |
void |
tsleep(void) |
{ |
struct timeval tv; |
tv.tv_sec = 0; |
tv.tv_usec = fallrate; |
while (TV_POS(&tv)) |
if (rwait(&tv)) { |
lastchar = '\0'; |
} else |
break; |
} |
/* |
* getchar with timeout. |
*/ |
int |
tgetchar(void) |
{ |
static struct timeval timeleft; |
char c; |
/* |
* Reset timeleft to fallrate whenever it is not positive. |
* In any case, wait to see if there is any input. If so, |
* take it, and update timeleft so that the next call to |
* tgetchar() will not wait as long. If there is no input, |
* make timeleft zero or negative, and return -1. |
* |
* Most of the hard work is done by rwait(). |
*/ |
if (!TV_POS(&timeleft)) { |
faster(); /* go faster */ |
timeleft.tv_sec = 0; |
timeleft.tv_usec = fallrate; |
} |
if (!rwait(&timeleft)) |
return (-1); |
c = lastchar; |
lastchar = '\0'; |
return ((int)(unsigned char)c); |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/app/tetris/Makefile |
---|
0,0 → 1,35 |
LIBC_PREFIX = ../../lib/libc |
SOFTINT_PREFIX = ../../lib/softint |
include $(LIBC_PREFIX)/Makefile.toolchain |
LIBS = $(LIBC_PREFIX)/libc.a |
OUTPUT = tetris |
SOURCES = shapes.c scores.c input.c tetris.c screen.c |
OBJECTS := $(addsuffix .o,$(basename $(SOURCES))) |
.PHONY: all clean depend disasm |
all: $(OUTPUT) disasm |
-include Makefile.depend |
depend: |
$(CC) $(DEFS) $(CFLAGS) -M $(SOURCES) > Makefile.depend |
$(OUTPUT): $(OBJECTS) $(LIBS) |
$(LD) -T $(LIBC_PREFIX)/arch/$(ARCH)/_link.ld $(OBJECTS) $(LIBS) $(LFLAGS) -o $@ -Map $(OUTPUT).map |
clean: |
-rm -f $(OUTPUT) $(OUTPUT).map $(OUTPUT).disasm Makefile.depend *.o |
disasm: |
$(OBJDUMP) -d $(OUTPUT) >$(OUTPUT).disasm |
%.o: %.S |
$(CC) $(DEFS) $(AFLAGS) $(CFLAGS) -D__ASM__ -c $< -o $@ |
%.o: %.s |
$(AS) $(AFLAGS) $< -o $@ |
%.o: %.c |
$(CC) $(DEFS) $(CFLAGS) -c $< -o $@ |
/tags/0.3.0/uspace/app/tetris/tetris.c |
---|
0,0 → 1,469 |
/* $OpenBSD: tetris.c,v 1.21 2006/04/20 03:24:12 ray Exp $ */ |
/* $NetBSD: tetris.c,v 1.2 1995/04/22 07:42:47 cgd Exp $ */ |
/*- |
* Copyright (c) 1992, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Chris Torek and Darren F. Provine. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
* |
* @(#)tetris.c 8.1 (Berkeley) 5/31/93 |
*/ |
/** @addtogroup tetris Tetris |
* @brief Tetris ported from OpenBSD |
* @{ |
*/ |
/** @file |
*/ |
#ifndef lint |
static const char copyright[] = |
"@(#) Copyright (c) 1992, 1993\n\ |
The Regents of the University of California. All rights reserved.\n"; |
#endif /* not lint */ |
/* |
* Tetris (or however it is spelled). |
*/ |
#include <sys/time.h> |
#include <sys/types.h> |
#include <err.h> |
#include <stdio.h> |
#include <stdlib.h> |
#include <string.h> |
#include <unistd.h> |
#include "input.h" |
#include "scores.h" |
#include "screen.h" |
#include "tetris.h" |
cell board[B_SIZE]; |
int Rows, Cols; |
const struct shape *curshape; |
const struct shape *nextshape; |
long fallrate; |
int score; |
//gid_t gid, egid; |
char key_msg[100]; |
int showpreview, classic; |
static void elide(void); |
static void setup_board(void); |
const struct shape *randshape(void); |
void onintr(int); |
void usage(void); |
/* |
* Set up the initial board. The bottom display row is completely set, |
* along with another (hidden) row underneath that. Also, the left and |
* right edges are set. |
*/ |
static void |
setup_board(void) |
{ |
int i; |
cell *p; |
p = board; |
for (i = B_SIZE; i; i--) |
*p++ = i <= (2 * B_COLS) || (i % B_COLS) < 2; |
} |
/* |
* Elide any full active rows. |
*/ |
static void |
elide(void) |
{ |
int rows = 0; |
int i, j, base; |
cell *p; |
for (i = A_FIRST; i < A_LAST; i++) { |
base = i * B_COLS + 1; |
p = &board[base]; |
for (j = B_COLS - 2; *p++ != 0;) { |
if (--j <= 0) { |
/* this row is to be elided */ |
rows++; |
memset(&board[base], 0, B_COLS - 2); |
scr_update(); |
tsleep(); |
while (--base != 0) |
board[base + B_COLS] = board[base]; |
scr_update(); |
tsleep(); |
break; |
} |
} |
} |
switch (rows) { |
case 1: |
score += 10; |
break; |
case 2: |
score += 30; |
break; |
case 3: |
score += 70; |
break; |
case 4: |
score += 150; |
break; |
default: |
break; |
} |
} |
const struct shape * |
randshape(void) |
{ |
const struct shape *tmp; |
int i, j; |
tmp = &shapes[random() % 7]; |
j = random() % 4; |
for (i = 0; i < j; i++) |
tmp = &shapes[classic? tmp->rotc : tmp->rot]; |
return (tmp); |
} |
static void srandomdev(void) |
{ |
struct timeval tv; |
gettimeofday(&tv, NULL); |
srandom(tv.tv_sec + tv.tv_usec / 100000); |
} |
static void tetris_menu_draw(int level) |
{ |
clear_screen(); |
moveto(5,10); |
puts("Tetris\n\n"); |
moveto(8,10); |
printf("Level = %d (press keys 1 - 9 to change)",level); |
moveto(9,10); |
printf("Preview is %s (press 'p' to change)", (showpreview?"on ":"off")); |
moveto(12,10); |
printf("Press 'h' to show hiscore table."); |
moveto(13,10); |
printf("Press 's' to start game."); |
moveto(14,10); |
printf("Press 'q' to quit game."); |
moveto(20,10); |
printf("In game controls:"); |
moveto(21,0); |
puts(key_msg); |
} |
static int tetris_menu(int *level) |
{ |
static int firstgame = 1; |
int i; |
/* if (showpreview == 0) |
(void)printf("Your score: %d point%s x level %d = %d\n", |
score, score == 1 ? "" : "s", level, score * level); |
else { |
(void)printf("Your score: %d point%s x level %d x preview penalty %0.3f = %d\n", |
score, score == 1 ? "" : "s", level, (double)PRE_PENALTY, |
(int)(score * level * PRE_PENALTY)); |
score = score * PRE_PENALTY; |
} |
savescore(level); |
showscores(level); |
printf("\nHit 's' to new game, 'q' to quit.\n"); |
*/ |
tetris_menu_draw(*level); |
while (1) { |
i = getchar(); |
switch(i) { |
case 'p': |
showpreview = !showpreview; |
moveto(9,21); |
if (showpreview) |
printf("on "); |
else |
printf("off"); |
break; |
case 'h': |
showscores(firstgame); |
tetris_menu_draw(*level); |
break; |
case 's': |
firstgame = 0; |
return 1; |
case 'q': |
return 0; |
case '1': |
case '2': |
case '3': |
case '4': |
case '5': |
case '6': |
case '7': |
case '8': |
case '9': |
*level = i - '0'; |
moveto(8,18); |
printf("%d", *level); |
break; |
} |
} |
} |
int |
main(int argc, char *argv[]) |
{ |
int pos, c; |
char *keys; |
int level = 2; |
char key_write[6][10]; |
int i, j; |
keys = "jkl pq"; |
// gid = getgid(); |
// egid = getegid(); |
// setegid(gid); |
classic = 0; |
showpreview = 1; |
/* while ((ch = getopt(argc, argv, "ck:l:ps")) != -1) */ |
/* switch(ch) { */ |
/* case 'c': */ |
/* /\* */ |
/* * this means: */ |
/* * - rotate the other way; */ |
/* * - no reverse video. */ |
/* *\/ */ |
/* classic = 1; */ |
/* break; */ |
/* case 'k': */ |
/* if (strlen(keys = optarg) != 6) */ |
/* usage(); */ |
/* break; */ |
/* case 'l': */ |
/* level = (int)strtonum(optarg, MINLEVEL, MAXLEVEL, */ |
/* &errstr); */ |
/* if (errstr) */ |
/* errx(1, "level must be from %d to %d", */ |
/* MINLEVEL, MAXLEVEL); */ |
/* break; */ |
/* case 'p': */ |
/* showpreview = 1; */ |
/* break; */ |
/* case 's': */ |
/* showscores(0); */ |
/* exit(0); */ |
/* default: */ |
/* usage(); */ |
/* } */ |
/* argc -= optind; */ |
/* argv += optind; */ |
/* if (argc) */ |
/* usage(); */ |
for (i = 0; i <= 5; i++) { |
for (j = i+1; j <= 5; j++) { |
if (keys[i] == keys[j]) |
errx(1, "duplicate command keys specified."); |
} |
if (keys[i] == ' ') |
strncpy(key_write[i], "<space>", sizeof key_write[i]); |
else { |
key_write[i][0] = keys[i]; |
key_write[i][1] = '\0'; |
} |
} |
snprintf(key_msg, sizeof key_msg, |
"%s - left %s - rotate %s - right %s - drop %s - pause %s - quit", |
key_write[0], key_write[1], key_write[2], key_write[3], |
key_write[4], key_write[5]); |
scr_init(); |
initscores(); |
while (tetris_menu(&level)) { |
fallrate = 1000000 / level; |
scr_clear(); |
setup_board(); |
srandomdev(); |
scr_set(); |
pos = A_FIRST*B_COLS + (B_COLS/2)-1; |
nextshape = randshape(); |
curshape = randshape(); |
scr_msg(key_msg, 1); |
for (;;) { |
place(curshape, pos, 1); |
scr_update(); |
place(curshape, pos, 0); |
c = tgetchar(); |
if (c < 0) { |
/* |
* Timeout. Move down if possible. |
*/ |
if (fits_in(curshape, pos + B_COLS)) { |
pos += B_COLS; |
continue; |
} |
/* |
* Put up the current shape `permanently', |
* bump score, and elide any full rows. |
*/ |
place(curshape, pos, 1); |
score++; |
elide(); |
/* |
* Choose a new shape. If it does not fit, |
* the game is over. |
*/ |
curshape = nextshape; |
nextshape = randshape(); |
pos = A_FIRST*B_COLS + (B_COLS/2)-1; |
if (!fits_in(curshape, pos)) |
break; |
continue; |
} |
/* |
* Handle command keys. |
*/ |
if (c == keys[5]) { |
/* quit */ |
break; |
} |
if (c == keys[4]) { |
static char msg[] = |
"paused - press RETURN to continue"; |
place(curshape, pos, 1); |
do { |
scr_update(); |
scr_msg(key_msg, 0); |
scr_msg(msg, 1); |
// (void) fflush(stdout); |
} while (rwait((struct timeval *)NULL) == -1); |
scr_msg(msg, 0); |
scr_msg(key_msg, 1); |
place(curshape, pos, 0); |
continue; |
} |
if (c == keys[0]) { |
/* move left */ |
if (fits_in(curshape, pos - 1)) |
pos--; |
continue; |
} |
if (c == keys[1]) { |
/* turn */ |
const struct shape *new = &shapes[ |
classic? curshape->rotc : curshape->rot]; |
if (fits_in(new, pos)) |
curshape = new; |
continue; |
} |
if (c == keys[2]) { |
/* move right */ |
if (fits_in(curshape, pos + 1)) |
pos++; |
continue; |
} |
if (c == keys[3]) { |
/* move to bottom */ |
while (fits_in(curshape, pos + B_COLS)) { |
pos += B_COLS; |
score++; |
} |
continue; |
} |
if (c == '\f') { |
scr_clear(); |
scr_msg(key_msg, 1); |
} |
} |
scr_clear(); |
insertscore(score, level); |
score=0; |
} |
scr_clear(); |
printf("\n\n\n\t\tGame over.\n"); |
/* |
while ((i = getchar()) != '\n') |
if (i == EOF) |
break |
*/ |
scr_end(); |
return 0; |
} |
/* void */ |
/* onintr(int signo) */ |
/* { */ |
/* scr_clear(); /\* XXX signal race *\/ */ |
/* scr_end(); /\* XXX signal race *\/ */ |
/* _exit(0); */ |
/* } */ |
void |
usage(void) |
{ |
(void)fprintf(stderr, "usage: tetris [-ps] [-k keys] [-l level]\n"); |
exit(1); |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/app/tetris/scores.c |
---|
0,0 → 1,543 |
/* $OpenBSD: scores.c,v 1.11 2006/04/20 03:25:36 ray Exp $ */ |
/* $NetBSD: scores.c,v 1.2 1995/04/22 07:42:38 cgd Exp $ */ |
/*- |
* Copyright (c) 1992, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Chris Torek and Darren F. Provine. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
* |
* @(#)scores.c 8.1 (Berkeley) 5/31/93 |
*/ |
/** @addtogroup tetris |
* @{ |
*/ |
/** @file |
*/ |
/* |
* Score code for Tetris, by Darren Provine (kilroy@gboro.glassboro.edu) |
* modified 22 January 1992, to limit the number of entries any one |
* person has. |
* |
* Major whacks since then. |
*/ |
#include <errno.h> |
/* #include <err.h> */ |
/* #include <fcntl.h> */ |
/* #include <pwd.h> */ |
#include <stdio.h> |
/* #include <stdlib.h> */ |
#include <string.h> |
/* #include <time.h> */ |
/* #include <term.h> */ |
/* #include <unistd.h> */ |
/* #include <sys/param.h> */ |
/* #include <sys/stat.h> */ |
/* #include <sys/types.h> */ |
#include "pathnames.h" |
#include "screen.h" |
#include "tetris.h" |
#include "scores.h" |
/* |
* Within this code, we can hang onto one extra "high score", leaving |
* room for our current score (whether or not it is high). |
* |
* We also sometimes keep tabs on the "highest" score on each level. |
* As long as the scores are kept sorted, this is simply the first one at |
* that level. |
*/ |
#define NUMSPOTS (MAXHISCORES + 1) |
#define NLEVELS (MAXLEVEL + 1) |
/* static time_t now; */ |
/* static int nscores; */ |
/* static int gotscores; */ |
/* static struct highscore scores[NUMSPOTS]; */ |
static struct highscore scores[NUMSPOTS]; |
/* static int checkscores(struct highscore *, int); */ |
/* static int cmpscores(const void *, const void *); */ |
/* static void getscores(FILE **); */ |
/* static void printem(int, int, struct highscore *, int, const char *); */ |
/* static char *thisuser(void); */ |
void showscores(int firstgame) |
{ |
int i; |
clear_screen(); |
moveto(10, 0); |
printf("\tRank \tLevel \tName\t points\n"); |
printf("\t========================================================\n"); |
for (i = 0; i < NUMSPOTS - 1; i++) { |
printf("\t%6d %6d %-16s %20d\n", i+1, scores[i].hs_level, scores[i].hs_name, scores[i].hs_score); |
} |
if (!firstgame) { |
printf("\t========================================================\n"); |
printf("\t Last %6d %-16s %20d\n", scores[NUMSPOTS - 1].hs_level, scores[NUMSPOTS - 1].hs_name, scores[NUMSPOTS - 1].hs_score); |
} |
printf("\n\n\n\n\tPress any key to return to main menu."); |
getchar(); |
} |
/** Copy from hiscore table score with index src to dest |
* |
*/ |
static void copyhiscore(int dest, int src) |
{ |
strcpy(scores[dest].hs_name, scores[src].hs_name); |
scores[dest].hs_score = scores[src].hs_score; |
scores[dest].hs_level = scores[src].hs_level; |
} |
void insertscore(int score, int level) |
{ |
int i,j; |
int key; |
clear_screen(); |
moveto(10 , 10); |
puts("Insert your name: "); |
strncpy(scores[NUMSPOTS - 1].hs_name, "Player", MAXLOGNAME); |
i = 6; |
moveto(10 , 28); |
printf("%s%.*s",scores[NUMSPOTS - 1].hs_name,MAXLOGNAME-i,"........................................"); |
key = getchar(); |
while(key != '\n') { |
if (key == '\b') { |
if (i > 0) |
scores[NUMSPOTS - 1].hs_name[--i] = '\0'; |
} else { |
if (i < (MAXLOGNAME - 1)) |
scores[NUMSPOTS - 1].hs_name[i++] = key; |
scores[NUMSPOTS - 1].hs_name[i] = '\0'; |
} |
moveto(10 , 28); |
printf("%s%.*s",scores[NUMSPOTS - 1].hs_name,MAXLOGNAME-i,"........................................"); |
key = getchar(); |
} |
scores[NUMSPOTS - 1].hs_score = score; |
scores[NUMSPOTS - 1].hs_level = level; |
i = NUMSPOTS-1; |
while ((i > 0) && (scores[i - 1].hs_score < score)) |
i--; |
for (j = NUMSPOTS - 2; j > i; j--) { |
copyhiscore(j,j-1); |
} |
copyhiscore(i, NUMSPOTS - 1); |
} |
void initscores(void) |
{ |
int i; |
for(i = 0; i < NUMSPOTS; i++) { |
strncpy(scores[i].hs_name, "HelenOS Team", MAXLOGNAME); |
scores[i].hs_score = (NUMSPOTS - i) * 200; |
scores[i].hs_level = (i + 1 > MAXLEVEL?MAXLEVEL:i + 1); |
} |
} |
/* |
* Read the score file. Can be called from savescore (before showscores) |
* or showscores (if savescore will not be called). If the given pointer |
* is not NULL, sets *fpp to an open file pointer that corresponds to a |
* read/write score file that is locked with LOCK_EX. Otherwise, the |
* file is locked with LOCK_SH for the read and closed before return. |
* |
* Note, we assume closing the stdio file releases the lock. |
*/ |
/* static void */ |
/* getscores(FILE **fpp) */ |
/* { */ |
/* int sd, mint, lck, mask, i; */ |
/* char *mstr, *human; */ |
/* FILE *sf; */ |
/* if (fpp != NULL) { */ |
/* mint = O_RDWR | O_CREAT; */ |
/* mstr = "r+"; */ |
/* human = "read/write"; */ |
/* lck = LOCK_EX; */ |
/* } else { */ |
/* mint = O_RDONLY; */ |
/* mstr = "r"; */ |
/* human = "reading"; */ |
/* lck = LOCK_SH; */ |
/* } */ |
/* setegid(egid); */ |
/* mask = umask(S_IWOTH); */ |
/* sd = open(_PATH_SCOREFILE, mint, 0666); */ |
/* (void)umask(mask); */ |
/* setegid(gid); */ |
/* if (sd < 0) { */ |
/* if (fpp == NULL) { */ |
/* nscores = 0; */ |
/* return; */ |
/* } */ |
/* err(1, "cannot open %s for %s", _PATH_SCOREFILE, human); */ |
/* } */ |
/* setegid(egid); */ |
/* if ((sf = fdopen(sd, mstr)) == NULL) */ |
/* err(1, "cannot fdopen %s for %s", _PATH_SCOREFILE, human); */ |
/* setegid(gid); */ |
/* /\* */ |
/* * Grab a lock. */ |
/* *\/ */ |
/* if (flock(sd, lck)) */ |
/* warn("warning: score file %s cannot be locked", */ |
/* _PATH_SCOREFILE); */ |
/* nscores = fread(scores, sizeof(scores[0]), MAXHISCORES, sf); */ |
/* if (ferror(sf)) */ |
/* err(1, "error reading %s", _PATH_SCOREFILE); */ |
/* for (i = 0; i < nscores; i++) */ |
/* if (scores[i].hs_level < MINLEVEL || */ |
/* scores[i].hs_level > MAXLEVEL) */ |
/* errx(1, "scorefile %s corrupt", _PATH_SCOREFILE); */ |
/* if (fpp) */ |
/* *fpp = sf; */ |
/* else */ |
/* (void)fclose(sf); */ |
/* } */ |
void |
savescore(int level) |
{ |
return; |
} |
/* struct highscore *sp; */ |
/* int i; */ |
/* int change; */ |
/* FILE *sf; */ |
/* const char *me; */ |
/* getscores(&sf); */ |
/* gotscores = 1; */ |
/* (void)time(&now); */ |
/* /\* */ |
/* * Allow at most one score per person per level -- see if we */ |
/* * can replace an existing score, or (easiest) do nothing. */ |
/* * Otherwise add new score at end (there is always room). */ |
/* *\/ */ |
/* change = 0; */ |
/* me = thisuser(); */ |
/* for (i = 0, sp = &scores[0]; i < nscores; i++, sp++) { */ |
/* if (sp->hs_level != level || strcmp(sp->hs_name, me) != 0) */ |
/* continue; */ |
/* if (score > sp->hs_score) { */ |
/* (void)printf("%s bettered %s %d score of %d!\n", */ |
/* "\nYou", "your old level", level, */ |
/* sp->hs_score * sp->hs_level); */ |
/* sp->hs_score = score; /\* new score *\/ */ |
/* sp->hs_time = now; /\* and time *\/ */ |
/* change = 1; */ |
/* } else if (score == sp->hs_score) { */ |
/* (void)printf("%s tied %s %d high score.\n", */ |
/* "\nYou", "your old level", level); */ |
/* sp->hs_time = now; /\* renew it *\/ */ |
/* change = 1; /\* gotta rewrite, sigh *\/ */ |
/* } /\* else new score < old score: do nothing *\/ */ |
/* break; */ |
/* } */ |
/* if (i >= nscores) { */ |
/* strlcpy(sp->hs_name, me, sizeof sp->hs_name); */ |
/* sp->hs_level = level; */ |
/* sp->hs_score = score; */ |
/* sp->hs_time = now; */ |
/* nscores++; */ |
/* change = 1; */ |
/* } */ |
/* if (change) { */ |
/* /\* */ |
/* * Sort & clean the scores, then rewrite. */ |
/* *\/ */ |
/* nscores = checkscores(scores, nscores); */ |
/* rewind(sf); */ |
/* if (fwrite(scores, sizeof(*sp), nscores, sf) != nscores || */ |
/* fflush(sf) == EOF) */ |
/* warnx("error writing %s: %s\n\t-- %s", */ |
/* _PATH_SCOREFILE, strerror(errno), */ |
/* "high scores may be damaged"); */ |
/* } */ |
/* (void)fclose(sf); /\* releases lock *\/ */ |
/* } */ |
/* |
* Get login name, or if that fails, get something suitable. |
* The result is always trimmed to fit in a score. |
*/ |
/* static char * */ |
/* thisuser(void) */ |
/* { */ |
/* const char *p; */ |
/* struct passwd *pw; */ |
/* static char u[sizeof(scores[0].hs_name)]; */ |
/* if (u[0]) */ |
/* return (u); */ |
/* p = getlogin(); */ |
/* if (p == NULL || *p == '\0') { */ |
/* pw = getpwuid(getuid()); */ |
/* if (pw != NULL) */ |
/* p = pw->pw_name; */ |
/* else */ |
/* p = " ???"; */ |
/* } */ |
/* strlcpy(u, p, sizeof(u)); */ |
/* return (u); */ |
/* } */ |
/* |
* Score comparison function for qsort. |
* |
* If two scores are equal, the person who had the score first is |
* listed first in the highscore file. |
*/ |
/* static int */ |
/* cmpscores(const void *x, const void *y) */ |
/* { */ |
/* const struct highscore *a, *b; */ |
/* long l; */ |
/* a = x; */ |
/* b = y; */ |
/* l = (long)b->hs_level * b->hs_score - (long)a->hs_level * a->hs_score; */ |
/* if (l < 0) */ |
/* return (-1); */ |
/* if (l > 0) */ |
/* return (1); */ |
/* if (a->hs_time < b->hs_time) */ |
/* return (-1); */ |
/* if (a->hs_time > b->hs_time) */ |
/* return (1); */ |
/* return (0); */ |
/* } */ |
/* |
* If we've added a score to the file, we need to check the file and ensure |
* that this player has only a few entries. The number of entries is |
* controlled by MAXSCORES, and is to ensure that the highscore file is not |
* monopolised by just a few people. People who no longer have accounts are |
* only allowed the highest score. Scores older than EXPIRATION seconds are |
* removed, unless they are someone's personal best. |
* Caveat: the highest score on each level is always kept. |
*/ |
/* static int */ |
/* checkscores(struct highscore *hs, int num) */ |
/* { */ |
/* struct highscore *sp; */ |
/* int i, j, k, numnames; */ |
/* int levelfound[NLEVELS]; */ |
/* struct peruser { */ |
/* char *name; */ |
/* int times; */ |
/* } count[NUMSPOTS]; */ |
/* struct peruser *pu; */ |
/* /\* */ |
/* * Sort so that highest totals come first. */ |
/* * */ |
/* * levelfound[i] becomes set when the first high score for that */ |
/* * level is encountered. By definition this is the highest score. */ |
/* *\/ */ |
/* qsort((void *)hs, nscores, sizeof(*hs), cmpscores); */ |
/* for (i = MINLEVEL; i < NLEVELS; i++) */ |
/* levelfound[i] = 0; */ |
/* numnames = 0; */ |
/* for (i = 0, sp = hs; i < num;) { */ |
/* /\* */ |
/* * This is O(n^2), but do you think we care? */ |
/* *\/ */ |
/* for (j = 0, pu = count; j < numnames; j++, pu++) */ |
/* if (strcmp(sp->hs_name, pu->name) == 0) */ |
/* break; */ |
/* if (j == numnames) { */ |
/* /\* */ |
/* * Add new user, set per-user count to 1. */ |
/* *\/ */ |
/* pu->name = sp->hs_name; */ |
/* pu->times = 1; */ |
/* numnames++; */ |
/* } else { */ |
/* /\* */ |
/* * Two ways to keep this score: */ |
/* * - Not too many (per user), still has acct, & */ |
/* * score not dated; or */ |
/* * - High score on this level. */ |
/* *\/ */ |
/* if ((pu->times < MAXSCORES && */ |
/* getpwnam(sp->hs_name) != NULL && */ |
/* sp->hs_time + EXPIRATION >= now) || */ |
/* levelfound[sp->hs_level] == 0) */ |
/* pu->times++; */ |
/* else { */ |
/* /\* */ |
/* * Delete this score, do not count it, */ |
/* * do not pass go, do not collect $200. */ |
/* *\/ */ |
/* num--; */ |
/* for (k = i; k < num; k++) */ |
/* hs[k] = hs[k + 1]; */ |
/* continue; */ |
/* } */ |
/* } */ |
/* levelfound[sp->hs_level] = 1; */ |
/* i++, sp++; */ |
/* } */ |
/* return (num > MAXHISCORES ? MAXHISCORES : num); */ |
/* } */ |
/* |
* Show current scores. This must be called after savescore, if |
* savescore is called at all, for two reasons: |
* - Showscores munches the time field. |
* - Even if that were not the case, a new score must be recorded |
* before it can be shown anyway. |
*/ |
/* |
void |
showscores(int level) |
{ |
return; |
} |
*/ |
/* struct highscore *sp; */ |
/* int i, n, c; */ |
/* const char *me; */ |
/* int levelfound[NLEVELS]; */ |
/* if (!gotscores) */ |
/* getscores((FILE **)NULL); */ |
/* (void)printf("\n\t\t Tetris High Scores\n"); */ |
/* /\* */ |
/* * If level == 0, the person has not played a game but just asked for */ |
/* * the high scores; we do not need to check for printing in highlight */ |
/* * mode. If SOstr is null, we can't do highlighting anyway. */ |
/* *\/ */ |
/* me = level && SOstr ? thisuser() : NULL; */ |
/* /\* */ |
/* * Set times to 0 except for high score on each level. */ |
/* *\/ */ |
/* for (i = MINLEVEL; i < NLEVELS; i++) */ |
/* levelfound[i] = 0; */ |
/* for (i = 0, sp = scores; i < nscores; i++, sp++) { */ |
/* if (levelfound[sp->hs_level]) */ |
/* sp->hs_time = 0; */ |
/* else { */ |
/* sp->hs_time = 1; */ |
/* levelfound[sp->hs_level] = 1; */ |
/* } */ |
/* } */ |
/* /\* */ |
/* * Page each screenful of scores. */ |
/* *\/ */ |
/* for (i = 0, sp = scores; i < nscores; sp += n) { */ |
/* n = 20; */ |
/* if (i + n > nscores) */ |
/* n = nscores - i; */ |
/* printem(level, i + 1, sp, n, me); */ |
/* if ((i += n) < nscores) { */ |
/* (void)printf("\nHit RETURN to continue."); */ |
/* (void)fflush(stdout); */ |
/* while ((c = getchar()) != '\n') */ |
/* if (c == EOF) */ |
/* break; */ |
/* (void)printf("\n"); */ |
/* } */ |
/* } */ |
/* if (nscores == 0) */ |
/* printf("\t\t\t - none to date.\n"); */ |
/* } */ |
/* static void */ |
/* printem(int level, int offset, struct highscore *hs, int n, const char *me) */ |
/* { */ |
/* struct highscore *sp; */ |
/* int row, highlight, i; */ |
/* char buf[100]; */ |
/* #define TITLE "Rank Score Name (points/level)" */ |
/* #define TITL2 "==========================================================" */ |
/* printf("%s\n%s\n", TITLE, TITL2); */ |
/* highlight = 0; */ |
/* for (row = 0; row < n; row++) { */ |
/* sp = &hs[row]; */ |
/* (void)snprintf(buf, sizeof(buf), */ |
/* "%3d%c %6d %-31s (%6d on %d)\n", */ |
/* row + offset, sp->hs_time ? '*' : ' ', */ |
/* sp->hs_score * sp->hs_level, */ |
/* sp->hs_name, sp->hs_score, sp->hs_level); */ |
/* /\* Print leaders every three lines *\/ */ |
/* if ((row + 1) % 3 == 0) { */ |
/* for (i = 0; i < sizeof(buf); i++) */ |
/* if (buf[i] == ' ') */ |
/* buf[i] = '_'; */ |
/* } */ |
/* /\* */ |
/* * Highlight if appropriate. This works because */ |
/* * we only get one score per level. */ |
/* *\/ */ |
/* if (me != NULL && */ |
/* sp->hs_level == level && */ |
/* sp->hs_score == score && */ |
/* strcmp(sp->hs_name, me) == 0) { */ |
/* putpad(SOstr); */ |
/* highlight = 1; */ |
/* } */ |
/* (void)printf("%s", buf); */ |
/* if (highlight) { */ |
/* putpad(SEstr); */ |
/* highlight = 0; */ |
/* } */ |
/* } */ |
/* } */ |
/** @} |
*/ |
/tags/0.3.0/uspace/app/tetris/tetris.h |
---|
0,0 → 1,188 |
/* $OpenBSD: tetris.h,v 1.9 2003/06/03 03:01:41 millert Exp $ */ |
/* $NetBSD: tetris.h,v 1.2 1995/04/22 07:42:48 cgd Exp $ */ |
/*- |
* Copyright (c) 1992, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Chris Torek and Darren F. Provine. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
* |
* @(#)tetris.h 8.1 (Berkeley) 5/31/93 |
*/ |
/** @addtogroup tetris |
* @{ |
*/ |
/** @file |
*/ |
/* |
* Definitions for Tetris. |
*/ |
/* |
* The display (`board') is composed of 23 rows of 12 columns of characters |
* (numbered 0..22 and 0..11), stored in a single array for convenience. |
* Columns 1 to 10 of rows 1 to 20 are the actual playing area, where |
* shapes appear. Columns 0 and 11 are always occupied, as are all |
* columns of rows 21 and 22. Rows 0 and 22 exist as boundary areas |
* so that regions `outside' the visible area can be examined without |
* worrying about addressing problems. |
*/ |
/* the board */ |
#define B_COLS 12 |
#define B_ROWS 23 |
#define B_SIZE (B_ROWS * B_COLS) |
typedef unsigned char cell; |
extern cell board[B_SIZE]; /* 1 => occupied, 0 => empty */ |
/* the displayed area (rows) */ |
#define D_FIRST 1 |
#define D_LAST 22 |
/* the active area (rows) */ |
#define A_FIRST 1 |
#define A_LAST 21 |
/* |
* Minimum display size. |
*/ |
#define MINROWS 23 |
#define MINCOLS 40 |
extern int Rows, Cols; /* current screen size */ |
/* |
* Translations from board coordinates to display coordinates. |
* As with board coordinates, display coordiates are zero origin. |
*/ |
#define RTOD(x) ((x) - 1) |
#define CTOD(x) ((x) * 2 + (((Cols - 2 * B_COLS) >> 1) - 1)) |
/* |
* A `shape' is the fundamental thing that makes up the game. There |
* are 7 basic shapes, each consisting of four `blots': |
* |
* X.X X.X X.X |
* X.X X.X X.X.X X.X X.X.X X.X.X X.X.X.X |
* X X X |
* |
* 0 1 2 3 4 5 6 |
* |
* Except for 3 and 6, the center of each shape is one of the blots. |
* This blot is designated (0,0). The other three blots can then be |
* described as offsets from the center. Shape 3 is the same under |
* rotation, so its center is effectively irrelevant; it has been chosen |
* so that it `sticks out' upward and leftward. Except for shape 6, |
* all the blots are contained in a box going from (-1,-1) to (+1,+1); |
* shape 6's center `wobbles' as it rotates, so that while it `sticks out' |
* rightward, its rotation---a vertical line---`sticks out' downward. |
* The containment box has to include the offset (2,0), making the overall |
* containment box range from offset (-1,-1) to (+2,+1). (This is why |
* there is only one row above, but two rows below, the display area.) |
* |
* The game works by choosing one of these shapes at random and putting |
* its center at the middle of the first display row (row 1, column 5). |
* The shape is moved steadily downward until it collides with something: |
* either another shape, or the bottom of the board. When the shape can |
* no longer be moved downwards, it is merged into the current board. |
* At this time, any completely filled rows are elided, and blots above |
* these rows move down to make more room. A new random shape is again |
* introduced at the top of the board, and the whole process repeats. |
* The game ends when the new shape will not fit at (1,5). |
* |
* While the shapes are falling, the user can rotate them counterclockwise |
* 90 degrees (in addition to moving them left or right), provided that the |
* rotation puts the blots in empty spaces. The table of shapes is set up |
* so that each shape contains the index of the new shape obtained by |
* rotating the current shape. Due to symmetry, each shape has exactly |
* 1, 2, or 4 rotations total; the first 7 entries in the table represent |
* the primary shapes, and the remaining 12 represent their various |
* rotated forms. |
*/ |
struct shape { |
int rot; /* index of rotated version of this shape */ |
int rotc; /* -- " -- in classic version */ |
int off[3]; /* offsets to other blots if center is at (0,0) */ |
}; |
extern const struct shape shapes[]; |
extern const struct shape *curshape; |
extern const struct shape *nextshape; |
/* |
* Shapes fall at a rate faster than once per second. |
* |
* The initial rate is determined by dividing 1 million microseconds |
* by the game `level'. (This is at most 1 million, or one second.) |
* Each time the fall-rate is used, it is decreased a little bit, |
* depending on its current value, via the `faster' macro below. |
* The value eventually reaches a limit, and things stop going faster, |
* but by then the game is utterly impossible. |
*/ |
extern long fallrate; /* less than 1 million; smaller => faster */ |
#define faster() (fallrate -= fallrate / 3000) |
/* |
* Game level must be between 1 and 9. This controls the initial fall rate |
* and affects scoring. |
*/ |
#define MINLEVEL 1 |
#define MAXLEVEL 9 |
/* |
* Scoring is as follows: |
* |
* When the shape comes to rest, and is integrated into the board, |
* we score one point. If the shape is high up (at a low-numbered row), |
* and the user hits the space bar, the shape plummets all the way down, |
* and we score a point for each row it falls (plus one more as soon as |
* we find that it is at rest and integrate it---until then, it can |
* still be moved or rotated). |
* |
* If previewing has been turned on, the score is multiplied by PRE_PENALTY. |
*/ |
#define PRE_PENALTY 0.75 |
extern int score; /* the obvious thing */ |
//extern gid_t gid, egid; |
extern char key_msg[100]; |
extern int showpreview; |
extern int classic; |
int fits_in(const struct shape *, int); |
void place(const struct shape *, int, int); |
void stop(char *); |
/** @} |
*/ |
/tags/0.3.0/uspace/app/tetris/scores.h |
---|
0,0 → 1,67 |
/* $OpenBSD: scores.h,v 1.5 2003/06/03 03:01:41 millert Exp $ */ |
/* $NetBSD: scores.h,v 1.2 1995/04/22 07:42:40 cgd Exp $ */ |
/*- |
* Copyright (c) 1992, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Chris Torek and Darren F. Provine. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
* |
* @(#)scores.h 8.1 (Berkeley) 5/31/93 |
*/ |
/** @addtogroup tetris |
* @{ |
*/ |
/** @file |
*/ |
/* |
* Tetris scores. |
*/ |
#include <sys/time.h> |
#define MAXLOGNAME 16 |
struct highscore { |
char hs_name[MAXLOGNAME + 1]; /* login name */ |
int hs_score; /* raw score */ |
int hs_level; /* play level */ |
// time_t hs_time; /* time at game end */ |
}; |
#define MAXHISCORES 10 |
//#define MAXSCORES 9 /* maximum high score entries per person */ |
//#define EXPIRATION (5L * 365 * 24 * 60 * 60) |
void savescore(int); |
void showscores(int); |
void insertscore(int score, int level); |
void initscores(void); |
/** @} |
*/ |
/tags/0.3.0/uspace/app/tetris/shapes.c |
---|
0,0 → 1,116 |
/* $OpenBSD: shapes.c,v 1.8 2004/07/10 07:26:24 deraadt Exp $ */ |
/* $NetBSD: shapes.c,v 1.2 1995/04/22 07:42:44 cgd Exp $ */ |
/*- |
* Copyright (c) 1992, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Chris Torek and Darren F. Provine. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
* |
* @(#)shapes.c 8.1 (Berkeley) 5/31/93 |
*/ |
/** @addtogroup tetris |
* @{ |
*/ |
/** @file |
*/ |
/* |
* Tetris shapes and related routines. |
* |
* Note that the first 7 are `well known'. |
*/ |
#include <unistd.h> |
#include "tetris.h" |
#define TL -B_COLS-1 /* top left */ |
#define TC -B_COLS /* top center */ |
#define TR -B_COLS+1 /* top right */ |
#define ML -1 /* middle left */ |
#define MR 1 /* middle right */ |
#define BL B_COLS-1 /* bottom left */ |
#define BC B_COLS /* bottom center */ |
#define BR B_COLS+1 /* bottom right */ |
const struct shape shapes[] = { |
/* 0*/ { 7, 7, { TL, TC, MR } }, |
/* 1*/ { 8, 8, { TC, TR, ML } }, |
/* 2*/ { 9, 11, { ML, MR, BC } }, |
/* 3*/ { 3, 3, { TL, TC, ML } }, |
/* 4*/ { 12, 14, { ML, BL, MR } }, |
/* 5*/ { 15, 17, { ML, BR, MR } }, |
/* 6*/ { 18, 18, { ML, MR, 2 } }, /* sticks out */ |
/* 7*/ { 0, 0, { TC, ML, BL } }, |
/* 8*/ { 1, 1, { TC, MR, BR } }, |
/* 9*/ { 10, 2, { TC, MR, BC } }, |
/*10*/ { 11, 9, { TC, ML, MR } }, |
/*11*/ { 2, 10, { TC, ML, BC } }, |
/*12*/ { 13, 4, { TC, BC, BR } }, |
/*13*/ { 14, 12, { TR, ML, MR } }, |
/*14*/ { 4, 13, { TL, TC, BC } }, |
/*15*/ { 16, 5, { TR, TC, BC } }, |
/*16*/ { 17, 15, { TL, MR, ML } }, |
/*17*/ { 5, 16, { TC, BC, BL } }, |
/*18*/ { 6, 6, { TC, BC, 2*B_COLS } }/* sticks out */ |
}; |
/* |
* Return true iff the given shape fits in the given position, |
* taking the current board into account. |
*/ |
int |
fits_in(const struct shape *shape, int pos) |
{ |
int *o = shape->off; |
if (board[pos] || board[pos + *o++] || board[pos + *o++] || |
board[pos + *o]) |
return 0; |
return 1; |
} |
/* |
* Write the given shape into the current board, turning it on |
* if `onoff' is 1, and off if `onoff' is 0. |
*/ |
void |
place(const struct shape *shape, int pos, int onoff) |
{ |
int *o = shape->off; |
board[pos] = onoff; |
board[pos + *o++] = onoff; |
board[pos + *o++] = onoff; |
board[pos + *o] = onoff; |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/app/tetris/input.h |
---|
0,0 → 1,50 |
/* $OpenBSD: input.h,v 1.5 2003/06/03 03:01:41 millert Exp $ */ |
/* $NetBSD: input.h,v 1.2 1995/04/22 07:42:36 cgd Exp $ */ |
/*- |
* Copyright (c) 1992, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Chris Torek and Darren F. Provine. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
* |
* @(#)input.h 8.1 (Berkeley) 5/31/93 |
*/ |
/** @addtogroup tetris |
* @{ |
*/ |
/** @file |
*/ |
int rwait(struct timeval *); |
int tgetchar(void); |
void tsleep(void); |
/** @} |
*/ |
/tags/0.3.0/uspace/app/tetris/screen.h |
---|
0,0 → 1,71 |
/* $OpenBSD: screen.h,v 1.5 2003/06/03 03:01:41 millert Exp $ */ |
/* $NetBSD: screen.h,v 1.2 1995/04/22 07:42:42 cgd Exp $ */ |
/*- |
* Copyright (c) 1992, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Chris Torek and Darren F. Provine. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
* |
* @(#)screen.h 8.1 (Berkeley) 5/31/93 |
*/ |
/** @addtogroup tetris |
* @{ |
*/ |
/** @file |
*/ |
/* |
* putpad() is for padded strings with count=1. |
*/ |
#define putpad(s) tputs(s, 1, put) |
#include <async.h> |
typedef struct { |
ipcarg_t ws_row; |
ipcarg_t ws_col; |
} winsize_t; |
extern winsize_t winsize; |
void moveto(int r, int c); |
void clear_screen(void); |
int put(int); /* just calls putchar; for tputs */ |
void scr_clear(void); |
void scr_end(void); |
void scr_init(void); |
void scr_msg(char *, int); |
void scr_set(void); |
void scr_update(void); |
/** @} |
*/ |
/tags/0.3.0/uspace/app/tetris/pathnames.h |
---|
0,0 → 1,49 |
/* $OpenBSD: pathnames.h,v 1.3 2003/06/03 03:01:41 millert Exp $ */ |
/* $NetBSD: pathnames.h,v 1.2 1995/04/22 07:42:37 cgd Exp $ */ |
/*- |
* Copyright (c) 1992, 1993 |
* The Regents of the University of California. All rights reserved. |
* |
* This code is derived from software contributed to Berkeley by |
* Chris Torek and Darren F. Provine. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* 3. Neither the name of the University nor the names of its contributors |
* may be used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* SUCH DAMAGE. |
* |
* @(#)pathnames.h 8.1 (Berkeley) 5/31/93 |
*/ |
/** @addtogroup tetris |
* @{ |
*/ |
/** @file |
*/ |
#define _PATH_SCOREFILE "/var/games/tetris.scores" |
/** @} |
*/ |
/tags/0.3.0/uspace/app/init/Makefile |
---|
0,0 → 1,87 |
# |
# Copyright (c) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
include ../../../version |
include ../../Makefile.config |
## Setup toolchain |
# |
LIBC_PREFIX = ../../lib/libc |
SOFTINT_PREFIX = ../../lib/softint |
include $(LIBC_PREFIX)/Makefile.toolchain |
CFLAGS += -I../../srv/kbd/include |
LIBS = $(LIBC_PREFIX)/libc.a |
DEFS += -DRELEASE=\"$(RELEASE)\" |
ifdef REVISION |
DEFS += "-DREVISION=\"$(REVISION)\"" |
endif |
ifdef TIMESTAMP |
DEFS += "-DTIMESTAMP=\"$(TIMESTAMP)\"" |
endif |
## Sources |
# |
OUTPUT = init |
SOURCES = \ |
init.c \ |
version.c |
OBJECTS := $(addsuffix .o,$(basename $(SOURCES))) |
.PHONY: all clean depend disasm |
all: $(OUTPUT) disasm |
-include Makefile.depend |
clean: |
-rm -f $(OUTPUT) $(OUTPUT).map $(OUTPUT).disasm Makefile.depend |
depend: |
$(CC) $(DEFS) $(CFLAGS) -M $(SOURCES) > Makefile.depend |
$(OUTPUT): $(OBJECTS) $(LIBS) |
$(LD) -T $(LIBC_PREFIX)/arch/$(ARCH)/_link.ld $(OBJECTS) $(LIBS) $(LFLAGS) -o $@ -Map $(OUTPUT).map |
disasm: |
$(OBJDUMP) -d $(OUTPUT) >$(OUTPUT).disasm |
%.o: %.S |
$(CC) $(DEFS) $(AFLAGS) $(CFLAGS) -D__ASM__ -c $< -o $@ |
%.o: %.s |
$(AS) $(AFLAGS) $< -o $@ |
%.o: %.c |
$(CC) $(DEFS) $(CFLAGS) -c $< -o $@ |
/tags/0.3.0/uspace/app/init/init.c |
---|
0,0 → 1,63 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup init Init |
* @brief Init process for testing purposes. |
* @{ |
*/ |
/** |
* @file |
*/ |
#include "version.h" |
#include <stdio.h> |
static void test_console(void) |
{ |
int c; |
while ((c = getchar()) != EOF) |
putchar(c); |
} |
int main(int argc, char *argv[]) |
{ |
version_print(); |
printf("This is init\n"); |
test_console(); |
printf("\nBye.\n"); |
return 0; |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/app/init/version.c |
---|
0,0 → 1,61 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup init |
* @{ |
*/ |
/** |
* @file |
*/ |
#include <unistd.h> |
#include <stdio.h> |
#include "version.h" |
char *release = RELEASE; |
#ifdef REVISION |
char *revision = ", revision " REVISION; |
#else |
char *revision = ""; |
#endif |
#ifdef TIMESTAMP |
char *timestamp = "\nBuilt on " TIMESTAMP; |
#else |
char *timestamp = ""; |
#endif |
/** Print version information. */ |
void version_print(void) |
{ |
printf("HelenOS init\nRelease %s%s%s\nCopyright (c) 2006 HelenOS project\n", release, revision, timestamp); |
} |
/** @} |
*/ |
/tags/0.3.0/uspace/app/init/init.h |
---|
0,0 → 1,45 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup init |
* @{ |
*/ |
/** |
* @file |
*/ |
#ifndef __INIT_H__ |
#define __INIT_H__ |
#include "version.h" |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/app/init/version.h |
---|
0,0 → 1,45 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup init |
* @{ |
*/ |
/** |
* @file |
*/ |
#ifndef __VERSION_H__ |
#define __VERSION_H__ |
extern void version_print(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/uspace/Makefile |
---|
0,0 → 1,94 |
# |
# Copyright (c) 2005 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
## Include configuration |
# |
-include Makefile.config |
DIRS = \ |
lib/libc \ |
lib/libfs \ |
lib/softint \ |
lib/softfloat \ |
srv/ns \ |
srv/fb \ |
srv/kbd \ |
srv/console \ |
srv/rd \ |
srv/fs/fat \ |
srv/fs/tmpfs \ |
srv/vfs \ |
srv/devmap \ |
app/tetris \ |
app/tester \ |
app/klog \ |
app/init |
ifeq ($(ARCH), amd64) |
DIRS += srv/pci |
endif |
ifeq ($(ARCH), ia32) |
DIRS += srv/pci |
endif |
ifeq ($(ARCH), mips32) |
CFLAGS += -DCONFIG_MIPS_FPU |
endif |
ifeq ($(ARCH), mips32eb) |
CFLAGS += -DCONFIG_MIPS_FPU |
endif |
BUILDS := $(addsuffix .build,$(DIRS)) |
CLEANS := $(addsuffix .clean,$(DIRS)) |
.PHONY: all config build $(BUILDS) $(CLEANS) clean distclean |
all: |
../tools/config.py uspace.config default $(ARCH) $(COMPILER) $(CONFIG_DEBUG) |
$(MAKE) -C . build |
config: |
../tools/config.py uspace.config |
build: $(BUILDS) |
clean: $(CLEANS) |
find $(DIRS) -name '*.o' -follow -exec rm \{\} \; |
find lib/libc -name "_link.ld" -exec rm \{\} \; |
distclean: clean |
-rm Makefile.config |
$(CLEANS): |
-$(MAKE) -C $(basename $@) clean ARCH=$(ARCH) |
$(BUILDS): |
$(MAKE) -C $(basename $@) all ARCH=$(ARCH) COMPILER=$(COMPILER) |
/tags/0.3.0/uspace/uspace.config |
---|
0,0 → 1,40 |
## General configuration directives |
# Architecture |
@ "amd64" AMD64/Intel EM64T |
@ "arm32" ARM 32-bit |
@ "ia32" Intel IA-32 |
@ "ia64" Intel IA-64 |
@ "mips32" MIPS 32-bit Little Endian |
@ "mips32eb" MIPS 32-bit Big Endian |
@ "ppc32" PowerPC 32-bit |
@ "ppc64" PowerPC 64-bit |
@ "sparc64" Sun UltraSPARC 64-bit |
! ARCH (choice) |
# Compiler |
@ "gcc_cross" GCC Cross-compiler |
@ "gcc_native" GCC Native |
@ "icc_native" ICC Native |
@ "suncc_native" Sun Studio C Compiler |
! [ARCH=amd64|ARCH=ia32] COMPILER (choice) |
# Compiler |
@ "gcc_cross" GCC Cross-compiler |
@ "gcc_native" GCC Native |
@ "icc_native" ICC Native |
! [ARCH=ia64] COMPILER (choice) |
# Compiler |
@ "gcc_cross" GCC Cross-compiler |
@ "gcc_native" GCC Native |
@ "suncc_native" Sun Studio C Compiler |
! [ARCH=sparc64] COMPILER (choice) |
# Compiler |
@ "gcc_cross" GCC Cross-compiler |
@ "gcc_native" GCC Native |
! [ARCH=arm32|ARCH=mips32|ARCH=mips32eb|ARCH=ppc32|ARCH=ppc64] COMPILER (choice) |
# General debuging and assert checking |
! CONFIG_DEBUG (y/n) |
/tags/0.3.0/uspace/doc/doxygroups.h |
---|
0,0 → 1,56 |
/* Definitions of modules and its relations for generating Doxygen documentation */ |
/** |
* @defgroup srvcs HelenOS Services |
* @ingroup uspace |
*/ |
/** |
* @defgroup ns Naming Service |
* @ingroup srvcs |
*/ |
/** |
* @defgroup kbd Keyboard Service |
* @ingroup srvcs |
*/ |
/** |
* @defgroup fbs Framebuffer Service |
* @ingroup srvcs |
*/ |
/** |
* @defgroup console Console Service |
* @ingroup srvcs |
*/ |
/** |
* @cond amd64 |
* @defgroup pci PCI Service |
* @ingroup srvcs |
* @endcond |
*/ |
/** |
* @cond ia32 |
* @defgroup pci PCI Service |
* @ingroup srvcs |
* @endcond |
*/ |
/** |
* @defgroup emul Emulation Libraries |
* @ingroup uspace |
*/ |
/** |
* @defgroup sfl Softloat |
* @ingroup emul |
*/ |
/** |
* @defgroup softint Softint |
* @ingroup emul |
*/ |
/tags/0.3.0/version |
---|
0,0 → 1,11 |
VERSION = 0 |
PATCHLEVEL = 3 |
SUBLEVEL = 0 |
#EXTRAVERSION = 0 |
NAME = Tartare |
ifdef EXTRAVERSION |
RELEASE = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL).$(EXTRAVERSION) |
else |
RELEASE = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL) |
endif |
/tags/0.3.0/boot/arch/ia64/loader/gefi/Make.defaults |
---|
0,0 → 1,56 |
# |
# Copyright (c) 1999-2004 Hewlett-Packard Development Company, L.P. |
# Contributed by David Mosberger <davidm@hpl.hp.com> |
# Contributed by Stephane Eranian <eranian@hpl.hp.com> |
# |
# This file is part of the gnu-efi package. |
# |
# GNU-EFI is free software; you can redistribute it and/or modify |
# it under the terms of the GNU General Public License as published by |
# the Free Software Foundation; either version 2, or (at your option) |
# any later version. |
# |
# GNU-EFI is distributed in the hope that it will be useful, |
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
# GNU General Public License for more details. |
# |
# You should have received a copy of the GNU General Public License |
# along with GNU-EFI; see the file COPYING. If not, write to the Free |
# Software Foundation, 59 Temple Place - Suite 330, Boston, MA |
# 02111-1307, USA. |
# |
# |
# Where to install the package. GNU-EFI will create and access |
# lib and include under the root |
# |
INSTALLROOT=/usr/local |
TOPDIR := $(shell if [ "$$PWD" != "" ]; then echo $$PWD; else pwd; fi) |
ARCH = $(shell uname -m | sed s,i[3456789]86,ia32,) |
INCDIR = -I. -I$(CDIR)/inc -I$(CDIR)/inc/$(ARCH) -I$(CDIR)/inc/protocol |
CPPFLAGS = -DCONFIG_$(ARCH) |
CFLAGS = -O2 -fpic -Wall -fshort-wchar -fno-strict-aliasing -fno-merge-constants |
LDFLAGS = -nostdlib |
INSTALL = install |
GCC_VERSION=$(shell $(CROSS_COMPILE)$(CC) -v 2>&1 | fgrep 'gcc version' | cut -f3 -d' ' | cut -f1 -d'.') |
# prefix = |
CC = $(prefix)gcc |
AS = $(prefix)as |
LD = $(prefix)ld |
AR = $(prefix)ar |
RANLIB = $(prefix)ranlib |
OBJCOPY = $(prefix)objcopy |
OBJDUMP = $(prefix)objdump |
ifneq ($(GCC_VERSION),2) |
CFLAGS += -frename-registers |
endif |
CFLAGS += -mfixed-range=f32-f127 |
/tags/0.3.0/boot/arch/ia64/loader/gefi/HelenOS/Makefile |
---|
0,0 → 1,60 |
# |
# Copyright (C) 1999-2001 Hewlett-Packard Co. |
# Contributed by David Mosberger <davidm@hpl.hp.com> |
# Contributed by Stephane Eranian <eranian@hpl.hp.com> |
# |
# This file is part of the gnu-efi package. |
# |
# GNU-EFI is free software; you can redistribute it and/or modify |
# it under the terms of the GNU General Public License as published by |
# the Free Software Foundation; either version 2, or (at your option) |
# any later version. |
# |
# GNU-EFI is distributed in the hope that it will be useful, |
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
# GNU General Public License for more details. |
# |
# You should have received a copy of the GNU General Public License |
# along with GNU-EFI; see the file COPYING. If not, write to the Free |
# Software Foundation, 59 Temple Place - Suite 330, Boston, MA |
# 02111-1307, USA. |
# |
prefix=$(PREFIX) |
include ../Make.defaults |
CDIR=$(TOPDIR)/.. |
LINUX_HEADERS = /usr/src/sys/build |
CPPFLAGS += -D__KERNEL__ -I$(LINUX_HEADERS)/include |
CRTOBJS = ../gnuefi/crt0-efi-$(ARCH).o |
LDSCRIPT = ../gnuefi/elf_$(ARCH)_efi.lds |
LDFLAGS += -T $(LDSCRIPT) -shared -Bsymbolic -L../lib -L../gnuefi $(CRTOBJS) |
LOADLIBES = -lefi -lgnuefi $(shell $(CC) -print-libgcc-file-name) |
FORMAT = efi-app-$(ARCH) |
all: gefi hello.efi |
clean: |
rm -f *.efi *~ *.o *.so |
.PHONY: install |
hello.efi: hello.so |
$(OBJCOPY) -j .text -j .sdata -j .data -j .dynamic -j .dynsym -j .rel \ |
-j .rela -j .reloc --target=$(FORMAT) hello.so hello.efi |
$(OBJDUMP) -d hello.efi > hello.disass |
hello.so: hello.o image.o |
$(LD) $(LDFLAGS) -Map hello.map hello.o -o hello.so $(LOADLIBES) |
hello.o: hello.c |
$(CC) $(INCDIR) $(CFLAGS) $(CPPFLAGS) -c hello.c -o hello.o |
image.o: ../../image.boot |
$(OBJCOPY) -O binary ../../image.boot image.bin |
$(OBJCOPY) -I binary -O elf64-ia64-little -B ia64 image.bin image.o |
gefi: |
make -C .. prefix=$(PREFIX) |
/tags/0.3.0/boot/arch/ia64/loader/gefi/HelenOS/hello.c |
---|
0,0 → 1,184 |
#include <efi.h> |
#include <efilib.h> |
#define KERNEL_LOAD_ADDRESS 0x4400000 |
static CHAR16 * |
a2u (char *str) |
{ |
static CHAR16 mem[2048]; |
int i; |
for (i = 0; str[i]; ++i) |
mem[i] = (CHAR16) str[i]; |
mem[i] = 0; |
return mem; |
} |
char HEX[256]; |
char hexs[]="0123456789ABCDEF"; |
/* |
void to_hex(unsigned long long num) |
{ |
int a; |
for(a=15;a>=0;a--) |
{ |
char c=num - (num & 0xfffffffffffffff0LL); |
num/=16; |
c=hexs[c]; |
HEX[a]=c; |
} |
} |
*/ |
EFI_STATUS |
efi_main (EFI_HANDLE image, EFI_SYSTEM_TABLE *systab) |
{ |
SIMPLE_TEXT_OUTPUT_INTERFACE *conout; |
EFI_INPUT_KEY efi_input_key; |
EFI_STATUS efi_status; |
InitializeLib(image, systab); |
Print(L"HelloLib application started\n"); |
EFI_GUID LoadedImageProtocol=LOADED_IMAGE_PROTOCOL; |
EFI_GUID DevicePathProtocol=DEVICE_PATH_PROTOCOL; |
EFI_GUID FileSystemProtocol=SIMPLE_FILE_SYSTEM_PROTOCOL; |
EFI_LOADED_IMAGE *LoadedImage; |
EFI_DEVICE_PATH *DevicePath; |
BS->HandleProtocol(image, |
&LoadedImageProtocol, |
&LoadedImage); |
BS->HandleProtocol(LoadedImage->DeviceHandle, |
&DevicePathProtocol, |
&DevicePath); |
Print (L"Image device : %s\n", DevicePathToStr (DevicePath)); |
Print (L"Image file : %s\n", DevicePathToStr (LoadedImage->FilePath)); |
Print (L"Image Base : %X\n", LoadedImage->ImageBase); |
Print (L"Image Size : %X\n", LoadedImage->ImageSize); |
EFI_FILE_IO_INTERFACE *Vol; |
EFI_FILE *CurDir; |
EFI_FILE *FileHandle; |
BS->HandleProtocol(LoadedImage->DeviceHandle, &FileSystemProtocol, &Vol); |
Vol->OpenVolume (Vol, &CurDir); |
char FileName[1024]; |
char *OsKernelBuffer; |
int i; |
UINTN Size; |
StrCpy(FileName,DevicePathToStr(LoadedImage->FilePath)); |
for(i=StrLen(FileName);i>=0 && FileName[i]!='\\';i--); |
FileName[i] = 0; |
Print(L"%s\n",LoadedImage->LoadOptions); |
i=0; |
CHAR16 *LoadOptions = LoadedImage->LoadOptions; |
while(1) if(LoadOptions[i++]!=L' ') break; |
while(LoadOptions[i]!=L' '){ |
if(LoadOptions[i]==0) break; |
i++; |
} |
while(LoadOptions[i]==L' ') if(LoadOptions[i++]==0) break; |
if(LoadOptions[i++]==0) |
StrCat(FileName,L"\\image.bin"); |
else{ |
CHAR16 buf[1024]; |
buf[0]='\\'; |
i--; |
int j; |
for(j=0;LoadOptions[i+j]!=L' '&&LoadOptions[i+j]!=0;j++) |
buf[j+1]=LoadOptions[i+j]; |
buf[j+1]=0; |
StrCat(FileName,buf); |
} |
//Print(L"%s\n",FileName); |
EFI_STATUS stat; |
stat=CurDir->Open(CurDir, &FileHandle, FileName, EFI_FILE_MODE_READ, 0); |
if(EFI_ERROR(stat)){ |
Print(L"Error Opening Image %s\n",FileName); |
return 0; |
} |
Size = 0x00400000; |
BS->AllocatePool(EfiLoaderData, Size, &OsKernelBuffer); |
FileHandle->Read(FileHandle, &Size, OsKernelBuffer); |
FileHandle->Close(FileHandle); |
if(Size<1) return 0; |
char * HOS = OsKernelBuffer; |
int HOSSize = Size; |
{ |
UINTN cookie; |
void *p=(void *)KERNEL_LOAD_ADDRESS; |
UINTN mapsize,descsize; |
UINT32 desver; |
EFI_STATUS status; |
EFI_MEMORY_DESCRIPTOR emd[1024]; |
mapsize=1024*sizeof(emd); |
status=BS->AllocatePages(AllocateAnyPages,EfiLoaderData,/*(HOSSize>>12)+1*/ 1,p); |
if(EFI_ERROR(status)){ |
Print(L"Error 0\n"); |
if(status == EFI_OUT_OF_RESOURCES) Print(L"EFI_OUT_OF_RESOURCES\n"); |
if(status == EFI_INVALID_PARAMETER) Print(L"EFI_INVALID_PARAMETER\n"); |
if(status == EFI_NOT_FOUND) Print(L"EFI_NOT_FOUND\n"); |
return EFI_SUCCESS; |
} |
status=BS->GetMemoryMap(&mapsize,emd,&cookie,&descsize,&desver); |
if(EFI_ERROR(status)){ |
Print(L"Error 1\n"); |
return EFI_SUCCESS; |
} |
status=BS->ExitBootServices(image,cookie); |
if(EFI_ERROR(status)){ |
Print(L"Error 2\n"); |
return EFI_SUCCESS; |
} |
} |
int a; |
for(a=0;a<HOSSize;a++){ |
((char *)(0x4400000))[a]=HOS[a]; |
} |
//Run Kernel |
asm volatile( |
"nop.i 0x00 ;;\n" |
"movl r15 = 0x4400000 ;;\n" |
"mov b0 = r15;;" |
"br.few b0;;\n" |
); |
while(1){ |
((volatile int *)(0x80000000000b8000))[0]++; |
} |
return EFI_SUCCESS; |
} |
/tags/0.3.0/boot/arch/ia64/loader/gefi/README.elilo |
---|
0,0 → 1,18 |
IMPORTANT information related to the gnu-efi package |
---------------------------------------------------- |
June 2001 |
As of version 3.0, the gnu-efi package is now split in two different packages: |
-> gnu-efi-X.y: contains the EFI library, include files and crt0. |
-> elilo-X.y : contains the ELILO bootloader. |
Note that X.y don't need to match for both packages. However elilo-3.x |
requires at least gnu-efi-3.0. |
Both packages can be downloaded from: |
ftp://ftp.hpl.hp.com/pub/linux-ia64/gnu-efi-X.y.tar.gz |
http://www.sf.net/projects/elilo |
/tags/0.3.0/boot/arch/ia64/loader/gefi/apps/tpause.c |
---|
0,0 → 1,9 |
#include <efi.h> |
#include <efilib.h> |
EFI_STATUS |
efi_main (EFI_HANDLE image, EFI_SYSTEM_TABLE *systab) |
{ |
Print(L"Press `q' to quit, any other key to continue:\n"); |
} |
/tags/0.3.0/boot/arch/ia64/loader/gefi/apps/t.c |
---|
0,0 → 1,71 |
#define EFI_SUCCESS 0 |
typedef short CHAR16; |
typedef unsigned long UINTN; |
typedef unsigned long long UINT64; |
typedef unsigned int UINT32; |
typedef void * EFI_HANDLE; |
typedef UINTN EFI_STATUS; |
typedef struct _EFI_TABLE_HEARDER { |
UINT64 Signature; |
UINT32 Revision; |
UINT32 HeaderSize; |
UINT32 CRC32; |
UINT32 Reserved; |
} EFI_TABLE_HEADER; |
typedef EFI_STATUS (*EFI_TEXT_STRING) (void *This, CHAR16 *String); |
typedef struct _SIMPLE_TEXT_OUTPUT_INTERFACE { |
void * Reset; |
EFI_TEXT_STRING OutputString; |
} SIMPLE_TEXT_OUTPUT_INTERFACE; |
typedef struct _EFI_SYSTEM_TABLE { |
EFI_TABLE_HEADER Hdr; |
CHAR16 *FirmwareVendor; |
UINT32 FirmwareRevision; |
EFI_HANDLE ConsoleInHandle; |
/*SIMPLE_INPUT_INTERFACE*/ void *ConIn; |
EFI_HANDLE ConsoleOutHandle; |
SIMPLE_TEXT_OUTPUT_INTERFACE *ConOut; |
EFI_HANDLE StandardErrorHandle; |
SIMPLE_TEXT_OUTPUT_INTERFACE *StdErr; |
/*EFI_RUNTIME_SERVICES*/ void *RuntimeServices; |
/*EFI_BOOT_SERVICES*/ void *BootServices; |
UINTN NumberOfTableEntries; |
/*EFI_CONFIGURATION_TABLE*/void *ConfigurationTable; |
} EFI_SYSTEM_TABLE; |
static CHAR16 * |
a2u (char *str) |
{ |
static CHAR16 mem[2048]; |
int i; |
for (i = 0; str[i]; ++i) |
mem[i] = (CHAR16) str[i]; |
mem[i] = 0; |
return mem; |
} |
EFI_STATUS |
efi_main (EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *systab) |
{ |
SIMPLE_TEXT_OUTPUT_INTERFACE *conout; |
conout = systab->ConOut; |
conout->OutputString(conout, (CHAR16 *)L"Hello World!\n\r"); |
conout->OutputString(conout, a2u("Hello World!\n\r")); |
return EFI_SUCCESS; |
} |
/tags/0.3.0/boot/arch/ia64/loader/gefi/apps/printenv.c |
---|
0,0 → 1,32 |
#include <efi.h> |
#include <efilib.h> |
EFI_STATUS |
efi_main (EFI_HANDLE image, EFI_SYSTEM_TABLE *systab) |
{ |
EFI_STATUS status; |
CHAR16 name[256], *val, fmt[20]; |
EFI_GUID vendor; |
UINTN size; |
InitializeLib(image, systab); |
name[0] = 0; |
vendor = NullGuid; |
Print(L"GUID Variable Name Value\n"); |
Print(L"=================================== ==================== ========\n"); |
StrCpy(fmt, L"%.-35g %.-20s %s\n"); |
while (1) { |
size = sizeof(name); |
status = RT->GetNextVariableName(&size, name, &vendor); |
if (status != EFI_SUCCESS) |
break; |
val = LibGetVariable(name, &vendor); |
Print(fmt, &vendor, name, val); |
FreePool(val); |
} |
return EFI_SUCCESS; |
} |
/tags/0.3.0/boot/arch/ia64/loader/gefi/apps/t2.c |
---|
0,0 → 1,13 |
#include <efi.h> |
#include <efilib.h> |
EFI_STATUS |
efi_main (EFI_HANDLE image, EFI_SYSTEM_TABLE *systab) |
{ |
SIMPLE_TEXT_OUTPUT_INTERFACE *conout; |
conout = systab->ConOut; |
conout->OutputString(conout, L"Hello World!\n\r"); |
return EFI_SUCCESS; |
} |
/tags/0.3.0/boot/arch/ia64/loader/gefi/apps/t3.c |
---|
0,0 → 1,93 |
#include <efi.h> |
#include <efilib.h> |
EFI_STATUS |
efi_main( |
EFI_HANDLE image_handle, |
EFI_SYSTEM_TABLE *systab |
) |
{ |
EFI_GUID loaded_image_protocol = LOADED_IMAGE_PROTOCOL; |
EFI_STATUS efi_status; |
EFI_LOADED_IMAGE *li; |
UINTN pat = PoolAllocationType; |
VOID *void_li_p; |
InitializeLib(image_handle, systab); |
PoolAllocationType = 2; /* klooj */ |
Print(L"Hello World! (0xd=0x%x, 13=%d)\n", 13, 13); |
Print(L"before InitializeLib(): PoolAllocationType=%d\n", |
pat); |
Print(L" after InitializeLib(): PoolAllocationType=%d\n", |
PoolAllocationType); |
/* |
* Locate loaded_image_handle instance. |
*/ |
Print(L"BS->HandleProtocol() "); |
efi_status = BS->HandleProtocol( |
image_handle, |
&loaded_image_protocol, |
&void_li_p); |
li = void_li_p; |
Print(L"%xh (%r)\n", efi_status, efi_status); |
if (efi_status != EFI_SUCCESS) { |
return efi_status; |
} |
Print(L" li: %xh\n", li); |
if (!li) { |
return EFI_UNSUPPORTED; |
} |
Print(L" li->Revision: %xh\n", li->Revision); |
Print(L" li->ParentHandle: %xh\n", li->ParentHandle); |
Print(L" li->SystemTable: %xh\n", li->SystemTable); |
Print(L" li->DeviceHandle: %xh\n", li->DeviceHandle); |
Print(L" li->FilePath: %xh\n", li->FilePath); |
Print(L" li->Reserved: %xh\n", li->Reserved); |
Print(L" li->LoadOptionsSize: %xh\n", li->LoadOptionsSize); |
Print(L" li->LoadOptions: %xh\n", li->LoadOptions); |
Print(L" li->ImageBase: %xh\n", li->ImageBase); |
Print(L" li->ImageSize: %xh\n", li->ImageSize); |
Print(L" li->ImageCodeType: %xh\n", li->ImageCodeType); |
Print(L" li->ImageDataType: %xh\n", li->ImageDataType); |
Print(L" li->Unload: %xh\n", li->Unload); |
#if 0 |
typedef struct { |
UINT32 Revision; |
EFI_HANDLE ParentHandle; |
struct _EFI_SYSTEM_TABLE *SystemTable; |
// Source location of image |
EFI_HANDLE DeviceHandle; |
EFI_DEVICE_PATH *FilePath; |
VOID *Reserved; |
// Images load options |
UINT32 LoadOptionsSize; |
VOID *LoadOptions; |
// Location of where image was loaded |
VOID *ImageBase; |
UINT64 ImageSize; |
EFI_MEMORY_TYPE ImageCodeType; |
EFI_MEMORY_TYPE ImageDataType; |
// If the driver image supports a dynamic unload request |
EFI_IMAGE_UNLOAD Unload; |
} EFI_LOADED_IMAGE; |
#endif |
return EFI_SUCCESS; |
} |
/tags/0.3.0/boot/arch/ia64/loader/gefi/apps/t4.c |
---|
0,0 → 1,13 |
#include <efi.h> |
#include <efilib.h> |
EFI_STATUS |
efi_main (EFI_HANDLE *image, EFI_SYSTEM_TABLE *systab) |
{ |
UINTN index; |
systab->ConOut->OutputString(systab->ConOut, L"Hello application started\r\n"); |
systab->ConOut->OutputString(systab->ConOut, L"\r\n\r\n\r\nHit any key to exit\r\n"); |
systab->BootServices->WaitForEvent(1, &systab->ConIn->WaitForKey, &index); |
return EFI_SUCCESS; |
} |
/tags/0.3.0/boot/arch/ia64/loader/gefi/apps/t5.c |
---|
0,0 → 1,13 |
#include <efi.h> |
#include <efilib.h> |
EFI_STATUS |
efi_main (EFI_HANDLE image, EFI_SYSTEM_TABLE *systab) |
{ |
InitializeLib(image, systab); |
Print(L"HelloLib application started\n"); |
Print(L"\n\n\nHit any key to exit this image\n"); |
WaitForSingleEvent(ST->ConIn->WaitForKey, 0); |
ST->ConOut->OutputString(ST->ConOut, L"\n\n"); |
return EFI_SUCCESS; |
} |
/tags/0.3.0/boot/arch/ia64/loader/gefi/apps/t6.c |
---|
0,0 → 1,39 |
#include <efi.h> |
#include <efilib.h> |
typedef EFI_STATUS (*foo_t)(EFI_HANDLE, EFI_GUID *, VOID **); |
typedef struct { |
unsigned long addr; |
unsigned long gp; |
} fdesc_t; |
EFI_LOADED_IMAGE my_loaded; |
EFI_STATUS |
efi_main (EFI_HANDLE image, EFI_SYSTEM_TABLE *systab) |
{ |
EFI_LOADED_IMAGE *loaded_image = NULL; |
#if 0 |
EFI_DEVICE_PATH *dev_path; |
#endif |
EFI_STATUS status; |
InitializeLib(image, systab); |
status = systab->BootServices->HandleProtocol(image, &LoadedImageProtocol, (void **) &loaded_image); |
if (EFI_ERROR(status)) { |
Print(L"handleprotocol: %r\n", status); |
} |
#if 0 |
BS->HandleProtocol(loaded_image->DeviceHandle, &DevicePathProtocol, (void **) &dev_path); |
Print(L"Image device : %s\n", DevicePathToStr(dev_path)); |
Print(L"Image file : %s\n", DevicePathToStr(loaded_image->FilePath)); |
#endif |
Print(L"Image base : %lx\n", loaded_image->ImageBase); |
Print(L"Image size : %lx\n", loaded_image->ImageSize); |
Print(L"Load options size : %lx\n", loaded_image->LoadOptionsSize); |
Print(L"Load options : %s\n", loaded_image->LoadOptions); |
return EFI_SUCCESS; |
} |
/tags/0.3.0/boot/arch/ia64/loader/gefi/apps/t7.c |
---|
0,0 → 1,25 |
#include <efi.h> |
#include <efilib.h> |
EFI_STATUS |
efi_main (EFI_HANDLE image, EFI_SYSTEM_TABLE *systab) |
{ |
EFI_INPUT_KEY efi_input_key; |
EFI_STATUS efi_status; |
InitializeLib(image, systab); |
Print(L"HelloLib application started\n"); |
Print(L"\n\n\nHit any key to exit this image\n"); |
WaitForSingleEvent(ST->ConIn->WaitForKey, 0); |
ST->ConOut->OutputString(ST->ConOut, L"\n\n"); |
efi_status = ST->ConIn->ReadKeyStroke(ST->ConIn, &efi_input_key); |
Print(L"ScanCode: %xh UnicodeChar: %xh\n", |
efi_input_key.ScanCode, efi_input_key.UnicodeChar); |
return EFI_SUCCESS; |
} |
/tags/0.3.0/boot/arch/ia64/loader/gefi/apps/trivial.S |
---|
0,0 → 1,43 |
.text |
.align 4 |
.globl _start |
_start: |
#if 0 |
pushl %ebp |
movl %esp,%ebp |
pushl %ebx # save ebx |
movl 12(%ebp),%eax # eax <- systab |
movl 24(%eax),%ebx # ebx <- systab->FirmwareVendor |
pushl %ebx |
movl 44(%eax),%ebx # ebx <- systab->ConOut |
pushl %ebx |
movl 4(%ebx),%eax # eax <- conout->OutputString |
call *%eax |
movl -4(%ebp),%ebx # restore ebx |
leave |
ret |
#else |
pushl %ebp |
movl %esp,%ebp |
pushl %ebx |
call 0f |
0: popl %eax |
addl $hello-0b,%eax |
pushl %eax |
movl 12(%ebp),%eax # eax <- systab |
movl 44(%eax),%ebx # ebx <- systab->ConOut |
pushl %ebx |
movl 4(%ebx),%eax # eax <- conout->OutputString |
call *%eax |
movl -4(%ebp),%ebx |
leave |
ret |
.section .rodata |
.align 2 |
hello: .byte 'h',0,'e',0,'l',0,'l',0,'o',0,'\n',0,'\r',0,0,0 |
#endif |
/tags/0.3.0/boot/arch/ia64/loader/gefi/apps/Makefile |
---|
0,0 → 1,44 |
# |
# Copyright (C) 1999-2001 Hewlett-Packard Co. |
# Contributed by David Mosberger <davidm@hpl.hp.com> |
# Contributed by Stephane Eranian <eranian@hpl.hp.com> |
# |
# This file is part of the gnu-efi package. |
# |
# GNU-EFI is free software; you can redistribute it and/or modify |
# it under the terms of the GNU General Public License as published by |
# the Free Software Foundation; either version 2, or (at your option) |
# any later version. |
# |
# GNU-EFI is distributed in the hope that it will be useful, |
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
# GNU General Public License for more details. |
# |
# You should have received a copy of the GNU General Public License |
# along with GNU-EFI; see the file COPYING. If not, write to the Free |
# Software Foundation, 59 Temple Place - Suite 330, Boston, MA |
# 02111-1307, USA. |
# |
include ../Make.defaults |
CDIR=$(TOPDIR)/.. |
LINUX_HEADERS = /usr/src/sys/build |
CPPFLAGS += -D__KERNEL__ -I$(LINUX_HEADERS)/include |
CRTOBJS = ../gnuefi/crt0-efi-$(ARCH).o |
LDSCRIPT = ../gnuefi/elf_$(ARCH)_efi.lds |
LDFLAGS += -T $(LDSCRIPT) -shared -Bsymbolic -L../lib -L../gnuefi $(CRTOBJS) |
LOADLIBES = -lefi -lgnuefi $(shell $(CC) -print-libgcc-file-name) |
FORMAT = efi-app-$(ARCH) |
TARGETS = t.efi t2.efi t3.efi t4.efi t5.efi t6.efi printenv.efi t7.efi |
all: $(TARGETS) |
clean: |
rm -f $(TARGETS) *~ *.o *.so |
.PHONY: install |
include ../Make.rules |
/tags/0.3.0/boot/arch/ia64/loader/gefi/Make.rules |
---|
0,0 → 1,33 |
# |
# Copyright (C) 1999-2001 Hewlett-Packard Co. |
# Contributed by David Mosberger <davidm@hpl.hp.com> |
# Contributed by Stephane Eranian <eranian@hpl.hp.com> |
# |
# This file is part of the gnu-efi package. |
# |
# GNU-EFI is free software; you can redistribute it and/or modify |
# it under the terms of the GNU General Public License as published by |
# the Free Software Foundation; either version 2, or (at your option) |
# any later version. |
# |
# GNU-EFI is distributed in the hope that it will be useful, |
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
# GNU General Public License for more details. |
# |
# You should have received a copy of the GNU General Public License |
# along with GNU-EFI; see the file COPYING. If not, write to the Free |
# Software Foundation, 59 Temple Place - Suite 330, Boston, MA |
# 02111-1307, USA. |
# |
%.efi: %.so |
$(OBJCOPY) -j .text -j .sdata -j .data -j .dynamic -j .dynsym -j .rel \ |
-j .rela -j .reloc --target=$(FORMAT) $*.so $@ |
%.so: %.o |
$(LD) $(LDFLAGS) $^ -o $@ $(LOADLIBES) |
%.o: %.c |
$(CC) $(INCDIR) $(CFLAGS) $(CPPFLAGS) -c $< -o $@ |
/tags/0.3.0/boot/arch/ia64/loader/gefi/README.efilib |
---|
0,0 → 1,30 |
The files in the "lib" and "inc" subdirectories are using the EFI Application |
Toolkit distributed by Intel at http://developer.intel.com/technology/efi |
This code is covered by the following agreement: |
Copyright (c) 1998-2000 Intel Corporation |
Redistribution and use in source and binary forms, with or without modification, are permitted |
provided that the following conditions are met: |
Redistributions of source code must retain the above copyright notice, this list of conditions and |
the following disclaimer. |
Redistributions in binary form must reproduce the above copyright notice, this list of conditions |
and the following disclaimer in the documentation and/or other materials provided with the |
distribution. |
THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, |
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND |
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL BE |
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
POSSIBILITY OF SUCH DAMAGE. THE EFI SPECIFICATION AND ALL OTHER INFORMATION |
ON THIS WEB SITE ARE PROVIDED "AS IS" WITH NO WARRANTIES, AND ARE SUBJECT |
TO CHANGE WITHOUT NOTICE. |
/tags/0.3.0/boot/arch/ia64/loader/gefi/lib/sread.c |
---|
0,0 → 1,352 |
/*++ |
Copyright (c) 1998 Intel Corporation |
Module Name: |
sread.c |
Abstract: |
Simple read file access |
Revision History |
--*/ |
#include "lib.h" |
#define SIMPLE_READ_SIGNATURE EFI_SIGNATURE_32('s','r','d','r') |
typedef struct _SIMPLE_READ_FILE { |
UINTN Signature; |
BOOLEAN FreeBuffer; |
VOID *Source; |
UINTN SourceSize; |
EFI_FILE_HANDLE FileHandle; |
} SIMPLE_READ_HANDLE; |
EFI_STATUS |
OpenSimpleReadFile ( |
IN BOOLEAN BootPolicy, |
IN VOID *SourceBuffer OPTIONAL, |
IN UINTN SourceSize, |
IN OUT EFI_DEVICE_PATH **FilePath, |
OUT EFI_HANDLE *DeviceHandle, |
OUT SIMPLE_READ_FILE *SimpleReadHandle |
) |
/*++ |
Routine Description: |
Opens a file for (simple) reading. The simple read abstraction |
will access the file either from a memory copy, from a file |
system interface, or from the load file interface. |
Arguments: |
Returns: |
A handle to access the file |
--*/ |
{ |
SIMPLE_READ_HANDLE *FHand; |
EFI_DEVICE_PATH *UserFilePath; |
EFI_DEVICE_PATH *TempFilePath; |
EFI_DEVICE_PATH *TempFilePathPtr; |
FILEPATH_DEVICE_PATH *FilePathNode; |
EFI_FILE_HANDLE FileHandle, LastHandle; |
EFI_STATUS Status; |
EFI_LOAD_FILE_INTERFACE *LoadFile; |
FHand = NULL; |
UserFilePath = *FilePath; |
// |
// Allocate a new simple read handle structure |
// |
FHand = AllocateZeroPool (sizeof(SIMPLE_READ_HANDLE)); |
if (!FHand) { |
Status = EFI_OUT_OF_RESOURCES; |
goto Done; |
} |
*SimpleReadHandle = (SIMPLE_READ_FILE) FHand; |
FHand->Signature = SIMPLE_READ_SIGNATURE; |
// |
// If the caller passed a copy of the file, then just use it |
// |
if (SourceBuffer) { |
FHand->Source = SourceBuffer; |
FHand->SourceSize = SourceSize; |
*DeviceHandle = NULL; |
Status = EFI_SUCCESS; |
goto Done; |
} |
// |
// Attempt to access the file via a file system interface |
// |
FileHandle = NULL; |
Status = BS->LocateDevicePath (&FileSystemProtocol, FilePath, DeviceHandle); |
if (!EFI_ERROR(Status)) { |
FileHandle = LibOpenRoot (*DeviceHandle); |
} |
Status = FileHandle ? EFI_SUCCESS : EFI_UNSUPPORTED; |
// |
// To access as a filesystem, the filepath should only |
// contain filepath components. Follow the filepath nodes |
// and find the target file |
// |
FilePathNode = (FILEPATH_DEVICE_PATH *) *FilePath; |
while (!IsDevicePathEnd(&FilePathNode->Header)) { |
// |
// For filesystem access each node should be a filepath component |
// |
if (DevicePathType(&FilePathNode->Header) != MEDIA_DEVICE_PATH || |
DevicePathSubType(&FilePathNode->Header) != MEDIA_FILEPATH_DP) { |
Status = EFI_UNSUPPORTED; |
} |
// |
// If there's been an error, stop |
// |
if (EFI_ERROR(Status)) { |
break; |
} |
// |
// Open this file path node |
// |
LastHandle = FileHandle; |
FileHandle = NULL; |
Status = LastHandle->Open ( |
LastHandle, |
&FileHandle, |
FilePathNode->PathName, |
EFI_FILE_MODE_READ, |
0 |
); |
// |
// Close the last node |
// |
LastHandle->Close (LastHandle); |
// |
// Get the next node |
// |
FilePathNode = (FILEPATH_DEVICE_PATH *) NextDevicePathNode(&FilePathNode->Header); |
} |
// |
// If success, return the FHand |
// |
if (!EFI_ERROR(Status)) { |
ASSERT(FileHandle); |
FHand->FileHandle = FileHandle; |
goto Done; |
} |
// |
// Cleanup from filesystem access |
// |
if (FileHandle) { |
FileHandle->Close (FileHandle); |
FileHandle = NULL; |
*FilePath = UserFilePath; |
} |
// |
// If the error is something other then unsupported, return it |
// |
if (Status != EFI_UNSUPPORTED) { |
goto Done; |
} |
// |
// Attempt to access the file via the load file protocol |
// |
Status = LibDevicePathToInterface (&LoadFileProtocol, *FilePath, (VOID*)&LoadFile); |
if (!EFI_ERROR(Status)) { |
TempFilePath = DuplicateDevicePath (*FilePath); |
TempFilePathPtr = TempFilePath; |
Status = BS->LocateDevicePath (&LoadFileProtocol, &TempFilePath, DeviceHandle); |
FreePool (TempFilePathPtr); |
// |
// Determine the size of buffer needed to hold the file |
// |
SourceSize = 0; |
Status = LoadFile->LoadFile ( |
LoadFile, |
*FilePath, |
BootPolicy, |
&SourceSize, |
NULL |
); |
// |
// We expect a buffer too small error to inform us |
// of the buffer size needed |
// |
if (Status == EFI_BUFFER_TOO_SMALL) { |
SourceBuffer = AllocatePool (SourceSize); |
if (SourceBuffer) { |
FHand->FreeBuffer = TRUE; |
FHand->Source = SourceBuffer; |
FHand->SourceSize = SourceSize; |
Status = LoadFile->LoadFile ( |
LoadFile, |
*FilePath, |
BootPolicy, |
&SourceSize, |
SourceBuffer |
); |
} |
} |
// |
// If success, return FHand |
// |
if (!EFI_ERROR(Status) || Status == EFI_ALREADY_STARTED) { |
goto Done; |
} |
} |
// |
// Nothing else to try |
// |
DEBUG ((D_LOAD|D_WARN, "OpenSimpleReadFile: Device did not support a known load protocol\n")); |
Status = EFI_UNSUPPORTED; |
Done: |
// |
// If the file was not accessed, clean up |
// |
if (EFI_ERROR(Status) && (Status != EFI_ALREADY_STARTED)) { |
if (FHand) { |
if (FHand->FreeBuffer) { |
FreePool (FHand->Source); |
} |
FreePool (FHand); |
} |
} |
return Status; |
} |
EFI_STATUS |
ReadSimpleReadFile ( |
IN SIMPLE_READ_FILE UserHandle, |
IN UINTN Offset, |
IN OUT UINTN *ReadSize, |
OUT VOID *Buffer |
) |
{ |
UINTN EndPos; |
SIMPLE_READ_HANDLE *FHand; |
EFI_STATUS Status; |
FHand = UserHandle; |
ASSERT (FHand->Signature == SIMPLE_READ_SIGNATURE); |
if (FHand->Source) { |
// |
// Move data from our local copy of the file |
// |
EndPos = Offset + *ReadSize; |
if (EndPos > FHand->SourceSize) { |
*ReadSize = FHand->SourceSize - Offset; |
if (Offset >= FHand->SourceSize) { |
*ReadSize = 0; |
} |
} |
CopyMem (Buffer, (CHAR8 *) FHand->Source + Offset, *ReadSize); |
Status = EFI_SUCCESS; |
} else { |
// |
// Read data from the file |
// |
Status = FHand->FileHandle->SetPosition (FHand->FileHandle, Offset); |
if (!EFI_ERROR(Status)) { |
Status = FHand->FileHandle->Read (FHand->FileHandle, ReadSize, Buffer); |
} |
} |
return Status; |
} |
VOID |
CloseSimpleReadFile ( |
IN SIMPLE_READ_FILE UserHandle |
) |
{ |
SIMPLE_READ_HANDLE *FHand; |
FHand = UserHandle; |
ASSERT (FHand->Signature == SIMPLE_READ_SIGNATURE); |
// |
// Free any file handle we opened |
// |
if (FHand->FileHandle) { |
FHand->FileHandle->Close (FHand->FileHandle); |
} |
// |
// If we allocated the Source buffer, free it |
// |
if (FHand->FreeBuffer) { |
FreePool (FHand->Source); |
} |
// |
// Done with this simple read file handle |
// |
FreePool (FHand); |
} |
/tags/0.3.0/boot/arch/ia64/loader/gefi/lib/dpath.c |
---|
0,0 → 1,1035 |
/*++ |
Copyright (c) 1998 Intel Corporation |
Module Name: |
dpath.c |
Abstract: |
MBR & Device Path functions |
Revision History |
--*/ |
#include "lib.h" |
#define ALIGN_SIZE(a) ((a % MIN_ALIGNMENT_SIZE) ? MIN_ALIGNMENT_SIZE - (a % MIN_ALIGNMENT_SIZE) : 0) |
EFI_DEVICE_PATH * |
DevicePathFromHandle ( |
IN EFI_HANDLE Handle |
) |
{ |
EFI_STATUS Status; |
EFI_DEVICE_PATH *DevicePath; |
Status = BS->HandleProtocol (Handle, &DevicePathProtocol, (VOID*)&DevicePath); |
if (EFI_ERROR(Status)) { |
DevicePath = NULL; |
} |
return DevicePath; |
} |
EFI_DEVICE_PATH * |
DevicePathInstance ( |
IN OUT EFI_DEVICE_PATH **DevicePath, |
OUT UINTN *Size |
) |
{ |
EFI_DEVICE_PATH *Start, *Next, *DevPath; |
UINTN Count; |
DevPath = *DevicePath; |
Start = DevPath; |
if (!DevPath) { |
return NULL; |
} |
// |
// Check for end of device path type |
// |
for (Count = 0; ; Count++) { |
Next = NextDevicePathNode(DevPath); |
if (IsDevicePathEndType(DevPath)) { |
break; |
} |
if (Count > 01000) { |
// |
// BugBug: Debug code to catch bogus device paths |
// |
DEBUG((D_ERROR, "DevicePathInstance: DevicePath %x Size %d", *DevicePath, ((UINT8 *) DevPath) - ((UINT8 *) Start) )); |
DumpHex (0, 0, ((UINT8 *) DevPath) - ((UINT8 *) Start), Start); |
break; |
} |
DevPath = Next; |
} |
ASSERT (DevicePathSubType(DevPath) == END_ENTIRE_DEVICE_PATH_SUBTYPE || |
DevicePathSubType(DevPath) == END_INSTANCE_DEVICE_PATH_SUBTYPE); |
// |
// Set next position |
// |
if (DevicePathSubType(DevPath) == END_ENTIRE_DEVICE_PATH_SUBTYPE) { |
Next = NULL; |
} |
*DevicePath = Next; |
// |
// Return size and start of device path instance |
// |
*Size = ((UINT8 *) DevPath) - ((UINT8 *) Start); |
return Start; |
} |
UINTN |
DevicePathInstanceCount ( |
IN EFI_DEVICE_PATH *DevicePath |
) |
{ |
UINTN Count, Size; |
Count = 0; |
while (DevicePathInstance(&DevicePath, &Size)) { |
Count += 1; |
} |
return Count; |
} |
EFI_DEVICE_PATH * |
AppendDevicePath ( |
IN EFI_DEVICE_PATH *Src1, |
IN EFI_DEVICE_PATH *Src2 |
) |
// Src1 may have multiple "instances" and each instance is appended |
// Src2 is appended to each instance is Src1. (E.g., it's possible |
// to append a new instance to the complete device path by passing |
// it in Src2) |
{ |
UINTN Src1Size, Src1Inst, Src2Size, Size; |
EFI_DEVICE_PATH *Dst, *Inst; |
UINT8 *DstPos; |
// |
// If there's only 1 path, just duplicate it |
// |
if (!Src1) { |
ASSERT (!IsDevicePathUnpacked (Src2)); |
return DuplicateDevicePath (Src2); |
} |
if (!Src2) { |
ASSERT (!IsDevicePathUnpacked (Src1)); |
return DuplicateDevicePath (Src1); |
} |
// |
// Verify we're not working with unpacked paths |
// |
// ASSERT (!IsDevicePathUnpacked (Src1)); |
// ASSERT (!IsDevicePathUnpacked (Src2)); |
// |
// Append Src2 to every instance in Src1 |
// |
Src1Size = DevicePathSize(Src1); |
Src1Inst = DevicePathInstanceCount(Src1); |
Src2Size = DevicePathSize(Src2); |
Size = Src1Size * Src1Inst + Src2Size; |
Dst = AllocatePool (Size); |
if (Dst) { |
DstPos = (UINT8 *) Dst; |
// |
// Copy all device path instances |
// |
while ((Inst = DevicePathInstance (&Src1, &Size))) { |
CopyMem(DstPos, Inst, Size); |
DstPos += Size; |
CopyMem(DstPos, Src2, Src2Size); |
DstPos += Src2Size; |
CopyMem(DstPos, EndInstanceDevicePath, sizeof(EFI_DEVICE_PATH)); |
DstPos += sizeof(EFI_DEVICE_PATH); |
} |
// Change last end marker |
DstPos -= sizeof(EFI_DEVICE_PATH); |
CopyMem(DstPos, EndDevicePath, sizeof(EFI_DEVICE_PATH)); |
} |
return Dst; |
} |
EFI_DEVICE_PATH * |
AppendDevicePathNode ( |
IN EFI_DEVICE_PATH *Src1, |
IN EFI_DEVICE_PATH *Src2 |
) |
// Src1 may have multiple "instances" and each instance is appended |
// Src2 is a signal device path node (without a terminator) that is |
// appended to each instance is Src1. |
{ |
EFI_DEVICE_PATH *Temp, *Eop; |
UINTN Length; |
// |
// Build a Src2 that has a terminator on it |
// |
Length = DevicePathNodeLength(Src2); |
Temp = AllocatePool (Length + sizeof(EFI_DEVICE_PATH)); |
if (!Temp) { |
return NULL; |
} |
CopyMem (Temp, Src2, Length); |
Eop = NextDevicePathNode(Temp); |
SetDevicePathEndNode(Eop); |
// |
// Append device paths |
// |
Src1 = AppendDevicePath (Src1, Temp); |
FreePool (Temp); |
return Src1; |
} |
EFI_DEVICE_PATH * |
FileDevicePath ( |
IN EFI_HANDLE Device OPTIONAL, |
IN CHAR16 *FileName |
) |
/*++ |
N.B. Results are allocated from pool. The caller must FreePool |
the resulting device path structure |
--*/ |
{ |
UINTN Size; |
FILEPATH_DEVICE_PATH *FilePath; |
EFI_DEVICE_PATH *Eop, *DevicePath; |
Size = StrSize(FileName); |
FilePath = AllocateZeroPool (Size + SIZE_OF_FILEPATH_DEVICE_PATH + sizeof(EFI_DEVICE_PATH)); |
DevicePath = NULL; |
if (FilePath) { |
// |
// Build a file path |
// |
FilePath->Header.Type = MEDIA_DEVICE_PATH; |
FilePath->Header.SubType = MEDIA_FILEPATH_DP; |
SetDevicePathNodeLength (&FilePath->Header, Size + SIZE_OF_FILEPATH_DEVICE_PATH); |
CopyMem (FilePath->PathName, FileName, Size); |
Eop = NextDevicePathNode(&FilePath->Header); |
SetDevicePathEndNode(Eop); |
// |
// Append file path to device's device path |
// |
DevicePath = (EFI_DEVICE_PATH *) FilePath; |
if (Device) { |
DevicePath = AppendDevicePath ( |
DevicePathFromHandle(Device), |
DevicePath |
); |
FreePool(FilePath); |
} |
} |
return DevicePath; |
} |
UINTN |
DevicePathSize ( |
IN EFI_DEVICE_PATH *DevPath |
) |
{ |
EFI_DEVICE_PATH *Start; |
// |
// Search for the end of the device path structure |
// |
Start = DevPath; |
while (!IsDevicePathEnd(DevPath)) { |
DevPath = NextDevicePathNode(DevPath); |
} |
// |
// Compute the size |
// |
return ((UINTN) DevPath - (UINTN) Start) + sizeof(EFI_DEVICE_PATH); |
} |
EFI_DEVICE_PATH * |
DuplicateDevicePath ( |
IN EFI_DEVICE_PATH *DevPath |
) |
{ |
EFI_DEVICE_PATH *NewDevPath; |
UINTN Size; |
// |
// Compute the size |
// |
Size = DevicePathSize (DevPath); |
// |
// Make a copy |
// |
NewDevPath = AllocatePool (Size); |
if (NewDevPath) { |
CopyMem (NewDevPath, DevPath, Size); |
} |
return NewDevPath; |
} |
EFI_DEVICE_PATH * |
UnpackDevicePath ( |
IN EFI_DEVICE_PATH *DevPath |
) |
{ |
EFI_DEVICE_PATH *Src, *Dest, *NewPath; |
UINTN Size; |
// |
// Walk device path and round sizes to valid boundries |
// |
Src = DevPath; |
Size = 0; |
for (; ;) { |
Size += DevicePathNodeLength(Src); |
Size += ALIGN_SIZE(Size); |
if (IsDevicePathEnd(Src)) { |
break; |
} |
Src = NextDevicePathNode(Src); |
} |
// |
// Allocate space for the unpacked path |
// |
NewPath = AllocateZeroPool (Size); |
if (NewPath) { |
ASSERT (((UINTN)NewPath) % MIN_ALIGNMENT_SIZE == 0); |
// |
// Copy each node |
// |
Src = DevPath; |
Dest = NewPath; |
for (; ;) { |
Size = DevicePathNodeLength(Src); |
CopyMem (Dest, Src, Size); |
Size += ALIGN_SIZE(Size); |
SetDevicePathNodeLength (Dest, Size); |
Dest->Type |= EFI_DP_TYPE_UNPACKED; |
Dest = (EFI_DEVICE_PATH *) (((UINT8 *) Dest) + Size); |
if (IsDevicePathEnd(Src)) { |
break; |
} |
Src = NextDevicePathNode(Src); |
} |
} |
return NewPath; |
} |
EFI_DEVICE_PATH* |
AppendDevicePathInstance ( |
IN EFI_DEVICE_PATH *Src, |
IN EFI_DEVICE_PATH *Instance |
) |
{ |
UINT8 *Ptr; |
EFI_DEVICE_PATH *DevPath; |
UINTN SrcSize; |
UINTN InstanceSize; |
if (Src == NULL) { |
return DuplicateDevicePath (Instance); |
} |
SrcSize = DevicePathSize(Src); |
InstanceSize = DevicePathSize(Instance); |
Ptr = AllocatePool (SrcSize + InstanceSize); |
DevPath = (EFI_DEVICE_PATH *)Ptr; |
ASSERT(DevPath); |
CopyMem (Ptr, Src, SrcSize); |
// FreePool (Src); |
while (!IsDevicePathEnd(DevPath)) { |
DevPath = NextDevicePathNode(DevPath); |
} |
// |
// Convert the End to an End Instance, since we are |
// appending another instacne after this one its a good |
// idea. |
// |
DevPath->SubType = END_INSTANCE_DEVICE_PATH_SUBTYPE; |
DevPath = NextDevicePathNode(DevPath); |
CopyMem (DevPath, Instance, InstanceSize); |
return (EFI_DEVICE_PATH *)Ptr; |
} |
EFI_STATUS |
LibDevicePathToInterface ( |
IN EFI_GUID *Protocol, |
IN EFI_DEVICE_PATH *FilePath, |
OUT VOID **Interface |
) |
{ |
EFI_STATUS Status; |
EFI_HANDLE Device; |
Status = BS->LocateDevicePath (Protocol, &FilePath, &Device); |
if (!EFI_ERROR(Status)) { |
// If we didn't get a direct match return not found |
Status = EFI_NOT_FOUND; |
if (IsDevicePathEnd(FilePath)) { |
// |
// It was a direct match, lookup the protocol interface |
// |
Status = BS->HandleProtocol (Device, Protocol, Interface); |
} |
} |
// |
// If there was an error, do not return an interface |
// |
if (EFI_ERROR(Status)) { |
*Interface = NULL; |
} |
return Status; |
} |
VOID |
_DevPathPci ( |
IN OUT POOL_PRINT *Str, |
IN VOID *DevPath |
) |
{ |
PCI_DEVICE_PATH *Pci; |
Pci = DevPath; |
CatPrint(Str, L"Pci(%x|%x)", Pci->Device, Pci->Function); |
} |
VOID |
_DevPathPccard ( |
IN OUT POOL_PRINT *Str, |
IN VOID *DevPath |
) |
{ |
PCCARD_DEVICE_PATH *Pccard; |
Pccard = DevPath; |
CatPrint(Str, L"Pccard(Socket%x)", Pccard->SocketNumber); |
} |
VOID |
_DevPathMemMap ( |
IN OUT POOL_PRINT *Str, |
IN VOID *DevPath |
) |
{ |
MEMMAP_DEVICE_PATH *MemMap; |
MemMap = DevPath; |
CatPrint(Str, L"MemMap(%d:%x-%x)", |
MemMap->MemoryType, |
MemMap->StartingAddress, |
MemMap->EndingAddress |
); |
} |
VOID |
_DevPathController ( |
IN OUT POOL_PRINT *Str, |
IN VOID *DevPath |
) |
{ |
CONTROLLER_DEVICE_PATH *Controller; |
Controller = DevPath; |
CatPrint(Str, L"Ctrl(%d)", |
Controller->Controller |
); |
} |
VOID |
_DevPathVendor ( |
IN OUT POOL_PRINT *Str, |
IN VOID *DevPath |
) |
{ |
VENDOR_DEVICE_PATH *Vendor; |
CHAR16 *Type; |
UNKNOWN_DEVICE_VENDOR_DEVICE_PATH *UnknownDevPath; |
Vendor = DevPath; |
switch (DevicePathType(&Vendor->Header)) { |
case HARDWARE_DEVICE_PATH: Type = L"Hw"; break; |
case MESSAGING_DEVICE_PATH: Type = L"Msg"; break; |
case MEDIA_DEVICE_PATH: Type = L"Media"; break; |
default: Type = L"?"; break; |
} |
CatPrint(Str, L"Ven%s(%g", Type, &Vendor->Guid); |
if (CompareGuid (&Vendor->Guid, &UnknownDevice) == 0) { |
// |
// GUID used by EFI to enumerate an EDD 1.1 device |
// |
UnknownDevPath = (UNKNOWN_DEVICE_VENDOR_DEVICE_PATH *)Vendor; |
CatPrint(Str, L":%02x)", UnknownDevPath->LegacyDriveLetter); |
} else { |
CatPrint(Str, L")"); |
} |
} |
VOID |
_DevPathAcpi ( |
IN OUT POOL_PRINT *Str, |
IN VOID *DevPath |
) |
{ |
ACPI_HID_DEVICE_PATH *Acpi; |
Acpi = DevPath; |
if ((Acpi->HID & PNP_EISA_ID_MASK) == PNP_EISA_ID_CONST) { |
CatPrint(Str, L"Acpi(PNP%04x,%x)", EISA_ID_TO_NUM (Acpi->HID), Acpi->UID); |
} else { |
CatPrint(Str, L"Acpi(%08x,%x)", Acpi->HID, Acpi->UID); |
} |
} |
VOID |
_DevPathAtapi ( |
IN OUT POOL_PRINT *Str, |
IN VOID *DevPath |
) |
{ |
ATAPI_DEVICE_PATH *Atapi; |
Atapi = DevPath; |
CatPrint(Str, L"Ata(%s,%s)", |
Atapi->PrimarySecondary ? L"Secondary" : L"Primary", |
Atapi->SlaveMaster ? L"Slave" : L"Master" |
); |
} |
VOID |
_DevPathScsi ( |
IN OUT POOL_PRINT *Str, |
IN VOID *DevPath |
) |
{ |
SCSI_DEVICE_PATH *Scsi; |
Scsi = DevPath; |
CatPrint(Str, L"Scsi(Pun%x,Lun%x)", Scsi->Pun, Scsi->Lun); |
} |
VOID |
_DevPathFibre ( |
IN OUT POOL_PRINT *Str, |
IN VOID *DevPath |
) |
{ |
FIBRECHANNEL_DEVICE_PATH *Fibre; |
Fibre = DevPath; |
CatPrint(Str, L"Fibre(%lx)", Fibre->WWN); |
} |
VOID |
_DevPath1394 ( |
IN OUT POOL_PRINT *Str, |
IN VOID *DevPath |
) |
{ |
F1394_DEVICE_PATH *F1394; |
F1394 = DevPath; |
CatPrint(Str, L"1394(%g)", &F1394->Guid); |
} |
VOID |
_DevPathUsb ( |
IN OUT POOL_PRINT *Str, |
IN VOID *DevPath |
) |
{ |
USB_DEVICE_PATH *Usb; |
Usb = DevPath; |
CatPrint(Str, L"Usb(%x)", Usb->Port); |
} |
VOID |
_DevPathI2O ( |
IN OUT POOL_PRINT *Str, |
IN VOID *DevPath |
) |
{ |
I2O_DEVICE_PATH *I2O; |
I2O = DevPath; |
CatPrint(Str, L"I2O(%x)", I2O->Tid); |
} |
VOID |
_DevPathMacAddr ( |
IN OUT POOL_PRINT *Str, |
IN VOID *DevPath |
) |
{ |
MAC_ADDR_DEVICE_PATH *MAC; |
UINTN HwAddressSize; |
UINTN Index; |
MAC = DevPath; |
HwAddressSize = sizeof(EFI_MAC_ADDRESS); |
if (MAC->IfType == 0x01 || MAC->IfType == 0x00) { |
HwAddressSize = 6; |
} |
CatPrint(Str, L"Mac("); |
for(Index = 0; Index < HwAddressSize; Index++) { |
CatPrint(Str, L"%02x",MAC->MacAddress.Addr[Index]); |
} |
CatPrint(Str, L")"); |
} |
VOID |
_DevPathIPv4 ( |
IN OUT POOL_PRINT *Str, |
IN VOID *DevPath |
) |
{ |
IPv4_DEVICE_PATH *IP; |
IP = DevPath; |
CatPrint(Str, L"IPv4(not-done)"); |
} |
VOID |
_DevPathIPv6 ( |
IN OUT POOL_PRINT *Str, |
IN VOID *DevPath |
) |
{ |
IPv6_DEVICE_PATH *IP; |
IP = DevPath; |
CatPrint(Str, L"IP-v6(not-done)"); |
} |
VOID |
_DevPathInfiniBand ( |
IN OUT POOL_PRINT *Str, |
IN VOID *DevPath |
) |
{ |
INFINIBAND_DEVICE_PATH *InfiniBand; |
InfiniBand = DevPath; |
CatPrint(Str, L"InfiniBand(not-done)"); |
} |
VOID |
_DevPathUart ( |
IN OUT POOL_PRINT *Str, |
IN VOID *DevPath |
) |
{ |
UART_DEVICE_PATH *Uart; |
CHAR8 Parity; |
Uart = DevPath; |
switch (Uart->Parity) { |
case 0 : Parity = 'D'; break; |
case 1 : Parity = 'N'; break; |
case 2 : Parity = 'E'; break; |
case 3 : Parity = 'O'; break; |
case 4 : Parity = 'M'; break; |
case 5 : Parity = 'S'; break; |
default : Parity = 'x'; break; |
} |
if (Uart->BaudRate == 0) { |
CatPrint(Str, L"Uart(DEFAULT %c",Uart->BaudRate,Parity); |
} else { |
CatPrint(Str, L"Uart(%d %c",Uart->BaudRate,Parity); |
} |
if (Uart->DataBits == 0) { |
CatPrint(Str, L"D"); |
} else { |
CatPrint(Str, L"%d",Uart->DataBits); |
} |
switch (Uart->StopBits) { |
case 0 : CatPrint(Str, L"D)"); break; |
case 1 : CatPrint(Str, L"1)"); break; |
case 2 : CatPrint(Str, L"1.5)"); break; |
case 3 : CatPrint(Str, L"2)"); break; |
default : CatPrint(Str, L"x)"); break; |
} |
} |
VOID |
_DevPathHardDrive ( |
IN OUT POOL_PRINT *Str, |
IN VOID *DevPath |
) |
{ |
HARDDRIVE_DEVICE_PATH *Hd; |
Hd = DevPath; |
switch (Hd->SignatureType) { |
case SIGNATURE_TYPE_MBR: |
CatPrint(Str, L"HD(Part%d,Sig%08X)", |
Hd->PartitionNumber, |
*((UINT32 *)(&(Hd->Signature[0]))) |
); |
break; |
case SIGNATURE_TYPE_GUID: |
CatPrint(Str, L"HD(Part%d,Sig%g)", |
Hd->PartitionNumber, |
(EFI_GUID *) &(Hd->Signature[0]) |
); |
break; |
default: |
CatPrint(Str, L"HD(Part%d,MBRType=%02x,SigType=%02x)", |
Hd->PartitionNumber, |
Hd->MBRType, |
Hd->SignatureType |
); |
break; |
} |
} |
VOID |
_DevPathCDROM ( |
IN OUT POOL_PRINT *Str, |
IN VOID *DevPath |
) |
{ |
CDROM_DEVICE_PATH *Cd; |
Cd = DevPath; |
CatPrint(Str, L"CDROM(Entry%x)", Cd->BootEntry); |
} |
VOID |
_DevPathFilePath ( |
IN OUT POOL_PRINT *Str, |
IN VOID *DevPath |
) |
{ |
FILEPATH_DEVICE_PATH *Fp; |
Fp = DevPath; |
CatPrint(Str, L"%s", Fp->PathName); |
} |
VOID |
_DevPathMediaProtocol ( |
IN OUT POOL_PRINT *Str, |
IN VOID *DevPath |
) |
{ |
MEDIA_PROTOCOL_DEVICE_PATH *MediaProt; |
MediaProt = DevPath; |
CatPrint(Str, L"%g", &MediaProt->Protocol); |
} |
VOID |
_DevPathBssBss ( |
IN OUT POOL_PRINT *Str, |
IN VOID *DevPath |
) |
{ |
BBS_BBS_DEVICE_PATH *Bss; |
CHAR16 *Type; |
Bss = DevPath; |
switch (Bss->DeviceType) { |
case BBS_TYPE_FLOPPY: Type = L"Floppy"; break; |
case BBS_TYPE_HARDDRIVE: Type = L"Harddrive"; break; |
case BBS_TYPE_CDROM: Type = L"CDROM"; break; |
case BBS_TYPE_PCMCIA: Type = L"PCMCIA"; break; |
case BBS_TYPE_USB: Type = L"Usb"; break; |
case BBS_TYPE_EMBEDDED_NETWORK: Type = L"Net"; break; |
default: Type = L"?"; break; |
} |
CatPrint(Str, L"Bss-%s(%a)", Type, Bss->String); |
} |
VOID |
_DevPathEndInstance ( |
IN OUT POOL_PRINT *Str, |
IN VOID *DevPath |
) |
{ |
CatPrint(Str, L","); |
} |
VOID |
_DevPathNodeUnknown ( |
IN OUT POOL_PRINT *Str, |
IN VOID *DevPath |
) |
{ |
CatPrint(Str, L"?"); |
} |
struct { |
UINT8 Type; |
UINT8 SubType; |
VOID (*Function)(POOL_PRINT *, VOID *); |
} DevPathTable[] = { |
{ HARDWARE_DEVICE_PATH, HW_PCI_DP, _DevPathPci}, |
{ HARDWARE_DEVICE_PATH, HW_PCCARD_DP, _DevPathPccard}, |
{ HARDWARE_DEVICE_PATH, HW_MEMMAP_DP, _DevPathMemMap}, |
{ HARDWARE_DEVICE_PATH, HW_VENDOR_DP, _DevPathVendor}, |
{ HARDWARE_DEVICE_PATH, HW_CONTROLLER_DP, _DevPathController}, |
{ ACPI_DEVICE_PATH, ACPI_DP, _DevPathAcpi}, |
{ MESSAGING_DEVICE_PATH, MSG_ATAPI_DP, _DevPathAtapi}, |
{ MESSAGING_DEVICE_PATH, MSG_SCSI_DP, _DevPathScsi}, |
{ MESSAGING_DEVICE_PATH, MSG_FIBRECHANNEL_DP, _DevPathFibre}, |
{ MESSAGING_DEVICE_PATH, MSG_1394_DP, _DevPath1394}, |
{ MESSAGING_DEVICE_PATH, MSG_USB_DP, _DevPathUsb}, |
{ MESSAGING_DEVICE_PATH, MSG_I2O_DP, _DevPathI2O}, |
{ MESSAGING_DEVICE_PATH, MSG_MAC_ADDR_DP, _DevPathMacAddr}, |
{ MESSAGING_DEVICE_PATH, MSG_IPv4_DP, _DevPathIPv4}, |
{ MESSAGING_DEVICE_PATH, MSG_IPv6_DP, _DevPathIPv6}, |
{ MESSAGING_DEVICE_PATH, MSG_INFINIBAND_DP, _DevPathInfiniBand}, |
{ MESSAGING_DEVICE_PATH, MSG_UART_DP, _DevPathUart}, |
{ MESSAGING_DEVICE_PATH, MSG_VENDOR_DP, _DevPathVendor}, |
{ MEDIA_DEVICE_PATH, MEDIA_HARDDRIVE_DP, _DevPathHardDrive}, |
{ MEDIA_DEVICE_PATH, MEDIA_CDROM_DP, _DevPathCDROM}, |
{ MEDIA_DEVICE_PATH, MEDIA_VENDOR_DP, _DevPathVendor}, |
{ MEDIA_DEVICE_PATH, MEDIA_FILEPATH_DP, _DevPathFilePath}, |
{ MEDIA_DEVICE_PATH, MEDIA_PROTOCOL_DP, _DevPathMediaProtocol}, |
{ BBS_DEVICE_PATH, BBS_BBS_DP, _DevPathBssBss}, |
{ END_DEVICE_PATH_TYPE, END_INSTANCE_DEVICE_PATH_SUBTYPE, _DevPathEndInstance}, |
{ 0, 0, NULL} |
}; |
CHAR16 * |
DevicePathToStr ( |
EFI_DEVICE_PATH *DevPath |
) |
/*++ |
Turns the Device Path into a printable string. Allcoates |
the string from pool. The caller must FreePool the returned |
string. |
--*/ |
{ |
POOL_PRINT Str; |
EFI_DEVICE_PATH *DevPathNode; |
VOID (*DumpNode)(POOL_PRINT *, VOID *); |
UINTN Index, NewSize; |
ZeroMem(&Str, sizeof(Str)); |
// |
// Unpacked the device path |
// |
DevPath = UnpackDevicePath(DevPath); |
ASSERT (DevPath); |
// |
// Process each device path node |
// |
DevPathNode = DevPath; |
while (!IsDevicePathEnd(DevPathNode)) { |
// |
// Find the handler to dump this device path node |
// |
DumpNode = NULL; |
for (Index = 0; DevPathTable[Index].Function; Index += 1) { |
if (DevicePathType(DevPathNode) == DevPathTable[Index].Type && |
DevicePathSubType(DevPathNode) == DevPathTable[Index].SubType) { |
DumpNode = DevPathTable[Index].Function; |
break; |
} |
} |
// |
// If not found, use a generic function |
// |
if (!DumpNode) { |
DumpNode = _DevPathNodeUnknown; |
} |
// |
// Put a path seperator in if needed |
// |
if (Str.len && DumpNode != _DevPathEndInstance) { |
CatPrint (&Str, L"/"); |
} |
// |
// Print this node of the device path |
// |
DumpNode (&Str, DevPathNode); |
// |
// Next device path node |
// |
DevPathNode = NextDevicePathNode(DevPathNode); |
} |
// |
// Shrink pool used for string allocation |
// |
FreePool (DevPath); |
NewSize = (Str.len + 1) * sizeof(CHAR16); |
Str.str = ReallocatePool (Str.str, NewSize, NewSize); |
Str.str[Str.len] = 0; |
return Str.str; |
} |
BOOLEAN |
LibMatchDevicePaths ( |
IN EFI_DEVICE_PATH *Multi, |
IN EFI_DEVICE_PATH *Single |
) |
{ |
EFI_DEVICE_PATH *DevicePath, *DevicePathInst; |
UINTN Size; |
if (!Multi || !Single) { |
return FALSE; |
} |
DevicePath = Multi; |
while ((DevicePathInst = DevicePathInstance (&DevicePath, &Size))) { |
if (CompareMem (Single, DevicePathInst, Size) == 0) { |
return TRUE; |
} |
} |
return FALSE; |
} |
EFI_DEVICE_PATH * |
LibDuplicateDevicePathInstance ( |
IN EFI_DEVICE_PATH *DevPath |
) |
{ |
EFI_DEVICE_PATH *NewDevPath,*DevicePathInst,*Temp; |
UINTN Size; |
// |
// get the size of an instance from the input |
// |
Temp = DevPath; |
DevicePathInst = DevicePathInstance (&Temp, &Size); |
// |
// Make a copy and set proper end type |
// |
NewDevPath = NULL; |
if (Size) { |
NewDevPath = AllocatePool (Size + sizeof(EFI_DEVICE_PATH)); |
} |
if (NewDevPath) { |
CopyMem (NewDevPath, DevicePathInst, Size); |
Temp = NextDevicePathNode(NewDevPath); |
SetDevicePathEndNode(Temp); |
} |
return NewDevPath; |
} |
/tags/0.3.0/boot/arch/ia64/loader/gefi/lib/console.c |
---|
0,0 → 1,104 |
/*++ |
Copyright (c) 1998 Intel Corporation |
Module Name: |
console.c |
Abstract: |
Revision History |
--*/ |
#include "lib.h" |
VOID |
Output ( |
IN CHAR16 *Str |
) |
// Write a string to the console at the current cursor location |
{ |
ST->ConOut->OutputString (ST->ConOut, Str); |
} |
VOID |
Input ( |
IN CHAR16 *Prompt OPTIONAL, |
OUT CHAR16 *InStr, |
IN UINTN StrLen |
) |
// Input a string at the current cursor location, for StrLen |
{ |
IInput ( |
ST->ConOut, |
ST->ConIn, |
Prompt, |
InStr, |
StrLen |
); |
} |
VOID |
IInput ( |
IN SIMPLE_TEXT_OUTPUT_INTERFACE *ConOut, |
IN SIMPLE_INPUT_INTERFACE *ConIn, |
IN CHAR16 *Prompt OPTIONAL, |
OUT CHAR16 *InStr, |
IN UINTN StrLen |
) |
// Input a string at the current cursor location, for StrLen |
{ |
EFI_INPUT_KEY Key; |
EFI_STATUS Status; |
UINTN Len; |
if (Prompt) { |
ConOut->OutputString (ConOut, Prompt); |
} |
Len = 0; |
for (; ;) { |
WaitForSingleEvent (ConIn->WaitForKey, 0); |
Status = ConIn->ReadKeyStroke(ConIn, &Key); |
if (EFI_ERROR(Status)) { |
DEBUG((D_ERROR, "Input: error return from ReadKey %x\n", Status)); |
break; |
} |
if (Key.UnicodeChar == '\n' || |
Key.UnicodeChar == '\r') { |
break; |
} |
if (Key.UnicodeChar == '\b') { |
if (Len) { |
ConOut->OutputString(ConOut, L"\b \b"); |
Len -= 1; |
} |
continue; |
} |
if (Key.UnicodeChar >= ' ') { |
if (Len < StrLen-1) { |
InStr[Len] = Key.UnicodeChar; |
InStr[Len+1] = 0; |
ConOut->OutputString(ConOut, &InStr[Len]); |
Len += 1; |
} |
continue; |
} |
} |
InStr[Len] = 0; |
} |
/tags/0.3.0/boot/arch/ia64/loader/gefi/lib/runtime/rtlock.c |
---|
0,0 → 1,98 |
/*++ |
Copyright (c) 1998 Intel Corporation |
Module Name: |
lock.c |
Abstract: |
Implements FLOCK |
Revision History |
--*/ |
#include "lib.h" |
#pragma RUNTIME_CODE(RtAcquireLock) |
VOID |
RtAcquireLock ( |
IN FLOCK *Lock |
) |
/*++ |
Routine Description: |
Raising to the task priority level of the mutual exclusion |
lock, and then acquires ownership of the lock. |
Arguments: |
Lock - The lock to acquire |
Returns: |
Lock owned |
--*/ |
{ |
if (BS) { |
if (BS->RaiseTPL != NULL) { |
Lock->OwnerTpl = BS->RaiseTPL(Lock->Tpl); |
} |
} |
else { |
if (LibRuntimeRaiseTPL != NULL) { |
Lock->OwnerTpl = LibRuntimeRaiseTPL(Lock->Tpl); |
} |
} |
Lock->Lock += 1; |
ASSERT (Lock->Lock == 1); |
} |
#pragma RUNTIME_CODE(RtAcquireLock) |
VOID |
RtReleaseLock ( |
IN FLOCK *Lock |
) |
/*++ |
Routine Description: |
Releases ownership of the mutual exclusion lock, and |
restores the previous task priority level. |
Arguments: |
Lock - The lock to release |
Returns: |
Lock unowned |
--*/ |
{ |
EFI_TPL Tpl; |
Tpl = Lock->OwnerTpl; |
ASSERT(Lock->Lock == 1); |
Lock->Lock -= 1; |
if (BS) { |
if (BS->RestoreTPL != NULL) { |
BS->RestoreTPL (Tpl); |
} |
} |
else { |
if (LibRuntimeRestoreTPL != NULL) { |
LibRuntimeRestoreTPL(Tpl); |
} |
} |
} |
/tags/0.3.0/boot/arch/ia64/loader/gefi/lib/runtime/rtstr.c |
---|
0,0 → 1,126 |
/*++ |
Copyright (c) 1998 Intel Corporation |
Module Name: |
str.c |
Abstract: |
String runtime functions |
Revision History |
--*/ |
#include "lib.h" |
#pragma RUNTIME_CODE(RtAcquireLock) |
INTN |
RUNTIMEFUNCTION |
RtStrCmp ( |
IN CHAR16 *s1, |
IN CHAR16 *s2 |
) |
// compare strings |
{ |
while (*s1) { |
if (*s1 != *s2) { |
break; |
} |
s1 += 1; |
s2 += 1; |
} |
return *s1 - *s2; |
} |
#pragma RUNTIME_CODE(RtStrCpy) |
VOID |
RUNTIMEFUNCTION |
RtStrCpy ( |
IN CHAR16 *Dest, |
IN CHAR16 *Src |
) |
// copy strings |
{ |
while (*Src) { |
*(Dest++) = *(Src++); |
} |
*Dest = 0; |
} |
#pragma RUNTIME_CODE(RtStrCat) |
VOID |
RUNTIMEFUNCTION |
RtStrCat ( |
IN CHAR16 *Dest, |
IN CHAR16 *Src |
) |
{ |
RtStrCpy(Dest+StrLen(Dest), Src); |
} |
#pragma RUNTIME_CODE(RtStrLen) |
UINTN |
RUNTIMEFUNCTION |
RtStrLen ( |
IN CHAR16 *s1 |
) |
// string length |
{ |
UINTN len; |
for (len=0; *s1; s1+=1, len+=1) ; |
return len; |
} |
#pragma RUNTIME_CODE(RtStrSize) |
UINTN |
RUNTIMEFUNCTION |
RtStrSize ( |
IN CHAR16 *s1 |
) |
// string size |
{ |
UINTN len; |
for (len=0; *s1; s1+=1, len+=1) ; |
return (len + 1) * sizeof(CHAR16); |
} |
#pragma RUNTIME_CODE(RtBCDtoDecimal) |
UINT8 |
RUNTIMEFUNCTION |
RtBCDtoDecimal( |
IN UINT8 BcdValue |
) |
{ |
UINTN High, Low; |
High = BcdValue >> 4; |
Low = BcdValue - (High << 4); |
return ((UINT8)(Low + (High * 10))); |
} |
#pragma RUNTIME_CODE(RtDecimaltoBCD) |
UINT8 |
RUNTIMEFUNCTION |
RtDecimaltoBCD ( |
IN UINT8 DecValue |
) |
{ |
UINTN High, Low; |
High = DecValue / 10; |
Low = DecValue - (High * 10); |
return ((UINT8)(Low + (High << 4))); |
} |
/tags/0.3.0/boot/arch/ia64/loader/gefi/lib/runtime/rtdata.c |
---|
0,0 → 1,63 |
/*++ |
Copyright (c) 1998 Intel Corporation |
Module Name: |
data.c |
Abstract: |
EFI library global data |
Revision History |
--*/ |
#include "lib.h" |
// |
// These globals are runtime globals |
// |
// N.B. The Microsoft C compiler will only put the data in the |
// right data section if it is explicitly initialized.. |
// |
#pragma BEGIN_RUNTIME_DATA() |
// |
// RT - pointer to the runtime table |
// |
EFI_RUNTIME_SERVICES *RT; |
// |
// LibStandalone - TRUE if lib is linked in as part of the firmware. |
// N.B. The EFI fw sets this value directly |
// |
BOOLEAN LibFwInstance; |
// |
// EFIDebug - Debug mask |
// |
UINTN EFIDebug = EFI_DBUG_MASK; |
// |
// LibRuntimeDebugOut - Runtime Debug Output device |
// |
SIMPLE_TEXT_OUTPUT_INTERFACE *LibRuntimeDebugOut; |
// |
// LibRuntimeRaiseTPL, LibRuntimeRestoreTPL - pointers to Runtime functions from the |
// Boot Services Table |
// |
EFI_RAISE_TPL LibRuntimeRaiseTPL = NULL; |
EFI_RESTORE_TPL LibRuntimeRestoreTPL = NULL; |
/tags/0.3.0/boot/arch/ia64/loader/gefi/lib/runtime/efirtlib.c |
---|
0,0 → 1,139 |
/*++ |
Copyright (c) 1999 Intel Corporation |
Module Name: |
EfiRtLib.h |
Abstract: |
EFI Runtime library functions |
Revision History |
--*/ |
#include "efi.h" |
#include "efilib.h" |
#include "efirtlib.h" |
#pragma RUNTIME_CODE(RtZeroMem) |
VOID |
RUNTIMEFUNCTION |
RtZeroMem ( |
IN VOID *Buffer, |
IN UINTN Size |
) |
{ |
INT8 *pt; |
pt = Buffer; |
while (Size--) { |
*(pt++) = 0; |
} |
} |
#pragma RUNTIME_CODE(RtSetMem) |
VOID |
RUNTIMEFUNCTION |
RtSetMem ( |
IN VOID *Buffer, |
IN UINTN Size, |
IN UINT8 Value |
) |
{ |
INT8 *pt; |
pt = Buffer; |
while (Size--) { |
*(pt++) = Value; |
} |
} |
#pragma RUNTIME_CODE(RtCopyMem) |
VOID |
RUNTIMEFUNCTION |
RtCopyMem ( |
IN VOID *Dest, |
IN VOID *Src, |
IN UINTN len |
) |
{ |
CHAR8 *d, *s; |
d = Dest; |
s = Src; |
while (len--) { |
*(d++) = *(s++); |
} |
} |
#pragma RUNTIME_CODE(RtCompareMem) |
INTN |
RUNTIMEFUNCTION |
RtCompareMem ( |
IN VOID *Dest, |
IN VOID *Src, |
IN UINTN len |
) |
{ |
CHAR8 *d, *s; |
d = Dest; |
s = Src; |
while (len--) { |
if (*d != *s) { |
return *d - *s; |
} |
d += 1; |
s += 1; |
} |
return 0; |
} |
#pragma RUNTIME_CODE(RtCompareGuid) |
INTN |
RUNTIMEFUNCTION |
RtCompareGuid ( |
IN EFI_GUID *Guid1, |
IN EFI_GUID *Guid2 |
) |
/*++ |
Routine Description: |
Compares to GUIDs |
Arguments: |
Guid1 - guid to compare |
Guid2 - guid to compare |
Returns: |
= 0 if Guid1 == Guid2 |
--*/ |
{ |
INT32 *g1, *g2, r; |
// |
// Compare 32 bits at a time |
// |
g1 = (INT32 *) Guid1; |
g2 = (INT32 *) Guid2; |
r = g1[0] - g2[0]; |
r |= g1[1] - g2[1]; |
r |= g1[2] - g2[2]; |
r |= g1[3] - g2[3]; |
return r; |
} |
/tags/0.3.0/boot/arch/ia64/loader/gefi/lib/runtime/vm.c |
---|
0,0 → 1,101 |
/*++ |
Copyright (c) 1998 Intel Corporation |
Module Name: |
vm.c |
Abstract: |
EFI Hell to remap runtime address into the new virual address space |
that was registered by the OS for RT calls. |
So the code image needs to be relocated. All pointers need to be |
manually fixed up since the address map changes. |
GOOD LUCK NOT HAVING BUGS IN YOUR CODE! PLEASE TEST A LOT. MAKE SURE |
EXIT BOOTSERVICES OVER WRITES ALL BOOTSERVICE MEMORY & DATA SPACES WHEN |
YOU TEST. |
Revision History |
--*/ |
#include "lib.h" |
#pragma RUNTIME_CODE(RtLibEnableVirtualMappings) |
VOID |
RUNTIMEFUNCTION |
RtLibEnableVirtualMappings ( |
VOID |
) |
{ |
EFI_CONVERT_POINTER ConvertPointer; |
// |
// If this copy of the lib is linked into the firmware, then |
// do not update the pointers yet. |
// |
if (!LibFwInstance) { |
// |
// Different components are updating to the new virtual |
// mappings at differnt times. The only function that |
// is safe to call at this notification is ConvertAddress |
// |
ConvertPointer = RT->ConvertPointer; |
// |
// Fix any pointers that the lib created, that may be needed |
// during runtime. |
// |
ConvertPointer (EFI_INTERNAL_PTR, (VOID **)&RT); |
ConvertPointer (EFI_OPTIONAL_PTR, (VOID **)&LibRuntimeDebugOut); |
ConvertPointer (EFI_INTERNAL_PTR, (VOID **)&LibRuntimeRaiseTPL); |
ConvertPointer (EFI_INTERNAL_PTR, (VOID **)&LibRuntimeRestoreTPL); |
// that was it :^) |
} |
} |
#pragma RUNTIME_CODE(RtConvertList) |
VOID |
RUNTIMEFUNCTION |
RtConvertList ( |
IN UINTN DebugDisposition, |
IN OUT LIST_ENTRY *ListHead |
) |
{ |
LIST_ENTRY *Link; |
LIST_ENTRY *NextLink; |
EFI_CONVERT_POINTER ConvertPointer; |
ConvertPointer = RT->ConvertPointer; |
// |
// Convert all the Flink & Blink pointers in the list |
// |
Link = ListHead; |
do { |
NextLink = Link->Flink; |
ConvertPointer ( |
Link->Flink == ListHead ? DebugDisposition : 0, |
(VOID **)&Link->Flink |
); |
ConvertPointer ( |
Link->Blink == ListHead ? DebugDisposition : 0, |
(VOID **)&Link->Blink |
); |
Link = NextLink; |
} while (Link != ListHead); |
} |
/tags/0.3.0/boot/arch/ia64/loader/gefi/lib/init.c |
---|
0,0 → 1,181 |
/*++ |
Copyright (c) 1998 Intel Corporation |
Module Name: |
Abstract: |
Revision History |
--*/ |
#include "lib.h" |
VOID |
EFIDebugVariable ( |
VOID |
); |
VOID |
InitializeLib ( |
IN EFI_HANDLE ImageHandle, |
IN EFI_SYSTEM_TABLE *SystemTable |
) |
/*++ |
Routine Description: |
Initializes EFI library for use |
Arguments: |
Firmware's EFI system table |
Returns: |
None |
--*/ |
{ |
EFI_LOADED_IMAGE *LoadedImage; |
EFI_STATUS Status; |
CHAR8 *LangCode; |
if (!LibInitialized) { |
LibInitialized = TRUE; |
LibFwInstance = FALSE; |
// |
// Set up global pointer to the system table, boot services table, |
// and runtime services table |
// |
ST = SystemTable; |
BS = SystemTable->BootServices; |
RT = SystemTable->RuntimeServices; |
// ASSERT (CheckCrc(0, &ST->Hdr)); |
// ASSERT (CheckCrc(0, &BS->Hdr)); |
// ASSERT (CheckCrc(0, &RT->Hdr)); |
// |
// Initialize pool allocation type |
// |
if (ImageHandle) { |
Status = BS->HandleProtocol ( |
ImageHandle, |
&LoadedImageProtocol, |
(VOID*)&LoadedImage |
); |
if (!EFI_ERROR(Status)) { |
PoolAllocationType = LoadedImage->ImageDataType; |
} |
EFIDebugVariable (); |
} |
// |
// Initialize Guid table |
// |
InitializeGuid(); |
InitializeLibPlatform(ImageHandle,SystemTable); |
} |
// |
// |
// |
if (ImageHandle && UnicodeInterface == &LibStubUnicodeInterface) { |
LangCode = LibGetVariable (VarLanguage, &EfiGlobalVariable); |
InitializeUnicodeSupport (LangCode); |
if (LangCode) { |
FreePool (LangCode); |
} |
} |
} |
VOID |
InitializeUnicodeSupport ( |
CHAR8 *LangCode |
) |
{ |
EFI_UNICODE_COLLATION_INTERFACE *Ui; |
EFI_STATUS Status; |
CHAR8 *Languages; |
UINTN Index, Position, Length; |
UINTN NoHandles; |
EFI_HANDLE *Handles; |
// |
// If we don't know it, lookup the current language code |
// |
LibLocateHandle (ByProtocol, &UnicodeCollationProtocol, NULL, &NoHandles, &Handles); |
if (!LangCode || !NoHandles) { |
goto Done; |
} |
// |
// Check all driver's for a matching language code |
// |
for (Index=0; Index < NoHandles; Index++) { |
Status = BS->HandleProtocol (Handles[Index], &UnicodeCollationProtocol, (VOID*)&Ui); |
if (EFI_ERROR(Status)) { |
continue; |
} |
// |
// Check for a matching language code |
// |
Languages = Ui->SupportedLanguages; |
Length = strlena(Languages); |
for (Position=0; Position < Length; Position += ISO_639_2_ENTRY_SIZE) { |
// |
// If this code matches, use this driver |
// |
if (CompareMem (Languages+Position, LangCode, ISO_639_2_ENTRY_SIZE) == 0) { |
UnicodeInterface = Ui; |
goto Done; |
} |
} |
} |
Done: |
// |
// Cleanup |
// |
if (Handles) { |
FreePool (Handles); |
} |
} |
VOID |
EFIDebugVariable ( |
VOID |
) |
{ |
EFI_STATUS Status; |
UINT32 Attributes; |
UINTN DataSize; |
UINTN NewEFIDebug; |
DataSize = sizeof(EFIDebug); |
Status = RT->GetVariable(L"EFIDebug", &EfiGlobalVariable, &Attributes, &DataSize, &NewEFIDebug); |
if (!EFI_ERROR(Status)) { |
EFIDebug = NewEFIDebug; |
} |
} |
/tags/0.3.0/boot/arch/ia64/loader/gefi/lib/boxdraw.c |
---|
0,0 → 1,173 |
/*++ |
Copyright (c) 1998 Intel Corporation |
Module Name: |
BoxDraw.c |
Abstract: |
Lib functions to support Box Draw Unicode code pages. |
Revision History |
--*/ |
#include "lib.h" |
typedef struct { |
CHAR16 Unicode; |
CHAR8 PcAnsi; |
CHAR8 Ascii; |
} UNICODE_TO_CHAR; |
// |
// This list is used to define the valid extend chars. |
// It also provides a mapping from Unicode to PCANSI or |
// ASCII. The ASCII mapping we just made up. |
// |
// |
STATIC UNICODE_TO_CHAR UnicodeToPcAnsiOrAscii[] = { |
{ BOXDRAW_HORIZONTAL, 0xc4, L'-'}, |
{ BOXDRAW_VERTICAL, 0xb3, L'|'}, |
{ BOXDRAW_DOWN_RIGHT, 0xda, L'/'}, |
{ BOXDRAW_DOWN_LEFT, 0xbf, L'\\'}, |
{ BOXDRAW_UP_RIGHT, 0xc0, L'\\'}, |
{ BOXDRAW_UP_LEFT, 0xd9, L'/'}, |
{ BOXDRAW_VERTICAL_RIGHT, 0xc3, L'|'}, |
{ BOXDRAW_VERTICAL_LEFT, 0xb4, L'|'}, |
{ BOXDRAW_DOWN_HORIZONTAL, 0xc2, L'+'}, |
{ BOXDRAW_UP_HORIZONTAL, 0xc1, L'+'}, |
{ BOXDRAW_VERTICAL_HORIZONTAL, 0xc5, L'+'}, |
{ BOXDRAW_DOUBLE_HORIZONTAL, 0xcd, L'-'}, |
{ BOXDRAW_DOUBLE_VERTICAL, 0xba, L'|'}, |
{ BOXDRAW_DOWN_RIGHT_DOUBLE, 0xd5, L'/'}, |
{ BOXDRAW_DOWN_DOUBLE_RIGHT, 0xd6, L'/'}, |
{ BOXDRAW_DOUBLE_DOWN_RIGHT, 0xc9, L'/'}, |
{ BOXDRAW_DOWN_LEFT_DOUBLE, 0xb8, L'\\'}, |
{ BOXDRAW_DOWN_DOUBLE_LEFT, 0xb7, L'\\'}, |
{ BOXDRAW_DOUBLE_DOWN_LEFT, 0xbb, L'\\'}, |
{ BOXDRAW_UP_RIGHT_DOUBLE, 0xd4, L'\\'}, |
{ BOXDRAW_UP_DOUBLE_RIGHT, 0xd3, L'\\'}, |
{ BOXDRAW_DOUBLE_UP_RIGHT, 0xc8, L'\\'}, |
{ BOXDRAW_UP_LEFT_DOUBLE, 0xbe, L'/'}, |
{ BOXDRAW_UP_DOUBLE_LEFT, 0xbd, L'/'}, |
{ BOXDRAW_DOUBLE_UP_LEFT, 0xbc, L'/'}, |
{ BOXDRAW_VERTICAL_RIGHT_DOUBLE, 0xc6, L'|'}, |
{ BOXDRAW_VERTICAL_DOUBLE_RIGHT, 0xc7, L'|'}, |
{ BOXDRAW_DOUBLE_VERTICAL_RIGHT, 0xcc, L'|'}, |
{ BOXDRAW_VERTICAL_LEFT_DOUBLE, 0xb5, L'|'}, |
{ BOXDRAW_VERTICAL_DOUBLE_LEFT, 0xb6, L'|'}, |
{ BOXDRAW_DOUBLE_VERTICAL_LEFT, 0xb9, L'|'}, |
{ BOXDRAW_DOWN_HORIZONTAL_DOUBLE, 0xd1, L'+'}, |
{ BOXDRAW_DOWN_DOUBLE_HORIZONTAL, 0xd2, L'+'}, |
{ BOXDRAW_DOUBLE_DOWN_HORIZONTAL, 0xcb, L'+'}, |
{ BOXDRAW_UP_HORIZONTAL_DOUBLE, 0xcf, L'+'}, |
{ BOXDRAW_UP_DOUBLE_HORIZONTAL, 0xd0, L'+'}, |
{ BOXDRAW_DOUBLE_UP_HORIZONTAL, 0xca, L'+'}, |
{ BOXDRAW_VERTICAL_HORIZONTAL_DOUBLE, 0xd8, L'+'}, |
{ BOXDRAW_VERTICAL_DOUBLE_HORIZONTAL, 0xd7, L'+'}, |
{ BOXDRAW_DOUBLE_VERTICAL_HORIZONTAL, 0xce, L'+'}, |
{ BLOCKELEMENT_FULL_BLOCK, 0xdb, L'*'}, |
{ BLOCKELEMENT_LIGHT_SHADE, 0xb0, L'+'}, |
{ GEOMETRICSHAPE_UP_TRIANGLE, 0x1e, L'^'}, |
{ GEOMETRICSHAPE_RIGHT_TRIANGLE, 0x10, L'>'}, |
{ GEOMETRICSHAPE_DOWN_TRIANGLE, 0x1f, L'v'}, |
{ GEOMETRICSHAPE_LEFT_TRIANGLE, 0x11, L'<'}, |
/* BugBug: Left Arrow is an ESC. We can not make it print |
on a PCANSI terminal. If we can make left arrow |
come out on PC ANSI we can add it back. |
{ ARROW_LEFT, 0x1b, L'<'}, |
*/ |
{ ARROW_UP, 0x18, L'^'}, |
/* BugBut: Took out left arrow so right has to go too. |
{ ARROW_RIGHT, 0x1a, L'>'}, |
*/ |
{ ARROW_DOWN, 0x19, L'v'}, |
{ 0x0000, 0x00 } |
}; |
BOOLEAN |
LibIsValidTextGraphics ( |
IN CHAR16 Graphic, |
OUT CHAR8 *PcAnsi, OPTIONAL |
OUT CHAR8 *Ascii OPTIONAL |
) |
/*++ |
Routine Description: |
Detects if a Unicode char is for Box Drawing text graphics. |
Arguments: |
Grphic - Unicode char to test. |
PcAnsi - Optional pointer to return PCANSI equivalent of Graphic. |
Asci - Optional pointer to return Ascii equivalent of Graphic. |
Returns: |
TRUE if Gpaphic is a supported Unicode Box Drawing character. |
--*/{ |
UNICODE_TO_CHAR *Table; |
if ((((Graphic & 0xff00) != 0x2500) && ((Graphic & 0xff00) != 0x2100))) { |
// |
// Unicode drawing code charts are all in the 0x25xx range, |
// arrows are 0x21xx |
// |
return FALSE; |
} |
for (Table = UnicodeToPcAnsiOrAscii; Table->Unicode != 0x0000; Table++) { |
if (Graphic == Table->Unicode) { |
if (PcAnsi) { |
*PcAnsi = Table->PcAnsi; |
} |
if (Ascii) { |
*Ascii = Table->Ascii; |
} |
return TRUE; |
} |
} |
return FALSE; |
} |
BOOLEAN |
IsValidAscii ( |
IN CHAR16 Ascii |
) |
{ |
if ((Ascii >= 0x20) && (Ascii <= 0x7f)) { |
return TRUE; |
} |
return FALSE; |
} |
BOOLEAN |
IsValidEfiCntlChar ( |
IN CHAR16 c |
) |
{ |
if (c == CHAR_NULL || c == CHAR_BACKSPACE || c == CHAR_LINEFEED || c == CHAR_CARRIAGE_RETURN) { |
return TRUE; |
} |
return FALSE; |
} |
/tags/0.3.0/boot/arch/ia64/loader/gefi/lib/crc.c |
---|
0,0 → 1,218 |
/*++ |
Copyright (c) 1998 Intel Corporation |
Module Name: |
crc.c |
Abstract: |
CRC32 functions |
Revision History |
--*/ |
#include "lib.h" |
UINT32 CRCTable[256] = { |
0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, |
0xE963A535, 0x9E6495A3, 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, |
0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, 0x1DB71064, 0x6AB020F2, |
0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, |
0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, |
0xFA0F3D63, 0x8D080DF5, 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, |
0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, 0x35B5A8FA, 0x42B2986C, |
0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, |
0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, |
0xCFBA9599, 0xB8BDA50F, 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, |
0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, 0x76DC4190, 0x01DB7106, |
0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, |
0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, |
0x91646C97, 0xE6635C01, 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, |
0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, 0x65B0D9C6, 0x12B7E950, |
0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, |
0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, |
0xA4D1C46D, 0xD3D6F4FB, 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, |
0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, 0x5005713C, 0x270241AA, |
0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, |
0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, |
0xB7BD5C3B, 0xC0BA6CAD, 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, |
0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, 0xE3630B12, 0x94643B84, |
0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, |
0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, |
0x196C3671, 0x6E6B06E7, 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, |
0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, 0xD6D6A3E8, 0xA1D1937E, |
0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, |
0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, |
0x316E8EEF, 0x4669BE79, 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, |
0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, 0xC5BA3BBE, 0xB2BD0B28, |
0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, |
0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F, |
0x72076785, 0x05005713, 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, |
0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, 0x86D3D2D4, 0xF1D4E242, |
0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, |
0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, |
0x616BFFD3, 0x166CCF45, 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, |
0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, 0xAED16A4A, 0xD9D65ADC, |
0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, |
0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, |
0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, |
0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D |
}; |
VOID |
SetCrc ( |
IN OUT EFI_TABLE_HEADER *Hdr |
) |
/*++ |
Routine Description: |
Updates the CRC32 value in the table header |
Arguments: |
Hdr - The table to update |
Returns: |
None |
--*/ |
{ |
SetCrcAltSize (Hdr->HeaderSize, Hdr); |
} |
VOID |
SetCrcAltSize ( |
IN UINTN Size, |
IN OUT EFI_TABLE_HEADER *Hdr |
) |
/*++ |
Routine Description: |
Updates the CRC32 value in the table header |
Arguments: |
Hdr - The table to update |
Returns: |
None |
--*/ |
{ |
Hdr->CRC32 = 0; |
Hdr->CRC32 = CalculateCrc((UINT8 *)Hdr, Size); |
} |
BOOLEAN |
CheckCrc ( |
IN UINTN MaxSize, |
IN OUT EFI_TABLE_HEADER *Hdr |
) |
/*++ |
Routine Description: |
Checks the CRC32 value in the table header |
Arguments: |
Hdr - The table to check |
Returns: |
TRUE if the CRC is OK in the table |
--*/ |
{ |
return CheckCrcAltSize (MaxSize, Hdr->HeaderSize, Hdr); |
} |
BOOLEAN |
CheckCrcAltSize ( |
IN UINTN MaxSize, |
IN UINTN Size, |
IN OUT EFI_TABLE_HEADER *Hdr |
) |
/*++ |
Routine Description: |
Checks the CRC32 value in the table header |
Arguments: |
Hdr - The table to check |
Returns: |
TRUE if the CRC is OK in the table |
--*/ |
{ |
UINT32 Crc; |
UINT32 OrgCrc; |
BOOLEAN f; |
if (Size == 0) { |
// |
// If header size is 0 CRC will pass so return FALSE here |
// |
return FALSE; |
} |
if (MaxSize && Size > MaxSize) { |
DEBUG((D_ERROR, "CheckCrc32: Size > MaxSize\n")); |
return FALSE; |
} |
// clear old crc from header |
OrgCrc = Hdr->CRC32; |
Hdr->CRC32 = 0; |
Crc = CalculateCrc((UINT8 *)Hdr, Size); |
// set restults |
Hdr->CRC32 = OrgCrc; |
// return status |
f = OrgCrc == (UINT32) Crc; |
if (!f) { |
DEBUG((D_ERROR, "CheckCrc32: Crc check failed\n")); |
} |
return f; |
} |
UINT32 |
CalculateCrc ( |
UINT8 *pt, |
UINTN Size |
) |
{ |
UINTN Crc; |
// compute crc |
Crc = 0xffffffff; |
while (Size) { |
Crc = (Crc >> 8) ^ CRCTable[(UINT8) Crc ^ *pt]; |
pt += 1; |
Size -= 1; |
} |
Crc = Crc ^ 0xffffffff; |
return (UINT32)Crc; |
} |
/tags/0.3.0/boot/arch/ia64/loader/gefi/lib/str.c |
---|
0,0 → 1,370 |
/*++ |
Copyright (c) 1998 Intel Corporation |
Module Name: |
str.c |
Abstract: |
Revision History |
--*/ |
#include "lib.h" |
INTN |
StrCmp ( |
IN CHAR16 *s1, |
IN CHAR16 *s2 |
) |
// compare strings |
{ |
return RtStrCmp(s1, s2); |
} |
INTN |
StrnCmp ( |
IN CHAR16 *s1, |
IN CHAR16 *s2, |
IN UINTN len |
) |
// compare strings |
{ |
while (*s1 && len) { |
if (*s1 != *s2) { |
break; |
} |
s1 += 1; |
s2 += 1; |
len -= 1; |
} |
return len ? *s1 - *s2 : 0; |
} |
INTN |
LibStubStriCmp ( |
IN EFI_UNICODE_COLLATION_INTERFACE *This, |
IN CHAR16 *s1, |
IN CHAR16 *s2 |
) |
{ |
return StrCmp (s1, s2); |
} |
VOID |
LibStubStrLwrUpr ( |
IN EFI_UNICODE_COLLATION_INTERFACE *This, |
IN CHAR16 *Str |
) |
{ |
} |
INTN |
StriCmp ( |
IN CHAR16 *s1, |
IN CHAR16 *s2 |
) |
// compare strings |
{ |
return UnicodeInterface->StriColl(UnicodeInterface, s1, s2); |
} |
VOID |
StrLwr ( |
IN CHAR16 *Str |
) |
// lwoer case string |
{ |
UnicodeInterface->StrLwr(UnicodeInterface, Str); |
} |
VOID |
StrUpr ( |
IN CHAR16 *Str |
) |
// upper case string |
{ |
UnicodeInterface->StrUpr(UnicodeInterface, Str); |
} |
VOID |
StrCpy ( |
IN CHAR16 *Dest, |
IN CHAR16 *Src |
) |
// copy strings |
{ |
RtStrCpy (Dest, Src); |
} |
VOID |
StrCat ( |
IN CHAR16 *Dest, |
IN CHAR16 *Src |
) |
{ |
RtStrCat(Dest, Src); |
} |
UINTN |
StrLen ( |
IN CHAR16 *s1 |
) |
// string length |
{ |
return RtStrLen(s1); |
} |
UINTN |
StrSize ( |
IN CHAR16 *s1 |
) |
// string size |
{ |
return RtStrSize(s1); |
} |
CHAR16 * |
StrDuplicate ( |
IN CHAR16 *Src |
) |
// duplicate a string |
{ |
CHAR16 *Dest; |
UINTN Size; |
Size = StrSize(Src); |
Dest = AllocatePool (Size); |
if (Dest) { |
CopyMem (Dest, Src, Size); |
} |
return Dest; |
} |
UINTN |
strlena ( |
IN CHAR8 *s1 |
) |
// string length |
{ |
UINTN len; |
for (len=0; *s1; s1+=1, len+=1) ; |
return len; |
} |
UINTN |
strcmpa ( |
IN CHAR8 *s1, |
IN CHAR8 *s2 |
) |
// compare strings |
{ |
while (*s1) { |
if (*s1 != *s2) { |
break; |
} |
s1 += 1; |
s2 += 1; |
} |
return *s1 - *s2; |
} |
UINTN |
strncmpa ( |
IN CHAR8 *s1, |
IN CHAR8 *s2, |
IN UINTN len |
) |
// compare strings |
{ |
while (*s1 && len) { |
if (*s1 != *s2) { |
break; |
} |
s1 += 1; |
s2 += 1; |
len -= 1; |
} |
return len ? *s1 - *s2 : 0; |
} |
UINTN |
xtoi ( |
CHAR16 *str |
) |
// convert hex string to uint |
{ |
UINTN u; |
CHAR16 c; |
// skip preceeding white space |
while (*str && *str == ' ') { |
str += 1; |
} |
// convert hex digits |
u = 0; |
while ((c = *(str++))) { |
if (c >= 'a' && c <= 'f') { |
c -= 'a' - 'A'; |
} |
if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'F')) { |
u = (u << 4) | (c - (c >= 'A' ? 'A'-10 : '0')); |
} else { |
break; |
} |
} |
return u; |
} |
UINTN |
Atoi ( |
CHAR16 *str |
) |
// convert hex string to uint |
{ |
UINTN u; |
CHAR16 c; |
// skip preceeding white space |
while (*str && *str == ' ') { |
str += 1; |
} |
// convert digits |
u = 0; |
while ((c = *(str++))) { |
if (c >= '0' && c <= '9') { |
u = (u * 10) + c - '0'; |
} else { |
break; |
} |
} |
return u; |
} |
BOOLEAN |
MetaMatch ( |
IN CHAR16 *String, |
IN CHAR16 *Pattern |
) |
{ |
CHAR16 c, p, l; |
for (; ;) { |
p = *Pattern; |
Pattern += 1; |
switch (p) { |
case 0: |
// End of pattern. If end of string, TRUE match |
return *String ? FALSE : TRUE; |
case '*': |
// Match zero or more chars |
while (*String) { |
if (MetaMatch (String, Pattern)) { |
return TRUE; |
} |
String += 1; |
} |
return MetaMatch (String, Pattern); |
case '?': |
// Match any one char |
if (!*String) { |
return FALSE; |
} |
String += 1; |
break; |
case '[': |
// Match char set |
c = *String; |
if (!c) { |
return FALSE; // syntax problem |
} |
l = 0; |
while ((p = *Pattern++)) { |
if (p == ']') { |
return FALSE; |
} |
if (p == '-') { // if range of chars, |
p = *Pattern; // get high range |
if (p == 0 || p == ']') { |
return FALSE; // syntax problem |
} |
if (c >= l && c <= p) { // if in range, |
break; // it's a match |
} |
} |
l = p; |
if (c == p) { // if char matches |
break; // move on |
} |
} |
// skip to end of match char set |
while (p && p != ']') { |
p = *Pattern; |
Pattern += 1; |
} |
String += 1; |
break; |
default: |
c = *String; |
if (c != p) { |
return FALSE; |
} |
String += 1; |
break; |
} |
} |
} |
BOOLEAN |
LibStubMetaiMatch ( |
IN EFI_UNICODE_COLLATION_INTERFACE *This, |
IN CHAR16 *String, |
IN CHAR16 *Pattern |
) |
{ |
return MetaMatch (String, Pattern); |
} |
BOOLEAN |
MetaiMatch ( |
IN CHAR16 *String, |
IN CHAR16 *Pattern |
) |
{ |
return UnicodeInterface->MetaiMatch(UnicodeInterface, String, Pattern); |
} |
/tags/0.3.0/boot/arch/ia64/loader/gefi/lib/data.c |
---|
0,0 → 1,154 |
/*++ |
Copyright (c) 1998 Intel Corporation |
Module Name: |
data.c |
Abstract: |
EFI library global data |
Revision History |
--*/ |
#include "lib.h" |
// |
// LibInitialized - TRUE once InitializeLib() is called for the first time |
// |
BOOLEAN LibInitialized = FALSE; |
// |
// ST - pointer to the EFI system table |
// |
EFI_SYSTEM_TABLE *ST; |
// |
// BS - pointer to the boot services table |
// |
EFI_BOOT_SERVICES *BS; |
// |
// Default pool allocation type |
// |
EFI_MEMORY_TYPE PoolAllocationType = EfiBootServicesData; |
// |
// Unicode collation functions that are in use |
// |
EFI_UNICODE_COLLATION_INTERFACE LibStubUnicodeInterface = { |
LibStubStriCmp, |
LibStubMetaiMatch, |
LibStubStrLwrUpr, |
LibStubStrLwrUpr, |
NULL, // FatToStr |
NULL, // StrToFat |
NULL // SupportedLanguages |
}; |
EFI_UNICODE_COLLATION_INTERFACE *UnicodeInterface = &LibStubUnicodeInterface; |
// |
// Root device path |
// |
EFI_DEVICE_PATH RootDevicePath[] = { |
{END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE, {END_DEVICE_PATH_LENGTH,0}} |
}; |
EFI_DEVICE_PATH EndDevicePath[] = { |
{END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE, {END_DEVICE_PATH_LENGTH, 0}} |
}; |
EFI_DEVICE_PATH EndInstanceDevicePath[] = { |
{END_DEVICE_PATH_TYPE, END_INSTANCE_DEVICE_PATH_SUBTYPE, {END_DEVICE_PATH_LENGTH, 0}} |
}; |
// |
// EFI IDs |
// |
EFI_GUID EfiGlobalVariable = EFI_GLOBAL_VARIABLE; |
EFI_GUID NullGuid = { 0,0,0,{0,0,0,0,0,0,0,0} }; |
// |
// Protocol IDs |
// |
EFI_GUID DevicePathProtocol = DEVICE_PATH_PROTOCOL; |
EFI_GUID LoadedImageProtocol = LOADED_IMAGE_PROTOCOL; |
EFI_GUID TextInProtocol = SIMPLE_TEXT_INPUT_PROTOCOL; |
EFI_GUID TextOutProtocol = SIMPLE_TEXT_OUTPUT_PROTOCOL; |
EFI_GUID BlockIoProtocol = BLOCK_IO_PROTOCOL; |
EFI_GUID DiskIoProtocol = DISK_IO_PROTOCOL; |
EFI_GUID FileSystemProtocol = SIMPLE_FILE_SYSTEM_PROTOCOL; |
EFI_GUID LoadFileProtocol = LOAD_FILE_PROTOCOL; |
EFI_GUID DeviceIoProtocol = DEVICE_IO_PROTOCOL; |
EFI_GUID UnicodeCollationProtocol = UNICODE_COLLATION_PROTOCOL; |
EFI_GUID SerialIoProtocol = SERIAL_IO_PROTOCOL; |
EFI_GUID SimpleNetworkProtocol = EFI_SIMPLE_NETWORK_PROTOCOL; |
EFI_GUID PxeBaseCodeProtocol = EFI_PXE_BASE_CODE_PROTOCOL; |
EFI_GUID PxeCallbackProtocol = EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL; |
EFI_GUID NetworkInterfaceIdentifierProtocol = EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL; |
EFI_GUID UiProtocol = EFI_UI_PROTOCOL; |
// |
// File system information IDs |
// |
EFI_GUID GenericFileInfo = EFI_FILE_INFO_ID; |
EFI_GUID FileSystemInfo = EFI_FILE_SYSTEM_INFO_ID; |
EFI_GUID FileSystemVolumeLabelInfo = EFI_FILE_SYSTEM_VOLUME_LABEL_INFO_ID; |
// |
// Reference implementation public protocol IDs |
// |
EFI_GUID InternalShellProtocol = INTERNAL_SHELL_GUID; |
EFI_GUID VariableStoreProtocol = VARIABLE_STORE_PROTOCOL; |
EFI_GUID LegacyBootProtocol = LEGACY_BOOT_PROTOCOL; |
EFI_GUID VgaClassProtocol = VGA_CLASS_DRIVER_PROTOCOL; |
EFI_GUID TextOutSpliterProtocol = TEXT_OUT_SPLITER_PROTOCOL; |
EFI_GUID ErrorOutSpliterProtocol = ERROR_OUT_SPLITER_PROTOCOL; |
EFI_GUID TextInSpliterProtocol = TEXT_IN_SPLITER_PROTOCOL; |
EFI_GUID AdapterDebugProtocol = ADAPTER_DEBUG_PROTOCOL; |
// |
// Device path media protocol IDs |
// |
EFI_GUID PcAnsiProtocol = DEVICE_PATH_MESSAGING_PC_ANSI; |
EFI_GUID Vt100Protocol = DEVICE_PATH_MESSAGING_VT_100; |
// |
// EFI GPT Partition Type GUIDs |
// |
EFI_GUID EfiPartTypeSystemPartitionGuid = EFI_PART_TYPE_EFI_SYSTEM_PART_GUID; |
EFI_GUID EfiPartTypeLegacyMbrGuid = EFI_PART_TYPE_LEGACY_MBR_GUID; |
// |
// Reference implementation Vendor Device Path Guids |
// |
EFI_GUID UnknownDevice = UNKNOWN_DEVICE_GUID; |
// |
// Configuration Table GUIDs |
// |
EFI_GUID MpsTableGuid = MPS_TABLE_GUID; |
EFI_GUID AcpiTableGuid = ACPI_TABLE_GUID; |
EFI_GUID SMBIOSTableGuid = SMBIOS_TABLE_GUID; |
EFI_GUID SalSystemTableGuid = SAL_SYSTEM_TABLE_GUID; |
/tags/0.3.0/boot/arch/ia64/loader/gefi/lib/hand.c |
---|
0,0 → 1,620 |
/*++ |
Copyright (c) 1998 Intel Corporation |
Module Name: |
hand.c |
Abstract: |
Revision History |
--*/ |
#include "lib.h" |
#include "efistdarg.h" // !!! |
EFI_STATUS |
LibLocateProtocol ( |
IN EFI_GUID *ProtocolGuid, |
OUT VOID **Interface |
) |
// |
// Find the first instance of this Protocol in the system and return it's interface |
// |
{ |
EFI_STATUS Status; |
UINTN NumberHandles, Index; |
EFI_HANDLE *Handles; |
*Interface = NULL; |
Status = LibLocateHandle (ByProtocol, ProtocolGuid, NULL, &NumberHandles, &Handles); |
if (EFI_ERROR(Status)) { |
DEBUG((D_INFO, "LibLocateProtocol: Handle not found\n")); |
return Status; |
} |
for (Index=0; Index < NumberHandles; Index++) { |
Status = BS->HandleProtocol (Handles[Index], ProtocolGuid, Interface); |
if (!EFI_ERROR(Status)) { |
break; |
} |
} |
if (Handles) { |
FreePool (Handles); |
} |
return Status; |
} |
EFI_STATUS |
LibLocateHandle ( |
IN EFI_LOCATE_SEARCH_TYPE SearchType, |
IN EFI_GUID *Protocol OPTIONAL, |
IN VOID *SearchKey OPTIONAL, |
IN OUT UINTN *NoHandles, |
OUT EFI_HANDLE **Buffer |
) |
{ |
EFI_STATUS Status; |
UINTN BufferSize; |
// |
// Initialize for GrowBuffer loop |
// |
Status = EFI_SUCCESS; |
*Buffer = NULL; |
BufferSize = 50 * sizeof(EFI_HANDLE); |
// |
// Call the real function |
// |
while (GrowBuffer (&Status, (VOID **) Buffer, BufferSize)) { |
Status = BS->LocateHandle ( |
SearchType, |
Protocol, |
SearchKey, |
&BufferSize, |
*Buffer |
); |
} |
*NoHandles = BufferSize / sizeof (EFI_HANDLE); |
if (EFI_ERROR(Status)) { |
*NoHandles = 0; |
} |
return Status; |
} |
EFI_STATUS |
LibLocateHandleByDiskSignature ( |
IN UINT8 MBRType, |
IN UINT8 SignatureType, |
IN VOID *Signature, |
IN OUT UINTN *NoHandles, |
OUT EFI_HANDLE **Buffer |
) |
{ |
EFI_STATUS Status; |
UINTN BufferSize; |
UINTN NoBlockIoHandles; |
EFI_HANDLE *BlockIoBuffer; |
EFI_DEVICE_PATH *DevicePath; |
UINTN Index; |
EFI_DEVICE_PATH *Start, *Next, *DevPath; |
HARDDRIVE_DEVICE_PATH *HardDriveDevicePath; |
BOOLEAN Match; |
BOOLEAN PreviousNodeIsHardDriveDevicePath; |
// |
// Initialize for GrowBuffer loop |
// |
BlockIoBuffer = NULL; |
BufferSize = 50 * sizeof(EFI_HANDLE); |
// |
// Call the real function |
// |
while (GrowBuffer (&Status, (VOID **)&BlockIoBuffer, BufferSize)) { |
// |
// Get list of device handles that support the BLOCK_IO Protocol. |
// |
Status = BS->LocateHandle ( |
ByProtocol, |
&BlockIoProtocol, |
NULL, |
&BufferSize, |
BlockIoBuffer |
); |
} |
NoBlockIoHandles = BufferSize / sizeof (EFI_HANDLE); |
if (EFI_ERROR(Status)) { |
NoBlockIoHandles = 0; |
} |
// |
// If there was an error or there are no device handles that support |
// the BLOCK_IO Protocol, then return. |
// |
if (NoBlockIoHandles == 0) { |
FreePool(BlockIoBuffer); |
*NoHandles = 0; |
*Buffer = NULL; |
return Status; |
} |
// |
// Loop through all the device handles that support the BLOCK_IO Protocol |
// |
*NoHandles = 0; |
for(Index=0;Index<NoBlockIoHandles;Index++) { |
Status = BS->HandleProtocol (BlockIoBuffer[Index], |
&DevicePathProtocol, |
(VOID*)&DevicePath |
); |
// |
// Search DevicePath for a Hard Drive Media Device Path node. |
// If one is found, then see if it matches the signature that was |
// passed in. If it does match, and the next node is the End of the |
// device path, and the previous node is not a Hard Drive Media Device |
// Path, then we have found a match. |
// |
Match = FALSE; |
if (DevicePath != NULL) { |
PreviousNodeIsHardDriveDevicePath = FALSE; |
DevPath = DevicePath; |
Start = DevPath; |
// |
// Check for end of device path type |
// |
for (; ;) { |
if ((DevicePathType(DevPath) == MEDIA_DEVICE_PATH) && |
(DevicePathSubType(DevPath) == MEDIA_HARDDRIVE_DP)) { |
HardDriveDevicePath = (HARDDRIVE_DEVICE_PATH *)(DevPath); |
if (PreviousNodeIsHardDriveDevicePath == FALSE) { |
Next = NextDevicePathNode(DevPath); |
if (IsDevicePathEndType(Next)) { |
if ((HardDriveDevicePath->MBRType == MBRType) && |
(HardDriveDevicePath->SignatureType == SignatureType)) { |
switch(SignatureType) { |
case SIGNATURE_TYPE_MBR: |
if (*((UINT32 *)(Signature)) == *(UINT32 *)(&(HardDriveDevicePath->Signature[0]))) { |
Match = TRUE; |
} |
break; |
case SIGNATURE_TYPE_GUID: |
if (CompareGuid((EFI_GUID *)Signature,(EFI_GUID *)(&(HardDriveDevicePath->Signature[0]))) == 0) { |
Match = TRUE; |
} |
break; |
} |
} |
} |
} |
PreviousNodeIsHardDriveDevicePath = TRUE; |
} else { |
PreviousNodeIsHardDriveDevicePath = FALSE; |
} |
if (IsDevicePathEnd(DevPath)) { |
break; |
} |
DevPath = NextDevicePathNode(DevPath); |
} |
} |
if (Match == FALSE) { |
BlockIoBuffer[Index] = NULL; |
} else { |
*NoHandles = *NoHandles + 1; |
} |
} |
// |
// If there are no matches, then return |
// |
if (*NoHandles == 0) { |
FreePool(BlockIoBuffer); |
*NoHandles = 0; |
*Buffer = NULL; |
return EFI_SUCCESS; |
} |
// |
// Allocate space for the return buffer of device handles. |
// |
*Buffer = AllocatePool(*NoHandles * sizeof(EFI_HANDLE)); |
if (*Buffer == NULL) { |
FreePool(BlockIoBuffer); |
*NoHandles = 0; |
*Buffer = NULL; |
return EFI_OUT_OF_RESOURCES; |
} |
// |
// Build list of matching device handles. |
// |
*NoHandles = 0; |
for(Index=0;Index<NoBlockIoHandles;Index++) { |
if (BlockIoBuffer[Index] != NULL) { |
(*Buffer)[*NoHandles] = BlockIoBuffer[Index]; |
*NoHandles = *NoHandles + 1; |
} |
} |
FreePool(BlockIoBuffer); |
return EFI_SUCCESS; |
} |
EFI_FILE_HANDLE |
LibOpenRoot ( |
IN EFI_HANDLE DeviceHandle |
) |
{ |
EFI_STATUS Status; |
EFI_FILE_IO_INTERFACE *Volume; |
EFI_FILE_HANDLE File; |
// |
// File the file system interface to the device |
// |
Status = BS->HandleProtocol (DeviceHandle, &FileSystemProtocol, (VOID*)&Volume); |
// |
// Open the root directory of the volume |
// |
if (!EFI_ERROR(Status)) { |
Status = Volume->OpenVolume(Volume, &File); |
} |
// |
// Done |
// |
return EFI_ERROR(Status) ? NULL : File; |
} |
EFI_FILE_INFO * |
LibFileInfo ( |
IN EFI_FILE_HANDLE FHand |
) |
{ |
EFI_STATUS Status; |
EFI_FILE_INFO *Buffer; |
UINTN BufferSize; |
// |
// Initialize for GrowBuffer loop |
// |
Buffer = NULL; |
BufferSize = SIZE_OF_EFI_FILE_INFO + 200; |
// |
// Call the real function |
// |
while (GrowBuffer (&Status, (VOID **) &Buffer, BufferSize)) { |
Status = FHand->GetInfo ( |
FHand, |
&GenericFileInfo, |
&BufferSize, |
Buffer |
); |
} |
return Buffer; |
} |
EFI_FILE_SYSTEM_INFO * |
LibFileSystemInfo ( |
IN EFI_FILE_HANDLE FHand |
) |
{ |
EFI_STATUS Status; |
EFI_FILE_SYSTEM_INFO *Buffer; |
UINTN BufferSize; |
// |
// Initialize for GrowBuffer loop |
// |
Buffer = NULL; |
BufferSize = SIZE_OF_EFI_FILE_SYSTEM_INFO + 200; |
// |
// Call the real function |
// |
while (GrowBuffer (&Status, (VOID **) &Buffer, BufferSize)) { |
Status = FHand->GetInfo ( |
FHand, |
&FileSystemInfo, |
&BufferSize, |
Buffer |
); |
} |
return Buffer; |
} |
EFI_FILE_SYSTEM_VOLUME_LABEL_INFO * |
LibFileSystemVolumeLabelInfo ( |
IN EFI_FILE_HANDLE FHand |
) |
{ |
EFI_STATUS Status; |
EFI_FILE_SYSTEM_VOLUME_LABEL_INFO *Buffer; |
UINTN BufferSize; |
// |
// Initialize for GrowBuffer loop |
// |
Buffer = NULL; |
BufferSize = SIZE_OF_EFI_FILE_SYSTEM_VOLUME_LABEL_INFO + 200; |
// |
// Call the real function |
// |
while (GrowBuffer (&Status, (VOID **) &Buffer, BufferSize)) { |
Status = FHand->GetInfo ( |
FHand, |
&FileSystemVolumeLabelInfo, |
&BufferSize, |
Buffer |
); |
} |
return Buffer; |
} |
EFI_STATUS |
LibInstallProtocolInterfaces ( |
IN OUT EFI_HANDLE *Handle, |
... |
) |
{ |
va_list args; |
EFI_STATUS Status; |
EFI_GUID *Protocol; |
VOID *Interface; |
EFI_TPL OldTpl; |
UINTN Index; |
EFI_HANDLE OldHandle; |
// |
// Syncronize with notifcations |
// |
OldTpl = BS->RaiseTPL(TPL_NOTIFY); |
OldHandle = *Handle; |
// |
// Install the protocol interfaces |
// |
Index = 0; |
Status = EFI_SUCCESS; |
va_start (args, Handle); |
while (!EFI_ERROR(Status)) { |
// |
// If protocol is NULL, then it's the end of the list |
// |
Protocol = va_arg(args, EFI_GUID *); |
if (!Protocol) { |
break; |
} |
Interface = va_arg(args, VOID *); |
// |
// Install it |
// |
DEBUG((D_INFO, "LibInstallProtocolInterface: %d %x\n", Protocol, Interface)); |
Status = BS->InstallProtocolInterface (Handle, Protocol, EFI_NATIVE_INTERFACE, Interface); |
if (EFI_ERROR(Status)) { |
break; |
} |
Index += 1; |
} |
// |
// If there was an error, remove all the interfaces that were |
// installed without any errors |
// |
if (EFI_ERROR(Status)) { |
va_start (args, Handle); |
while (Index) { |
Protocol = va_arg(args, EFI_GUID *); |
Interface = va_arg(args, VOID *); |
BS->UninstallProtocolInterface (*Handle, Protocol, Interface); |
Index -= 1; |
} |
*Handle = OldHandle; |
} |
// |
// Done |
// |
BS->RestoreTPL(OldTpl); |
return Status; |
} |
VOID |
LibUninstallProtocolInterfaces ( |
IN EFI_HANDLE Handle, |
... |
) |
{ |
va_list args; |
EFI_STATUS Status; |
EFI_GUID *Protocol; |
VOID *Interface; |
va_start (args, Handle); |
for (; ;) { |
// |
// If protocol is NULL, then it's the end of the list |
// |
Protocol = va_arg(args, EFI_GUID *); |
if (!Protocol) { |
break; |
} |
Interface = va_arg(args, VOID *); |
// |
// Uninstall it |
// |
Status = BS->UninstallProtocolInterface (Handle, Protocol, Interface); |
if (EFI_ERROR(Status)) { |
DEBUG((D_ERROR, "LibUninstallProtocolInterfaces: failed %g, %r\n", Protocol, Handle)); |
} |
} |
} |
EFI_STATUS |
LibReinstallProtocolInterfaces ( |
IN OUT EFI_HANDLE *Handle, |
... |
) |
{ |
va_list args; |
EFI_STATUS Status; |
EFI_GUID *Protocol; |
VOID *OldInterface, *NewInterface; |
EFI_TPL OldTpl; |
UINTN Index; |
// |
// Syncronize with notifcations |
// |
OldTpl = BS->RaiseTPL(TPL_NOTIFY); |
// |
// Install the protocol interfaces |
// |
Index = 0; |
Status = EFI_SUCCESS; |
va_start (args, Handle); |
while (!EFI_ERROR(Status)) { |
// |
// If protocol is NULL, then it's the end of the list |
// |
Protocol = va_arg(args, EFI_GUID *); |
if (!Protocol) { |
break; |
} |
OldInterface = va_arg(args, VOID *); |
NewInterface = va_arg(args, VOID *); |
// |
// Reinstall it |
// |
Status = BS->ReinstallProtocolInterface (Handle, Protocol, OldInterface, NewInterface); |
if (EFI_ERROR(Status)) { |
break; |
} |
Index += 1; |
} |
// |
// If there was an error, undo all the interfaces that were |
// reinstalled without any errors |
// |
if (EFI_ERROR(Status)) { |
va_start (args, Handle); |
while (Index) { |
Protocol = va_arg(args, EFI_GUID *); |
OldInterface = va_arg(args, VOID *); |
NewInterface = va_arg(args, VOID *); |
BS->ReinstallProtocolInterface (Handle, Protocol, NewInterface, OldInterface); |
Index -= 1; |
} |
} |
// |
// Done |
// |
BS->RestoreTPL(OldTpl); |
return Status; |
} |
/tags/0.3.0/boot/arch/ia64/loader/gefi/lib/lib.h |
---|
0,0 → 1,88 |
/*++ |
Copyright (c) 1998 Intel Corporation |
Module Name: |
lib.h |
Abstract: |
EFI library header files |
Revision History |
--*/ |
#include "efi.h" |
#include "efilib.h" |
#include "efirtlib.h" |
// |
// Include non architectural protocols |
// |
#include "efivar.h" |
#include "legacyboot.h" |
#include "intload.h" |
#include "vgaclass.h" |
#include "eficonsplit.h" |
#include "adapterdebug.h" |
#include "intload.h" |
#include "efigpt.h" |
#include "libsmbios.h" |
// |
// Prototypes |
// |
VOID |
InitializeGuid ( |
VOID |
); |
INTN |
LibStubStriCmp ( |
IN EFI_UNICODE_COLLATION_INTERFACE *This, |
IN CHAR16 *S1, |
IN CHAR16 *S2 |
); |
BOOLEAN |
LibStubMetaiMatch ( |
IN EFI_UNICODE_COLLATION_INTERFACE *This, |
IN CHAR16 *String, |
IN CHAR16 *Pattern |
); |
VOID |
LibStubStrLwrUpr ( |
IN EFI_UNICODE_COLLATION_INTERFACE *This, |
IN CHAR16 *Str |
); |
BOOLEAN |
LibMatchDevicePaths ( |
IN EFI_DEVICE_PATH *Multi, |
IN EFI_DEVICE_PATH *Single |
); |
EFI_DEVICE_PATH * |
LibDuplicateDevicePathInstance ( |
IN EFI_DEVICE_PATH *DevPath |
); |
// |
// Globals |
// |
extern BOOLEAN LibInitialized; |
extern BOOLEAN LibFwInstance; |
extern SIMPLE_TEXT_OUTPUT_INTERFACE *LibRuntimeDebugOut; |
extern EFI_UNICODE_COLLATION_INTERFACE *UnicodeInterface; |
extern EFI_UNICODE_COLLATION_INTERFACE LibStubUnicodeInterface; |
extern EFI_RAISE_TPL LibRuntimeRaiseTPL; |
extern EFI_RESTORE_TPL LibRuntimeRestoreTPL; |
/tags/0.3.0/boot/arch/ia64/loader/gefi/lib/ia32/initplat.c |
---|
0,0 → 1,28 |
/*++ |
Copyright (c) 1998 Intel Corporation |
Module Name: |
initplat.c |
Abstract: |
Revision History |
--*/ |
#include "lib.h" |
VOID |
InitializeLibPlatform ( |
IN EFI_HANDLE ImageHandle, |
IN EFI_SYSTEM_TABLE *SystemTable |
) |
{ |
} |
/tags/0.3.0/boot/arch/ia64/loader/gefi/lib/ia32/math.c |
---|
0,0 → 1,179 |
/*++ |
Copyright (c) 1998 Intel Corporation |
Module Name: |
math.c |
Abstract: |
Revision History |
--*/ |
#include "lib.h" |
// |
// Declare runtime functions |
// |
#ifdef RUNTIME_CODE |
#pragma RUNTIME_CODE(LShiftU64) |
#pragma RUNTIME_CODE(RShiftU64) |
#pragma RUNTIME_CODE(MultU64x32) |
#pragma RUNTIME_CODE(DivU64x32) |
#endif |
// |
// |
// |
UINT64 |
LShiftU64 ( |
IN UINT64 Operand, |
IN UINTN Count |
) |
// Left shift 64bit by 32bit and get a 64bit result |
{ |
#ifdef __GNUC__ |
return Operand << Count; |
#else |
UINT64 Result; |
_asm { |
mov eax, dword ptr Operand[0] |
mov edx, dword ptr Operand[4] |
mov ecx, Count |
and ecx, 63 |
shld edx, eax, cl |
shl eax, cl |
cmp ecx, 32 |
jc short ls10 |
mov edx, eax |
xor eax, eax |
ls10: |
mov dword ptr Result[0], eax |
mov dword ptr Result[4], edx |
} |
return Result; |
#endif |
} |
UINT64 |
RShiftU64 ( |
IN UINT64 Operand, |
IN UINTN Count |
) |
// Right shift 64bit by 32bit and get a 64bit result |
{ |
#ifdef __GNUC__ |
return Operand >> Count; |
#else |
UINT64 Result; |
_asm { |
mov eax, dword ptr Operand[0] |
mov edx, dword ptr Operand[4] |
mov ecx, Count |
and ecx, 63 |
shrd eax, edx, cl |
shr edx, cl |
cmp ecx, 32 |
jc short rs10 |
mov eax, edx |
xor edx, edx |
rs10: |
mov dword ptr Result[0], eax |
mov dword ptr Result[4], edx |
} |
return Result; |
#endif |
} |
UINT64 |
MultU64x32 ( |
IN UINT64 Multiplicand, |
IN UINTN Multiplier |
) |
// Multiple 64bit by 32bit and get a 64bit result |
{ |
#ifdef __GNUC__ |
return Multiplicand * Multiplier; |
#else |
UINT64 Result; |
_asm { |
mov eax, dword ptr Multiplicand[0] |
mul Multiplier |
mov dword ptr Result[0], eax |
mov dword ptr Result[4], edx |
mov eax, dword ptr Multiplicand[4] |
mul Multiplier |
add dword ptr Result[4], eax |
} |
return Result; |
#endif |
} |
UINT64 |
DivU64x32 ( |
IN UINT64 Dividend, |
IN UINTN Divisor, |
OUT UINTN *Remainder OPTIONAL |
) |
// divide 64bit by 32bit and get a 64bit result |
// N.B. only works for 31bit divisors!! |
{ |
#ifdef __GNUC__ |
if (Remainder) |
*Remainder = Dividend % Divisor; |
return Dividend / Divisor; |
#else |
UINT32 Rem; |
UINT32 bit; |
ASSERT (Divisor != 0); |
ASSERT ((Divisor >> 31) == 0); |
// |
// For each bit in the dividend |
// |
Rem = 0; |
for (bit=0; bit < 64; bit++) { |
_asm { |
shl dword ptr Dividend[0], 1 ; shift rem:dividend left one |
rcl dword ptr Dividend[4], 1 |
rcl dword ptr Rem, 1 |
mov eax, Rem |
cmp eax, Divisor ; Is Rem >= Divisor? |
cmc ; No - do nothing |
sbb eax, eax ; Else, |
sub dword ptr Dividend[0], eax ; set low bit in dividen |
and eax, Divisor ; and |
sub Rem, eax ; subtract divisor |
} |
} |
if (Remainder) { |
*Remainder = Rem; |
} |
return Dividend; |
#endif |
} |
/tags/0.3.0/boot/arch/ia64/loader/gefi/lib/hw.c |
---|
0,0 → 1,132 |
/*++ |
Copyright (c) 1998 Intel Corporation |
Module Name: |
hw.c |
Abstract: |
Debug library functions for Hardware IO access |
Revision History |
--*/ |
#include "lib.h" |
EFI_STATUS |
InitializeGlobalIoDevice ( |
IN EFI_DEVICE_PATH *DevicePath, |
IN EFI_GUID *Protocol, |
IN CHAR8 *ErrorStr, |
OUT EFI_DEVICE_IO_INTERFACE **GlobalIoFncs |
) |
/*++ |
Routine Description: |
Check to see if DevicePath exists for a given Protocol. Return Error if it |
exists. Return GlobalIoFuncs set match the DevicePath |
Arguments: |
DevicePath - to operate on |
Protocol - to check the DevicePath against |
ErrorStr - ASCII string to display on error |
GlobalIoFncs - Returned with DeviceIoProtocol for the DevicePath |
Returns: |
Pass or Fail based on wether GlobalIoFncs where found |
--*/ |
{ |
EFI_STATUS Status; |
EFI_HANDLE Handle; |
// |
// Check to see if this device path already has Protocol on it. |
// if so we are loading recursivly and should exit with an error |
// |
Status = BS->LocateDevicePath (Protocol, &DevicePath, &Handle); |
if (!EFI_ERROR(Status)) { |
DEBUG ((D_INIT, "Device Already Loaded for %a device\n", ErrorStr)); |
return EFI_LOAD_ERROR; |
} |
Status = BS->LocateDevicePath (&DeviceIoProtocol, &DevicePath, &Handle); |
if (!EFI_ERROR(Status)) { |
Status = BS->HandleProtocol (Handle, &DeviceIoProtocol, (VOID*)GlobalIoFncs); |
} |
ASSERT (!EFI_ERROR(Status)); |
return Status; |
} |
UINT32 |
ReadPort ( |
IN EFI_DEVICE_IO_INTERFACE *GlobalIoFncs, |
IN EFI_IO_WIDTH Width, |
IN UINTN Port |
) |
{ |
UINT32 Data; |
EFI_STATUS Status; |
Status = GlobalIoFncs->Io.Read (GlobalIoFncs, Width, (UINT64)Port, 1, &Data); |
ASSERT(!EFI_ERROR(Status)); |
return Data; |
} |
UINT32 |
WritePort ( |
IN EFI_DEVICE_IO_INTERFACE *GlobalIoFncs, |
IN EFI_IO_WIDTH Width, |
IN UINTN Port, |
IN UINTN Data |
) |
{ |
EFI_STATUS Status; |
Status = GlobalIoFncs->Io.Write (GlobalIoFncs, Width, (UINT64)Port, 1, &Data); |
ASSERT(!EFI_ERROR(Status)); |
return (UINT32)Data; |
} |
UINT32 |
ReadPciConfig ( |
IN EFI_DEVICE_IO_INTERFACE *GlobalIoFncs, |
IN EFI_IO_WIDTH Width, |
IN UINTN Address |
) |
{ |
UINT32 Data; |
EFI_STATUS Status; |
Status = GlobalIoFncs->Pci.Read (GlobalIoFncs, Width, (UINT64)Address, 1, &Data); |
ASSERT(!EFI_ERROR(Status)); |
return Data; |
} |
UINT32 |
WritePciConfig ( |
IN EFI_DEVICE_IO_INTERFACE *GlobalIoFncs, |
IN EFI_IO_WIDTH Width, |
IN UINTN Address, |
IN UINTN Data |
) |
{ |
EFI_STATUS Status; |
Status = GlobalIoFncs->Pci.Write (GlobalIoFncs, Width, (UINT64)Address, 1, &Data); |
ASSERT(!EFI_ERROR(Status)); |
return (UINT32)Data; |
} |
/tags/0.3.0/boot/arch/ia64/loader/gefi/lib/event.c |
---|
0,0 → 1,149 |
/*++ |
Copyright (c) 1998 Intel Corporation |
Module Name: |
event.c |
Abstract: |
Revision History |
--*/ |
#include "lib.h" |
EFI_EVENT |
LibCreateProtocolNotifyEvent ( |
IN EFI_GUID *ProtocolGuid, |
IN EFI_TPL NotifyTpl, |
IN EFI_EVENT_NOTIFY NotifyFunction, |
IN VOID *NotifyContext, |
OUT VOID *Registration |
) |
{ |
EFI_STATUS Status; |
EFI_EVENT Event; |
// |
// Create the event |
// |
Status = BS->CreateEvent ( |
EVT_NOTIFY_SIGNAL, |
NotifyTpl, |
NotifyFunction, |
NotifyContext, |
&Event |
); |
ASSERT (!EFI_ERROR(Status)); |
// |
// Register for protocol notifactions on this event |
// |
Status = BS->RegisterProtocolNotify ( |
ProtocolGuid, |
Event, |
Registration |
); |
ASSERT (!EFI_ERROR(Status)); |
// |
// Kick the event so we will perform an initial pass of |
// current installed drivers |
// |
BS->SignalEvent (Event); |
return Event; |
} |
EFI_STATUS |
WaitForSingleEvent ( |
IN EFI_EVENT Event, |
IN UINT64 Timeout OPTIONAL |
) |
{ |
EFI_STATUS Status; |
UINTN Index; |
EFI_EVENT TimerEvent; |
EFI_EVENT WaitList[2]; |
if (Timeout) { |
// |
// Create a timer event |
// |
Status = BS->CreateEvent (EVT_TIMER, 0, NULL, NULL, &TimerEvent); |
if (!EFI_ERROR(Status)) { |
// |
// Set the timer event |
// |
BS->SetTimer (TimerEvent, TimerRelative, Timeout); |
// |
// Wait for the original event or the timer |
// |
WaitList[0] = Event; |
WaitList[1] = TimerEvent; |
Status = BS->WaitForEvent (2, WaitList, &Index); |
BS->CloseEvent (TimerEvent); |
// |
// If the timer expired, change the return to timed out |
// |
if (!EFI_ERROR(Status) && Index == 1) { |
Status = EFI_TIMEOUT; |
} |
} |
} else { |
// |
// No timeout... just wait on the event |
// |
Status = BS->WaitForEvent (1, &Event, &Index); |
ASSERT (!EFI_ERROR(Status)); |
ASSERT (Index == 0); |
} |
return Status; |
} |
VOID |
WaitForEventWithTimeout ( |
IN EFI_EVENT Event, |
IN UINTN Timeout, |
IN UINTN Row, |
IN UINTN Column, |
IN CHAR16 *String, |
IN EFI_INPUT_KEY TimeoutKey, |
OUT EFI_INPUT_KEY *Key |
) |
{ |
EFI_STATUS Status; |
do { |
PrintAt (Column, Row, String, Timeout); |
Status = WaitForSingleEvent (Event, 10000000); |
if (Status == EFI_SUCCESS) { |
if (!EFI_ERROR(ST->ConIn->ReadKeyStroke (ST->ConIn, Key))) { |
return; |
} |
} |
} while (Timeout > 0); |
*Key = TimeoutKey; |
} |
/tags/0.3.0/boot/arch/ia64/loader/gefi/lib/ia64/palproc.S |
---|
0,0 → 1,170 |
//++ |
// Copyright (c) 1996-99 Intel Corp. |
// All Rights Reserved |
// |
// INTEL CORPORATION PROPRIETARY INFORMATION |
// |
// This software is supplied under the terms of a license |
// agreement or nondisclosure agreement with Intel Corpo- |
// ration and may not be copied or disclosed except in |
// accordance with the terms of that agreement. |
// |
// |
// |
// Module Name: |
// |
// palproc.s |
// |
// Abstract: |
// |
// Contains an implementation for making PAL PROC calls on |
// IA-64 architecture. |
// |
// |
// |
// Revision History: |
// |
//-- |
.file "palproc.s" |
#include "palproc.h" |
//----------------------------------------------------------------------------- |
//++ |
// MakeStaticPALCall |
// |
// This routine is called whenever an architected static calling convention |
// based PAL call is to be made. This call does use RSE actually, but our policy |
// in making static PAL calls before memory is available is to make sure that |
// we do not nest too deep and allocate beyond 96 banked registers. In other |
// words we carefully code calls and control flow before memory is available. |
// |
// Arguments : All parameters set up to do static PAL call. |
// |
// On Entry : |
// |
// Return Value: |
// |
// As per static calling conventions. |
// |
//-- |
//--------------------------------------------------------------------------- |
PROCEDURE_ENTRY(MakeStaticPALCall) |
NESTED_SETUP (5,8,0,0) |
mov loc3 = b5 |
mov loc4 = r2 |
mov loc7 = r1;; |
movl loc6 = PAL_MC_CLEAR_LOG |
mov r2 = psr;; |
mov loc5 = r2 |
cmp.eq p6,p7 = r28,loc6;; |
(p7)movl loc6 = PAL_MC_DYNAMIC_STATE;; |
(p7)cmp.eq p6,p7 = r28,loc6;; |
(p7)movl loc6 = PAL_MC_ERROR_INFO;; |
(p7)cmp.eq p6,p7 = r28,loc6;; |
(p7)movl loc6 = PAL_MC_RESUME;; |
(p7)cmp.eq p6,p7 = r28,loc6 |
mov loc6 = 0x1;; |
(p7)dep r2 = loc6,r2,13,1;; // psr.ic = 1 |
// p6 will be true, if it is one of the MCHK calls. There has been lots of debate |
// on psr.ic for these values. For now, do not do any thing to psr.ic |
// (p6)dep r2 = r0,r2,13,1;; // psr.ic = 0 |
dep r2 = r0,r2,14,1;; // psr.i = 0 |
mov psr.l = r2 |
srlz.d;; // Needs data serailization. |
srlz.i;; // Needs instruction serailization. |
StaticGetPALLocalIP: |
mov loc2 = ip;; |
add loc2 = StaticComeBackFromPALCall - StaticGetPALLocalIP,loc2;; |
mov b0 = loc2 // return address after Pal call |
mov r28 = in1 // get the input parameters to PAL call |
mov r29 = in2 |
mov r30 = in3;; |
mov r31 = in4 |
mov b5 = in0;; // get the PalProcEntrypt from input |
br.sptk b5 // Take the plunge. |
StaticComeBackFromPALCall: |
mov psr.l = loc5;; |
srlz.d;; // Needs data serailization. |
srlz.i;; // Needs instruction serailization. |
mov b5 = loc3 |
mov r2 = loc4 |
mov r1 = loc7 |
NESTED_RETURN |
PROCEDURE_EXIT(MakeStaticPALCall) |
//----------------------------------------------------------------------------- |
//++ |
// MakeStackedPALCall |
// |
// This routine is called whenever an architected stacked calling convention |
// based PAL call is to be made. This call is made after memory is available. |
// Although stacked calls could be made directly from 'C', there is a PAL |
// requirement which forces the index to be in GR28 and hence this stub is |
// needed |
// |
// Arguments : All parameters set up to do stacted PAL call. |
// |
// On Entry : |
// in0: PAL_PROC entrypoint |
// in1-in4 : PAL_PROC arguments |
// |
// Return Value: |
// |
// As per stacked calling conventions. |
// |
//-- |
//--------------------------------------------------------------------------- |
PROCEDURE_ENTRY(MakeStackedPALCall) |
NESTED_SETUP (5,8,4,0) |
mov loc3 = b5 |
mov loc4 = r2 |
mov loc7 = r1 |
mov r2 = psr;; |
mov loc5 = r2;; |
dep r2 = r0,r2,14,1;; // psr.i = 0 |
mov psr.l = r2 |
srlz.d;; // Needs data serailization. |
srlz.i;; // Needs instruction serailization. |
StackedGetPALLocalIP: |
mov r28 = in1 // get the input parameters to PAL call |
mov out0 = in1 |
mov out1 = in2;; |
mov out2 = in3 |
mov out3 = in4 |
mov b5 = in0;; // get the PalProcEntrypt from input |
br.call.dpnt b0=b5;; // Take the plunge. |
StackedComeBackFromPALCall: |
mov psr.l = loc5;; |
srlz.d;; // Needs data serailization. |
srlz.i;; // Needs instruction serailization. |
mov b5 = loc3 |
mov r2 = loc4 |
mov r1 = loc7 |
NESTED_RETURN |
PROCEDURE_EXIT(MakeStackedPALCall) |
/tags/0.3.0/boot/arch/ia64/loader/gefi/lib/ia64/initplat.c |
---|
0,0 → 1,31 |
/*++ |
Copyright (c) 1999 Intel Corporation |
Module Name: |
initplat.c |
Abstract: |
Functions to make SAL and PAL proc calls |
Revision History |
--*/ |
#include "lib.h" |
//#include "palproc.h" |
VOID |
InitializeLibPlatform ( |
IN EFI_HANDLE ImageHandle, |
IN EFI_SYSTEM_TABLE *SystemTable |
) |
{ |
PLABEL SalPlabel; |
UINT64 PalEntry; |
LibInitSalAndPalProc (&SalPlabel, &PalEntry); |
} |
/tags/0.3.0/boot/arch/ia64/loader/gefi/lib/ia64/palproc.h |
---|
0,0 → 1,60 |
// |
// |
// Copyright (c) 1996-99 Intel Corp. |
// All Rights Reserved |
// |
// INTEL CORPORATION PROPRIETARY INFORMATION |
// |
// This software is supplied under the terms of a license |
// agreement or nondisclosure agreement with Intel Corpo- |
// ration and may not be copied or disclosed except in |
// accordance with the terms of that agreement. |
// |
// |
// |
//Module Name: |
// |
// palproc.h |
// |
//Abstract: |
// |
// This module contains generic macros for an IA64 assembly writer. |
// |
// |
//Revision History |
// |
#ifndef _PALPROC_H |
#define _PALPROC_H |
#define PROCEDURE_ENTRY(name) .##text; \ |
.##type name, @function; \ |
.##global name; \ |
.##proc name; \ |
name: |
#define PROCEDURE_EXIT(name) .##endp name |
// Note: use of NESTED_SETUP requires number of locals (l) >= 3 |
#define NESTED_SETUP(i,l,o,r) \ |
alloc loc1=ar##.##pfs,i,l,o,r ;\ |
mov loc0=b0 |
#define NESTED_RETURN \ |
mov b0=loc0 ;\ |
mov ar##.##pfs=loc1 ;;\ |
br##.##ret##.##dpnt b0;; |
// defines needed in palproc.s |
#define PAL_MC_CLEAR_LOG 0x0015 |
#define PAL_MC_DRAIN 0x0016 |
#define PAL_MC_EXPECTED 0x0017 |
#define PAL_MC_DYNAMIC_STATE 0x0018 |
#define PAL_MC_ERROR_INFO 0x0019 |
#define PAL_MC_RESUME 0x001a |
#define PAL_MC_REGISTER_MEM 0x001b |
#endif // _PALPROC_H |
/tags/0.3.0/boot/arch/ia64/loader/gefi/lib/ia64/math.c |
---|
0,0 → 1,86 |
/*++ |
Copyright (c) 1998 Intel Corporation |
Module Name: |
math.c |
Abstract: |
Revision History |
--*/ |
#include "lib.h" |
// |
// Declare runtime functions |
// |
#ifdef RUNTIME_CODE |
#pragma RUNTIME_CODE(LShiftU64) |
#pragma RUNTIME_CODE(RShiftU64) |
#pragma RUNTIME_CODE(MultU64x32) |
#pragma RUNTIME_CODE(DivU64x32) |
#endif |
// |
// |
// |
UINT64 |
LShiftU64 ( |
IN UINT64 Operand, |
IN UINTN Count |
) |
// Left shift 64bit by 32bit and get a 64bit result |
{ |
return Operand << Count; |
} |
UINT64 |
RShiftU64 ( |
IN UINT64 Operand, |
IN UINTN Count |
) |
// Right shift 64bit by 32bit and get a 64bit result |
{ |
return Operand >> Count; |
} |
UINT64 |
MultU64x32 ( |
IN UINT64 Multiplicand, |
IN UINTN Multiplier |
) |
// Multiple 64bit by 32bit and get a 64bit result |
{ |
return Multiplicand * Multiplier; |
} |
UINT64 |
DivU64x32 ( |
IN UINT64 Dividend, |
IN UINTN Divisor, |
OUT UINTN *Remainder OPTIONAL |
) |
// divide 64bit by 32bit and get a 64bit result |
// N.B. only works for 31bit divisors!! |
{ |
ASSERT (Divisor != 0); |
if (Remainder) { |
*Remainder = Dividend % Divisor; |
} |
return Dividend / Divisor; |
} |
/tags/0.3.0/boot/arch/ia64/loader/gefi/lib/ia64/salpal.c |
---|
0,0 → 1,335 |
/*++ |
Copyright (c) 1999 Intel Corporation |
Module Name: |
salpal.c |
Abstract: |
Functions to make SAL and PAL proc calls |
Revision History |
--*/ |
#include "lib.h" |
#include "palproc.h" |
#include "salproc.h" |
/*++ |
Copyright (c) 1999 Intel Corporation |
Module Name: |
EfiRtLib.h |
Abstract: |
EFI Runtime library functions |
Revision History |
--*/ |
#include "efi.h" |
#include "efilib.h" |
rArg |
MakeStaticPALCall ( |
IN UINT64 PALPROCPtr, |
IN UINT64 Arg1, |
IN UINT64 Arg2, |
IN UINT64 Arg3, |
IN UINT64 Arg4 |
); |
rArg |
MakeStackedPALCall ( |
IN UINT64 PALPROCPtr, |
IN UINT64 Arg1, |
IN UINT64 Arg2, |
IN UINT64 Arg3, |
IN UINT64 Arg4 |
); |
PLABEL SalProcPlabel; |
PLABEL PalProcPlabel; |
CALL_SAL_PROC GlobalSalProc; |
CALL_PAL_PROC GlobalPalProc; |
VOID |
LibInitSalAndPalProc ( |
OUT PLABEL *SalPlabel, |
OUT UINT64 *PalEntry |
) |
{ |
SAL_SYSTEM_TABLE_ASCENDING_ORDER *SalSystemTable; |
EFI_STATUS Status; |
GlobalSalProc = NULL; |
GlobalPalProc = NULL; |
Status = LibGetSystemConfigurationTable(&SalSystemTableGuid, (VOID **)&SalSystemTable); |
if (EFI_ERROR(Status)) { |
return; |
} |
// |
// BugBug: Add code to test checksum on the Sal System Table |
// |
if (SalSystemTable->Entry0.Type != 0) { |
return; |
} |
SalProcPlabel.ProcEntryPoint = SalSystemTable->Entry0.SalProcEntry; |
SalProcPlabel.GP = SalSystemTable->Entry0.GlobalDataPointer; |
GlobalSalProc = (CALL_SAL_PROC)&SalProcPlabel.ProcEntryPoint; |
// |
// Need to check the PAL spec to make sure I'm not responsible for |
// storing more state. |
// We are passing in a Plabel that should be ignorred by the PAL. Call |
// this way will cause use to retore our gp after the PAL returns. |
// |
PalProcPlabel.ProcEntryPoint = SalSystemTable->Entry0.PalProcEntry; |
PalProcPlabel.GP = SalSystemTable->Entry0.GlobalDataPointer; |
GlobalPalProc = (CALL_PAL_PROC)PalProcPlabel.ProcEntryPoint; |
*PalEntry = PalProcPlabel.ProcEntryPoint; |
*SalPlabel = SalProcPlabel; |
} |
EFI_STATUS |
LibGetSalIoPortMapping ( |
OUT UINT64 *IoPortMapping |
) |
/*++ |
Get the IO Port Map from the SAL System Table. |
DO NOT USE THIS TO DO YOU OWN IO's!!!!!!!!!!!! |
Only use this for getting info, or initing the built in EFI IO abstraction. |
Always use the EFI Device IO protoocl to access IO space. |
--*/ |
{ |
SAL_SYSTEM_TABLE_ASCENDING_ORDER *SalSystemTable; |
SAL_ST_MEMORY_DESCRIPTOR_ENTRY *SalMemDesc; |
EFI_STATUS Status; |
Status = LibGetSystemConfigurationTable(&SalSystemTableGuid, (VOID **)&SalSystemTable); |
if (EFI_ERROR(Status)) { |
return EFI_UNSUPPORTED; |
} |
// |
// BugBug: Add code to test checksum on the Sal System Table |
// |
if (SalSystemTable->Entry0.Type != 0) { |
return EFI_UNSUPPORTED; |
} |
// |
// The SalSystemTable pointer includes the Type 0 entry. |
// The SalMemDesc is Type 1 so it comes next. |
// |
SalMemDesc = (SAL_ST_MEMORY_DESCRIPTOR_ENTRY *)(SalSystemTable + 1); |
while (SalMemDesc->Type == SAL_ST_MEMORY_DESCRIPTOR) { |
if (SalMemDesc->MemoryType == SAL_IO_PORT_MAPPING) { |
*IoPortMapping = SalMemDesc->PhysicalMemoryAddress; |
return EFI_SUCCESS; |
} |
SalMemDesc++; |
} |
return EFI_UNSUPPORTED; |
} |
EFI_STATUS |
LibGetSalIpiBlock ( |
OUT UINT64 *IpiBlock |
) |
/*++ |
Get the IPI block from the SAL system table |
--*/ |
{ |
SAL_SYSTEM_TABLE_ASCENDING_ORDER *SalSystemTable; |
SAL_ST_MEMORY_DESCRIPTOR_ENTRY *SalMemDesc; |
EFI_STATUS Status; |
Status = LibGetSystemConfigurationTable(&SalSystemTableGuid, (VOID*)&SalSystemTable); |
if (EFI_ERROR(Status)) { |
return EFI_UNSUPPORTED; |
} |
// |
// BugBug: Add code to test checksum on the Sal System Table |
// |
if (SalSystemTable->Entry0.Type != 0) { |
return EFI_UNSUPPORTED; |
} |
// |
// The SalSystemTable pointer includes the Type 0 entry. |
// The SalMemDesc is Type 1 so it comes next. |
// |
SalMemDesc = (SAL_ST_MEMORY_DESCRIPTOR_ENTRY *)(SalSystemTable + 1); |
while (SalMemDesc->Type == SAL_ST_MEMORY_DESCRIPTOR) { |
if (SalMemDesc->MemoryType == SAL_SAPIC_IPI_BLOCK ) { |
*IpiBlock = SalMemDesc->PhysicalMemoryAddress; |
return EFI_SUCCESS; |
} |
SalMemDesc++; |
} |
return EFI_UNSUPPORTED; |
} |
EFI_STATUS |
LibGetSalWakeupVector ( |
OUT UINT64 *WakeVector |
) |
/*++ |
Get the wakeup vector from the SAL system table |
--*/ |
{ |
SAL_ST_AP_WAKEUP_DECRIPTOR *ApWakeUp; |
ApWakeUp = LibSearchSalSystemTable (SAL_ST_AP_WAKEUP); |
if (!ApWakeUp) { |
*WakeVector = -1; |
return EFI_UNSUPPORTED; |
} |
*WakeVector = ApWakeUp->ExternalInterruptVector; |
return EFI_SUCCESS; |
} |
VOID * |
LibSearchSalSystemTable ( |
IN UINT8 EntryType |
) |
{ |
EFI_STATUS Status; |
UINT8 *SalTableHack; |
SAL_SYSTEM_TABLE_ASCENDING_ORDER *SalSystemTable; |
UINT16 EntryCount; |
UINT16 Count; |
Status = LibGetSystemConfigurationTable(&SalSystemTableGuid, (VOID*)&SalSystemTable); |
if (EFI_ERROR(Status)) { |
return NULL; |
} |
EntryCount = SalSystemTable->Header.EntryCount; |
if (EntryCount == 0) { |
return NULL; |
} |
// |
// BugBug: Add code to test checksum on the Sal System Table |
// |
SalTableHack = (UINT8 *)&SalSystemTable->Entry0; |
for (Count = 0; Count < EntryCount ;Count++) { |
if (*SalTableHack == EntryType) { |
return (VOID *)SalTableHack; |
} |
switch (*SalTableHack) { |
case SAL_ST_ENTRY_POINT: |
SalTableHack += 48; |
break; |
case SAL_ST_MEMORY_DESCRIPTOR: |
SalTableHack += 32; |
break; |
case SAL_ST_PLATFORM_FEATURES: |
SalTableHack += 16; |
break; |
case SAL_ST_TR_USAGE: |
SalTableHack += 32; |
break; |
case SAL_ST_PTC: |
SalTableHack += 16; |
break; |
case SAL_ST_AP_WAKEUP: |
SalTableHack += 16; |
break; |
default: |
ASSERT(FALSE); |
break; |
} |
} |
return NULL; |
} |
VOID |
LibSalProc ( |
IN UINT64 Arg1, |
IN UINT64 Arg2, |
IN UINT64 Arg3, |
IN UINT64 Arg4, |
IN UINT64 Arg5, |
IN UINT64 Arg6, |
IN UINT64 Arg7, |
IN UINT64 Arg8, |
OUT rArg *Results OPTIONAL |
) |
{ |
rArg ReturnValue; |
ReturnValue.p0 = -3; // SAL status return completed with error |
if (GlobalSalProc) { |
ReturnValue = GlobalSalProc(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8); |
} |
if (Results) { |
CopyMem (Results, &ReturnValue, sizeof(rArg)); |
} |
} |
VOID |
LibPalProc ( |
IN UINT64 Arg1, // Pal Proc index |
IN UINT64 Arg2, |
IN UINT64 Arg3, |
IN UINT64 Arg4, |
OUT rArg *Results OPTIONAL |
) |
{ |
rArg ReturnValue; |
ReturnValue.p0 = -3; // PAL status return completed with error |
// |
// check for valid PalProc entry point |
// |
if (!GlobalPalProc) { |
if (Results) |
CopyMem (Results, &ReturnValue, sizeof(rArg)); |
return; |
} |
// |
// check if index falls within stacked or static register calling conventions |
// and call appropriate Pal stub call |
// |
if (((Arg1 >=255) && (Arg1 <=511)) || |
((Arg1 >=768) && (Arg1 <=1023))) { |
ReturnValue = MakeStackedPALCall((UINT64)GlobalPalProc,Arg1,Arg2,Arg3,Arg4); |
} |
else { |
ReturnValue = MakeStaticPALCall((UINT64)GlobalPalProc,Arg1,Arg2,Arg3,Arg4); |
} |
if (Results) |
CopyMem (Results, &ReturnValue, sizeof(rArg)); |
return; |
} |
/tags/0.3.0/boot/arch/ia64/loader/gefi/lib/debug.c |
---|
0,0 → 1,43 |
/*++ |
Copyright (c) 1998 Intel Corporation |
Module Name: |
debug.c |
Abstract: |
Debug library functions |
Revision History |
--*/ |
#include "lib.h" |
// |
// Declare runtime functions |
// |
// |
// |
// |
INTN |
DbgAssert ( |
IN CHAR8 *FileName, |
IN INTN LineNo, |
IN CHAR8 *Description |
) |
{ |
DbgPrint (D_ERROR, (CHAR8 *)"%EASSERT FAILED: %a(%d): %a%N\n", FileName, LineNo, Description); |
BREAKPOINT(); |
return 0; |
} |
/tags/0.3.0/boot/arch/ia64/loader/gefi/lib/guid.c |
---|
0,0 → 1,175 |
/*++ |
Copyright (c) 1998 Intel Corporation |
Module Name: |
misc.c |
Abstract: |
Misc EFI support functions |
Revision History |
--*/ |
#include "lib.h" |
// |
// Additional Known guids |
// |
#define SHELL_INTERFACE_PROTOCOL \ |
{ 0x47c7b223, 0xc42a, 0x11d2, {0x8e, 0x57, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} } |
#define ENVIRONMENT_VARIABLE_ID \ |
{ 0x47c7b224, 0xc42a, 0x11d2, {0x8e, 0x57, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} } |
#define DEVICE_PATH_MAPPING_ID \ |
{ 0x47c7b225, 0xc42a, 0x11d2, {0x8e, 0x57, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} } |
#define PROTOCOL_ID_ID \ |
{ 0x47c7b226, 0xc42a, 0x11d2, {0x8e, 0x57, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} } |
#define ALIAS_ID \ |
{ 0x47c7b227, 0xc42a, 0x11d2, {0x8e, 0x57, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} } |
static EFI_GUID ShellInterfaceProtocol = SHELL_INTERFACE_PROTOCOL; |
static EFI_GUID SEnvId = ENVIRONMENT_VARIABLE_ID; |
static EFI_GUID SMapId = DEVICE_PATH_MAPPING_ID; |
static EFI_GUID SProtId = PROTOCOL_ID_ID; |
static EFI_GUID SAliasId = ALIAS_ID; |
static struct { |
EFI_GUID *Guid; |
WCHAR *GuidName; |
} KnownGuids[] = { |
{ &NullGuid, L"G0"}, |
{ &EfiGlobalVariable, L"Efi"}, |
{ &VariableStoreProtocol, L"varstore"}, |
{ &DevicePathProtocol, L"dpath"}, |
{ &LoadedImageProtocol, L"image"}, |
{ &TextInProtocol, L"txtin"}, |
{ &TextOutProtocol, L"txtout"}, |
{ &BlockIoProtocol, L"blkio"}, |
{ &DiskIoProtocol, L"diskio"}, |
{ &FileSystemProtocol, L"fs"}, |
{ &LoadFileProtocol, L"load"}, |
{ &DeviceIoProtocol, L"DevIo"}, |
{ &GenericFileInfo, L"GenFileInfo"}, |
{ &FileSystemInfo, L"FileSysInfo"}, |
{ &UnicodeCollationProtocol, L"unicode"}, |
{ &LegacyBootProtocol, L"LegacyBoot"}, |
{ &SerialIoProtocol, L"serialio"}, |
{ &VgaClassProtocol, L"vgaclass"}, |
{ &SimpleNetworkProtocol, L"net"}, |
{ &NetworkInterfaceIdentifierProtocol, L"nii"}, |
{ &PxeBaseCodeProtocol, L"pxebc"}, |
{ &PxeCallbackProtocol, L"pxecb"}, |
{ &VariableStoreProtocol, L"varstore"}, |
{ &LegacyBootProtocol, L"LegacyBoot"}, |
{ &VgaClassProtocol, L"VgaClass"}, |
{ &TextOutSpliterProtocol, L"TxtOutSplit"}, |
{ &ErrorOutSpliterProtocol, L"ErrOutSplit"}, |
{ &TextInSpliterProtocol, L"TxtInSplit"}, |
{ &PcAnsiProtocol, L"PcAnsi"}, |
{ &Vt100Protocol, L"Vt100"}, |
{ &UnknownDevice, L"Unknown Device"}, |
{ &EfiPartTypeSystemPartitionGuid, L"ESP"}, |
{ &EfiPartTypeLegacyMbrGuid, L"GPT MBR"}, |
{ &ShellInterfaceProtocol, L"ShellInt"}, |
{ &SEnvId, L"SEnv"}, |
{ &SProtId, L"ShellProtId"}, |
{ &SMapId, L"ShellDevPathMap"}, |
{ &SAliasId, L"ShellAlias"}, |
{ NULL } |
}; |
// |
// |
// |
LIST_ENTRY GuidList; |
VOID |
InitializeGuid ( |
VOID |
) |
{ |
} |
INTN |
CompareGuid( |
IN EFI_GUID *Guid1, |
IN EFI_GUID *Guid2 |
) |
/*++ |
Routine Description: |
Compares to GUIDs |
Arguments: |
Guid1 - guid to compare |
Guid2 - guid to compare |
Returns: |
= 0 if Guid1 == Guid2 |
--*/ |
{ |
return RtCompareGuid (Guid1, Guid2); |
} |
VOID |
GuidToString ( |
OUT CHAR16 *Buffer, |
IN EFI_GUID *Guid |
) |
{ |
UINTN Index; |
// |
// Else, (for now) use additional internal function for mapping guids |
// |
for (Index=0; KnownGuids[Index].Guid; Index++) { |
if (CompareGuid(Guid, KnownGuids[Index].Guid) == 0) { |
SPrint (Buffer, 0, KnownGuids[Index].GuidName); |
return ; |
} |
} |
// |
// Else dump it |
// |
SPrint (Buffer, 0, L"%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x", |
Guid->Data1, |
Guid->Data2, |
Guid->Data3, |
Guid->Data4[0], |
Guid->Data4[1], |
Guid->Data4[2], |
Guid->Data4[3], |
Guid->Data4[4], |
Guid->Data4[5], |
Guid->Data4[6], |
Guid->Data4[7] |
); |
} |
/tags/0.3.0/boot/arch/ia64/loader/gefi/lib/lock.c |
---|
0,0 → 1,107 |
/*++ |
Copyright (c) 1998 Intel Corporation |
Module Name: |
lock.c |
Abstract: |
Implements FLOCK |
Revision History |
--*/ |
#include "lib.h" |
VOID |
InitializeLock ( |
IN OUT FLOCK *Lock, |
IN EFI_TPL Priority |
) |
/*++ |
Routine Description: |
Initialize a basic mutual exclusion lock. Each lock |
provides mutual exclusion access at it's task priority |
level. Since there is no-premption (at any TPL) or |
multiprocessor support, acquiring the lock only consists |
of raising to the locks TPL. |
Note on a debug build the lock is acquired and released |
to help ensure proper usage. |
Arguments: |
Lock - The FLOCK structure to initialize |
Priority - The task priority level of the lock |
Returns: |
An initialized F Lock structure. |
--*/ |
{ |
Lock->Tpl = Priority; |
Lock->OwnerTpl = 0; |
Lock->Lock = 0; |
} |
VOID |
AcquireLock ( |
IN FLOCK *Lock |
) |
/*++ |
Routine Description: |
Raising to the task priority level of the mutual exclusion |
lock, and then acquires ownership of the lock. |
Arguments: |
Lock - The lock to acquire |
Returns: |
Lock owned |
--*/ |
{ |
RtAcquireLock (Lock); |
} |
VOID |
ReleaseLock ( |
IN FLOCK *Lock |
) |
/*++ |
Routine Description: |
Releases ownership of the mutual exclusion lock, and |
restores the previous task priority level. |
Arguments: |
Lock - The lock to release |
Returns: |
Lock unowned |
--*/ |
{ |
RtReleaseLock (Lock); |
} |
/tags/0.3.0/boot/arch/ia64/loader/gefi/lib/error.c |
---|
0,0 → 1,76 |
/*++ |
Copyright (c) 1998 Intel Corporation |
Module Name: |
error.c |
Abstract: |
Revision History |
--*/ |
#include "lib.h" |
struct { |
EFI_STATUS Code; |
WCHAR *Desc; |
} ErrorCodeTable[] = { |
{ EFI_SUCCESS, L"Success"}, |
{ EFI_LOAD_ERROR, L"Load Error"}, |
{ EFI_INVALID_PARAMETER, L"Invalid Parameter"}, |
{ EFI_UNSUPPORTED, L"Unsupported"}, |
{ EFI_BAD_BUFFER_SIZE, L"Bad Buffer Size"}, |
{ EFI_BUFFER_TOO_SMALL, L"Buffer Too Small"}, |
{ EFI_NOT_READY, L"Not Ready"}, |
{ EFI_DEVICE_ERROR, L"Device Error"}, |
{ EFI_WRITE_PROTECTED, L"Write Protected"}, |
{ EFI_OUT_OF_RESOURCES, L"Out of Resources"}, |
{ EFI_VOLUME_CORRUPTED, L"Volume Corrupt"}, |
{ EFI_VOLUME_FULL, L"Volume Full"}, |
{ EFI_NO_MEDIA, L"No Media"}, |
{ EFI_MEDIA_CHANGED, L"Media changed"}, |
{ EFI_NOT_FOUND, L"Not Found"}, |
{ EFI_ACCESS_DENIED, L"Access Denied"}, |
{ EFI_NO_RESPONSE, L"No Response"}, |
{ EFI_NO_MAPPING, L"No mapping"}, |
{ EFI_TIMEOUT, L"Time out"}, |
{ EFI_NOT_STARTED, L"Not started"}, |
{ EFI_ALREADY_STARTED, L"Already started"}, |
{ EFI_ABORTED, L"Aborted"}, |
{ EFI_ICMP_ERROR, L"ICMP Error"}, |
{ EFI_TFTP_ERROR, L"TFTP Error"}, |
{ EFI_PROTOCOL_ERROR, L"Protocol Error"}, |
// warnings |
{ EFI_WARN_UNKOWN_GLYPH, L"Warning Unknown Glyph"}, |
{ EFI_WARN_DELETE_FAILURE, L"Warning Delete Failure"}, |
{ EFI_WARN_WRITE_FAILURE, L"Warning Write Failure"}, |
{ EFI_WARN_BUFFER_TOO_SMALL, L"Warning Buffer Too Small"}, |
{ 0, NULL} |
} ; |
VOID |
StatusToString ( |
OUT CHAR16 *Buffer, |
IN EFI_STATUS Status |
) |
{ |
UINTN Index; |
for (Index = 0; ErrorCodeTable[Index].Desc; Index +=1) { |
if (ErrorCodeTable[Index].Code == Status) { |
StrCpy (Buffer, ErrorCodeTable[Index].Desc); |
return; |
} |
} |
SPrint (Buffer, 0, L"%X", Status); |
} |
/tags/0.3.0/boot/arch/ia64/loader/gefi/lib/misc.c |
---|
0,0 → 1,514 |
/*++ |
Copyright (c) 1998 Intel Corporation |
Module Name: |
misc.c |
Abstract: |
Revision History |
--*/ |
#include "lib.h" |
// |
// |
// |
VOID * |
AllocatePool ( |
IN UINTN Size |
) |
{ |
EFI_STATUS Status; |
VOID *p; |
Status = BS->AllocatePool (PoolAllocationType, Size, &p); |
if (EFI_ERROR(Status)) { |
DEBUG((D_ERROR, "AllocatePool: out of pool %x\n", Status)); |
p = NULL; |
} |
return p; |
} |
VOID * |
AllocateZeroPool ( |
IN UINTN Size |
) |
{ |
VOID *p; |
p = AllocatePool (Size); |
if (p) { |
ZeroMem (p, Size); |
} |
return p; |
} |
VOID * |
ReallocatePool ( |
IN VOID *OldPool, |
IN UINTN OldSize, |
IN UINTN NewSize |
) |
{ |
VOID *NewPool; |
NewPool = NULL; |
if (NewSize) { |
NewPool = AllocatePool (NewSize); |
} |
if (OldPool) { |
if (NewPool) { |
CopyMem (NewPool, OldPool, OldSize < NewSize ? OldSize : NewSize); |
} |
FreePool (OldPool); |
} |
return NewPool; |
} |
VOID |
FreePool ( |
IN VOID *Buffer |
) |
{ |
BS->FreePool (Buffer); |
} |
VOID |
ZeroMem ( |
IN VOID *Buffer, |
IN UINTN Size |
) |
{ |
RtZeroMem (Buffer, Size); |
} |
VOID |
SetMem ( |
IN VOID *Buffer, |
IN UINTN Size, |
IN UINT8 Value |
) |
{ |
RtSetMem (Buffer, Size, Value); |
} |
VOID |
CopyMem ( |
IN VOID *Dest, |
IN VOID *Src, |
IN UINTN len |
) |
{ |
RtCopyMem (Dest, Src, len); |
} |
INTN |
CompareMem ( |
IN VOID *Dest, |
IN VOID *Src, |
IN UINTN len |
) |
{ |
return RtCompareMem (Dest, Src, len); |
} |
BOOLEAN |
GrowBuffer( |
IN OUT EFI_STATUS *Status, |
IN OUT VOID **Buffer, |
IN UINTN BufferSize |
) |
/*++ |
Routine Description: |
Helper function called as part of the code needed |
to allocate the proper sized buffer for various |
EFI interfaces. |
Arguments: |
Status - Current status |
Buffer - Current allocated buffer, or NULL |
BufferSize - Current buffer size needed |
Returns: |
TRUE - if the buffer was reallocated and the caller |
should try the API again. |
--*/ |
{ |
BOOLEAN TryAgain; |
// |
// If this is an initial request, buffer will be null with a new buffer size |
// |
if (!*Buffer && BufferSize) { |
*Status = EFI_BUFFER_TOO_SMALL; |
} |
// |
// If the status code is "buffer too small", resize the buffer |
// |
TryAgain = FALSE; |
if (*Status == EFI_BUFFER_TOO_SMALL) { |
if (*Buffer) { |
FreePool (*Buffer); |
} |
*Buffer = AllocatePool (BufferSize); |
if (*Buffer) { |
TryAgain = TRUE; |
} else { |
*Status = EFI_OUT_OF_RESOURCES; |
} |
} |
// |
// If there's an error, free the buffer |
// |
if (!TryAgain && EFI_ERROR(*Status) && *Buffer) { |
FreePool (*Buffer); |
*Buffer = NULL; |
} |
return TryAgain; |
} |
EFI_MEMORY_DESCRIPTOR * |
LibMemoryMap ( |
OUT UINTN *NoEntries, |
OUT UINTN *MapKey, |
OUT UINTN *DescriptorSize, |
OUT UINT32 *DescriptorVersion |
) |
{ |
EFI_STATUS Status; |
EFI_MEMORY_DESCRIPTOR *Buffer; |
UINTN BufferSize; |
// |
// Initialize for GrowBuffer loop |
// |
Buffer = NULL; |
BufferSize = sizeof(EFI_MEMORY_DESCRIPTOR); |
// |
// Call the real function |
// |
while (GrowBuffer (&Status, (VOID **) &Buffer, BufferSize)) { |
Status = BS->GetMemoryMap (&BufferSize, Buffer, MapKey, DescriptorSize, DescriptorVersion); |
} |
// |
// Convert buffer size to NoEntries |
// |
if (!EFI_ERROR(Status)) { |
*NoEntries = BufferSize / *DescriptorSize; |
} |
return Buffer; |
} |
VOID * |
LibGetVariableAndSize ( |
IN CHAR16 *Name, |
IN EFI_GUID *VendorGuid, |
OUT UINTN *VarSize |
) |
{ |
EFI_STATUS Status; |
VOID *Buffer; |
UINTN BufferSize; |
// |
// Initialize for GrowBuffer loop |
// |
Buffer = NULL; |
BufferSize = 100; |
// |
// Call the real function |
// |
while (GrowBuffer (&Status, &Buffer, BufferSize)) { |
Status = RT->GetVariable ( |
Name, |
VendorGuid, |
NULL, |
&BufferSize, |
Buffer |
); |
} |
if (Buffer) { |
*VarSize = BufferSize; |
} else { |
*VarSize = 0; |
} |
return Buffer; |
} |
VOID * |
LibGetVariable ( |
IN CHAR16 *Name, |
IN EFI_GUID *VendorGuid |
) |
{ |
UINTN VarSize; |
return LibGetVariableAndSize (Name, VendorGuid, &VarSize); |
} |
EFI_STATUS |
LibDeleteVariable ( |
IN CHAR16 *VarName, |
IN EFI_GUID *VarGuid |
) |
{ |
VOID *VarBuf; |
EFI_STATUS Status; |
VarBuf = LibGetVariable(VarName,VarGuid); |
Status = EFI_NOT_FOUND; |
if (VarBuf) { |
// |
// Delete variable from Storage |
// |
Status = RT->SetVariable ( |
VarName, VarGuid, |
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE, |
0, NULL |
); |
ASSERT (!EFI_ERROR(Status)); |
FreePool(VarBuf); |
} |
return (Status); |
} |
EFI_STATUS |
LibInsertToTailOfBootOrder ( |
IN UINT16 BootOption, |
IN BOOLEAN OnlyInsertIfEmpty |
) |
{ |
UINT16 *BootOptionArray; |
UINT16 *NewBootOptionArray; |
UINTN VarSize; |
UINTN Index; |
EFI_STATUS Status; |
BootOptionArray = LibGetVariableAndSize (VarBootOrder, &EfiGlobalVariable, &VarSize); |
if (VarSize != 0 && OnlyInsertIfEmpty) { |
if (BootOptionArray) { |
FreePool (BootOptionArray); |
} |
return EFI_UNSUPPORTED; |
} |
VarSize += sizeof(UINT16); |
NewBootOptionArray = AllocatePool (VarSize); |
for (Index = 0; Index < ((VarSize/sizeof(UINT16)) - 1); Index++) { |
NewBootOptionArray[Index] = BootOptionArray[Index]; |
} |
// |
// Insert in the tail of the array |
// |
NewBootOptionArray[Index] = BootOption; |
Status = RT->SetVariable ( |
VarBootOrder, &EfiGlobalVariable, |
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE, |
VarSize, (VOID*) NewBootOptionArray |
); |
if (NewBootOptionArray) { |
FreePool (NewBootOptionArray); |
} |
if (BootOptionArray) { |
FreePool (BootOptionArray); |
} |
return Status; |
} |
BOOLEAN |
ValidMBR( |
IN MASTER_BOOT_RECORD *Mbr, |
IN EFI_BLOCK_IO *BlkIo |
) |
{ |
UINT32 StartingLBA, EndingLBA; |
UINT32 NewEndingLBA; |
INTN i, j; |
BOOLEAN ValidMbr; |
if (Mbr->Signature != MBR_SIGNATURE) { |
// |
// The BPB also has this signature, so it can not be used alone. |
// |
return FALSE; |
} |
ValidMbr = FALSE; |
for (i=0; i<MAX_MBR_PARTITIONS; i++) { |
if ( Mbr->Partition[i].OSIndicator == 0x00 || EXTRACT_UINT32(Mbr->Partition[i].SizeInLBA) == 0 ) { |
continue; |
} |
ValidMbr = TRUE; |
StartingLBA = EXTRACT_UINT32(Mbr->Partition[i].StartingLBA); |
EndingLBA = StartingLBA + EXTRACT_UINT32(Mbr->Partition[i].SizeInLBA) - 1; |
if (EndingLBA > BlkIo->Media->LastBlock) { |
// |
// Compatability Errata: |
// Some systems try to hide drive space with thier INT 13h driver |
// This does not hide space from the OS driver. This means the MBR |
// that gets created from DOS is smaller than the MBR created from |
// a real OS (NT & Win98). This leads to BlkIo->LastBlock being |
// wrong on some systems FDISKed by the OS. |
// |
// |
if (BlkIo->Media->LastBlock < MIN_MBR_DEVICE_SIZE) { |
// |
// If this is a very small device then trust the BlkIo->LastBlock |
// |
return FALSE; |
} |
if (EndingLBA > (BlkIo->Media->LastBlock + MBR_ERRATA_PAD)) { |
return FALSE; |
} |
} |
for (j=i+1; j<MAX_MBR_PARTITIONS; j++) { |
if (Mbr->Partition[j].OSIndicator == 0x00 || EXTRACT_UINT32(Mbr->Partition[j].SizeInLBA) == 0) { |
continue; |
} |
if ( EXTRACT_UINT32(Mbr->Partition[j].StartingLBA) >= StartingLBA && |
EXTRACT_UINT32(Mbr->Partition[j].StartingLBA) <= EndingLBA ) { |
// |
// The Start of this region overlaps with the i'th region |
// |
return FALSE; |
} |
NewEndingLBA = EXTRACT_UINT32(Mbr->Partition[j].StartingLBA) + EXTRACT_UINT32(Mbr->Partition[j].SizeInLBA) - 1; |
if ( NewEndingLBA >= StartingLBA && NewEndingLBA <= EndingLBA ) { |
// |
// The End of this region overlaps with the i'th region |
// |
return FALSE; |
} |
} |
} |
// |
// Non of the regions overlapped so MBR is O.K. |
// |
return ValidMbr; |
} |
UINT8 |
DecimaltoBCD( |
IN UINT8 DecValue |
) |
{ |
return RtDecimaltoBCD (DecValue); |
} |
UINT8 |
BCDtoDecimal( |
IN UINT8 BcdValue |
) |
{ |
return RtBCDtoDecimal (BcdValue); |
} |
EFI_STATUS |
LibGetSystemConfigurationTable( |
IN EFI_GUID *TableGuid, |
IN OUT VOID **Table |
) |
{ |
UINTN Index; |
for(Index=0;Index<ST->NumberOfTableEntries;Index++) { |
if (CompareGuid(TableGuid,&(ST->ConfigurationTable[Index].VendorGuid))==0) { |
*Table = ST->ConfigurationTable[Index].VendorTable; |
return EFI_SUCCESS; |
} |
} |
return EFI_NOT_FOUND; |
} |
CHAR16 * |
LibGetUiString ( |
IN EFI_HANDLE Handle, |
IN UI_STRING_TYPE StringType, |
IN ISO_639_2 *LangCode, |
IN BOOLEAN ReturnDevicePathStrOnMismatch |
) |
{ |
UI_INTERFACE *Ui; |
UI_STRING_TYPE Index; |
UI_STRING_ENTRY *Array; |
EFI_STATUS Status; |
Status = BS->HandleProtocol (Handle, &UiProtocol, (VOID *)&Ui); |
if (EFI_ERROR(Status)) { |
return (ReturnDevicePathStrOnMismatch) ? DevicePathToStr(DevicePathFromHandle(Handle)) : NULL; |
} |
// |
// Skip the first strings |
// |
for (Index = UiDeviceString, Array = Ui->Entry; Index < StringType; Index++, Array++) { |
while (Array->LangCode) { |
Array++; |
} |
} |
// |
// Search for the match |
// |
while (Array->LangCode) { |
if (strcmpa (Array->LangCode, LangCode) == 0) { |
return Array->UiString; |
} |
} |
return (ReturnDevicePathStrOnMismatch) ? DevicePathToStr(DevicePathFromHandle(Handle)) : NULL; |
} |
/tags/0.3.0/boot/arch/ia64/loader/gefi/lib/Makefile |
---|
0,0 → 1,47 |
# |
# Copyright (C) 1999-2001 Hewlett-Packard Co. |
# Contributed by David Mosberger <davidm@hpl.hp.com> |
# Contributed by Stephane Eranian <eranian@hpl.hp.com> |
# |
# This file is part of the gnu-efi package. |
# |
# GNU-EFI is free software; you can redistribute it and/or modify |
# it under the terms of the GNU General Public License as published by |
# the Free Software Foundation; either version 2, or (at your option) |
# any later version. |
# |
# GNU-EFI is distributed in the hope that it will be useful, |
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
# GNU General Public License for more details. |
# |
# You should have received a copy of the GNU General Public License |
# along with GNU-EFI; see the file COPYING. If not, write to the Free |
# Software Foundation, 59 Temple Place - Suite 330, Boston, MA |
# 02111-1307, USA. |
# |
include ../Make.defaults |
CDIR = $(TOPDIR)/.. |
FILES = boxdraw smbios console crc data debug dpath \ |
error event guid hand hw init lock \ |
misc print sread str \ |
runtime/rtlock runtime/efirtlib runtime/rtstr runtime/vm runtime/rtdata \ |
$(ARCH)/initplat $(ARCH)/math |
ifeq ($(ARCH),ia64) |
FILES += $(ARCH)/salpal $(ARCH)/palproc |
endif |
OBJS = $(FILES:%=%.o) |
libefi.a: libefi.a($(OBJS)) |
clean: |
rm -f libefi.a *~ $(OBJS) */*.o |
install: libefi.a |
mkdir -p $(INSTALLROOT)/lib |
$(INSTALL) -m 644 libefi.a $(INSTALLROOT)/lib/ |
include ../Make.rules |
/tags/0.3.0/boot/arch/ia64/loader/gefi/lib/print.c |
---|
0,0 → 1,1301 |
/*++ |
Copyright (c) 1998 Intel Corporation |
Module Name: |
print.c |
Abstract: |
Revision History |
--*/ |
#include "lib.h" |
#include "efistdarg.h" // !!! |
// |
// Declare runtime functions |
// |
#ifdef RUNTIME_CODE |
#pragma RUNTIME_CODE(DbgPrint) |
// For debugging.. |
/* |
#pragma RUNTIME_CODE(_Print) |
#pragma RUNTIME_CODE(PFLUSH) |
#pragma RUNTIME_CODE(PSETATTR) |
#pragma RUNTIME_CODE(PPUTC) |
#pragma RUNTIME_CODE(PGETC) |
#pragma RUNTIME_CODE(PITEM) |
#pragma RUNTIME_CODE(ValueToHex) |
#pragma RUNTIME_CODE(ValueToString) |
#pragma RUNTIME_CODE(TimeToString) |
*/ |
#endif |
// |
// |
// |
#define PRINT_STRING_LEN 200 |
#define PRINT_ITEM_BUFFER_LEN 100 |
typedef struct { |
BOOLEAN Ascii; |
UINTN Index; |
union { |
CHAR16 *pw; |
CHAR8 *pc; |
} un; |
} POINTER; |
#define pw un.pw |
#define pc un.pc |
typedef struct _pitem { |
POINTER Item; |
CHAR16 Scratch[PRINT_ITEM_BUFFER_LEN]; |
UINTN Width; |
UINTN FieldWidth; |
UINTN *WidthParse; |
CHAR16 Pad; |
BOOLEAN PadBefore; |
BOOLEAN Comma; |
BOOLEAN Long; |
} PRINT_ITEM; |
typedef struct _pstate { |
// Input |
POINTER fmt; |
va_list args; |
// Output |
CHAR16 *Buffer; |
CHAR16 *End; |
CHAR16 *Pos; |
UINTN Len; |
UINTN Attr; |
UINTN RestoreAttr; |
UINTN AttrNorm; |
UINTN AttrHighlight; |
UINTN AttrError; |
INTN (*Output)(VOID *context, CHAR16 *str); |
INTN (*SetAttr)(VOID *context, UINTN attr); |
VOID *Context; |
// Current item being formatted |
struct _pitem *Item; |
} PRINT_STATE; |
// |
// Internal fucntions |
// |
STATIC |
UINTN |
_Print ( |
IN PRINT_STATE *ps |
); |
STATIC |
UINTN |
_IPrint ( |
IN UINTN Column, |
IN UINTN Row, |
IN SIMPLE_TEXT_OUTPUT_INTERFACE *Out, |
IN CHAR16 *fmt, |
IN CHAR8 *fmta, |
IN va_list args |
); |
STATIC |
INTN |
_DbgOut ( |
IN VOID *Context, |
IN CHAR16 *Buffer |
); |
STATIC |
VOID |
PFLUSH ( |
IN OUT PRINT_STATE *ps |
); |
STATIC |
VOID |
PPUTC ( |
IN OUT PRINT_STATE *ps, |
IN CHAR16 c |
); |
STATIC |
VOID |
PITEM ( |
IN OUT PRINT_STATE *ps |
); |
STATIC |
CHAR16 |
PGETC ( |
IN POINTER *p |
); |
STATIC |
VOID |
PSETATTR ( |
IN OUT PRINT_STATE *ps, |
IN UINTN Attr |
); |
// |
// |
// |
INTN |
DbgPrint ( |
IN INTN mask, |
IN CHAR8 *fmt, |
... |
) |
/*++ |
Routine Description: |
Prints a formatted unicode string to the default StandardError console |
Arguments: |
mask - Bit mask of debug string. If a bit is set in the |
mask that is also set in EFIDebug the string is |
printed; otherwise, the string is not printed |
fmt - Format string |
Returns: |
Length of string printed to the StandardError console |
--*/ |
{ |
SIMPLE_TEXT_OUTPUT_INTERFACE *DbgOut; |
PRINT_STATE ps; |
va_list args; |
UINTN back; |
UINTN attr; |
UINTN SavedAttribute; |
if (!(EFIDebug & mask)) { |
return 0; |
} |
va_start (args, fmt); |
ZeroMem (&ps, sizeof(ps)); |
ps.Output = _DbgOut; |
ps.fmt.Ascii = TRUE; |
ps.fmt.pc = fmt; |
va_copy(ps.args, args); |
ps.Attr = EFI_TEXT_ATTR(EFI_LIGHTGRAY, EFI_RED); |
DbgOut = LibRuntimeDebugOut; |
if (!DbgOut) { |
DbgOut = ST->StdErr; |
} |
if (DbgOut) { |
ps.Attr = DbgOut->Mode->Attribute; |
ps.Context = DbgOut; |
ps.SetAttr = (INTN (*)(VOID *, UINTN)) DbgOut->SetAttribute; |
} |
SavedAttribute = ps.Attr; |
back = (ps.Attr >> 4) & 0xf; |
ps.AttrNorm = EFI_TEXT_ATTR(EFI_LIGHTGRAY, back); |
ps.AttrHighlight = EFI_TEXT_ATTR(EFI_WHITE, back); |
ps.AttrError = EFI_TEXT_ATTR(EFI_YELLOW, back); |
attr = ps.AttrNorm; |
if (mask & D_WARN) { |
attr = ps.AttrHighlight; |
} |
if (mask & D_ERROR) { |
attr = ps.AttrError; |
} |
if (ps.SetAttr) { |
ps.Attr = attr; |
ps.SetAttr (ps.Context, attr); |
} |
_Print (&ps); |
va_end (ps.args); |
va_end (args); |
// |
// Restore original attributes |
// |
if (ps.SetAttr) { |
ps.SetAttr (ps.Context, SavedAttribute); |
} |
return 0; |
} |
STATIC |
INTN |
_DbgOut ( |
IN VOID *Context, |
IN CHAR16 *Buffer |
) |
// Append string worker for DbgPrint |
{ |
SIMPLE_TEXT_OUTPUT_INTERFACE *DbgOut; |
DbgOut = Context; |
// if (!DbgOut && ST && ST->ConOut) { |
// DbgOut = ST->ConOut; |
// } |
if (DbgOut) { |
DbgOut->OutputString (DbgOut, Buffer); |
} |
return 0; |
} |
INTN |
_SPrint ( |
IN VOID *Context, |
IN CHAR16 *Buffer |
) |
// Append string worker for SPrint, PoolPrint and CatPrint |
{ |
UINTN len; |
POOL_PRINT *spc; |
spc = Context; |
len = StrLen(Buffer); |
// |
// Is the string is over the max truncate it |
// |
if (spc->len + len > spc->maxlen) { |
len = spc->maxlen - spc->len; |
} |
// |
// Append the new text |
// |
CopyMem (spc->str + spc->len, Buffer, len * sizeof(CHAR16)); |
spc->len += len; |
// |
// Null terminate it |
// |
if (spc->len < spc->maxlen) { |
spc->str[spc->len] = 0; |
} else if (spc->maxlen) { |
spc->str[spc->maxlen-1] = 0; |
} |
return 0; |
} |
INTN |
_PoolPrint ( |
IN VOID *Context, |
IN CHAR16 *Buffer |
) |
// Append string worker for PoolPrint and CatPrint |
{ |
UINTN newlen; |
POOL_PRINT *spc; |
spc = Context; |
newlen = spc->len + StrLen(Buffer) + 1; |
// |
// Is the string is over the max, grow the buffer |
// |
if (newlen > spc->maxlen) { |
// |
// Grow the pool buffer |
// |
newlen += PRINT_STRING_LEN; |
spc->maxlen = newlen; |
spc->str = ReallocatePool ( |
spc->str, |
spc->len * sizeof(CHAR16), |
spc->maxlen * sizeof(CHAR16) |
); |
if (!spc->str) { |
spc->len = 0; |
spc->maxlen = 0; |
} |
} |
// |
// Append the new text |
// |
return _SPrint (Context, Buffer); |
} |
VOID |
_PoolCatPrint ( |
IN CHAR16 *fmt, |
IN va_list args, |
IN OUT POOL_PRINT *spc, |
IN INTN (*Output)(VOID *context, CHAR16 *str) |
) |
// Dispath function for SPrint, PoolPrint, and CatPrint |
{ |
PRINT_STATE ps; |
ZeroMem (&ps, sizeof(ps)); |
ps.Output = Output; |
ps.Context = spc; |
ps.fmt.pw = fmt; |
va_copy(ps.args, args); |
_Print (&ps); |
va_end(ps.args); |
} |
UINTN |
SPrint ( |
OUT CHAR16 *Str, |
IN UINTN StrSize, |
IN CHAR16 *fmt, |
... |
) |
/*++ |
Routine Description: |
Prints a formatted unicode string to a buffer |
Arguments: |
Str - Output buffer to print the formatted string into |
StrSize - Size of Str. String is truncated to this size. |
A size of 0 means there is no limit |
fmt - The format string |
Returns: |
String length returned in buffer |
--*/ |
{ |
POOL_PRINT spc; |
va_list args; |
va_start (args, fmt); |
spc.str = Str; |
spc.maxlen = StrSize / sizeof(CHAR16) - 1; |
spc.len = 0; |
_PoolCatPrint (fmt, args, &spc, _SPrint); |
va_end (args); |
return spc.len; |
} |
CHAR16 * |
PoolPrint ( |
IN CHAR16 *fmt, |
... |
) |
/*++ |
Routine Description: |
Prints a formatted unicode string to allocated pool. The caller |
must free the resulting buffer. |
Arguments: |
fmt - The format string |
Returns: |
Allocated buffer with the formatted string printed in it. |
The caller must free the allocated buffer. The buffer |
allocation is not packed. |
--*/ |
{ |
POOL_PRINT spc; |
va_list args; |
ZeroMem (&spc, sizeof(spc)); |
va_start (args, fmt); |
_PoolCatPrint (fmt, args, &spc, _PoolPrint); |
va_end (args); |
return spc.str; |
} |
CHAR16 * |
CatPrint ( |
IN OUT POOL_PRINT *Str, |
IN CHAR16 *fmt, |
... |
) |
/*++ |
Routine Description: |
Concatenates a formatted unicode string to allocated pool. |
The caller must free the resulting buffer. |
Arguments: |
Str - Tracks the allocated pool, size in use, and |
amount of pool allocated. |
fmt - The format string |
Returns: |
Allocated buffer with the formatted string printed in it. |
The caller must free the allocated buffer. The buffer |
allocation is not packed. |
--*/ |
{ |
va_list args; |
va_start (args, fmt); |
_PoolCatPrint (fmt, args, Str, _PoolPrint); |
va_end (args); |
return Str->str; |
} |
UINTN |
Print ( |
IN CHAR16 *fmt, |
... |
) |
/*++ |
Routine Description: |
Prints a formatted unicode string to the default console |
Arguments: |
fmt - Format string |
Returns: |
Length of string printed to the console |
--*/ |
{ |
va_list args; |
UINTN back; |
va_start (args, fmt); |
back = _IPrint ((UINTN) -1, (UINTN) -1, ST->ConOut, fmt, NULL, args); |
va_end (args); |
return back; |
} |
UINTN |
VPrint ( |
IN CHAR16 *fmt, |
va_list args |
) |
/*++ |
Routine Description: |
Prints a formatted unicode string to the default console using a va_list |
Arguments: |
fmt - Format string |
args - va_list |
Returns: |
Length of string printed to the console |
--*/ |
{ |
return _IPrint ((UINTN) -1, (UINTN) -1, ST->ConOut, fmt, NULL, args); |
} |
UINTN |
PrintAt ( |
IN UINTN Column, |
IN UINTN Row, |
IN CHAR16 *fmt, |
... |
) |
/*++ |
Routine Description: |
Prints a formatted unicode string to the default console, at |
the supplied cursor position |
Arguments: |
Column, Row - The cursor position to print the string at |
fmt - Format string |
Returns: |
Length of string printed to the console |
--*/ |
{ |
va_list args; |
UINTN back; |
va_start (args, fmt); |
back = _IPrint (Column, Row, ST->ConOut, fmt, NULL, args); |
va_end (args); |
return back; |
} |
UINTN |
IPrint ( |
IN SIMPLE_TEXT_OUTPUT_INTERFACE *Out, |
IN CHAR16 *fmt, |
... |
) |
/*++ |
Routine Description: |
Prints a formatted unicode string to the specified console |
Arguments: |
Out - The console to print the string too |
fmt - Format string |
Returns: |
Length of string printed to the console |
--*/ |
{ |
va_list args; |
UINTN back; |
va_start (args, fmt); |
back = _IPrint ((UINTN) -1, (UINTN) -1, Out, fmt, NULL, args); |
va_end (args); |
return back; |
} |
UINTN |
IPrintAt ( |
IN SIMPLE_TEXT_OUTPUT_INTERFACE *Out, |
IN UINTN Column, |
IN UINTN Row, |
IN CHAR16 *fmt, |
... |
) |
/*++ |
Routine Description: |
Prints a formatted unicode string to the specified console, at |
the supplied cursor position |
Arguments: |
Out - The console to print the string too |
Column, Row - The cursor position to print the string at |
fmt - Format string |
Returns: |
Length of string printed to the console |
--*/ |
{ |
va_list args; |
UINTN back; |
va_start (args, fmt); |
back = _IPrint (Column, Row, ST->ConOut, fmt, NULL, args); |
va_end (args); |
return back; |
} |
UINTN |
_IPrint ( |
IN UINTN Column, |
IN UINTN Row, |
IN SIMPLE_TEXT_OUTPUT_INTERFACE *Out, |
IN CHAR16 *fmt, |
IN CHAR8 *fmta, |
IN va_list args |
) |
// Display string worker for: Print, PrintAt, IPrint, IPrintAt |
{ |
PRINT_STATE ps; |
UINTN back; |
ZeroMem (&ps, sizeof(ps)); |
ps.Context = Out; |
ps.Output = (INTN (*)(VOID *, CHAR16 *)) Out->OutputString; |
ps.SetAttr = (INTN (*)(VOID *, UINTN)) Out->SetAttribute; |
ps.Attr = Out->Mode->Attribute; |
back = (ps.Attr >> 4) & 0xF; |
ps.AttrNorm = EFI_TEXT_ATTR(EFI_LIGHTGRAY, back); |
ps.AttrHighlight = EFI_TEXT_ATTR(EFI_WHITE, back); |
ps.AttrError = EFI_TEXT_ATTR(EFI_YELLOW, back); |
if (fmt) { |
ps.fmt.pw = fmt; |
} else { |
ps.fmt.Ascii = TRUE; |
ps.fmt.pc = fmta; |
} |
va_copy(ps.args, args); |
if (Column != (UINTN) -1) { |
Out->SetCursorPosition(Out, Column, Row); |
} |
back = _Print (&ps); |
va_end(ps.args); |
return back; |
} |
UINTN |
APrint ( |
IN CHAR8 *fmt, |
... |
) |
/*++ |
Routine Description: |
For those whom really can't deal with unicode, a print |
function that takes an ascii format string |
Arguments: |
fmt - ascii format string |
Returns: |
Length of string printed to the console |
--*/ |
{ |
va_list args; |
UINTN back; |
va_start (args, fmt); |
back = _IPrint ((UINTN) -1, (UINTN) -1, ST->ConOut, NULL, fmt, args); |
va_end (args); |
return back; |
} |
STATIC |
VOID |
PFLUSH ( |
IN OUT PRINT_STATE *ps |
) |
{ |
*ps->Pos = 0; |
ps->Output(ps->Context, ps->Buffer); |
ps->Pos = ps->Buffer; |
} |
STATIC |
VOID |
PSETATTR ( |
IN OUT PRINT_STATE *ps, |
IN UINTN Attr |
) |
{ |
PFLUSH (ps); |
ps->RestoreAttr = ps->Attr; |
if (ps->SetAttr) { |
ps->SetAttr (ps->Context, Attr); |
} |
ps->Attr = Attr; |
} |
STATIC |
VOID |
PPUTC ( |
IN OUT PRINT_STATE *ps, |
IN CHAR16 c |
) |
{ |
// if this is a newline, add a carraige return |
if (c == '\n') { |
PPUTC (ps, '\r'); |
} |
*ps->Pos = c; |
ps->Pos += 1; |
ps->Len += 1; |
// if at the end of the buffer, flush it |
if (ps->Pos >= ps->End) { |
PFLUSH(ps); |
} |
} |
STATIC |
CHAR16 |
PGETC ( |
IN POINTER *p |
) |
{ |
CHAR16 c; |
c = p->Ascii ? p->pc[p->Index] : p->pw[p->Index]; |
p->Index += 1; |
return c; |
} |
STATIC |
VOID |
PITEM ( |
IN OUT PRINT_STATE *ps |
) |
{ |
UINTN Len, i; |
PRINT_ITEM *Item; |
CHAR16 c; |
// Get the length of the item |
Item = ps->Item; |
Item->Item.Index = 0; |
while (Item->Item.Index < Item->FieldWidth) { |
c = PGETC(&Item->Item); |
if (!c) { |
Item->Item.Index -= 1; |
break; |
} |
} |
Len = Item->Item.Index; |
// if there is no item field width, use the items width |
if (Item->FieldWidth == (UINTN) -1) { |
Item->FieldWidth = Len; |
} |
// if item is larger then width, update width |
if (Len > Item->Width) { |
Item->Width = Len; |
} |
// if pad field before, add pad char |
if (Item->PadBefore) { |
for (i=Item->Width; i < Item->FieldWidth; i+=1) { |
PPUTC (ps, ' '); |
} |
} |
// pad item |
for (i=Len; i < Item->Width; i++) { |
PPUTC (ps, Item->Pad); |
} |
// add the item |
Item->Item.Index=0; |
while (Item->Item.Index < Len) { |
PPUTC (ps, PGETC(&Item->Item)); |
} |
// If pad at the end, add pad char |
if (!Item->PadBefore) { |
for (i=Item->Width; i < Item->FieldWidth; i+=1) { |
PPUTC (ps, ' '); |
} |
} |
} |
STATIC |
UINTN |
_Print ( |
IN PRINT_STATE *ps |
) |
/*++ |
Routine Description: |
%w.lF - w = width |
l = field width |
F = format of arg |
Args F: |
0 - pad with zeros |
- - justify on left (default is on right) |
, - add comma's to field |
* - width provided on stack |
n - Set output attribute to normal (for this field only) |
h - Set output attribute to highlight (for this field only) |
e - Set output attribute to error (for this field only) |
l - Value is 64 bits |
a - ascii string |
s - unicode string |
X - fixed 8 byte value in hex |
x - hex value |
d - value as decimal |
c - Unicode char |
t - EFI time structure |
g - Pointer to GUID |
r - EFI status code (result code) |
N - Set output attribute to normal |
H - Set output attribute to highlight |
E - Set output attribute to error |
% - Print a % |
Arguments: |
SystemTable - The system table |
Returns: |
Number of charactors written |
--*/ |
{ |
CHAR16 c; |
UINTN Attr; |
PRINT_ITEM Item; |
CHAR16 Buffer[PRINT_STRING_LEN]; |
ps->Len = 0; |
ps->Buffer = Buffer; |
ps->Pos = Buffer; |
ps->End = Buffer + PRINT_STRING_LEN - 1; |
ps->Item = &Item; |
ps->fmt.Index = 0; |
while ((c = PGETC(&ps->fmt))) { |
if (c != '%') { |
PPUTC ( ps, c ); |
continue; |
} |
// setup for new item |
Item.FieldWidth = (UINTN) -1; |
Item.Width = 0; |
Item.WidthParse = &Item.Width; |
Item.Pad = ' '; |
Item.PadBefore = TRUE; |
Item.Comma = FALSE; |
Item.Long = FALSE; |
Item.Item.Ascii = FALSE; |
Item.Item.pw = NULL; |
ps->RestoreAttr = 0; |
Attr = 0; |
while ((c = PGETC(&ps->fmt))) { |
switch (c) { |
case '%': |
// |
// %% -> % |
// |
Item.Item.pw = Item.Scratch; |
Item.Item.pw[0] = '%'; |
Item.Item.pw[1] = 0; |
break; |
case '0': |
Item.Pad = '0'; |
break; |
case '-': |
Item.PadBefore = FALSE; |
break; |
case ',': |
Item.Comma = TRUE; |
break; |
case '.': |
Item.WidthParse = &Item.FieldWidth; |
break; |
case '*': |
*Item.WidthParse = va_arg(ps->args, UINTN); |
break; |
case '1': |
case '2': |
case '3': |
case '4': |
case '5': |
case '6': |
case '7': |
case '8': |
case '9': |
*Item.WidthParse = 0; |
do { |
*Item.WidthParse = *Item.WidthParse * 10 + c - '0'; |
c = PGETC(&ps->fmt); |
} while (c >= '0' && c <= '9') ; |
ps->fmt.Index -= 1; |
break; |
case 'a': |
Item.Item.pc = va_arg(ps->args, CHAR8 *); |
Item.Item.Ascii = TRUE; |
if (!Item.Item.pc) { |
Item.Item.pc = (CHAR8 *)"(null)"; |
} |
break; |
case 's': |
Item.Item.pw = va_arg(ps->args, CHAR16 *); |
if (!Item.Item.pw) { |
Item.Item.pw = L"(null)"; |
} |
break; |
case 'c': |
Item.Item.pw = Item.Scratch; |
Item.Item.pw[0] = (CHAR16) va_arg(ps->args, UINTN); |
Item.Item.pw[1] = 0; |
break; |
case 'l': |
Item.Long = TRUE; |
break; |
case 'X': |
Item.Width = Item.Long ? 16 : 8; |
Item.Pad = '0'; |
case 'x': |
Item.Item.pw = Item.Scratch; |
ValueToHex ( |
Item.Item.pw, |
Item.Long ? va_arg(ps->args, UINT64) : va_arg(ps->args, UINTN) |
); |
break; |
case 'g': |
Item.Item.pw = Item.Scratch; |
GuidToString (Item.Item.pw, va_arg(ps->args, EFI_GUID *)); |
break; |
case 'd': |
Item.Item.pw = Item.Scratch; |
ValueToString ( |
Item.Item.pw, |
Item.Comma, |
Item.Long ? va_arg(ps->args, UINT64) : va_arg(ps->args, UINTN) |
); |
break |
; |
case 't': |
Item.Item.pw = Item.Scratch; |
TimeToString (Item.Item.pw, va_arg(ps->args, EFI_TIME *)); |
break; |
case 'r': |
Item.Item.pw = Item.Scratch; |
StatusToString (Item.Item.pw, va_arg(ps->args, EFI_STATUS)); |
break; |
case 'n': |
PSETATTR(ps, ps->AttrNorm); |
break; |
case 'h': |
PSETATTR(ps, ps->AttrHighlight); |
break; |
case 'e': |
PSETATTR(ps, ps->AttrError); |
break; |
case 'N': |
Attr = ps->AttrNorm; |
break; |
case 'H': |
Attr = ps->AttrHighlight; |
break; |
case 'E': |
Attr = ps->AttrError; |
break; |
default: |
Item.Item.pw = Item.Scratch; |
Item.Item.pw[0] = '?'; |
Item.Item.pw[1] = 0; |
break; |
} |
// if we have an Item |
if (Item.Item.pw) { |
PITEM (ps); |
break; |
} |
// if we have an Attr set |
if (Attr) { |
PSETATTR(ps, Attr); |
ps->RestoreAttr = 0; |
break; |
} |
} |
if (ps->RestoreAttr) { |
PSETATTR(ps, ps->RestoreAttr); |
} |
} |
// Flush buffer |
PFLUSH (ps); |
return ps->Len; |
} |
STATIC CHAR8 Hex[] = {'0','1','2','3','4','5','6','7', |
'8','9','A','B','C','D','E','F'}; |
VOID |
ValueToHex ( |
IN CHAR16 *Buffer, |
IN UINT64 v |
) |
{ |
CHAR8 str[30], *p1; |
CHAR16 *p2; |
if (!v) { |
Buffer[0] = '0'; |
Buffer[1] = 0; |
return ; |
} |
p1 = str; |
p2 = Buffer; |
while (v) { |
*(p1++) = Hex[v & 0xf]; |
v = RShiftU64 (v, 4); |
} |
while (p1 != str) { |
*(p2++) = *(--p1); |
} |
*p2 = 0; |
} |
VOID |
ValueToString ( |
IN CHAR16 *Buffer, |
IN BOOLEAN Comma, |
IN INT64 v |
) |
{ |
STATIC CHAR8 ca[] = { 3, 1, 2 }; |
CHAR8 str[40], *p1; |
CHAR16 *p2; |
UINTN c, r; |
if (!v) { |
Buffer[0] = '0'; |
Buffer[1] = 0; |
return ; |
} |
p1 = str; |
p2 = Buffer; |
if (v < 0) { |
*(p2++) = '-'; |
v = -v; |
} |
while (v) { |
v = (INT64)DivU64x32 ((UINT64)v, 10, &r); |
*(p1++) = (CHAR8)r + '0'; |
} |
c = (Comma ? ca[(p1 - str) % 3] : 999) + 1; |
while (p1 != str) { |
c -= 1; |
if (!c) { |
*(p2++) = ','; |
c = 3; |
} |
*(p2++) = *(--p1); |
} |
*p2 = 0; |
} |
VOID |
TimeToString ( |
OUT CHAR16 *Buffer, |
IN EFI_TIME *Time |
) |
{ |
UINTN Hour, Year; |
CHAR16 AmPm; |
AmPm = 'a'; |
Hour = Time->Hour; |
if (Time->Hour == 0) { |
Hour = 12; |
} else if (Time->Hour >= 12) { |
AmPm = 'p'; |
if (Time->Hour >= 13) { |
Hour -= 12; |
} |
} |
Year = Time->Year % 100; |
// bugbug: for now just print it any old way |
SPrint (Buffer, 0, L"%02d/%02d/%02d %02d:%02d%c", |
Time->Month, |
Time->Day, |
Year, |
Hour, |
Time->Minute, |
AmPm |
); |
} |
VOID |
DumpHex ( |
IN UINTN Indent, |
IN UINTN Offset, |
IN UINTN DataSize, |
IN VOID *UserData |
) |
{ |
CHAR8 *Data, Val[50], Str[20], c; |
UINTN Size, Index; |
UINTN ScreenCount; |
UINTN TempColumn; |
UINTN ScreenSize; |
CHAR16 ReturnStr[1]; |
ST->ConOut->QueryMode (ST->ConOut, ST->ConOut->Mode->Mode, &TempColumn, &ScreenSize); |
ScreenCount = 0; |
ScreenSize -= 2; |
Data = UserData; |
while (DataSize) { |
Size = 16; |
if (Size > DataSize) { |
Size = DataSize; |
} |
for (Index=0; Index < Size; Index += 1) { |
c = Data[Index]; |
Val[Index*3+0] = Hex[c>>4]; |
Val[Index*3+1] = Hex[c&0xF]; |
Val[Index*3+2] = (Index == 7)?'-':' '; |
Str[Index] = (c < ' ' || c > 'z') ? '.' : c; |
} |
Val[Index*3] = 0; |
Str[Index] = 0; |
Print (L"%*a%X: %-.48a *%a*\n", Indent, "", Offset, Val, Str); |
Data += Size; |
Offset += Size; |
DataSize -= Size; |
ScreenCount++; |
if (ScreenCount >= ScreenSize && ScreenSize != 0) { |
// |
// If ScreenSize == 0 we have the console redirected so don't |
// block updates |
// |
ScreenCount = 0; |
Print (L"Press Enter to continue :"); |
Input (L"", ReturnStr, sizeof(ReturnStr)/sizeof(CHAR16)); |
Print (L"\n"); |
} |
} |
} |
/tags/0.3.0/boot/arch/ia64/loader/gefi/lib/smbios.c |
---|
0,0 → 1,126 |
/*++ |
Copyright (c) 2000 Intel Corporation |
Module Name: |
Smbios.c |
Abstract: |
Lib fucntions for SMBIOS. Used to get system serial number and GUID |
Revision History |
--*/ |
#include "lib.h" |
EFI_STATUS |
LibGetSmbiosSystemGuidAndSerialNumber ( |
IN EFI_GUID *SystemGuid, |
OUT CHAR8 **SystemSerialNumber |
) |
{ |
EFI_STATUS Status; |
SMBIOS_STRUCTURE_TABLE *SmbiosTable; |
SMBIOS_STRUCTURE_POINTER Smbios; |
SMBIOS_STRUCTURE_POINTER SmbiosEnd; |
UINT16 Index; |
Status = LibGetSystemConfigurationTable(&SMBIOSTableGuid, (VOID**)&SmbiosTable); |
if (EFI_ERROR(Status)) { |
return EFI_NOT_FOUND; |
} |
Smbios.Hdr = (SMBIOS_HEADER *)SmbiosTable->TableAddress; |
SmbiosEnd.Raw = (UINT8 *)(SmbiosTable->TableAddress + SmbiosTable->TableLength); |
for (Index = 0; Index < SmbiosTable->TableLength ; Index++) { |
if (Smbios.Hdr->Type == 1) { |
if (Smbios.Hdr->Length < 0x19) { |
// |
// Older version did not support Guid and Serial number |
// |
continue; |
} |
// |
// SMBIOS tables are byte packed so we need to do a byte copy to |
// prevend alignment faults on IA-64. |
CopyMem (SystemGuid, &Smbios.Type1->Uuid, sizeof(EFI_GUID)); |
*SystemSerialNumber = LibGetSmbiosString(&Smbios, Smbios.Type1->SerialNumber); |
return EFI_SUCCESS; |
} |
// |
// Make Smbios point to the next record |
// |
LibGetSmbiosString (&Smbios, -1); |
if (Smbios.Raw >= SmbiosEnd.Raw) { |
// |
// SMBIOS 2.1 incorrectly stated the length of SmbiosTable as 0x1e. |
// given this we must double check against the lenght of |
/// the structure. My home PC has this bug.ruthard |
// |
return EFI_SUCCESS; |
} |
} |
return EFI_SUCCESS; |
} |
CHAR8* |
LibGetSmbiosString ( |
IN SMBIOS_STRUCTURE_POINTER *Smbios, |
IN UINT16 StringNumber |
) |
/*++ |
Return SMBIOS string given the string number. |
Arguments: |
Smbios - Pointer to SMBIOS structure |
StringNumber - String number to return. -1 is used to skip all strings and |
point to the next SMBIOS structure. |
Returns: |
Pointer to string, or pointer to next SMBIOS strcuture if StringNumber == -1 |
--*/ |
{ |
UINT16 Index; |
CHAR8 *String; |
// |
// Skip over formatted section |
// |
String = (CHAR8 *)(Smbios->Raw + Smbios->Hdr->Length); |
// |
// Look through unformated section |
// |
for (Index = 1; Index <= StringNumber; Index++) { |
if (StringNumber == Index) { |
return String; |
} |
// |
// Skip string |
// |
for (; *String != 0; String++); |
String++; |
if (*String == 0) { |
// |
// If double NULL then we are done. |
// Retrun pointer to next structure in Smbios. |
// if you pass in a -1 you will always get here |
// |
Smbios->Raw = (UINT8 *)++String; |
return NULL; |
} |
} |
return NULL; |
} |
/tags/0.3.0/boot/arch/ia64/loader/gefi/ChangeLog |
---|
0,0 → 1,193 |
2006-03-21 Stephane Eranian <eranian@hpl.hp.com> |
* merged patch to support gcc-4.1 submitted by |
Raymund Will from Novell/SuSE |
2006-03-20 Stephane Eranian <eranian@hpl.hp.com> |
* updated ia-64 and ia-32 linker scripts to |
match latest gcc. The new gcc may put functions in |
.text* sections. patch submitted by H.J. Lu from Intel. |
2004-11-19 Stephane Eranian <eranian@hpl.hp.com> |
* added patch to ignore .eh_frame section for IA-32. Patch |
submitted by Jim Wilson |
2004-09-23 Stephane Eranian <eranian@hpl.hp.com> |
* added patch to discard unwind sections, newer toolchains |
complained about them. Patch submitted by Jesse Barnes from SGI. |
2003-09-29 Stephane Eranian <eranian@hpl.hp.com> |
* updated elf_ia64_efi.lds to reflect new data sections |
created by gcc-3.3. Patch provided by Andreas Schwab from Suse. |
2003-06-20 Stephane Eranian <eranian@hpl.hp.com> |
* updated elf_ia64_efi.lds and elf_ia32_efi.lds to include |
new types data sections produced by recent version of gcc-3.x |
2002-02-22 Stephane Eranian <eranian@hpl.hp.com> |
* release 3.0a |
* modified both IA-64 and IA-32 loader scripts to add support for the |
new .rodata sections names (such as rodata.str2.8). Required |
for new versions of gcc3.x. |
2001-06-20 Stephane Eranian <eranian@hpl.hp.com> |
* release 3.0 |
* split gnu-efi package in two different packages: the libary+include+crt and the bootloader. |
* removed W2U() hack and related files to get from wide-char to unicode. |
* Use -fshort-wchar option for unicode. |
* restructured Makefiles now install under INSTALLROOT. |
2001-04-06 Stephane Eranian <eranian@hpl.hp.com> |
* incorporated patches from David and Michael Johnston at Intel |
to get the package to compile for IA-32 linux target. |
* Fixed ELILO to compile for Ia-32 (does not execute yet, though): |
Makefile and start_kernel() function. |
2001-04-06 Andreas Schwab <schwab@suse.de> |
* Fixed config.c to |
get the timeout directive to do something. implemented the global |
root= directive. |
* Fix the efi_main() to deal with the -C option properly |
2001-04-05 Stephane Eranian <eranian@hpl.hp.com> |
* update efi library to latest EFI toolkit 1.02 as distributed |
by Intel. Fixed header + library files to compile with GCC |
* merged ELI and LILO (as of gnu-efi-1.1) together, mostly |
taking the config file feature of ELI. |
* renamed LILO to ELILO to make the distinction |
* restructured code to make it easier to understand and maintain |
* fixed FPSWA driver checking and loading: we try all possible |
files and let the driver itself figure out if it is the most |
recent. |
* added support for compression (gzip) but keep support for plain |
ELF image. ELILO autodetects the format |
* change the way the kernel is invoked. Now we call it in |
physical memory mode. This breaks the dependency between the |
kernel code and the loader. No more lilo_start.c madness. |
* changed the way the boot_params are passed. We don't use the |
ZERO_PAGE_ADDR trick anymore. Instead we use EFI runtime memory. |
The address of the structure is passed to the kernel in r28 |
by our convention. |
* released as gnu-efi-2.0 |
2001-04-03 David Mosberger <davidm@hpl.hp.com> |
* gnuefi/reloc_ia32.c (_relocate): Change return type from "void" |
to "int". Return error status if relocation fails for some |
reason. |
* gnuefi/elf_ia32_efi.lds: Drop unneeded ".rel.reloc" section. |
* gnuefi/crt0-efi-ia32.S (_start): Exit if _relocate() returns with |
non-zero exit status. |
* inc/ia32/efibind.h [__GNUC__]: Force 8-byte alignment for 64-bit |
types as that is what EFI appears to be expecting, despite the |
"#pragma pack()" at the beginning of the file! |
2001-03-29 David Mosberger <davidm@hpl.hp.com> |
* gnuefi/reloc_ia32.c: Add a couple of defines to work around |
libc/efilib collision on uint64_t et al. |
(_relocate): Use ELF32_R_TYPE() instead of ELFW(R_TYPE)(). |
* gnuefi/crt0-efi-ia32.S (dummy): Add a dummy relocation entry. |
2001-03-29 David Mosberger <davidm@hpl.hp.com> |
* gnuefi/reloc_ia32.c: Add a couple of defines to work around |
libc/efilib collision on uint64_t et al. |
(_relocate): Use ELF32_R_TYPE() instead of ELFW(R_TYPE)(). |
* gnuefi/crt0-efi-ia32.S (dummy): Add a dummy relocation entry. |
2000-10-26 David Mosberger <davidm@hpl.hp.com> |
* gnuefi/elf_ia64_efi.lds: Mention .rela.sdata. |
* Make.defaults (CFLAGS): Remove -nostdinc flags so we can pick |
up the C compiler's stdarg.h. |
* inc/stdarg.h: Remove this file. It's not correct for gcc (nor |
most other optimizing compilers). |
2000-10-10 Stephane Eranian <eranian@hpl.hp.com> |
* cleaned up the error message and printing of those. |
* added support to load the FPSWA from a file in case support is not |
present in the firmware already |
* fixed split_args() to do the right thing when you have leading spaces |
before kernel name |
* changed the argify() function to rely on \0 instead of LoadOptionSize |
as the field seems to be broken with current firmware |
* bumped version to 1.0 |
2000-10-04 David Mosberger <davidm@hpl.hp.com> |
* gnuefi/reloc_ia64.S: Reserve space for up to 750 function descriptors. |
* gnuefi/elf_ia64_efi.lds: Add .sdata section for small data and |
put __gp in the "middle" of it. |
* gnuefi/crt0-efi-ia64.S (_start): Use movl/add to load |
gp-relative addresses that could be out of the range of the addl |
offset. |
* gnuefi/reloc_ia64.S (_relocate): Ditto. |
* apps/Makefile: Remove standard rules and include Make.rules instead. |
* lilo/Makefile: Ditto. |
* Make.rules: New file. |
2000-08-04 Stephane Eranian <eranian@hpl.hp.com> |
* released version 0.9 |
* incorporated ACPI changes for Asuza by NEC < kouchi@hpc.bs1.fc.nec.co.jp> |
* added support for initrd (-i option) original ELI code from Bill Nottingham <notting@redhat.com>) |
* lots of cleanups |
* got rid of #ifdef LILO_DEBUG and uses macro instead |
* fix a few extra memory leaks in create_boot_params() |
* added exit capability just before starting the kernel |
2000-06-22 David Mosberger <davidm@hpl.hp.com> |
* gnuefi/elf_ia64_efi.lds: Add .srodata, .ctors, .IA64.unwind, |
.IA64.unwind_info to .data section and .rela.ctors to .rela |
section. |
2000-04-03 David Mosberger <davidm@hpl.hp.com> |
* lilo/lilo.c (LILO_VERSION): Up version number to 0.9. |
* gnuefi/elf_ia64_efi.lds: Include .IA_64.unwind and |
.IA_64.unwind_info in .data segment to avoid EFI load error |
"ImageAddress: pointer outside of image" error due to the .dynsym |
relocations against these sections. |
* ChangeLog: Moved from lilo/ChangeLogs. |
* gnuefi/reloc_ia64.S: fixed typo: .space directive had constant |
100 hardcoded instead of using MAX_FUNCTION_DESCRIPTORS |
macro. Duh. |
Fri Mar 17 15:19:18 PST 2000 Stephane Eranian <eranian@hpl.hp.com> |
* Released 0.8 |
* replace the getopt.c with new version free with better license |
* created a documentation file |
* fix a couple of memory leaks |
* code cleanups |
* created a separate directory for lilo in the gnu-efi package. |
* added support for the BOOT_IMAGE argument to kernel |
* default is to build natively now |
/tags/0.3.0/boot/arch/ia64/loader/gefi/README.gnuefi |
---|
0,0 → 1,392 |
------------------------------------------------- |
Building EFI Applications Using the GNU Toolchain |
------------------------------------------------- |
David Mosberger <davidm@hpl.hp.com> |
23 September 1999 |
Copyright (c) 1999-2003 Hewlett-Packard Co. |
Last update: 08/20/2003 |
* Introduction |
This document has two parts: the first part describes how to develop |
EFI applications for IA-64 and x86 using the GNU toolchain and the EFI |
development environment contained in this directory. The second part |
describes some of the more subtle aspects of how this development |
environment works. |
* Part 1: Developing EFI Applications |
** Prerequisites: |
To develop x86 EFI applications, the following tools are needed: |
- gcc-3.0 or newer (gcc 2.7.2 is NOT sufficient!) |
As of gnu-efi-3.0b, the Redhat 8.0 toolchain is known to work, |
but the Redhat 9.0 toolchain is not currently supported. |
- A version of "objcopy" that supports EFI applications. To |
check if your version includes EFI support, issue the |
command: |
objcopy --help |
and verify that the line "supported targets" contains the |
string "efi-app-ia32". |
- For debugging purposes, it's useful to have a version of |
"objdump" that supports EFI applications as well. This |
allows inspect and disassemble EFI binaries. |
To develop IA-64 EFI applications, the following tools are needed: |
- A version of gcc newer than July 30th 1999 (older versions |
had problems with generating position independent code). |
As of gnu-efi-3.0b, gcc-3.1 is known to work well. |
- A version of "objcopy" that supports EFI applications. To |
check if your version includes EFI support, issue the |
command: |
objcopy --help |
and verify that the line "supported targets" contains the |
string "efi-app-ia64". |
- For debugging purposes, it's useful to have a version of |
"objdump" that supports EFI applications as well. This |
allows inspect and disassemble EFI binaries. |
** Directory Structure |
This EFI development environment contains the following |
subdirectories: |
inc: This directory contains the EFI-related include files. The |
files are taken from Intel's EFI source distribution, except |
that various fixes were applied to make it compile with the |
GNU toolchain. |
lib: This directory contains the source code for Intel's EFI library. |
Again, the files are taken from Intel's EFI source |
distribution, with changes to make them compile with the GNU |
toolchain. |
gnuefi: This directory contains the glue necessary to convert ELF64 |
binaries to EFI binaries. Various runtime code bits, such as |
a self-relocator are included as well. This code has been |
contributed by the Hewlett-Packard Company and is distributed |
under the GNU GPL. |
apps: This directory contains a few simple EFI test apps. |
** Setup |
It is necessary to edit the Makefile in the directory containing this |
README file before EFI applications can be built. Specifically, you |
should verify that macros CC, AS, LD, AR, RANLIB, and OBJCOPY point to |
the appropriate compiler, assembler, linker, ar, and ranlib binaries, |
respectively. |
If you're working in a cross-development environment, be sure to set |
macro ARCH to the desired target architecture ("ia32" for x86, "ia64" |
for IA-64). For convenience, this can also be done from the make |
command line (e.g., "make ARCH=ia64"). |
** Building |
To build the sample EFI applications provided in subdirectory "apps", |
simply invoke "make" in the toplevel directory (the directory |
containing this README file). This should build lib/libefi.a and |
gnuefi/libgnuefi.a first and then all the EFI applications such as a |
apps/t6.efi. |
** Running |
Just copy the EFI application (e.g., apps/t6.efi) to the EFI |
filesystem, boot EFI, and then select "Invoke EFI application" to run |
the application you want to test. Alternatively, you can invoke the |
Intel-provided "nshell" application and then invoke your test binary |
via the command line interface that "nshell" provides. |
** Writing Your Own EFI Application |
Suppose you have your own EFI application in a file called |
"apps/myefiapp.c". To get this application built by the GNU EFI build |
environment, simply add "myefiapp.efi" to macro TARGETS in |
apps/Makefile. Once this is done, invoke "make" in the top level |
directory. This should result in EFI application apps/myefiapp.efi, |
ready for execution. |
The GNU EFI build environment allows to write EFI applications as |
described in Intel's EFI documentation, except for two differences: |
- The EFI application's entry point is always called "efi_main". The |
declaration of this routine is: |
EFI_STATUS efi_main (EFI_HANDLE image, EFI_SYSTEM_TABLE *systab); |
- UNICODE string literals must be written as W2U(L"Sample String") |
instead of just L"Sample String". The W2U() macro is defined in |
<efilib.h>. This header file also declares the function W2UCpy() |
which allows to convert a wide string into a UNICODE string and |
store the result in a programmer-supplied buffer. |
* Part 2: Inner Workings |
WARNING: This part contains all the gory detail of how the GNU EFI |
toolchain works. Normal users do not have to worry about such |
details. Reading this part incurs a definite risk of inducing severe |
headaches or other maladies. |
The basic idea behind the GNU EFI build environment is to use the GNU |
toolchain to build a normal ELF binary that, at the end, is converted |
to an EFI binary. EFI binaries are really just PE32+ binaries. PE |
stands for "Portable Executable" and is the object file format |
Microsoft is using on its Windows platforms. PE is basically the COFF |
object file format with an MS-DOS2.0 compatible header slapped on in |
front of it. The "32" in PE32+ stands for 32 bits, meaning that PE32 |
is a 32-bit object file format. The plus in "PE32+" indicates that |
this format has been hacked to allow loading a 4GB binary anywhere in |
a 64-bit address space (unlike ELF64, however, this is not a full |
64-bit object file format because the entire binary cannot span more |
than 4GB of address space). EFI binaries are plain PE32+ binaries |
except that the "subsystem id" differs from normal Windows binaries. |
There are two flavors of EFI binaries: "applications" and "drivers" |
and each has there own subsystem id and are identical otherwise. At |
present, the GNU EFI build environment supports the building of EFI |
applications only, though it would be trivial to generate drivers, as |
the only difference is the subsystem id. For more details on PE32+, |
see the spec at |
http://msdn.microsoft.com/library/specs/msdn_pecoff.htm. |
In theory, converting a suitable ELF64 binary to PE32+ is easy and |
could be accomplished with the "objcopy" utility by specifying option |
--target=efi-app-ia32 (x86) or --target=efi-app-ia64 (IA-64). But |
life never is that easy, so here some complicating factors: |
(1) COFF sections are very different from ELF sections. |
ELF binaries distinguish between program headers and sections. |
The program headers describe the memory segments that need to |
be loaded/initialized, whereas the sections describe what |
constitutes those segments. In COFF (and therefore PE32+) no |
such distinction is made. Thus, COFF sections need to be page |
aligned and have a size that is a multiple of the page size |
(4KB for EFI), whereas ELF allows sections at arbitrary |
addresses and with arbitrary sizes. |
(2) EFI binaries should be relocatable. |
Since EFI binaries are executed in physical mode, EFI cannot |
guarantee that a given binary can be loaded at its preferred |
address. EFI does _try_ to load a binary at it's preferred |
address, but if it can't do so, it will load it at another |
address and then relocate the binary using the contents of the |
.reloc section. |
(3) On IA-64, the EFI entry point needs to point to a function |
descriptor, not to the code address of the entry point. |
(4) The EFI specification assumes that wide characters use UNICODE |
encoding. |
ANSI C does not specify the size or encoding that a wide |
character uses. These choices are "implementation defined". |
On most UNIX systems, the GNU toolchain uses a wchar_t that is |
4 bytes in size. The encoding used for such characters is |
(mostly) UCS4. |
In the following sections, we address how the GNU EFI build |
environment addresses each of these issues. |
** (1) Accommodating COFF Sections |
In order to satisfy the COFF constraint of page-sized and page-aligned |
sections, the GNU EFI build environment uses the special linker script |
in gnuefi/elf_$(ARCH)_efi.lds where $(ARCH) is the target architecture |
("ia32" for x86, and "ia64" for IA-64). This script is set up to |
create only eight COFF section, each page aligned and page sized. |
These eight sections are used to group together the much greater |
number of sections that are typically present in ELF object files. |
Specifically: |
.hash |
Collects the ELF .hash info (this section _must_ be the first |
section in order to build a shared object file; the section is |
not actually loaded or used at runtime). |
.text |
Collects all sections containing executable code. |
.data |
Collects read-only and read-write data, literal string data, |
global offset tables, the uninitialized data segment (bss) and |
various other sections containing data. |
The reason read-only data is placed here instead of the in |
.text is to make it possible to disassemble the .text section |
without getting garbage due to read-only data. Besides, since |
EFI binaries execute in physical mode, differences in page |
protection do not matter. |
The reason the uninitialized data is placed in this section is |
that the EFI loader appears to be unable to handle sections |
that are allocated but not loaded from the binary. |
.dynamic, .dynsym, .rela, .rel, .reloc |
These sections contains the dynamic information necessary to |
self-relocate the binary (see below). |
A couple of more points worth noting about the linker script: |
o On IA-64, the global pointer symbol (__gp) needs to be placed such |
that the _entire_ EFI binary can be addressed using the signed |
22-bit offset that the "addl" instruction affords. Specifically, |
this means that __gp should be placed at ImageBase + 0x200000. |
Strictly speaking, only a couple of symbols need to be addressable |
in this fashion, so with some care it should be possible to build |
binaries much larger than 4MB. To get a list of symbols that need |
to be addressable in this fashion, grep the assembly files in |
directory gnuefi for the string "@gprel". |
o The link address (ImageBase) of the binary is (arbitrarily) set to |
zero. This could be set to something larger to increase the chance |
of EFI being able to load the binary without requiring relocation. |
However, a start address of 0 makes debugging a wee bit easier |
(great for those of us who can add, but not subtract... ;-). |
o The relocation related sections (.dynamic, .rel, .rela, .reloc) |
cannot be placed inside .data because some tools in the GNU |
toolchain rely on the existence of these sections. |
o Some sections in the ELF binary intentionally get dropped when |
building the EFI binary. Particularly noteworthy are the dynamic |
relocation sections for the .plabel and .reloc sections. It would |
be _wrong_ to include these sections in the EFI binary because it |
would result in .reloc and .plabel being relocated twice (once by |
the EFI loader and once by the self-relocator; see below for a |
description of the latter). Specifically, only the sections |
mentioned with the -j option in the final "objcopy" command are |
retained in the EFI binary (see apps/Makefile). |
** (2) Building Relocatable Binaries |
ELF binaries are normally linked for a fixed load address and are thus |
not relocatable. The only kind of ELF object that is relocatable are |
shared objects ("shared libraries"). However, even those objects are |
usually not completely position independent and therefore require |
runtime relocation by the dynamic loader. For example, IA-64 binaries |
normally require relocation of the global offset table. |
The approach to building relocatable binaries in the GNU EFI build |
environment is to: |
(a) build an ELF shared object |
(b) link it together with a self-relocator that takes care of |
applying the dynamic relocations that may be present in the |
ELF shared object |
(c) convert the resulting image to an EFI binary |
The self-relocator is of course architecture dependent. The x86 |
version can be found in gnuefi/reloc_ia32.c, the IA-64 version can be |
found in gnuefi/reloc_ia64.S. |
The self-relocator operates as follows: the startup code invokes it |
right after EFI has handed off control to the EFI binary at symbol |
"_start". Upon activation, the self-relocator searches the .dynamic |
section (whose starting address is given by symbol _DYNAMIC) for the |
dynamic relocation information, which can be found in the DT_REL, |
DT_RELSZ, and DT_RELENT entries of the dynamic table (DT_RELA, |
DT_RELASZ, and DT_RELAENT in the case of rela relocations, as is the |
case for IA-64). The dynamic relocation information points to the ELF |
relocation table. Once this table is found, the self-relocator walks |
through it, applying each relocation one by one. Since the EFI |
binaries are fully resolved shared objects, only a subset of all |
possible relocations need to be supported. Specifically, on x86 only |
the R_386_RELATIVE relocation is needed. On IA-64, the relocations |
R_IA64_DIR64LSB, R_IA64_REL64LSB, and R_IA64_FPTR64LSB are needed. |
Note that the R_IA64_FPTR64LSB relocation requires access to the |
dynamic symbol table. This is why the .dynsym section is included in |
the EFI binary. Another complication is that this relocation requires |
memory to hold the function descriptors (aka "procedure labels" or |
"plabels"). Each function descriptor uses 16 bytes of memory. The |
IA-64 self-relocator currently reserves a static memory area that can |
hold 100 of these descriptors. If the self-relocator runs out of |
space, it causes the EFI binary to fail with error code 5 |
(EFI_BUFFER_TOO_SMALL). When this happens, the manifest constant |
MAX_FUNCTION_DESCRIPTORS in gnuefi/reloc_ia64.S should be increased |
and the application recompiled. An easy way to count the number of |
function descriptors required by an EFI application is to run the |
command: |
objdump --dynamic-reloc example.so | fgrep FPTR64 | wc -l |
assuming "example" is the name of the desired EFI application. |
** (3) Creating the Function Descriptor for the IA-64 EFI Binaries |
As mentioned above, the IA-64 PE32+ format assumes that the entry |
point of the binary is a function descriptor. A function descriptors |
consists of two double words: the first one is the code entry point |
and the second is the global pointer that should be loaded before |
calling the entry point. Since the ELF toolchain doesn't know how to |
generate a function descriptor for the entry point, the startup code |
in gnuefi/crt0-efi-ia64.S crafts one manually by with the code: |
.section .plabel, "a" |
_start_plabel: |
data8 _start |
data8 __gp |
this places the procedure label for entry point _start in a section |
called ".plabel". Now, the only problem is that _start and __gp need |
to be relocated _before_ EFI hands control over to the EFI binary. |
Fortunately, PE32+ defines a section called ".reloc" that can achieve |
this. Thus, in addition to manually crafting the function descriptor, |
the startup code also crafts a ".reloc" section that has will cause |
the EFI loader to relocate the function descriptor before handing over |
control to the EFI binary (again, see the PECOFF spec mentioned above |
for details). |
A final question may be why .plabel and .reloc need to go in their own |
COFF sections. The answer is simply: we need to be able to discard |
the relocation entries that are generated for these sections. By |
placing them in these sections, the relocations end up in sections |
".rela.plabel" and ".rela.reloc" which makes it easy to filter them |
out in the filter script. Also, the ".reloc" section needs to be in |
its own section so that the objcopy program can recognize it and can |
create the correct directory entries in the PE32+ binary. |
** (4) Convenient and Portable Generation of UNICODE String Literals |
As of gnu-efi-3.0, we make use (and somewhat abuse) the gcc option |
that forces wide characters (WCHAR_T) to use short integers (2 bytes) |
instead of integers (4 bytes). This way we match the Unicode character |
size. By abuse, we mean that we rely on the fact that the regular ASCII |
characters are encoded the same way between (short) wide characters |
and Unicode and basically only use the first byte. This allows us |
to just use them interchangeably. |
The gcc option to force short wide characters is : -fshort-wchar |
* * * The End * * * |
/tags/0.3.0/boot/arch/ia64/loader/gefi/inc/efipart.h |
---|
0,0 → 1,61 |
#ifndef _EFI_PART_H |
#define _EFI_PART_H |
/*++ |
Copyright (c) 1998 Intel Corporation |
Module Name: |
efipart.h |
Abstract: |
Info about disk partitions and Master Boot Records |
Revision History |
--*/ |
// |
// |
// |
#define EFI_PARTITION 0xef |
#define MBR_SIZE 512 |
#pragma pack(1) |
typedef struct { |
UINT8 BootIndicator; |
UINT8 StartHead; |
UINT8 StartSector; |
UINT8 StartTrack; |
UINT8 OSIndicator; |
UINT8 EndHead; |
UINT8 EndSector; |
UINT8 EndTrack; |
UINT8 StartingLBA[4]; |
UINT8 SizeInLBA[4]; |
} MBR_PARTITION_RECORD; |
#define EXTRACT_UINT32(D) (UINT32)(D[0] | (D[1] << 8) | (D[2] << 16) | (D[3] << 24)) |
#define MBR_SIGNATURE 0xaa55 |
#define MIN_MBR_DEVICE_SIZE 0x80000 |
#define MBR_ERRATA_PAD 0x40000 // 128 MB |
#define MAX_MBR_PARTITIONS 4 |
typedef struct { |
UINT8 BootStrapCode[440]; |
UINT8 UniqueMbrSignature[4]; |
UINT8 Unknown[2]; |
MBR_PARTITION_RECORD Partition[MAX_MBR_PARTITIONS]; |
UINT16 Signature; |
} MASTER_BOOT_RECORD; |
#pragma pack() |
#endif |
/tags/0.3.0/boot/arch/ia64/loader/gefi/inc/efilib.h |
---|
0,0 → 1,879 |
#ifndef _EFILIB_INCLUDE_ |
#define _EFILIB_INCLUDE_ |
/*++ |
Copyright (c) 2000 Intel Corporation |
Module Name: |
efilib.h |
Abstract: |
EFI library functions |
Revision History |
--*/ |
#include "efidebug.h" |
#include "efipart.h" |
#include "efilibplat.h" |
#include "efilink.h" |
#include "efirtlib.h" |
#include "pci22.h" |
#include "libsmbios.h" |
// |
// Public read-only data in the EFI library |
// |
extern EFI_SYSTEM_TABLE *ST; |
extern EFI_BOOT_SERVICES *BS; |
extern EFI_RUNTIME_SERVICES *RT; |
extern EFI_GUID DevicePathProtocol; |
extern EFI_GUID LoadedImageProtocol; |
extern EFI_GUID TextInProtocol; |
extern EFI_GUID TextOutProtocol; |
extern EFI_GUID BlockIoProtocol; |
extern EFI_GUID DiskIoProtocol; |
extern EFI_GUID FileSystemProtocol; |
extern EFI_GUID LoadFileProtocol; |
extern EFI_GUID DeviceIoProtocol; |
extern EFI_GUID VariableStoreProtocol; |
extern EFI_GUID LegacyBootProtocol; |
extern EFI_GUID UnicodeCollationProtocol; |
extern EFI_GUID SerialIoProtocol; |
extern EFI_GUID VgaClassProtocol; |
extern EFI_GUID TextOutSpliterProtocol; |
extern EFI_GUID ErrorOutSpliterProtocol; |
extern EFI_GUID TextInSpliterProtocol; |
extern EFI_GUID SimpleNetworkProtocol; |
extern EFI_GUID PxeBaseCodeProtocol; |
extern EFI_GUID PxeCallbackProtocol; |
extern EFI_GUID NetworkInterfaceIdentifierProtocol; |
extern EFI_GUID UiProtocol; |
extern EFI_GUID InternalShellProtocol; |
extern EFI_GUID EfiGlobalVariable; |
extern EFI_GUID GenericFileInfo; |
extern EFI_GUID FileSystemInfo; |
extern EFI_GUID FileSystemVolumeLabelInfo; |
extern EFI_GUID PcAnsiProtocol; |
extern EFI_GUID Vt100Protocol; |
extern EFI_GUID NullGuid; |
extern EFI_GUID UnknownDevice; |
extern EFI_GUID EfiPartTypeSystemPartitionGuid; |
extern EFI_GUID EfiPartTypeLegacyMbrGuid; |
extern EFI_GUID MpsTableGuid; |
extern EFI_GUID AcpiTableGuid; |
extern EFI_GUID SMBIOSTableGuid; |
extern EFI_GUID SalSystemTableGuid; |
// |
// EFI Variable strings |
// |
#define LOAD_OPTION_ACTIVE 0x00000001 |
#define VarLanguageCodes L"LangCodes" |
#define VarLanguage L"Lang" |
#define VarTimeout L"Timeout" |
#define VarConsoleInp L"ConIn" |
#define VarConsoleOut L"ConOut" |
#define VarErrorOut L"ErrOut" |
#define VarBootOption L"Boot%04x" |
#define VarBootOrder L"BootOrder" |
#define VarBootNext L"BootNext" |
#define VarBootCurrent L"BootCurrent" |
#define VarDriverOption L"Driver%04x" |
#define VarDriverOrder L"DriverOrder" |
#define VarConsoleInpDev L"ConInDev" |
#define VarConsoleOutDev L"ConOutDev" |
#define VarErrorOutDev L"ErrOutDev" |
#define LanguageCodeEnglish "eng" |
extern EFI_DEVICE_PATH RootDevicePath[]; |
extern EFI_DEVICE_PATH EndDevicePath[]; |
extern EFI_DEVICE_PATH EndInstanceDevicePath[]; |
// |
// Other public data in the EFI library |
// |
extern EFI_MEMORY_TYPE PoolAllocationType; |
// |
// STATIC - Name is internal to the module |
// INTERNAL - Name is internal to the component (i.e., directory) |
// BOOTSERVCE - Name of a boot service function |
// |
#define STATIC |
#define INTERNAL |
#define BOOTSERVICE |
// |
// Prototypes |
// |
VOID |
InitializeLib ( |
IN EFI_HANDLE ImageHandle, |
IN EFI_SYSTEM_TABLE *SystemTable |
); |
VOID |
InitializeUnicodeSupport ( |
CHAR8 *LangCode |
); |
VOID |
EFIDebugVariable ( |
VOID |
); |
VOID |
SetCrc ( |
IN OUT EFI_TABLE_HEADER *Hdr |
); |
VOID |
SetCrcAltSize ( |
IN UINTN Size, |
IN OUT EFI_TABLE_HEADER *Hdr |
); |
BOOLEAN |
CheckCrc ( |
IN UINTN MaxSize, |
IN OUT EFI_TABLE_HEADER *Hdr |
); |
BOOLEAN |
CheckCrcAltSize ( |
IN UINTN MaxSize, |
IN UINTN Size, |
IN OUT EFI_TABLE_HEADER *Hdr |
); |
UINT32 |
CalculateCrc ( |
UINT8 *pt, |
UINTN Size |
); |
VOID |
ZeroMem ( |
IN VOID *Buffer, |
IN UINTN Size |
); |
VOID |
SetMem ( |
IN VOID *Buffer, |
IN UINTN Size, |
IN UINT8 Value |
); |
VOID |
CopyMem ( |
IN VOID *Dest, |
IN VOID *Src, |
IN UINTN len |
); |
INTN |
CompareMem ( |
IN VOID *Dest, |
IN VOID *Src, |
IN UINTN len |
); |
INTN |
StrCmp ( |
IN CHAR16 *s1, |
IN CHAR16 *s2 |
); |
INTN |
StrnCmp ( |
IN CHAR16 *s1, |
IN CHAR16 *s2, |
IN UINTN len |
); |
INTN |
StriCmp ( |
IN CHAR16 *s1, |
IN CHAR16 *s2 |
); |
VOID |
StrLwr ( |
IN CHAR16 *Str |
); |
VOID |
StrUpr ( |
IN CHAR16 *Str |
); |
VOID |
StrCpy ( |
IN CHAR16 *Dest, |
IN CHAR16 *Src |
); |
VOID |
StrCat ( |
IN CHAR16 *Dest, |
IN CHAR16 *Src |
); |
UINTN |
StrLen ( |
IN CHAR16 *s1 |
); |
UINTN |
StrSize ( |
IN CHAR16 *s1 |
); |
CHAR16 * |
StrDuplicate ( |
IN CHAR16 *Src |
); |
UINTN |
strlena ( |
IN CHAR8 *s1 |
); |
UINTN |
strcmpa ( |
IN CHAR8 *s1, |
IN CHAR8 *s2 |
); |
UINTN |
strncmpa ( |
IN CHAR8 *s1, |
IN CHAR8 *s2, |
IN UINTN len |
); |
UINTN |
xtoi ( |
CHAR16 *str |
); |
UINTN |
Atoi ( |
CHAR16 *str |
); |
BOOLEAN |
MetaMatch ( |
IN CHAR16 *String, |
IN CHAR16 *Pattern |
); |
BOOLEAN |
MetaiMatch ( |
IN CHAR16 *String, |
IN CHAR16 *Pattern |
); |
UINT64 |
LShiftU64 ( |
IN UINT64 Operand, |
IN UINTN Count |
); |
UINT64 |
RShiftU64 ( |
IN UINT64 Operand, |
IN UINTN Count |
); |
UINT64 |
MultU64x32 ( |
IN UINT64 Multiplicand, |
IN UINTN Multiplier |
); |
UINT64 |
DivU64x32 ( |
IN UINT64 Dividend, |
IN UINTN Divisor, |
OUT UINTN *Remainder OPTIONAL |
); |
VOID |
InitializeLock ( |
IN OUT FLOCK *Lock, |
IN EFI_TPL Priority |
); |
VOID |
AcquireLock ( |
IN FLOCK *Lock |
); |
VOID |
ReleaseLock ( |
IN FLOCK *Lock |
); |
INTN |
CompareGuid( |
IN EFI_GUID *Guid1, |
IN EFI_GUID *Guid2 |
); |
VOID * |
AllocatePool ( |
IN UINTN Size |
); |
VOID * |
AllocateZeroPool ( |
IN UINTN Size |
); |
VOID * |
ReallocatePool ( |
IN VOID *OldPool, |
IN UINTN OldSize, |
IN UINTN NewSize |
); |
VOID |
FreePool ( |
IN VOID *p |
); |
VOID |
Output ( |
IN CHAR16 *Str |
); |
VOID |
Input ( |
IN CHAR16 *Prompt OPTIONAL, |
OUT CHAR16 *InStr, |
IN UINTN StrLen |
); |
VOID |
IInput ( |
IN SIMPLE_TEXT_OUTPUT_INTERFACE *ConOut, |
IN SIMPLE_INPUT_INTERFACE *ConIn, |
IN CHAR16 *Prompt OPTIONAL, |
OUT CHAR16 *InStr, |
IN UINTN StrLen |
); |
UINTN |
Print ( |
IN CHAR16 *fmt, |
... |
); |
UINTN |
SPrint ( |
OUT CHAR16 *Str, |
IN UINTN StrSize, |
IN CHAR16 *fmt, |
... |
); |
CHAR16 * |
PoolPrint ( |
IN CHAR16 *fmt, |
... |
); |
typedef struct { |
CHAR16 *str; |
UINTN len; |
UINTN maxlen; |
} POOL_PRINT; |
CHAR16 * |
CatPrint ( |
IN OUT POOL_PRINT *Str, |
IN CHAR16 *fmt, |
... |
); |
UINTN |
PrintAt ( |
IN UINTN Column, |
IN UINTN Row, |
IN CHAR16 *fmt, |
... |
); |
UINTN |
IPrint ( |
IN SIMPLE_TEXT_OUTPUT_INTERFACE *Out, |
IN CHAR16 *fmt, |
... |
); |
UINTN |
IPrintAt ( |
IN SIMPLE_TEXT_OUTPUT_INTERFACE *Out, |
IN UINTN Column, |
IN UINTN Row, |
IN CHAR16 *fmt, |
... |
); |
UINTN |
APrint ( |
IN CHAR8 *fmt, |
... |
); |
VOID |
ValueToHex ( |
IN CHAR16 *Buffer, |
IN UINT64 v |
); |
VOID |
ValueToString ( |
IN CHAR16 *Buffer, |
IN BOOLEAN Comma, |
IN INT64 v |
); |
VOID |
TimeToString ( |
OUT CHAR16 *Buffer, |
IN EFI_TIME *Time |
); |
VOID |
GuidToString ( |
OUT CHAR16 *Buffer, |
IN EFI_GUID *Guid |
); |
VOID |
StatusToString ( |
OUT CHAR16 *Buffer, |
EFI_STATUS Status |
); |
VOID |
DumpHex ( |
IN UINTN Indent, |
IN UINTN Offset, |
IN UINTN DataSize, |
IN VOID *UserData |
); |
BOOLEAN |
GrowBuffer( |
IN OUT EFI_STATUS *Status, |
IN OUT VOID **Buffer, |
IN UINTN BufferSize |
); |
EFI_MEMORY_DESCRIPTOR * |
LibMemoryMap ( |
OUT UINTN *NoEntries, |
OUT UINTN *MapKey, |
OUT UINTN *DescriptorSize, |
OUT UINT32 *DescriptorVersion |
); |
VOID * |
LibGetVariable ( |
IN CHAR16 *Name, |
IN EFI_GUID *VendorGuid |
); |
VOID * |
LibGetVariableAndSize ( |
IN CHAR16 *Name, |
IN EFI_GUID *VendorGuid, |
OUT UINTN *VarSize |
); |
EFI_STATUS |
LibDeleteVariable ( |
IN CHAR16 *VarName, |
IN EFI_GUID *VarGuid |
); |
EFI_STATUS |
LibInsertToTailOfBootOrder ( |
IN UINT16 BootOption, |
IN BOOLEAN OnlyInsertIfEmpty |
); |
EFI_STATUS |
LibLocateProtocol ( |
IN EFI_GUID *ProtocolGuid, |
OUT VOID **Interface |
); |
EFI_STATUS |
LibLocateHandle ( |
IN EFI_LOCATE_SEARCH_TYPE SearchType, |
IN EFI_GUID *Protocol OPTIONAL, |
IN VOID *SearchKey OPTIONAL, |
IN OUT UINTN *NoHandles, |
OUT EFI_HANDLE **Buffer |
); |
EFI_STATUS |
LibLocateHandleByDiskSignature ( |
IN UINT8 MBRType, |
IN UINT8 SignatureType, |
IN VOID *Signature, |
IN OUT UINTN *NoHandles, |
OUT EFI_HANDLE **Buffer |
); |
EFI_STATUS |
LibInstallProtocolInterfaces ( |
IN OUT EFI_HANDLE *Handle, |
... |
); |
VOID |
LibUninstallProtocolInterfaces ( |
IN EFI_HANDLE Handle, |
... |
); |
EFI_STATUS |
LibReinstallProtocolInterfaces ( |
IN OUT EFI_HANDLE *Handle, |
... |
); |
EFI_EVENT |
LibCreateProtocolNotifyEvent ( |
IN EFI_GUID *ProtocolGuid, |
IN EFI_TPL NotifyTpl, |
IN EFI_EVENT_NOTIFY NotifyFunction, |
IN VOID *NotifyContext, |
OUT VOID *Registration |
); |
EFI_STATUS |
WaitForSingleEvent ( |
IN EFI_EVENT Event, |
IN UINT64 Timeout OPTIONAL |
); |
VOID |
WaitForEventWithTimeout ( |
IN EFI_EVENT Event, |
IN UINTN Timeout, |
IN UINTN Row, |
IN UINTN Column, |
IN CHAR16 *String, |
IN EFI_INPUT_KEY TimeoutKey, |
OUT EFI_INPUT_KEY *Key |
); |
EFI_FILE_HANDLE |
LibOpenRoot ( |
IN EFI_HANDLE DeviceHandle |
); |
EFI_FILE_INFO * |
LibFileInfo ( |
IN EFI_FILE_HANDLE FHand |
); |
EFI_FILE_SYSTEM_INFO * |
LibFileSystemInfo ( |
IN EFI_FILE_HANDLE FHand |
); |
EFI_FILE_SYSTEM_VOLUME_LABEL_INFO * |
LibFileSystemVolumeLabelInfo ( |
IN EFI_FILE_HANDLE FHand |
); |
BOOLEAN |
ValidMBR( |
IN MASTER_BOOT_RECORD *Mbr, |
IN EFI_BLOCK_IO *BlkIo |
); |
BOOLEAN |
LibMatchDevicePaths ( |
IN EFI_DEVICE_PATH *Multi, |
IN EFI_DEVICE_PATH *Single |
); |
EFI_DEVICE_PATH * |
LibDuplicateDevicePathInstance ( |
IN EFI_DEVICE_PATH *DevPath |
); |
EFI_DEVICE_PATH * |
DevicePathFromHandle ( |
IN EFI_HANDLE Handle |
); |
EFI_DEVICE_PATH * |
DevicePathInstance ( |
IN OUT EFI_DEVICE_PATH **DevicePath, |
OUT UINTN *Size |
); |
UINTN |
DevicePathInstanceCount ( |
IN EFI_DEVICE_PATH *DevicePath |
); |
EFI_DEVICE_PATH * |
AppendDevicePath ( |
IN EFI_DEVICE_PATH *Src1, |
IN EFI_DEVICE_PATH *Src2 |
); |
EFI_DEVICE_PATH * |
AppendDevicePathNode ( |
IN EFI_DEVICE_PATH *Src1, |
IN EFI_DEVICE_PATH *Src2 |
); |
EFI_DEVICE_PATH* |
AppendDevicePathInstance ( |
IN EFI_DEVICE_PATH *Src, |
IN EFI_DEVICE_PATH *Instance |
); |
EFI_DEVICE_PATH * |
FileDevicePath ( |
IN EFI_HANDLE Device OPTIONAL, |
IN CHAR16 *FileName |
); |
UINTN |
DevicePathSize ( |
IN EFI_DEVICE_PATH *DevPath |
); |
EFI_DEVICE_PATH * |
DuplicateDevicePath ( |
IN EFI_DEVICE_PATH *DevPath |
); |
EFI_DEVICE_PATH * |
UnpackDevicePath ( |
IN EFI_DEVICE_PATH *DevPath |
); |
EFI_STATUS |
LibDevicePathToInterface ( |
IN EFI_GUID *Protocol, |
IN EFI_DEVICE_PATH *FilePath, |
OUT VOID **Interface |
); |
CHAR16 * |
DevicePathToStr ( |
EFI_DEVICE_PATH *DevPath |
); |
// |
// BugBug: I need my own include files |
// |
typedef struct { |
UINT8 Register; |
UINT8 Function; |
UINT8 Device; |
UINT8 Bus; |
UINT32 Reserved; |
} EFI_ADDRESS; |
typedef union { |
UINT64 Address; |
EFI_ADDRESS EfiAddress; |
} EFI_PCI_ADDRESS_UNION; |
EFI_STATUS |
PciFindDeviceClass ( |
IN OUT EFI_PCI_ADDRESS_UNION *Address, |
IN UINT8 BaseClass, |
IN UINT8 SubClass |
); |
EFI_STATUS |
PciFindDevice ( |
IN OUT EFI_PCI_ADDRESS_UNION *DeviceAddress, |
IN UINT16 VendorId, |
IN UINT16 DeviceId, |
IN OUT PCI_TYPE00 *Pci |
); |
// |
// SIMPLE_READ_FILE object used to access files |
// |
typedef VOID *SIMPLE_READ_FILE; |
EFI_STATUS |
OpenSimpleReadFile ( |
IN BOOLEAN BootPolicy, |
IN VOID *SourceBuffer OPTIONAL, |
IN UINTN SourceSize, |
IN OUT EFI_DEVICE_PATH **FilePath, |
OUT EFI_HANDLE *DeviceHandle, |
OUT SIMPLE_READ_FILE *SimpleReadHandle |
); |
EFI_STATUS |
ReadSimpleReadFile ( |
IN SIMPLE_READ_FILE SimpleReadHandle, |
IN UINTN Offset, |
IN OUT UINTN *ReadSize, |
OUT VOID *Buffer |
); |
VOID |
CloseSimpleReadFile ( |
IN SIMPLE_READ_FILE SimpleReadHandle |
); |
VOID |
InitializeGuid ( |
VOID |
); |
UINT8 |
DecimaltoBCD( |
IN UINT8 DecValue |
); |
UINT8 |
BCDtoDecimal( |
IN UINT8 BcdValue |
); |
EFI_STATUS |
LibGetSystemConfigurationTable( |
IN EFI_GUID *TableGuid, |
IN OUT VOID **Table |
); |
BOOLEAN |
LibIsValidTextGraphics ( |
IN CHAR16 Graphic, |
OUT CHAR8 *PcAnsi, OPTIONAL |
OUT CHAR8 *Ascii OPTIONAL |
); |
BOOLEAN |
IsValidAscii ( |
IN CHAR16 Ascii |
); |
BOOLEAN |
IsValidEfiCntlChar ( |
IN CHAR16 c |
); |
CHAR16 * |
LibGetUiString ( |
IN EFI_HANDLE Handle, |
IN UI_STRING_TYPE StringType, |
IN ISO_639_2 *LangCode, |
IN BOOLEAN ReturnDevicePathStrOnMismatch |
); |
CHAR8* |
LibGetSmbiosString ( |
IN SMBIOS_STRUCTURE_POINTER *Smbios, |
IN UINT16 StringNumber |
); |
EFI_STATUS |
LibGetSmbiosSystemGuidAndSerialNumber ( |
IN EFI_GUID *SystemGuid, |
OUT CHAR8 **SystemSerialNumber |
); |
EFI_STATUS |
InitializeGlobalIoDevice ( |
IN EFI_DEVICE_PATH *DevicePath, |
IN EFI_GUID *Protocol, |
IN CHAR8 *ErrorStr, |
OUT EFI_DEVICE_IO_INTERFACE **GlobalIoFncs |
); |
UINT32 |
ReadPort ( |
IN EFI_DEVICE_IO_INTERFACE *GlobalIoFncs, |
IN EFI_IO_WIDTH Width, |
IN UINTN Port |
); |
UINT32 |
WritePort ( |
IN EFI_DEVICE_IO_INTERFACE *GlobalIoFncs, |
IN EFI_IO_WIDTH Width, |
IN UINTN Port, |
IN UINTN Data |
); |
UINT32 |
ReadPciConfig ( |
IN EFI_DEVICE_IO_INTERFACE *GlobalIoFncs, |
IN EFI_IO_WIDTH Width, |
IN UINTN Port |
); |
UINT32 |
WritePciConfig ( |
IN EFI_DEVICE_IO_INTERFACE *GlobalIoFncs, |
IN EFI_IO_WIDTH Width, |
IN UINTN Port, |
IN UINTN Data |
); |
extern EFI_DEVICE_IO_INTERFACE *GlobalIoFncs; |
#define outp(_Port, _DataByte) (UINT8)WritePort(GlobalIoFncs, IO_UINT8, (UINTN)_Port, (UINTN)_DataByte) |
#define inp(_Port) (UINT8)ReadPort(GlobalIoFncs, IO_UINT8, (UINTN)_Port) |
#define outpw(_Port, _DataByte) (UINT16)WritePort(GlobalIoFncs, IO_UINT16, (UINTN)_Port, (UINTN)_DataByte) |
#define inpw(_Port) (UINT16)ReadPort(GlobalIoFncs, IO_UINT16, (UINTN)_Port) |
#define outpd(_Port, _DataByte) (UINT32)WritePort(GlobalIoFncs, IO_UINT32, (UINTN)_Port, (UINTN)_DataByte) |
#define inpd(_Port) (UINT32)ReadPort(GlobalIoFncs, IO_UINT32, (UINTN)_Port) |
#define writepci8(_Addr, _DataByte) (UINT8)WritePciConfig(GlobalIoFncs, IO_UINT8, (UINTN)_Addr, (UINTN)_DataByte) |
#define readpci8(_Addr) (UINT8)ReadPciConfig(GlobalIoFncs, IO_UINT8, (UINTN)_Addr) |
#define writepci16(_Addr, _DataByte) (UINT16)WritePciConfig(GlobalIoFncs, IO_UINT16, (UINTN)_Addr, (UINTN)_DataByte) |
#define readpci16(_Addr) (UINT16)ReadPciConfig(GlobalIoFncs, IO_UINT16, (UINTN)_Addr) |
#define writepci32(_Addr, _DataByte) (UINT32)WritePciConfig(GlobalIoFncs, IO_UINT32, (UINTN)_Addr, (UINTN)_DataByte) |
#define readpci32(_Addr) (UINT32)ReadPciConfig(GlobalIoFncs, IO_UINT32, (UINTN)_Addr) |
#define Pause() WaitForSingleEvent (ST->ConIn->WaitForKey, 0) |
#define Port80(_PostCode) GlobalIoFncs->Io.Write (GlobalIoFncs, IO_UINT16, (UINT64)0x80, 1, &(_PostCode)) |
#endif |
/tags/0.3.0/boot/arch/ia64/loader/gefi/inc/inc.mak |
---|
0,0 → 1,19 |
INC_DEPS = $(INC_DEPS) \ |
efi.h \ |
efiapi.h \ |
efibind.h \ |
eficon.h \ |
efidebug.h \ |
efidef.h \ |
efidevp.h \ |
efierr.h \ |
efifs.h \ |
efilib.h \ |
efipart.h \ |
efiprot.h \ |
efipxe.h \ |
efivar.h \ |
pe.h \ |
stdarg.h |
/tags/0.3.0/boot/arch/ia64/loader/gefi/inc/efifs.h |
---|
0,0 → 1,116 |
#ifndef _EFI_FS_H |
#define _EFI_FS_H |
/*++ |
Copyright (c) 1998 Intel Corporation |
Module Name: |
efifs.h |
Abstract: |
EFI File System structures |
Revision History |
--*/ |
// |
// EFI Partition header (normaly starts in LBA 1) |
// |
#define EFI_PARTITION_SIGNATURE 0x5053595320494249 |
#define EFI_PARTITION_REVISION 0x00010001 |
#define MIN_EFI_PARTITION_BLOCK_SIZE 512 |
#define EFI_PARTITION_LBA 1 |
typedef struct _EFI_PARTITION_HEADER { |
EFI_TABLE_HEADER Hdr; |
UINT32 DirectoryAllocationNumber; |
UINT32 BlockSize; |
EFI_LBA FirstUsableLba; |
EFI_LBA LastUsableLba; |
EFI_LBA UnusableSpace; |
EFI_LBA FreeSpace; |
EFI_LBA RootFile; |
EFI_LBA SecutiryFile; |
} EFI_PARTITION_HEADER; |
// |
// File header |
// |
#define EFI_FILE_HEADER_SIGNATURE 0x454c494620494249 |
#define EFI_FILE_HEADER_REVISION 0x00010000 |
#define EFI_FILE_STRING_SIZE 260 |
typedef struct _EFI_FILE_HEADER { |
EFI_TABLE_HEADER Hdr; |
UINT32 Class; |
UINT32 LBALOffset; |
EFI_LBA Parent; |
UINT64 FileSize; |
UINT64 FileAttributes; |
EFI_TIME FileCreateTime; |
EFI_TIME FileModificationTime; |
EFI_GUID VendorGuid; |
CHAR16 FileString[EFI_FILE_STRING_SIZE]; |
} EFI_FILE_HEADER; |
// |
// Return the file's first LBAL which is in the same |
// logical block as the file header |
// |
#define EFI_FILE_LBAL(a) ((EFI_LBAL *) (((CHAR8 *) (a)) + (a)->LBALOffset)) |
#define EFI_FILE_CLASS_FREE_SPACE 1 |
#define EFI_FILE_CLASS_EMPTY 2 |
#define EFI_FILE_CLASS_NORMAL 3 |
// |
// Logical Block Address List - the fundemental block |
// description structure |
// |
#define EFI_LBAL_SIGNATURE 0x4c41424c20494249 |
#define EFI_LBAL_REVISION 0x00010000 |
typedef struct _EFI_LBAL { |
EFI_TABLE_HEADER Hdr; |
UINT32 Class; |
EFI_LBA Parent; |
EFI_LBA Next; |
UINT32 ArraySize; |
UINT32 ArrayCount; |
} EFI_LBAL; |
// Array size |
#define EFI_LBAL_ARRAY_SIZE(lbal,offs,blks) \ |
(((blks) - (offs) - (lbal)->Hdr.HeaderSize) / sizeof(EFI_RL)) |
// |
// Logical Block run-length |
// |
typedef struct { |
EFI_LBA Start; |
UINT64 Length; |
} EFI_RL; |
// |
// Return the run-length structure from an LBAL header |
// |
#define EFI_LBAL_RL(a) ((EFI_RL*) (((CHAR8 *) (a)) + (a)->Hdr.HeaderSize)) |
#endif |
/tags/0.3.0/boot/arch/ia64/loader/gefi/inc/efiapi.h |
---|
0,0 → 1,720 |
#ifndef _EFI_API_H |
#define _EFI_API_H |
/*++ |
Copyright (c) 1998 Intel Corporation |
Module Name: |
efiapi.h |
Abstract: |
Global EFI runtime & boot service interfaces |
Revision History |
--*/ |
// |
// EFI Specification Revision |
// |
#define EFI_SPECIFICATION_MAJOR_REVISION 1 |
#define EFI_SPECIFICATION_MINOR_REVISION 02 |
// |
// Declare forward referenced data structures |
// |
INTERFACE_DECL(_EFI_SYSTEM_TABLE); |
// |
// EFI Memory |
// |
typedef |
EFI_STATUS |
(EFIAPI *EFI_ALLOCATE_PAGES) ( |
IN EFI_ALLOCATE_TYPE Type, |
IN EFI_MEMORY_TYPE MemoryType, |
IN UINTN NoPages, |
OUT EFI_PHYSICAL_ADDRESS *Memory |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_FREE_PAGES) ( |
IN EFI_PHYSICAL_ADDRESS Memory, |
IN UINTN NoPages |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_GET_MEMORY_MAP) ( |
IN OUT UINTN *MemoryMapSize, |
IN OUT EFI_MEMORY_DESCRIPTOR *MemoryMap, |
OUT UINTN *MapKey, |
OUT UINTN *DescriptorSize, |
OUT UINT32 *DescriptorVersion |
); |
#define NextMemoryDescriptor(Ptr,Size) ((EFI_MEMORY_DESCRIPTOR *) (((UINT8 *) Ptr) + Size)) |
typedef |
EFI_STATUS |
(EFIAPI *EFI_ALLOCATE_POOL) ( |
IN EFI_MEMORY_TYPE PoolType, |
IN UINTN Size, |
OUT VOID **Buffer |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_FREE_POOL) ( |
IN VOID *Buffer |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_SET_VIRTUAL_ADDRESS_MAP) ( |
IN UINTN MemoryMapSize, |
IN UINTN DescriptorSize, |
IN UINT32 DescriptorVersion, |
IN EFI_MEMORY_DESCRIPTOR *VirtualMap |
); |
#define EFI_OPTIONAL_PTR 0x00000001 |
#define EFI_INTERNAL_FNC 0x00000002 // Pointer to internal runtime fnc |
#define EFI_INTERNAL_PTR 0x00000004 // Pointer to internal runtime data |
typedef |
EFI_STATUS |
(EFIAPI *EFI_CONVERT_POINTER) ( |
IN UINTN DebugDisposition, |
IN OUT VOID **Address |
); |
// |
// EFI Events |
// |
#define EVT_TIMER 0x80000000 |
#define EVT_RUNTIME 0x40000000 |
#define EVT_RUNTIME_CONTEXT 0x20000000 |
#define EVT_NOTIFY_WAIT 0x00000100 |
#define EVT_NOTIFY_SIGNAL 0x00000200 |
#define EVT_SIGNAL_EXIT_BOOT_SERVICES 0x00000201 |
#define EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE 0x60000202 |
#define EVT_EFI_SIGNAL_MASK 0x000000FF |
#define EVT_EFI_SIGNAL_MAX 2 |
typedef |
VOID |
(EFIAPI *EFI_EVENT_NOTIFY) ( |
IN EFI_EVENT Event, |
IN VOID *Context |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_CREATE_EVENT) ( |
IN UINT32 Type, |
IN EFI_TPL NotifyTpl, |
IN EFI_EVENT_NOTIFY NotifyFunction, |
IN VOID *NotifyContext, |
OUT EFI_EVENT *Event |
); |
typedef enum { |
TimerCancel, |
TimerPeriodic, |
TimerRelative, |
TimerTypeMax |
} EFI_TIMER_DELAY; |
typedef |
EFI_STATUS |
(EFIAPI *EFI_SET_TIMER) ( |
IN EFI_EVENT Event, |
IN EFI_TIMER_DELAY Type, |
IN UINT64 TriggerTime |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_SIGNAL_EVENT) ( |
IN EFI_EVENT Event |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_WAIT_FOR_EVENT) ( |
IN UINTN NumberOfEvents, |
IN EFI_EVENT *Event, |
OUT UINTN *Index |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_CLOSE_EVENT) ( |
IN EFI_EVENT Event |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_CHECK_EVENT) ( |
IN EFI_EVENT Event |
); |
// |
// Task priority level |
// |
#define TPL_APPLICATION 4 |
#define TPL_CALLBACK 8 |
#define TPL_NOTIFY 16 |
#define TPL_HIGH_LEVEL 31 |
typedef |
EFI_TPL |
(EFIAPI *EFI_RAISE_TPL) ( |
IN EFI_TPL NewTpl |
); |
typedef |
VOID |
(EFIAPI *EFI_RESTORE_TPL) ( |
IN EFI_TPL OldTpl |
); |
// |
// EFI platform varibles |
// |
#define EFI_GLOBAL_VARIABLE \ |
{ 0x8BE4DF61, 0x93CA, 0x11d2, {0xAA, 0x0D, 0x00, 0xE0, 0x98, 0x03, 0x2B, 0x8C} } |
// Variable attributes |
#define EFI_VARIABLE_NON_VOLATILE 0x00000001 |
#define EFI_VARIABLE_BOOTSERVICE_ACCESS 0x00000002 |
#define EFI_VARIABLE_RUNTIME_ACCESS 0x00000004 |
// Variable size limitation |
#define EFI_MAXIMUM_VARIABLE_SIZE 1024 |
typedef |
EFI_STATUS |
(EFIAPI *EFI_GET_VARIABLE) ( |
IN CHAR16 *VariableName, |
IN EFI_GUID *VendorGuid, |
OUT UINT32 *Attributes OPTIONAL, |
IN OUT UINTN *DataSize, |
OUT VOID *Data |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_GET_NEXT_VARIABLE_NAME) ( |
IN OUT UINTN *VariableNameSize, |
IN OUT CHAR16 *VariableName, |
IN OUT EFI_GUID *VendorGuid |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_SET_VARIABLE) ( |
IN CHAR16 *VariableName, |
IN EFI_GUID *VendorGuid, |
IN UINT32 Attributes, |
IN UINTN DataSize, |
IN VOID *Data |
); |
// |
// EFI Time |
// |
typedef struct { |
UINT32 Resolution; // 1e-6 parts per million |
UINT32 Accuracy; // hertz |
BOOLEAN SetsToZero; // Set clears sub-second time |
} EFI_TIME_CAPABILITIES; |
typedef |
EFI_STATUS |
(EFIAPI *EFI_GET_TIME) ( |
OUT EFI_TIME *Time, |
OUT EFI_TIME_CAPABILITIES *Capabilities OPTIONAL |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_SET_TIME) ( |
IN EFI_TIME *Time |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_GET_WAKEUP_TIME) ( |
OUT BOOLEAN *Enabled, |
OUT BOOLEAN *Pending, |
OUT EFI_TIME *Time |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_SET_WAKEUP_TIME) ( |
IN BOOLEAN Enable, |
IN EFI_TIME *Time OPTIONAL |
); |
// |
// Image functions |
// |
// PE32+ Subsystem type for EFI images |
#if !defined(IMAGE_SUBSYSTEM_EFI_APPLICATION) |
#define IMAGE_SUBSYSTEM_EFI_APPLICATION 10 |
#define IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER 11 |
#define IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER 12 |
#endif |
// PE32+ Machine type for EFI images |
#if !defined(EFI_IMAGE_MACHINE_IA32) |
#define EFI_IMAGE_MACHINE_IA32 0x014c |
#endif |
#if !defined(EFI_IMAGE_MACHINE_IA64) |
#define EFI_IMAGE_MACHINE_IA64 0x0200 |
#endif |
// Image Entry prototype |
typedef |
EFI_STATUS |
(EFIAPI *EFI_IMAGE_ENTRY_POINT) ( |
IN EFI_HANDLE ImageHandle, |
IN struct _EFI_SYSTEM_TABLE *SystemTable |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_IMAGE_LOAD) ( |
IN BOOLEAN BootPolicy, |
IN EFI_HANDLE ParentImageHandle, |
IN EFI_DEVICE_PATH *FilePath, |
IN VOID *SourceBuffer OPTIONAL, |
IN UINTN SourceSize, |
OUT EFI_HANDLE *ImageHandle |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_IMAGE_START) ( |
IN EFI_HANDLE ImageHandle, |
OUT UINTN *ExitDataSize, |
OUT CHAR16 **ExitData OPTIONAL |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_EXIT) ( |
IN EFI_HANDLE ImageHandle, |
IN EFI_STATUS ExitStatus, |
IN UINTN ExitDataSize, |
IN CHAR16 *ExitData OPTIONAL |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_IMAGE_UNLOAD) ( |
IN EFI_HANDLE ImageHandle |
); |
// Image handle |
#define LOADED_IMAGE_PROTOCOL \ |
{ 0x5B1B31A1, 0x9562, 0x11d2, {0x8E, 0x3F, 0x00, 0xA0, 0xC9, 0x69, 0x72, 0x3B} } |
#define EFI_IMAGE_INFORMATION_REVISION 0x1000 |
typedef struct { |
UINT32 Revision; |
EFI_HANDLE ParentHandle; |
struct _EFI_SYSTEM_TABLE *SystemTable; |
// Source location of image |
EFI_HANDLE DeviceHandle; |
EFI_DEVICE_PATH *FilePath; |
VOID *Reserved; |
// Images load options |
UINT32 LoadOptionsSize; |
VOID *LoadOptions; |
// Location of where image was loaded |
VOID *ImageBase; |
UINT64 ImageSize; |
EFI_MEMORY_TYPE ImageCodeType; |
EFI_MEMORY_TYPE ImageDataType; |
// If the driver image supports a dynamic unload request |
EFI_IMAGE_UNLOAD Unload; |
} EFI_LOADED_IMAGE; |
typedef |
EFI_STATUS |
(EFIAPI *EFI_EXIT_BOOT_SERVICES) ( |
IN EFI_HANDLE ImageHandle, |
IN UINTN MapKey |
); |
// |
// Misc |
// |
typedef |
EFI_STATUS |
(EFIAPI *EFI_STALL) ( |
IN UINTN Microseconds |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_SET_WATCHDOG_TIMER) ( |
IN UINTN Timeout, |
IN UINT64 WatchdogCode, |
IN UINTN DataSize, |
IN CHAR16 *WatchdogData OPTIONAL |
); |
typedef enum { |
EfiResetCold, |
EfiResetWarm |
} EFI_RESET_TYPE; |
typedef |
EFI_STATUS |
(EFIAPI *EFI_RESET_SYSTEM) ( |
IN EFI_RESET_TYPE ResetType, |
IN EFI_STATUS ResetStatus, |
IN UINTN DataSize, |
IN CHAR16 *ResetData OPTIONAL |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_GET_NEXT_MONOTONIC_COUNT) ( |
OUT UINT64 *Count |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_GET_NEXT_HIGH_MONO_COUNT) ( |
OUT UINT32 *HighCount |
); |
// |
// Protocol handler functions |
// |
typedef enum { |
EFI_NATIVE_INTERFACE, |
EFI_PCODE_INTERFACE |
} EFI_INTERFACE_TYPE; |
typedef |
EFI_STATUS |
(EFIAPI *EFI_INSTALL_PROTOCOL_INTERFACE) ( |
IN OUT EFI_HANDLE *Handle, |
IN EFI_GUID *Protocol, |
IN EFI_INTERFACE_TYPE InterfaceType, |
IN VOID *Interface |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_REINSTALL_PROTOCOL_INTERFACE) ( |
IN EFI_HANDLE Handle, |
IN EFI_GUID *Protocol, |
IN VOID *OldInterface, |
IN VOID *NewInterface |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_UNINSTALL_PROTOCOL_INTERFACE) ( |
IN EFI_HANDLE Handle, |
IN EFI_GUID *Protocol, |
IN VOID *Interface |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_HANDLE_PROTOCOL) ( |
IN EFI_HANDLE Handle, |
IN EFI_GUID *Protocol, |
OUT VOID **Interface |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_REGISTER_PROTOCOL_NOTIFY) ( |
IN EFI_GUID *Protocol, |
IN EFI_EVENT Event, |
OUT VOID **Registration |
); |
typedef enum { |
AllHandles, |
ByRegisterNotify, |
ByProtocol |
} EFI_LOCATE_SEARCH_TYPE; |
typedef |
EFI_STATUS |
(EFIAPI *EFI_LOCATE_HANDLE) ( |
IN EFI_LOCATE_SEARCH_TYPE SearchType, |
IN EFI_GUID *Protocol OPTIONAL, |
IN VOID *SearchKey OPTIONAL, |
IN OUT UINTN *BufferSize, |
OUT EFI_HANDLE *Buffer |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_LOCATE_DEVICE_PATH) ( |
IN EFI_GUID *Protocol, |
IN OUT EFI_DEVICE_PATH **DevicePath, |
OUT EFI_HANDLE *Device |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_INSTALL_CONFIGURATION_TABLE) ( |
IN EFI_GUID *Guid, |
IN VOID *Table |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_RESERVED_SERVICE) ( |
); |
// |
// Standard EFI table header |
// |
typedef struct _EFI_TABLE_HEARDER { |
UINT64 Signature; |
UINT32 Revision; |
UINT32 HeaderSize; |
UINT32 CRC32; |
UINT32 Reserved; |
} EFI_TABLE_HEADER; |
// |
// EFI Runtime Serivces Table |
// |
#define EFI_RUNTIME_SERVICES_SIGNATURE 0x56524553544e5552 |
#define EFI_RUNTIME_SERVICES_REVISION (EFI_SPECIFICATION_MAJOR_REVISION<<16) | (EFI_SPECIFICATION_MINOR_REVISION) |
typedef struct { |
EFI_TABLE_HEADER Hdr; |
// |
// Time services |
// |
EFI_GET_TIME GetTime; |
EFI_SET_TIME SetTime; |
EFI_GET_WAKEUP_TIME GetWakeupTime; |
EFI_SET_WAKEUP_TIME SetWakeupTime; |
// |
// Virtual memory services |
// |
EFI_SET_VIRTUAL_ADDRESS_MAP SetVirtualAddressMap; |
EFI_CONVERT_POINTER ConvertPointer; |
// |
// Variable serviers |
// |
EFI_GET_VARIABLE GetVariable; |
EFI_GET_NEXT_VARIABLE_NAME GetNextVariableName; |
EFI_SET_VARIABLE SetVariable; |
// |
// Misc |
// |
EFI_GET_NEXT_HIGH_MONO_COUNT GetNextHighMonotonicCount; |
EFI_RESET_SYSTEM ResetSystem; |
} EFI_RUNTIME_SERVICES; |
// |
// EFI Boot Services Table |
// |
#define EFI_BOOT_SERVICES_SIGNATURE 0x56524553544f4f42 |
#define EFI_BOOT_SERVICES_REVISION (EFI_SPECIFICATION_MAJOR_REVISION<<16) | (EFI_SPECIFICATION_MINOR_REVISION) |
typedef struct _EFI_BOOT_SERVICES { |
EFI_TABLE_HEADER Hdr; |
// |
// Task priority functions |
// |
EFI_RAISE_TPL RaiseTPL; |
EFI_RESTORE_TPL RestoreTPL; |
// |
// Memory functions |
// |
EFI_ALLOCATE_PAGES AllocatePages; |
EFI_FREE_PAGES FreePages; |
EFI_GET_MEMORY_MAP GetMemoryMap; |
EFI_ALLOCATE_POOL AllocatePool; |
EFI_FREE_POOL FreePool; |
// |
// Event & timer functions |
// |
EFI_CREATE_EVENT CreateEvent; |
EFI_SET_TIMER SetTimer; |
EFI_WAIT_FOR_EVENT WaitForEvent; |
EFI_SIGNAL_EVENT SignalEvent; |
EFI_CLOSE_EVENT CloseEvent; |
EFI_CHECK_EVENT CheckEvent; |
// |
// Protocol handler functions |
// |
EFI_INSTALL_PROTOCOL_INTERFACE InstallProtocolInterface; |
EFI_REINSTALL_PROTOCOL_INTERFACE ReinstallProtocolInterface; |
EFI_UNINSTALL_PROTOCOL_INTERFACE UninstallProtocolInterface; |
EFI_HANDLE_PROTOCOL HandleProtocol; |
EFI_HANDLE_PROTOCOL PCHandleProtocol; |
EFI_REGISTER_PROTOCOL_NOTIFY RegisterProtocolNotify; |
EFI_LOCATE_HANDLE LocateHandle; |
EFI_LOCATE_DEVICE_PATH LocateDevicePath; |
EFI_INSTALL_CONFIGURATION_TABLE InstallConfigurationTable; |
// |
// Image functions |
// |
EFI_IMAGE_LOAD LoadImage; |
EFI_IMAGE_START StartImage; |
EFI_EXIT Exit; |
EFI_IMAGE_UNLOAD UnloadImage; |
EFI_EXIT_BOOT_SERVICES ExitBootServices; |
// |
// Misc functions |
// |
EFI_GET_NEXT_MONOTONIC_COUNT GetNextMonotonicCount; |
EFI_STALL Stall; |
EFI_SET_WATCHDOG_TIMER SetWatchdogTimer; |
} EFI_BOOT_SERVICES; |
// |
// EFI Configuration Table and GUID definitions |
// |
#define MPS_TABLE_GUID \ |
{ 0xeb9d2d2f, 0x2d88, 0x11d3, {0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d} } |
#define ACPI_TABLE_GUID \ |
{ 0xeb9d2d30, 0x2d88, 0x11d3, {0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d} } |
#define ACPI_20_TABLE_GUID \ |
{ 0x8868e871, 0xe4f1, 0x11d3, {0xbc, 0x22, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81} } |
#define SMBIOS_TABLE_GUID \ |
{ 0xeb9d2d31, 0x2d88, 0x11d3, {0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d} } |
#define SAL_SYSTEM_TABLE_GUID \ |
{ 0xeb9d2d32, 0x2d88, 0x11d3, {0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d} } |
typedef struct _EFI_CONFIGURATION_TABLE { |
EFI_GUID VendorGuid; |
VOID *VendorTable; |
} EFI_CONFIGURATION_TABLE; |
// |
// EFI System Table |
// |
#define EFI_SYSTEM_TABLE_SIGNATURE 0x5453595320494249 |
#define EFI_SYSTEM_TABLE_REVISION (EFI_SPECIFICATION_MAJOR_REVISION<<16) | (EFI_SPECIFICATION_MINOR_REVISION) |
typedef struct _EFI_SYSTEM_TABLE { |
EFI_TABLE_HEADER Hdr; |
CHAR16 *FirmwareVendor; |
UINT32 FirmwareRevision; |
EFI_HANDLE ConsoleInHandle; |
SIMPLE_INPUT_INTERFACE *ConIn; |
EFI_HANDLE ConsoleOutHandle; |
SIMPLE_TEXT_OUTPUT_INTERFACE *ConOut; |
EFI_HANDLE StandardErrorHandle; |
SIMPLE_TEXT_OUTPUT_INTERFACE *StdErr; |
EFI_RUNTIME_SERVICES *RuntimeServices; |
EFI_BOOT_SERVICES *BootServices; |
UINTN NumberOfTableEntries; |
EFI_CONFIGURATION_TABLE *ConfigurationTable; |
} EFI_SYSTEM_TABLE; |
#endif |
/tags/0.3.0/boot/arch/ia64/loader/gefi/inc/romload.h |
---|
0,0 → 1,41 |
#ifndef _EFI_ROMLOAD_H |
#define _EFI_ROMLOAD_H |
#define ROM_SIGNATURE 0xaa55 |
#define PCIDS_SIGNATURE "PCIR" |
#pragma pack(push) |
#pragma pack(1) |
typedef struct |
{ |
UINT8 Pcids_Sig[4]; |
UINT16 VendId; |
UINT16 DevId; |
UINT16 Vpd_Off; |
UINT16 Size; |
UINT8 Rev; |
UINT8 Class_Code[3]; |
UINT16 Image_Len; |
UINT16 Rev_Lvl; |
UINT8 Code_Type; |
UINT8 Indi; |
UINT16 Rsvd; |
}PciDataStructure; |
typedef struct |
{ |
UINT16 Size; |
UINT32 Header_Sig; |
UINT16 SubSystem; |
UINT16 MachineType; |
UINT8 Resvd[10]; |
UINT16 EfiOffset; |
}ArchData; |
typedef struct |
{ |
UINT16 Rom_Sig; |
ArchData Arch_Data; |
UINT16 Pcids_Off; |
UINT8 resvd[38]; |
}RomHeader; |
#pragma pack(pop) |
#endif |
/tags/0.3.0/boot/arch/ia64/loader/gefi/inc/efirtlib.h |
---|
0,0 → 1,141 |
#ifndef _EFI_RT_LIB_INCLUDE_ |
#define _EFI_RT_LIB_INCLUDE_ |
/*++ |
Copyright (c) 1998 Intel Corporation |
Module Name: |
efilib.h |
Abstract: |
EFI Runtime library functions |
Revision History |
--*/ |
#include "efidebug.h" |
#include "efipart.h" |
#include "efilibplat.h" |
VOID |
RUNTIMEFUNCTION |
RtZeroMem ( |
IN VOID *Buffer, |
IN UINTN Size |
); |
VOID |
RUNTIMEFUNCTION |
RtSetMem ( |
IN VOID *Buffer, |
IN UINTN Size, |
IN UINT8 Value |
); |
VOID |
RUNTIMEFUNCTION |
RtCopyMem ( |
IN VOID *Dest, |
IN VOID *Src, |
IN UINTN len |
); |
INTN |
RUNTIMEFUNCTION |
RtCompareMem ( |
IN VOID *Dest, |
IN VOID *Src, |
IN UINTN len |
); |
INTN |
RUNTIMEFUNCTION |
RtStrCmp ( |
IN CHAR16 *s1, |
IN CHAR16 *s2 |
); |
VOID |
RUNTIMEFUNCTION |
RtStrCpy ( |
IN CHAR16 *Dest, |
IN CHAR16 *Src |
); |
VOID |
RUNTIMEFUNCTION |
RtStrCat ( |
IN CHAR16 *Dest, |
IN CHAR16 *Src |
); |
UINTN |
RUNTIMEFUNCTION |
RtStrLen ( |
IN CHAR16 *s1 |
); |
UINTN |
RUNTIMEFUNCTION |
RtStrSize ( |
IN CHAR16 *s1 |
); |
INTN |
RUNTIMEFUNCTION |
RtCompareGuid ( |
IN EFI_GUID *Guid1, |
IN EFI_GUID *Guid2 |
); |
UINT8 |
RUNTIMEFUNCTION |
RtDecimaltoBCD( |
IN UINT8 BcdValue |
); |
UINT8 |
RUNTIMEFUNCTION |
RtBCDtoDecimal( |
IN UINT8 BcdValue |
); |
// |
// Virtual mapping transition support. (Only used during |
// the virtual address change transisition) |
// |
VOID |
RUNTIMEFUNCTION |
RtLibEnableVirtualMappings ( |
VOID |
); |
VOID |
RUNTIMEFUNCTION |
RtConvertList ( |
IN UINTN DebugDisposition, |
IN OUT LIST_ENTRY *ListHead |
); |
VOID |
RUNTIMEFUNCTION |
RtAcquireLock ( |
IN FLOCK *Lock |
); |
VOID |
RUNTIMEFUNCTION |
RtReleaseLock ( |
IN FLOCK *Lock |
); |
#endif |
/tags/0.3.0/boot/arch/ia64/loader/gefi/inc/efiui.h |
---|
0,0 → 1,54 |
#ifndef _EFI_UI_H |
#define _EFI_UI_H |
/*++ |
Copyright (c) 200 Intel Corporation |
Module Name: |
EfiUi.h |
Abstract: |
Protocol used to build User Interface (UI) stuff. |
This protocol is just data. It is a multi dimentional array. |
For each string there is an array of UI_STRING_ENTRY. Each string |
is for a different language translation of the same string. The list |
is terminated by a NULL UiString. There can be any number of |
UI_STRING_ENTRY arrays. A NULL array terminates the list. A NULL array |
entry contains all zeros. |
Thus the shortest possible EFI_UI_PROTOCOL has three UI_STRING_ENTRY. |
The String, it's NULL terminator, and the NULL terminator for the entire |
thing. |
Revision History |
--*/ |
#define EFI_UI_PROTOCOL \ |
{ 0x32dd7981, 0x2d27, 0x11d4, {0xbc, 0x8b, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81} } |
typedef enum { |
UiDeviceString, |
UiVendorString, |
UiMaxString |
} UI_STRING_TYPE; |
typedef struct { |
ISO_639_2 *LangCode; |
CHAR16 *UiString; |
} UI_STRING_ENTRY; |
#define EFI_UI_VERSION 0x00010000 |
typedef struct _UI_INTERFACE { |
UINT32 Version; |
UI_STRING_ENTRY *Entry; |
} UI_INTERFACE; |
#endif |
/tags/0.3.0/boot/arch/ia64/loader/gefi/inc/efi_nii.h |
---|
0,0 → 1,74 |
#ifndef _EFI_NII_H |
#define _EFI_NII_H |
/*++ |
Copyright (c) 2000 Intel Corporation |
Module name: |
efi_nii.h |
Abstract: |
Revision history: |
2000-Feb-18 M(f)J GUID updated. |
Structure order changed for machine word alignment. |
Added StringId[4] to structure. |
2000-Feb-14 M(f)J Genesis. |
--*/ |
#define EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL \ |
{ 0xE18541CD, 0xF755, 0x4f73, {0x92, 0x8D, 0x64, 0x3C, 0x8A, 0x79, 0xB2, 0x29} } |
#define EFI_NETWORK_INTERFACE_IDENTIFIER_INTERFACE_REVISION 0x00010000 |
typedef enum { |
EfiNetworkInterfaceUndi = 1 |
} EFI_NETWORK_INTERFACE_TYPE; |
typedef struct { |
UINT64 Revision; |
// Revision of the network interface identifier protocol interface. |
UINT64 ID; |
// Address of the first byte of the identifying structure for this |
// network interface. This is set to zero if there is no structure. |
// |
// For PXE/UNDI this is the first byte of the !PXE structure. |
UINT64 ImageAddr; |
// Address of the UNrelocated driver/ROM image. This is set |
// to zero if there is no driver/ROM image. |
// |
// For 16-bit UNDI, this is the first byte of the option ROM in |
// upper memory. |
// |
// For 32/64-bit S/W UNDI, this is the first byte of the EFI ROM |
// image. |
// |
// For H/W UNDI, this is set to zero. |
UINT32 ImageSize; |
// Size of the UNrelocated driver/ROM image of this network interface. |
// This is set to zero if there is no driver/ROM image. |
CHAR8 StringId[4]; |
// 4 char ASCII string to go in class identifier (option 60) in DHCP |
// and Boot Server discover packets. |
// For EfiNetworkInterfaceUndi this field is "UNDI". |
// For EfiNetworkInterfaceSnp this field is "SNPN". |
UINT8 Type; |
UINT8 MajorVer; |
UINT8 MinorVer; |
// Information to be placed into the PXE DHCP and Discover packets. |
// This is the network interface type and version number that will |
// be placed into DHCP option 94 (client network interface identifier). |
BOOLEAN Ipv6Supported; |
UINT8 IfNum; // interface number to be used with pxeid structure |
} EFI_NETWORK_INTERFACE_IDENTIFIER_INTERFACE; |
extern EFI_GUID NetworkInterfaceIdentifierProtocol; |
#endif // _EFI_NII_H |
/tags/0.3.0/boot/arch/ia64/loader/gefi/inc/make.inf |
---|
0,0 → 1,29 |
# |
# |
# |
[sources] |
efi.h |
efiapi.h |
eficon.h |
efidebug.h |
efidef.h |
efidevp.h |
efierr.h |
efifs.h |
efilib.h |
efipart.h |
efiprot.h |
efipxebc.h |
efistdarg.h |
efinet.h |
[ia32sources] |
efibind.h |
pe.h |
efilibplat.h |
[ia64sources] |
efibind.h |
pe.h |
efilibplat.h |
/tags/0.3.0/boot/arch/ia64/loader/gefi/inc/eficon.h |
---|
0,0 → 1,302 |
#ifndef _EFI_CON_H |
#define _EFI_CON_H |
/*++ |
Copyright (c) 1998 Intel Corporation |
Module Name: |
eficon.h |
Abstract: |
EFI console protocols |
Revision History |
--*/ |
// |
// Text output protocol |
// |
#define SIMPLE_TEXT_OUTPUT_PROTOCOL \ |
{ 0x387477c2, 0x69c7, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} } |
INTERFACE_DECL(_SIMPLE_TEXT_OUTPUT_INTERFACE); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_TEXT_RESET) ( |
IN struct _SIMPLE_TEXT_OUTPUT_INTERFACE *This, |
IN BOOLEAN ExtendedVerification |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_TEXT_OUTPUT_STRING) ( |
IN struct _SIMPLE_TEXT_OUTPUT_INTERFACE *This, |
IN CHAR16 *String |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_TEXT_TEST_STRING) ( |
IN struct _SIMPLE_TEXT_OUTPUT_INTERFACE *This, |
IN CHAR16 *String |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_TEXT_QUERY_MODE) ( |
IN struct _SIMPLE_TEXT_OUTPUT_INTERFACE *This, |
IN UINTN ModeNumber, |
OUT UINTN *Columns, |
OUT UINTN *Rows |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_TEXT_SET_MODE) ( |
IN struct _SIMPLE_TEXT_OUTPUT_INTERFACE *This, |
IN UINTN ModeNumber |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_TEXT_SET_ATTRIBUTE) ( |
IN struct _SIMPLE_TEXT_OUTPUT_INTERFACE *This, |
IN UINTN Attribute |
); |
#define EFI_BLACK 0x00 |
#define EFI_BLUE 0x01 |
#define EFI_GREEN 0x02 |
#define EFI_CYAN (EFI_BLUE | EFI_GREEN) |
#define EFI_RED 0x04 |
#define EFI_MAGENTA (EFI_BLUE | EFI_RED) |
#define EFI_BROWN (EFI_GREEN | EFI_RED) |
#define EFI_LIGHTGRAY (EFI_BLUE | EFI_GREEN | EFI_RED) |
#define EFI_BRIGHT 0x08 |
#define EFI_DARKGRAY (EFI_BRIGHT) |
#define EFI_LIGHTBLUE (EFI_BLUE | EFI_BRIGHT) |
#define EFI_LIGHTGREEN (EFI_GREEN | EFI_BRIGHT) |
#define EFI_LIGHTCYAN (EFI_CYAN | EFI_BRIGHT) |
#define EFI_LIGHTRED (EFI_RED | EFI_BRIGHT) |
#define EFI_LIGHTMAGENTA (EFI_MAGENTA | EFI_BRIGHT) |
#define EFI_YELLOW (EFI_BROWN | EFI_BRIGHT) |
#define EFI_WHITE (EFI_BLUE | EFI_GREEN | EFI_RED | EFI_BRIGHT) |
#define EFI_TEXT_ATTR(f,b) ((f) | ((b) << 4)) |
#define EFI_BACKGROUND_BLACK 0x00 |
#define EFI_BACKGROUND_BLUE 0x10 |
#define EFI_BACKGROUND_GREEN 0x20 |
#define EFI_BACKGROUND_CYAN (EFI_BACKGROUND_BLUE | EFI_BACKGROUND_GREEN) |
#define EFI_BACKGROUND_RED 0x40 |
#define EFI_BACKGROUND_MAGENTA (EFI_BACKGROUND_BLUE | EFI_BACKGROUND_RED) |
#define EFI_BACKGROUND_BROWN (EFI_BACKGROUND_GREEN | EFI_BACKGROUND_RED) |
#define EFI_BACKGROUND_LIGHTGRAY (EFI_BACKGROUND_BLUE | EFI_BACKGROUND_GREEN | EFI_BACKGROUND_RED) |
typedef |
EFI_STATUS |
(EFIAPI *EFI_TEXT_CLEAR_SCREEN) ( |
IN struct _SIMPLE_TEXT_OUTPUT_INTERFACE *This |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_TEXT_SET_CURSOR_POSITION) ( |
IN struct _SIMPLE_TEXT_OUTPUT_INTERFACE *This, |
IN UINTN Column, |
IN UINTN Row |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_TEXT_ENABLE_CURSOR) ( |
IN struct _SIMPLE_TEXT_OUTPUT_INTERFACE *This, |
IN BOOLEAN Enable |
); |
typedef struct { |
INT32 MaxMode; |
// current settings |
INT32 Mode; |
INT32 Attribute; |
INT32 CursorColumn; |
INT32 CursorRow; |
BOOLEAN CursorVisible; |
} SIMPLE_TEXT_OUTPUT_MODE; |
typedef struct _SIMPLE_TEXT_OUTPUT_INTERFACE { |
EFI_TEXT_RESET Reset; |
EFI_TEXT_OUTPUT_STRING OutputString; |
EFI_TEXT_TEST_STRING TestString; |
EFI_TEXT_QUERY_MODE QueryMode; |
EFI_TEXT_SET_MODE SetMode; |
EFI_TEXT_SET_ATTRIBUTE SetAttribute; |
EFI_TEXT_CLEAR_SCREEN ClearScreen; |
EFI_TEXT_SET_CURSOR_POSITION SetCursorPosition; |
EFI_TEXT_ENABLE_CURSOR EnableCursor; |
// Current mode |
SIMPLE_TEXT_OUTPUT_MODE *Mode; |
} SIMPLE_TEXT_OUTPUT_INTERFACE; |
// |
// Define's for required EFI Unicode Box Draw character |
// |
#define BOXDRAW_HORIZONTAL 0x2500 |
#define BOXDRAW_VERTICAL 0x2502 |
#define BOXDRAW_DOWN_RIGHT 0x250c |
#define BOXDRAW_DOWN_LEFT 0x2510 |
#define BOXDRAW_UP_RIGHT 0x2514 |
#define BOXDRAW_UP_LEFT 0x2518 |
#define BOXDRAW_VERTICAL_RIGHT 0x251c |
#define BOXDRAW_VERTICAL_LEFT 0x2524 |
#define BOXDRAW_DOWN_HORIZONTAL 0x252c |
#define BOXDRAW_UP_HORIZONTAL 0x2534 |
#define BOXDRAW_VERTICAL_HORIZONTAL 0x253c |
#define BOXDRAW_DOUBLE_HORIZONTAL 0x2550 |
#define BOXDRAW_DOUBLE_VERTICAL 0x2551 |
#define BOXDRAW_DOWN_RIGHT_DOUBLE 0x2552 |
#define BOXDRAW_DOWN_DOUBLE_RIGHT 0x2553 |
#define BOXDRAW_DOUBLE_DOWN_RIGHT 0x2554 |
#define BOXDRAW_DOWN_LEFT_DOUBLE 0x2555 |
#define BOXDRAW_DOWN_DOUBLE_LEFT 0x2556 |
#define BOXDRAW_DOUBLE_DOWN_LEFT 0x2557 |
#define BOXDRAW_UP_RIGHT_DOUBLE 0x2558 |
#define BOXDRAW_UP_DOUBLE_RIGHT 0x2559 |
#define BOXDRAW_DOUBLE_UP_RIGHT 0x255a |
#define BOXDRAW_UP_LEFT_DOUBLE 0x255b |
#define BOXDRAW_UP_DOUBLE_LEFT 0x255c |
#define BOXDRAW_DOUBLE_UP_LEFT 0x255d |
#define BOXDRAW_VERTICAL_RIGHT_DOUBLE 0x255e |
#define BOXDRAW_VERTICAL_DOUBLE_RIGHT 0x255f |
#define BOXDRAW_DOUBLE_VERTICAL_RIGHT 0x2560 |
#define BOXDRAW_VERTICAL_LEFT_DOUBLE 0x2561 |
#define BOXDRAW_VERTICAL_DOUBLE_LEFT 0x2562 |
#define BOXDRAW_DOUBLE_VERTICAL_LEFT 0x2563 |
#define BOXDRAW_DOWN_HORIZONTAL_DOUBLE 0x2564 |
#define BOXDRAW_DOWN_DOUBLE_HORIZONTAL 0x2565 |
#define BOXDRAW_DOUBLE_DOWN_HORIZONTAL 0x2566 |
#define BOXDRAW_UP_HORIZONTAL_DOUBLE 0x2567 |
#define BOXDRAW_UP_DOUBLE_HORIZONTAL 0x2568 |
#define BOXDRAW_DOUBLE_UP_HORIZONTAL 0x2569 |
#define BOXDRAW_VERTICAL_HORIZONTAL_DOUBLE 0x256a |
#define BOXDRAW_VERTICAL_DOUBLE_HORIZONTAL 0x256b |
#define BOXDRAW_DOUBLE_VERTICAL_HORIZONTAL 0x256c |
// |
// EFI Required Block Elements Code Chart |
// |
#define BLOCKELEMENT_FULL_BLOCK 0x2588 |
#define BLOCKELEMENT_LIGHT_SHADE 0x2591 |
// |
// EFI Required Geometric Shapes Code Chart |
// |
#define GEOMETRICSHAPE_UP_TRIANGLE 0x25b2 |
#define GEOMETRICSHAPE_RIGHT_TRIANGLE 0x25ba |
#define GEOMETRICSHAPE_DOWN_TRIANGLE 0x25bc |
#define GEOMETRICSHAPE_LEFT_TRIANGLE 0x25c4 |
// |
// EFI Required Arrow shapes |
// |
#define ARROW_UP 0x2191 |
#define ARROW_DOWN 0x2193 |
// |
// Text input protocol |
// |
#define SIMPLE_TEXT_INPUT_PROTOCOL \ |
{ 0x387477c1, 0x69c7, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} } |
INTERFACE_DECL(_SIMPLE_INPUT_INTERFACE); |
typedef struct { |
UINT16 ScanCode; |
CHAR16 UnicodeChar; |
} EFI_INPUT_KEY; |
// |
// Baseline unicode control chars |
// |
#define CHAR_NULL 0x0000 |
#define CHAR_BACKSPACE 0x0008 |
#define CHAR_TAB 0x0009 |
#define CHAR_LINEFEED 0x000A |
#define CHAR_CARRIAGE_RETURN 0x000D |
// |
// Scan codes for base line keys |
// |
#define SCAN_NULL 0x0000 |
#define SCAN_UP 0x0001 |
#define SCAN_DOWN 0x0002 |
#define SCAN_RIGHT 0x0003 |
#define SCAN_LEFT 0x0004 |
#define SCAN_HOME 0x0005 |
#define SCAN_END 0x0006 |
#define SCAN_INSERT 0x0007 |
#define SCAN_DELETE 0x0008 |
#define SCAN_PAGE_UP 0x0009 |
#define SCAN_PAGE_DOWN 0x000A |
#define SCAN_F1 0x000B |
#define SCAN_F2 0x000C |
#define SCAN_F3 0x000D |
#define SCAN_F4 0x000E |
#define SCAN_F5 0x000F |
#define SCAN_F6 0x0010 |
#define SCAN_F7 0x0011 |
#define SCAN_F8 0x0012 |
#define SCAN_F9 0x0013 |
#define SCAN_F10 0x0014 |
#define SCAN_ESC 0x0017 |
typedef |
EFI_STATUS |
(EFIAPI *EFI_INPUT_RESET) ( |
IN struct _SIMPLE_INPUT_INTERFACE *This, |
IN BOOLEAN ExtendedVerification |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_INPUT_READ_KEY) ( |
IN struct _SIMPLE_INPUT_INTERFACE *This, |
OUT EFI_INPUT_KEY *Key |
); |
typedef struct _SIMPLE_INPUT_INTERFACE { |
EFI_INPUT_RESET Reset; |
EFI_INPUT_READ_KEY ReadKeyStroke; |
EFI_EVENT WaitForKey; |
} SIMPLE_INPUT_INTERFACE; |
#endif |
/tags/0.3.0/boot/arch/ia64/loader/gefi/inc/efi.h |
---|
0,0 → 1,49 |
/*++ |
Copyright (c) 1998 Intel Corporation |
Module Name: |
efi.h |
Abstract: |
Public EFI header files |
Revision History |
--*/ |
// |
// Build flags on input |
// EFI32 |
// EFI_DEBUG - Enable debugging code |
// EFI_NT_EMULATOR - Building for running under NT |
// |
#ifndef _EFI_INCLUDE_ |
#define _EFI_INCLUDE_ |
#define EFI_FIRMWARE_VENDOR L"INTEL" |
#define EFI_FIRMWARE_MAJOR_REVISION 12 |
#define EFI_FIRMWARE_MINOR_REVISION 33 |
#define EFI_FIRMWARE_REVISION ((EFI_FIRMWARE_MAJOR_REVISION <<16) | (EFI_FIRMWARE_MINOR_REVISION)) |
#include "efibind.h" |
#include "efidef.h" |
#include "efidevp.h" |
#include "efiprot.h" |
#include "eficon.h" |
#include "efiser.h" |
#include "efi_nii.h" |
#include "efipxebc.h" |
#include "efinet.h" |
#include "efiapi.h" |
#include "efifs.h" |
#include "efierr.h" |
#include "efiui.h" |
#endif |
/tags/0.3.0/boot/arch/ia64/loader/gefi/inc/makefile.hdr |
---|
0,0 → 1,44 |
# |
# This is a machine generated file - DO NOT EDIT |
# Generated by genmake.exe |
# Generated from make.inf |
# Copyright (c) 1998 Intel Corporation |
# |
INC_DEPS = $(INC_DEPS) \ |
$(SDK_INSTALL_DIR)\include\efi\efi.h \ |
$(SDK_INSTALL_DIR)\include\efi\efiapi.h \ |
$(SDK_INSTALL_DIR)\include\efi\eficon.h \ |
$(SDK_INSTALL_DIR)\include\efi\efidebug.h \ |
$(SDK_INSTALL_DIR)\include\efi\efidef.h \ |
$(SDK_INSTALL_DIR)\include\efi\efidevp.h \ |
$(SDK_INSTALL_DIR)\include\efi\efierr.h \ |
$(SDK_INSTALL_DIR)\include\efi\efifs.h \ |
$(SDK_INSTALL_DIR)\include\efi\efilib.h \ |
$(SDK_INSTALL_DIR)\include\efi\efipart.h \ |
$(SDK_INSTALL_DIR)\include\efi\efiprot.h \ |
$(SDK_INSTALL_DIR)\include\efi\efipxebc.h \ |
$(SDK_INSTALL_DIR)\include\efi\efistdarg.h \ |
$(SDK_INSTALL_DIR)\include\efi\efinet.h \ |
!IF "$(PROCESSOR)" == "Ia32" |
INC_DEPS = $(INC_DEPS) \ |
$(SDK_INSTALL_DIR)\include\efi\Ia32\efibind.h \ |
$(SDK_INSTALL_DIR)\include\efi\Ia32\pe.h \ |
$(SDK_INSTALL_DIR)\include\efi\Ia32\efilibplat.h \ |
!ENDIF |
!IF "$(PROCESSOR)" == "Ia64" |
INC_DEPS = $(INC_DEPS) \ |
$(SDK_INSTALL_DIR)\include\efi\Ia64\efibind.h \ |
$(SDK_INSTALL_DIR)\include\efi\Ia64\pe.h \ |
$(SDK_INSTALL_DIR)\include\efi\Ia64\efilibplat.h \ |
!ENDIF |
/tags/0.3.0/boot/arch/ia64/loader/gefi/inc/efiprot.h |
---|
0,0 → 1,558 |
#ifndef _EFI_PROT_H |
#define _EFI_PROT_H |
/*++ |
Copyright (c) 1998 Intel Corporation |
Module Name: |
efiprot.h |
Abstract: |
EFI Protocols |
Revision History |
--*/ |
// |
// FPSWA library protocol |
// |
#define FPSWA_PROTOCOL \ |
{ 0xc41b6531, 0x97b9, 0x11d3, {0x9a, 0x29, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d} } |
// |
// Device Path protocol |
// |
#define DEVICE_PATH_PROTOCOL \ |
{ 0x9576e91, 0x6d3f, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} } |
// |
// Block IO protocol |
// |
#define BLOCK_IO_PROTOCOL \ |
{ 0x964e5b21, 0x6459, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} } |
#define EFI_BLOCK_IO_INTERFACE_REVISION 0x00010000 |
INTERFACE_DECL(_EFI_BLOCK_IO); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_BLOCK_RESET) ( |
IN struct _EFI_BLOCK_IO *This, |
IN BOOLEAN ExtendedVerification |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_BLOCK_READ) ( |
IN struct _EFI_BLOCK_IO *This, |
IN UINT32 MediaId, |
IN EFI_LBA LBA, |
IN UINTN BufferSize, |
OUT VOID *Buffer |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_BLOCK_WRITE) ( |
IN struct _EFI_BLOCK_IO *This, |
IN UINT32 MediaId, |
IN EFI_LBA LBA, |
IN UINTN BufferSize, |
IN VOID *Buffer |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_BLOCK_FLUSH) ( |
IN struct _EFI_BLOCK_IO *This |
); |
typedef struct { |
UINT32 MediaId; |
BOOLEAN RemovableMedia; |
BOOLEAN MediaPresent; |
BOOLEAN LogicalPartition; |
BOOLEAN ReadOnly; |
BOOLEAN WriteCaching; |
UINT32 BlockSize; |
UINT32 IoAlign; |
EFI_LBA LastBlock; |
} EFI_BLOCK_IO_MEDIA; |
typedef struct _EFI_BLOCK_IO { |
UINT64 Revision; |
EFI_BLOCK_IO_MEDIA *Media; |
EFI_BLOCK_RESET Reset; |
EFI_BLOCK_READ ReadBlocks; |
EFI_BLOCK_WRITE WriteBlocks; |
EFI_BLOCK_FLUSH FlushBlocks; |
} EFI_BLOCK_IO; |
// |
// Disk Block IO protocol |
// |
#define DISK_IO_PROTOCOL \ |
{ 0xce345171, 0xba0b, 0x11d2, {0x8e, 0x4f, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} } |
#define EFI_DISK_IO_INTERFACE_REVISION 0x00010000 |
INTERFACE_DECL(_EFI_DISK_IO); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_DISK_READ) ( |
IN struct _EFI_DISK_IO *This, |
IN UINT32 MediaId, |
IN UINT64 Offset, |
IN UINTN BufferSize, |
OUT VOID *Buffer |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_DISK_WRITE) ( |
IN struct _EFI_DISK_IO *This, |
IN UINT32 MediaId, |
IN UINT64 Offset, |
IN UINTN BufferSize, |
IN VOID *Buffer |
); |
typedef struct _EFI_DISK_IO { |
UINT64 Revision; |
EFI_DISK_READ ReadDisk; |
EFI_DISK_WRITE WriteDisk; |
} EFI_DISK_IO; |
// |
// Simple file system protocol |
// |
#define SIMPLE_FILE_SYSTEM_PROTOCOL \ |
{ 0x964e5b22, 0x6459, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} } |
INTERFACE_DECL(_EFI_FILE_IO_INTERFACE); |
INTERFACE_DECL(_EFI_FILE_HANDLE); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_VOLUME_OPEN) ( |
IN struct _EFI_FILE_IO_INTERFACE *This, |
OUT struct _EFI_FILE_HANDLE **Root |
); |
#define EFI_FILE_IO_INTERFACE_REVISION 0x00010000 |
typedef struct _EFI_FILE_IO_INTERFACE { |
UINT64 Revision; |
EFI_VOLUME_OPEN OpenVolume; |
} EFI_FILE_IO_INTERFACE; |
// |
// |
// |
typedef |
EFI_STATUS |
(EFIAPI *EFI_FILE_OPEN) ( |
IN struct _EFI_FILE_HANDLE *File, |
OUT struct _EFI_FILE_HANDLE **NewHandle, |
IN CHAR16 *FileName, |
IN UINT64 OpenMode, |
IN UINT64 Attributes |
); |
// Open modes |
#define EFI_FILE_MODE_READ 0x0000000000000001 |
#define EFI_FILE_MODE_WRITE 0x0000000000000002 |
#define EFI_FILE_MODE_CREATE 0x8000000000000000 |
// File attributes |
#define EFI_FILE_READ_ONLY 0x0000000000000001 |
#define EFI_FILE_HIDDEN 0x0000000000000002 |
#define EFI_FILE_SYSTEM 0x0000000000000004 |
#define EFI_FILE_RESERVIED 0x0000000000000008 |
#define EFI_FILE_DIRECTORY 0x0000000000000010 |
#define EFI_FILE_ARCHIVE 0x0000000000000020 |
#define EFI_FILE_VALID_ATTR 0x0000000000000037 |
typedef |
EFI_STATUS |
(EFIAPI *EFI_FILE_CLOSE) ( |
IN struct _EFI_FILE_HANDLE *File |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_FILE_DELETE) ( |
IN struct _EFI_FILE_HANDLE *File |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_FILE_READ) ( |
IN struct _EFI_FILE_HANDLE *File, |
IN OUT UINTN *BufferSize, |
OUT VOID *Buffer |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_FILE_WRITE) ( |
IN struct _EFI_FILE_HANDLE *File, |
IN OUT UINTN *BufferSize, |
IN VOID *Buffer |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_FILE_SET_POSITION) ( |
IN struct _EFI_FILE_HANDLE *File, |
IN UINT64 Position |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_FILE_GET_POSITION) ( |
IN struct _EFI_FILE_HANDLE *File, |
OUT UINT64 *Position |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_FILE_GET_INFO) ( |
IN struct _EFI_FILE_HANDLE *File, |
IN EFI_GUID *InformationType, |
IN OUT UINTN *BufferSize, |
OUT VOID *Buffer |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_FILE_SET_INFO) ( |
IN struct _EFI_FILE_HANDLE *File, |
IN EFI_GUID *InformationType, |
IN UINTN BufferSize, |
IN VOID *Buffer |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_FILE_FLUSH) ( |
IN struct _EFI_FILE_HANDLE *File |
); |
#define EFI_FILE_HANDLE_REVISION 0x00010000 |
typedef struct _EFI_FILE_HANDLE { |
UINT64 Revision; |
EFI_FILE_OPEN Open; |
EFI_FILE_CLOSE Close; |
EFI_FILE_DELETE Delete; |
EFI_FILE_READ Read; |
EFI_FILE_WRITE Write; |
EFI_FILE_GET_POSITION GetPosition; |
EFI_FILE_SET_POSITION SetPosition; |
EFI_FILE_GET_INFO GetInfo; |
EFI_FILE_SET_INFO SetInfo; |
EFI_FILE_FLUSH Flush; |
} EFI_FILE, *EFI_FILE_HANDLE; |
// |
// File information types |
// |
#define EFI_FILE_INFO_ID \ |
{ 0x9576e92, 0x6d3f, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} } |
typedef struct { |
UINT64 Size; |
UINT64 FileSize; |
UINT64 PhysicalSize; |
EFI_TIME CreateTime; |
EFI_TIME LastAccessTime; |
EFI_TIME ModificationTime; |
UINT64 Attribute; |
CHAR16 FileName[1]; |
} EFI_FILE_INFO; |
// |
// The FileName field of the EFI_FILE_INFO data structure is variable length. |
// Whenever code needs to know the size of the EFI_FILE_INFO data structure, it needs to |
// be the size of the data structure without the FileName field. The following macro |
// computes this size correctly no matter how big the FileName array is declared. |
// This is required to make the EFI_FILE_INFO data structure ANSI compilant. |
// |
#define SIZE_OF_EFI_FILE_INFO EFI_FIELD_OFFSET(EFI_FILE_INFO,FileName) |
#define EFI_FILE_SYSTEM_INFO_ID \ |
{ 0x9576e93, 0x6d3f, 0x11d2, {0x8e, 0x39, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} } |
typedef struct { |
UINT64 Size; |
BOOLEAN ReadOnly; |
UINT64 VolumeSize; |
UINT64 FreeSpace; |
UINT32 BlockSize; |
CHAR16 VolumeLabel[1]; |
} EFI_FILE_SYSTEM_INFO; |
// |
// The VolumeLabel field of the EFI_FILE_SYSTEM_INFO data structure is variable length. |
// Whenever code needs to know the size of the EFI_FILE_SYSTEM_INFO data structure, it needs |
// to be the size of the data structure without the VolumeLable field. The following macro |
// computes this size correctly no matter how big the VolumeLable array is declared. |
// This is required to make the EFI_FILE_SYSTEM_INFO data structure ANSI compilant. |
// |
#define SIZE_OF_EFI_FILE_SYSTEM_INFO EFI_FIELD_OFFSET(EFI_FILE_SYSTEM_INFO,VolumeLabel) |
#define EFI_FILE_SYSTEM_VOLUME_LABEL_INFO_ID \ |
{ 0xDB47D7D3,0xFE81, 0x11d3, {0x9A, 0x35, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0x4D} } |
typedef struct { |
CHAR16 VolumeLabel[1]; |
} EFI_FILE_SYSTEM_VOLUME_LABEL_INFO; |
#define SIZE_OF_EFI_FILE_SYSTEM_VOLUME_LABEL_INFO EFI_FIELD_OFFSET(EFI_FILE_SYSTEM_VOLUME_LABEL_INFO,VolumeLabel) |
// |
// Load file protocol |
// |
#define LOAD_FILE_PROTOCOL \ |
{ 0x56EC3091, 0x954C, 0x11d2, {0x8E, 0x3F, 0x00, 0xA0, 0xC9, 0x69, 0x72, 0x3B} } |
INTERFACE_DECL(_EFI_LOAD_FILE_INTERFACE); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_LOAD_FILE) ( |
IN struct _EFI_LOAD_FILE_INTERFACE *This, |
IN EFI_DEVICE_PATH *FilePath, |
IN BOOLEAN BootPolicy, |
IN OUT UINTN *BufferSize, |
IN VOID *Buffer OPTIONAL |
); |
typedef struct _EFI_LOAD_FILE_INTERFACE { |
EFI_LOAD_FILE LoadFile; |
} EFI_LOAD_FILE_INTERFACE; |
// |
// Device IO protocol |
// |
#define DEVICE_IO_PROTOCOL \ |
{ 0xaf6ac311, 0x84c3, 0x11d2, {0x8e, 0x3c, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b} } |
INTERFACE_DECL(_EFI_DEVICE_IO_INTERFACE); |
typedef enum { |
IO_UINT8, |
IO_UINT16, |
IO_UINT32, |
IO_UINT64, |
// |
// Specification Change: Copy from MMIO to MMIO vs. MMIO to buffer, buffer to MMIO |
// |
MMIO_COPY_UINT8, |
MMIO_COPY_UINT16, |
MMIO_COPY_UINT32, |
MMIO_COPY_UINT64 |
} EFI_IO_WIDTH; |
#define EFI_PCI_ADDRESS(_bus,_dev,_func) \ |
( (UINT64) ( (((UINTN)_bus) << 24) + (((UINTN)_dev) << 16) + (((UINTN)_func) << 8) ) ) |
typedef |
EFI_STATUS |
(EFIAPI *EFI_DEVICE_IO) ( |
IN struct _EFI_DEVICE_IO_INTERFACE *This, |
IN EFI_IO_WIDTH Width, |
IN UINT64 Address, |
IN UINTN Count, |
IN OUT VOID *Buffer |
); |
typedef struct { |
EFI_DEVICE_IO Read; |
EFI_DEVICE_IO Write; |
} EFI_IO_ACCESS; |
typedef |
EFI_STATUS |
(EFIAPI *EFI_PCI_DEVICE_PATH) ( |
IN struct _EFI_DEVICE_IO_INTERFACE *This, |
IN UINT64 Address, |
IN OUT EFI_DEVICE_PATH **PciDevicePath |
); |
typedef enum { |
EfiBusMasterRead, |
EfiBusMasterWrite, |
EfiBusMasterCommonBuffer |
} EFI_IO_OPERATION_TYPE; |
typedef |
EFI_STATUS |
(EFIAPI *EFI_IO_MAP) ( |
IN struct _EFI_DEVICE_IO_INTERFACE *This, |
IN EFI_IO_OPERATION_TYPE Operation, |
IN EFI_PHYSICAL_ADDRESS *HostAddress, |
IN OUT UINTN *NumberOfBytes, |
OUT EFI_PHYSICAL_ADDRESS *DeviceAddress, |
OUT VOID **Mapping |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_IO_UNMAP) ( |
IN struct _EFI_DEVICE_IO_INTERFACE *This, |
IN VOID *Mapping |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_IO_ALLOCATE_BUFFER) ( |
IN struct _EFI_DEVICE_IO_INTERFACE *This, |
IN EFI_ALLOCATE_TYPE Type, |
IN EFI_MEMORY_TYPE MemoryType, |
IN UINTN Pages, |
IN OUT EFI_PHYSICAL_ADDRESS *HostAddress |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_IO_FLUSH) ( |
IN struct _EFI_DEVICE_IO_INTERFACE *This |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_IO_FREE_BUFFER) ( |
IN struct _EFI_DEVICE_IO_INTERFACE *This, |
IN UINTN Pages, |
IN EFI_PHYSICAL_ADDRESS HostAddress |
); |
typedef struct _EFI_DEVICE_IO_INTERFACE { |
EFI_IO_ACCESS Mem; |
EFI_IO_ACCESS Io; |
EFI_IO_ACCESS Pci; |
EFI_IO_MAP Map; |
EFI_PCI_DEVICE_PATH PciDevicePath; |
EFI_IO_UNMAP Unmap; |
EFI_IO_ALLOCATE_BUFFER AllocateBuffer; |
EFI_IO_FLUSH Flush; |
EFI_IO_FREE_BUFFER FreeBuffer; |
} EFI_DEVICE_IO_INTERFACE; |
// |
// Unicode Collation protocol |
// |
#define UNICODE_COLLATION_PROTOCOL \ |
{ 0x1d85cd7f, 0xf43d, 0x11d2, {0x9a, 0xc, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d} } |
#define UNICODE_BYTE_ORDER_MARK (CHAR16)(0xfeff) |
INTERFACE_DECL(_EFI_UNICODE_COLLATION_INTERFACE); |
typedef |
INTN |
(EFIAPI *EFI_UNICODE_STRICOLL) ( |
IN struct _EFI_UNICODE_COLLATION_INTERFACE *This, |
IN CHAR16 *s1, |
IN CHAR16 *s2 |
); |
typedef |
BOOLEAN |
(EFIAPI *EFI_UNICODE_METAIMATCH) ( |
IN struct _EFI_UNICODE_COLLATION_INTERFACE *This, |
IN CHAR16 *String, |
IN CHAR16 *Pattern |
); |
typedef |
VOID |
(EFIAPI *EFI_UNICODE_STRLWR) ( |
IN struct _EFI_UNICODE_COLLATION_INTERFACE *This, |
IN OUT CHAR16 *Str |
); |
typedef |
VOID |
(EFIAPI *EFI_UNICODE_STRUPR) ( |
IN struct _EFI_UNICODE_COLLATION_INTERFACE *This, |
IN OUT CHAR16 *Str |
); |
typedef |
VOID |
(EFIAPI *EFI_UNICODE_FATTOSTR) ( |
IN struct _EFI_UNICODE_COLLATION_INTERFACE *This, |
IN UINTN FatSize, |
IN CHAR8 *Fat, |
OUT CHAR16 *String |
); |
typedef |
BOOLEAN |
(EFIAPI *EFI_UNICODE_STRTOFAT) ( |
IN struct _EFI_UNICODE_COLLATION_INTERFACE *This, |
IN CHAR16 *String, |
IN UINTN FatSize, |
OUT CHAR8 *Fat |
); |
typedef struct _EFI_UNICODE_COLLATION_INTERFACE { |
// general |
EFI_UNICODE_STRICOLL StriColl; |
EFI_UNICODE_METAIMATCH MetaiMatch; |
EFI_UNICODE_STRLWR StrLwr; |
EFI_UNICODE_STRUPR StrUpr; |
// for supporting fat volumes |
EFI_UNICODE_FATTOSTR FatToStr; |
EFI_UNICODE_STRTOFAT StrToFat; |
CHAR8 *SupportedLanguages; |
} EFI_UNICODE_COLLATION_INTERFACE; |
#endif |
/tags/0.3.0/boot/arch/ia64/loader/gefi/inc/efistdarg.h |
---|
0,0 → 1,33 |
#ifndef _EFISTDARG_H_ |
#define _EFISTDARG_H_ |
/*++ |
Copyright (c) 1998 Intel Corporation |
Module Name: |
devpath.h |
Abstract: |
Defines for parsing the EFI Device Path structures |
Revision History |
--*/ |
#ifdef __GNUC__ |
#include "stdarg.h" |
#else |
#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(UINTN) - 1) & ~(sizeof(UINTN) - 1) ) |
typedef CHAR8 * va_list; |
#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) ) |
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) |
#define va_end(ap) ( ap = (va_list)0 ) |
#endif |
#endif /* _INC_STDARG */ |
/tags/0.3.0/boot/arch/ia64/loader/gefi/inc/ia32/efilibplat.h |
---|
0,0 → 1,26 |
/*++ |
Copyright (c) 1998 Intel Corporation |
Module Name: |
efilibplat.h |
Abstract: |
EFI to compile bindings |
Revision History |
--*/ |
VOID |
InitializeLibPlatform ( |
IN EFI_HANDLE ImageHandle, |
IN EFI_SYSTEM_TABLE *SystemTable |
); |
/tags/0.3.0/boot/arch/ia64/loader/gefi/inc/ia32/efibind.h |
---|
0,0 → 1,263 |
/*++ |
Copyright (c) 1998 Intel Corporation |
Module Name: |
efefind.h |
Abstract: |
EFI to compile bindings |
Revision History |
--*/ |
#ifndef __GNUC__ |
#pragma pack() |
#endif |
// |
// Basic int types of various widths |
// |
#if (__STDC_VERSION__ < 199901L ) |
// No ANSI C 1999/2000 stdint.h integer width declarations |
#if _MSC_EXTENSIONS |
// Use Microsoft C compiler integer width declarations |
typedef unsigned __int64 uint64_t; |
typedef __int64 int64_t; |
typedef unsigned __int32 uint32_t; |
typedef __int32 int32_t; |
typedef unsigned short uint16_t; |
typedef short int16_t; |
typedef unsigned char uint8_t; |
typedef char int8_t; |
#elif defined(__GNUC__) |
typedef unsigned long long uint64_t __attribute__((aligned (8))); |
typedef long long int64_t __attribute__((aligned (8))); |
typedef unsigned int uint32_t; |
typedef int int32_t; |
typedef unsigned short uint16_t; |
typedef short int16_t; |
typedef unsigned char uint8_t; |
typedef char int8_t; |
#elif defined(UNIX_LP64) |
/* Use LP64 programming model from C_FLAGS for integer width declarations */ |
typedef unsigned long uint64_t; |
typedef long int64_t; |
typedef unsigned int uint32_t; |
typedef int int32_t; |
typedef unsigned short uint16_t; |
typedef short int16_t; |
typedef unsigned char uint8_t; |
typedef char int8_t; |
#else |
/* Assume P64 programming model from C_FLAGS for integer width declarations */ |
typedef unsigned long long uint64_t __attribute__((aligned (8))); |
typedef long long int64_t __attribute__((aligned (8))); |
typedef unsigned int uint32_t; |
typedef int int32_t; |
typedef unsigned short uint16_t; |
typedef short int16_t; |
typedef unsigned char uint8_t; |
typedef char int8_t; |
#endif |
#endif |
// |
// Basic EFI types of various widths |
// |
#ifndef __WCHAR_TYPE__ |
# define __WCHAR_TYPE__ short |
#endif |
typedef uint64_t UINT64; |
typedef int64_t INT64; |
#ifndef _BASETSD_H_ |
typedef uint32_t UINT32; |
typedef int32_t INT32; |
#endif |
typedef uint16_t UINT16; |
typedef int16_t INT16; |
typedef uint8_t UINT8; |
typedef int8_t INT8; |
typedef __WCHAR_TYPE__ WCHAR; |
#undef VOID |
#define VOID void |
typedef int32_t INTN; |
typedef uint32_t UINTN; |
#ifdef EFI_NT_EMULATOR |
#define POST_CODE(_Data) |
#else |
#ifdef EFI_DEBUG |
#define POST_CODE(_Data) __asm mov eax,(_Data) __asm out 0x80,al |
#else |
#define POST_CODE(_Data) |
#endif |
#endif |
#define EFIERR(a) (0x80000000 | a) |
#define EFI_ERROR_MASK 0x80000000 |
#define EFIERR_OEM(a) (0xc0000000 | a) |
#define BAD_POINTER 0xFBFBFBFB |
#define MAX_ADDRESS 0xFFFFFFFF |
#ifdef EFI_NT_EMULATOR |
#define BREAKPOINT() __asm { int 3 } |
#else |
#define BREAKPOINT() while (TRUE); // Make it hang on Bios[Dbg]32 |
#endif |
// |
// Pointers must be aligned to these address to function |
// |
#define MIN_ALIGNMENT_SIZE 4 |
#define ALIGN_VARIABLE(Value ,Adjustment) \ |
(UINTN)Adjustment = 0; \ |
if((UINTN)Value % MIN_ALIGNMENT_SIZE) \ |
(UINTN)Adjustment = MIN_ALIGNMENT_SIZE - ((UINTN)Value % MIN_ALIGNMENT_SIZE); \ |
Value = (UINTN)Value + (UINTN)Adjustment |
// |
// Define macros to build data structure signatures from characters. |
// |
#define EFI_SIGNATURE_16(A,B) ((A) | (B<<8)) |
#define EFI_SIGNATURE_32(A,B,C,D) (EFI_SIGNATURE_16(A,B) | (EFI_SIGNATURE_16(C,D) << 16)) |
#define EFI_SIGNATURE_64(A,B,C,D,E,F,G,H) (EFI_SIGNATURE_32(A,B,C,D) | ((UINT64)(EFI_SIGNATURE_32(E,F,G,H)) << 32)) |
// |
// To export & import functions in the EFI emulator environment |
// |
#if EFI_NT_EMULATOR |
#define EXPORTAPI __declspec( dllexport ) |
#else |
#define EXPORTAPI |
#endif |
// |
// EFIAPI - prototype calling convention for EFI function pointers |
// BOOTSERVICE - prototype for implementation of a boot service interface |
// RUNTIMESERVICE - prototype for implementation of a runtime service interface |
// RUNTIMEFUNCTION - prototype for implementation of a runtime function that is not a service |
// RUNTIME_CODE - pragma macro for declaring runtime code |
// |
#ifndef EFIAPI // Forces EFI calling conventions reguardless of compiler options |
#if _MSC_EXTENSIONS |
#define EFIAPI __cdecl // Force C calling convention for Microsoft C compiler |
#else |
#define EFIAPI // Substitute expresion to force C calling convention |
#endif |
#endif |
#define BOOTSERVICE |
//#define RUNTIMESERVICE(proto,a) alloc_text("rtcode",a); proto a |
//#define RUNTIMEFUNCTION(proto,a) alloc_text("rtcode",a); proto a |
#define RUNTIMESERVICE |
#define RUNTIMEFUNCTION |
#define RUNTIME_CODE(a) alloc_text("rtcode", a) |
#define BEGIN_RUNTIME_DATA() data_seg("rtdata") |
#define END_RUNTIME_DATA() data_seg("") |
#define VOLATILE volatile |
#define MEMORY_FENCE() |
#ifdef EFI_NT_EMULATOR |
// |
// To help ensure proper coding of integrated drivers, they are |
// compiled as DLLs. In NT they require a dll init entry pointer. |
// The macro puts a stub entry point into the DLL so it will load. |
// |
#define EFI_DRIVER_ENTRY_POINT(InitFunction) \ |
UINTN \ |
__stdcall \ |
_DllMainCRTStartup ( \ |
UINTN Inst, \ |
UINTN reason_for_call, \ |
VOID *rserved \ |
) \ |
{ \ |
return 1; \ |
} \ |
\ |
int \ |
EXPORTAPI \ |
__cdecl \ |
InitializeDriver ( \ |
void *ImageHandle, \ |
void *SystemTable \ |
) \ |
{ \ |
return InitFunction(ImageHandle, SystemTable); \ |
} |
#define LOAD_INTERNAL_DRIVER(_if, type, name, entry) \ |
(_if)->LoadInternal(type, name, NULL) |
#else // EFI_NT_EMULATOR |
// |
// When build similiar to FW, then link everything together as |
// one big module. |
// |
#define EFI_DRIVER_ENTRY_POINT(InitFunction) |
#define LOAD_INTERNAL_DRIVER(_if, type, name, entry) \ |
(_if)->LoadInternal(type, name, entry) |
#endif // EFI_FW_NT |
// |
// Some compilers don't support the forward reference construct: |
// typedef struct XXXXX |
// |
// The following macro provide a workaround for such cases. |
// |
#ifdef NO_INTERFACE_DECL |
#define INTERFACE_DECL(x) |
#else |
#ifdef __GNUC__ |
#define INTERFACE_DECL(x) struct x |
#else |
#define INTERFACE_DECL(x) typedef struct x |
#endif |
#endif |
#if _MSC_EXTENSIONS |
#pragma warning ( disable : 4731 ) // Suppress warnings about modification of EBP |
#endif |
/tags/0.3.0/boot/arch/ia64/loader/gefi/inc/ia32/pe.h |
---|
0,0 → 1,591 |
/* |
PE32+ header file |
*/ |
#ifndef _PE_H |
#define _PE_H |
#define IMAGE_DOS_SIGNATURE 0x5A4D // MZ |
#define IMAGE_OS2_SIGNATURE 0x454E // NE |
#define IMAGE_OS2_SIGNATURE_LE 0x454C // LE |
#define IMAGE_NT_SIGNATURE 0x00004550 // PE00 |
#define IMAGE_EDOS_SIGNATURE 0x44454550 // PEED |
typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header |
UINT16 e_magic; // Magic number |
UINT16 e_cblp; // Bytes on last page of file |
UINT16 e_cp; // Pages in file |
UINT16 e_crlc; // Relocations |
UINT16 e_cparhdr; // Size of header in paragraphs |
UINT16 e_minalloc; // Minimum extra paragraphs needed |
UINT16 e_maxalloc; // Maximum extra paragraphs needed |
UINT16 e_ss; // Initial (relative) SS value |
UINT16 e_sp; // Initial SP value |
UINT16 e_csum; // Checksum |
UINT16 e_ip; // Initial IP value |
UINT16 e_cs; // Initial (relative) CS value |
UINT16 e_lfarlc; // File address of relocation table |
UINT16 e_ovno; // Overlay number |
UINT16 e_res[4]; // Reserved words |
UINT16 e_oemid; // OEM identifier (for e_oeminfo) |
UINT16 e_oeminfo; // OEM information; e_oemid specific |
UINT16 e_res2[10]; // Reserved words |
UINT32 e_lfanew; // File address of new exe header |
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER; |
typedef struct _IMAGE_OS2_HEADER { // OS/2 .EXE header |
UINT16 ne_magic; // Magic number |
UINT8 ne_ver; // Version number |
UINT8 ne_rev; // Revision number |
UINT16 ne_enttab; // Offset of Entry Table |
UINT16 ne_cbenttab; // Number of bytes in Entry Table |
UINT32 ne_crc; // Checksum of whole file |
UINT16 ne_flags; // Flag UINT16 |
UINT16 ne_autodata; // Automatic data segment number |
UINT16 ne_heap; // Initial heap allocation |
UINT16 ne_stack; // Initial stack allocation |
UINT32 ne_csip; // Initial CS:IP setting |
UINT32 ne_sssp; // Initial SS:SP setting |
UINT16 ne_cseg; // Count of file segments |
UINT16 ne_cmod; // Entries in Module Reference Table |
UINT16 ne_cbnrestab; // Size of non-resident name table |
UINT16 ne_segtab; // Offset of Segment Table |
UINT16 ne_rsrctab; // Offset of Resource Table |
UINT16 ne_restab; // Offset of resident name table |
UINT16 ne_modtab; // Offset of Module Reference Table |
UINT16 ne_imptab; // Offset of Imported Names Table |
UINT32 ne_nrestab; // Offset of Non-resident Names Table |
UINT16 ne_cmovent; // Count of movable entries |
UINT16 ne_align; // Segment alignment shift count |
UINT16 ne_cres; // Count of resource segments |
UINT8 ne_exetyp; // Target Operating system |
UINT8 ne_flagsothers; // Other .EXE flags |
UINT16 ne_pretthunks; // offset to return thunks |
UINT16 ne_psegrefbytes; // offset to segment ref. bytes |
UINT16 ne_swaparea; // Minimum code swap area size |
UINT16 ne_expver; // Expected Windows version number |
} IMAGE_OS2_HEADER, *PIMAGE_OS2_HEADER; |
// |
// File header format. |
// |
typedef struct _IMAGE_FILE_HEADER { |
UINT16 Machine; |
UINT16 NumberOfSections; |
UINT32 TimeDateStamp; |
UINT32 PointerToSymbolTable; |
UINT32 NumberOfSymbols; |
UINT16 SizeOfOptionalHeader; |
UINT16 Characteristics; |
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER; |
#define IMAGE_SIZEOF_FILE_HEADER 20 |
#define IMAGE_FILE_RELOCS_STRIPPED 0x0001 // Relocation info stripped from file. |
#define IMAGE_FILE_EXECUTABLE_IMAGE 0x0002 // File is executable (i.e. no unresolved externel references). |
#define IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004 // Line nunbers stripped from file. |
#define IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008 // Local symbols stripped from file. |
#define IMAGE_FILE_BYTES_REVERSED_LO 0x0080 // Bytes of machine word are reversed. |
#define IMAGE_FILE_32BIT_MACHINE 0x0100 // 32 bit word machine. |
#define IMAGE_FILE_DEBUG_STRIPPED 0x0200 // Debugging info stripped from file in .DBG file |
#define IMAGE_FILE_SYSTEM 0x1000 // System File. |
#define IMAGE_FILE_DLL 0x2000 // File is a DLL. |
#define IMAGE_FILE_BYTES_REVERSED_HI 0x8000 // Bytes of machine word are reversed. |
#define IMAGE_FILE_MACHINE_UNKNOWN 0 |
#define IMAGE_FILE_MACHINE_I386 0x14c // Intel 386. |
#define IMAGE_FILE_MACHINE_R3000 0x162 // MIPS little-endian, 0540 big-endian |
#define IMAGE_FILE_MACHINE_R4000 0x166 // MIPS little-endian |
#define IMAGE_FILE_MACHINE_ALPHA 0x184 // Alpha_AXP |
#define IMAGE_FILE_MACHINE_POWERPC 0x1F0 // IBM PowerPC Little-Endian |
#define IMAGE_FILE_MACHINE_TAHOE 0x7cc // Intel EM machine |
// |
// Directory format. |
// |
typedef struct _IMAGE_DATA_DIRECTORY { |
UINT32 VirtualAddress; |
UINT32 Size; |
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY; |
#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16 |
// |
// Optional header format. |
// |
typedef struct _IMAGE_OPTIONAL_HEADER { |
// |
// Standard fields. |
// |
UINT16 Magic; |
UINT8 MajorLinkerVersion; |
UINT8 MinorLinkerVersion; |
UINT32 SizeOfCode; |
UINT32 SizeOfInitializedData; |
UINT32 SizeOfUninitializedData; |
UINT32 AddressOfEntryPoint; |
UINT32 BaseOfCode; |
UINT32 BaseOfData; |
// |
// NT additional fields. |
// |
UINT32 ImageBase; |
UINT32 SectionAlignment; |
UINT32 FileAlignment; |
UINT16 MajorOperatingSystemVersion; |
UINT16 MinorOperatingSystemVersion; |
UINT16 MajorImageVersion; |
UINT16 MinorImageVersion; |
UINT16 MajorSubsystemVersion; |
UINT16 MinorSubsystemVersion; |
UINT32 Reserved1; |
UINT32 SizeOfImage; |
UINT32 SizeOfHeaders; |
UINT32 CheckSum; |
UINT16 Subsystem; |
UINT16 DllCharacteristics; |
UINT32 SizeOfStackReserve; |
UINT32 SizeOfStackCommit; |
UINT32 SizeOfHeapReserve; |
UINT32 SizeOfHeapCommit; |
UINT32 LoaderFlags; |
UINT32 NumberOfRvaAndSizes; |
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; |
} IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER; |
typedef struct _IMAGE_ROM_OPTIONAL_HEADER { |
UINT16 Magic; |
UINT8 MajorLinkerVersion; |
UINT8 MinorLinkerVersion; |
UINT32 SizeOfCode; |
UINT32 SizeOfInitializedData; |
UINT32 SizeOfUninitializedData; |
UINT32 AddressOfEntryPoint; |
UINT32 BaseOfCode; |
UINT32 BaseOfData; |
UINT32 BaseOfBss; |
UINT32 GprMask; |
UINT32 CprMask[4]; |
UINT32 GpValue; |
} IMAGE_ROM_OPTIONAL_HEADER, *PIMAGE_ROM_OPTIONAL_HEADER; |
#define IMAGE_SIZEOF_ROM_OPTIONAL_HEADER 56 |
#define IMAGE_SIZEOF_STD_OPTIONAL_HEADER 28 |
#define IMAGE_SIZEOF_NT_OPTIONAL_HEADER 224 |
#define IMAGE_NT_OPTIONAL_HDR_MAGIC 0x10b |
#define IMAGE_ROM_OPTIONAL_HDR_MAGIC 0x107 |
typedef struct _IMAGE_NT_HEADERS { |
UINT32 Signature; |
IMAGE_FILE_HEADER FileHeader; |
IMAGE_OPTIONAL_HEADER OptionalHeader; |
} IMAGE_NT_HEADERS, *PIMAGE_NT_HEADERS; |
typedef struct _IMAGE_ROM_HEADERS { |
IMAGE_FILE_HEADER FileHeader; |
IMAGE_ROM_OPTIONAL_HEADER OptionalHeader; |
} IMAGE_ROM_HEADERS, *PIMAGE_ROM_HEADERS; |
#define IMAGE_FIRST_SECTION( ntheader ) ((PIMAGE_SECTION_HEADER) \ |
((UINT32)ntheader + \ |
FIELD_OFFSET( IMAGE_NT_HEADERS, OptionalHeader ) + \ |
((PIMAGE_NT_HEADERS)(ntheader))->FileHeader.SizeOfOptionalHeader \ |
)) |
// Subsystem Values |
#define IMAGE_SUBSYSTEM_UNKNOWN 0 // Unknown subsystem. |
#define IMAGE_SUBSYSTEM_NATIVE 1 // Image doesn't require a subsystem. |
#define IMAGE_SUBSYSTEM_WINDOWS_GUI 2 // Image runs in the Windows GUI subsystem. |
#define IMAGE_SUBSYSTEM_WINDOWS_CUI 3 // Image runs in the Windows character subsystem. |
#define IMAGE_SUBSYSTEM_OS2_CUI 5 // image runs in the OS/2 character subsystem. |
#define IMAGE_SUBSYSTEM_POSIX_CUI 7 // image run in the Posix character subsystem. |
// Directory Entries |
#define IMAGE_DIRECTORY_ENTRY_EXPORT 0 // Export Directory |
#define IMAGE_DIRECTORY_ENTRY_IMPORT 1 // Import Directory |
#define IMAGE_DIRECTORY_ENTRY_RESOURCE 2 // Resource Directory |
#define IMAGE_DIRECTORY_ENTRY_EXCEPTION 3 // Exception Directory |
#define IMAGE_DIRECTORY_ENTRY_SECURITY 4 // Security Directory |
#define IMAGE_DIRECTORY_ENTRY_BASERELOC 5 // Base Relocation Table |
#define IMAGE_DIRECTORY_ENTRY_DEBUG 6 // Debug Directory |
#define IMAGE_DIRECTORY_ENTRY_COPYRIGHT 7 // Description String |
#define IMAGE_DIRECTORY_ENTRY_GLOBALPTR 8 // Machine Value (MIPS GP) |
#define IMAGE_DIRECTORY_ENTRY_TLS 9 // TLS Directory |
#define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10 // Load Configuration Directory |
// |
// Section header format. |
// |
#define IMAGE_SIZEOF_SHORT_NAME 8 |
typedef struct _IMAGE_SECTION_HEADER { |
UINT8 Name[IMAGE_SIZEOF_SHORT_NAME]; |
union { |
UINT32 PhysicalAddress; |
UINT32 VirtualSize; |
} Misc; |
UINT32 VirtualAddress; |
UINT32 SizeOfRawData; |
UINT32 PointerToRawData; |
UINT32 PointerToRelocations; |
UINT32 PointerToLinenumbers; |
UINT16 NumberOfRelocations; |
UINT16 NumberOfLinenumbers; |
UINT32 Characteristics; |
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER; |
#define IMAGE_SIZEOF_SECTION_HEADER 40 |
#define IMAGE_SCN_TYPE_NO_PAD 0x00000008 // Reserved. |
#define IMAGE_SCN_CNT_CODE 0x00000020 // Section contains code. |
#define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040 // Section contains initialized data. |
#define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080 // Section contains uninitialized data. |
#define IMAGE_SCN_LNK_OTHER 0x00000100 // Reserved. |
#define IMAGE_SCN_LNK_INFO 0x00000200 // Section contains comments or some other type of information. |
#define IMAGE_SCN_LNK_REMOVE 0x00000800 // Section contents will not become part of image. |
#define IMAGE_SCN_LNK_COMDAT 0x00001000 // Section contents comdat. |
#define IMAGE_SCN_ALIGN_1BYTES 0x00100000 // |
#define IMAGE_SCN_ALIGN_2BYTES 0x00200000 // |
#define IMAGE_SCN_ALIGN_4BYTES 0x00300000 // |
#define IMAGE_SCN_ALIGN_8BYTES 0x00400000 // |
#define IMAGE_SCN_ALIGN_16BYTES 0x00500000 // Default alignment if no others are specified. |
#define IMAGE_SCN_ALIGN_32BYTES 0x00600000 // |
#define IMAGE_SCN_ALIGN_64BYTES 0x00700000 // |
#define IMAGE_SCN_MEM_DISCARDABLE 0x02000000 // Section can be discarded. |
#define IMAGE_SCN_MEM_NOT_CACHED 0x04000000 // Section is not cachable. |
#define IMAGE_SCN_MEM_NOT_PAGED 0x08000000 // Section is not pageable. |
#define IMAGE_SCN_MEM_SHARED 0x10000000 // Section is shareable. |
#define IMAGE_SCN_MEM_EXECUTE 0x20000000 // Section is executable. |
#define IMAGE_SCN_MEM_READ 0x40000000 // Section is readable. |
#define IMAGE_SCN_MEM_WRITE 0x80000000 // Section is writeable. |
// |
// Symbol format. |
// |
#define IMAGE_SIZEOF_SYMBOL 18 |
// |
// Section values. |
// |
// Symbols have a section number of the section in which they are |
// defined. Otherwise, section numbers have the following meanings: |
// |
#define IMAGE_SYM_UNDEFINED (UINT16)0 // Symbol is undefined or is common. |
#define IMAGE_SYM_ABSOLUTE (UINT16)-1 // Symbol is an absolute value. |
#define IMAGE_SYM_DEBUG (UINT16)-2 // Symbol is a special debug item. |
// |
// Type (fundamental) values. |
// |
#define IMAGE_SYM_TYPE_NULL 0 // no type. |
#define IMAGE_SYM_TYPE_VOID 1 // |
#define IMAGE_SYM_TYPE_CHAR 2 // type character. |
#define IMAGE_SYM_TYPE_SHORT 3 // type short integer. |
#define IMAGE_SYM_TYPE_INT 4 // |
#define IMAGE_SYM_TYPE_LONG 5 // |
#define IMAGE_SYM_TYPE_FLOAT 6 // |
#define IMAGE_SYM_TYPE_DOUBLE 7 // |
#define IMAGE_SYM_TYPE_STRUCT 8 // |
#define IMAGE_SYM_TYPE_UNION 9 // |
#define IMAGE_SYM_TYPE_ENUM 10 // enumeration. |
#define IMAGE_SYM_TYPE_MOE 11 // member of enumeration. |
#define IMAGE_SYM_TYPE_BYTE 12 // |
#define IMAGE_SYM_TYPE_WORD 13 // |
#define IMAGE_SYM_TYPE_UINT 14 // |
#define IMAGE_SYM_TYPE_DWORD 15 // |
// |
// Type (derived) values. |
// |
#define IMAGE_SYM_DTYPE_NULL 0 // no derived type. |
#define IMAGE_SYM_DTYPE_POINTER 1 // pointer. |
#define IMAGE_SYM_DTYPE_FUNCTION 2 // function. |
#define IMAGE_SYM_DTYPE_ARRAY 3 // array. |
// |
// Storage classes. |
// |
#define IMAGE_SYM_CLASS_END_OF_FUNCTION (BYTE )-1 |
#define IMAGE_SYM_CLASS_NULL 0 |
#define IMAGE_SYM_CLASS_AUTOMATIC 1 |
#define IMAGE_SYM_CLASS_EXTERNAL 2 |
#define IMAGE_SYM_CLASS_STATIC 3 |
#define IMAGE_SYM_CLASS_REGISTER 4 |
#define IMAGE_SYM_CLASS_EXTERNAL_DEF 5 |
#define IMAGE_SYM_CLASS_LABEL 6 |
#define IMAGE_SYM_CLASS_UNDEFINED_LABEL 7 |
#define IMAGE_SYM_CLASS_MEMBER_OF_STRUCT 8 |
#define IMAGE_SYM_CLASS_ARGUMENT 9 |
#define IMAGE_SYM_CLASS_STRUCT_TAG 10 |
#define IMAGE_SYM_CLASS_MEMBER_OF_UNION 11 |
#define IMAGE_SYM_CLASS_UNION_TAG 12 |
#define IMAGE_SYM_CLASS_TYPE_DEFINITION 13 |
#define IMAGE_SYM_CLASS_UNDEFINED_STATIC 14 |
#define IMAGE_SYM_CLASS_ENUM_TAG 15 |
#define IMAGE_SYM_CLASS_MEMBER_OF_ENUM 16 |
#define IMAGE_SYM_CLASS_REGISTER_PARAM 17 |
#define IMAGE_SYM_CLASS_BIT_FIELD 18 |
#define IMAGE_SYM_CLASS_BLOCK 100 |
#define IMAGE_SYM_CLASS_FUNCTION 101 |
#define IMAGE_SYM_CLASS_END_OF_STRUCT 102 |
#define IMAGE_SYM_CLASS_FILE 103 |
// new |
#define IMAGE_SYM_CLASS_SECTION 104 |
#define IMAGE_SYM_CLASS_WEAK_EXTERNAL 105 |
// type packing constants |
#define N_BTMASK 017 |
#define N_TMASK 060 |
#define N_TMASK1 0300 |
#define N_TMASK2 0360 |
#define N_BTSHFT 4 |
#define N_TSHIFT 2 |
// MACROS |
// |
// Communal selection types. |
// |
#define IMAGE_COMDAT_SELECT_NODUPLICATES 1 |
#define IMAGE_COMDAT_SELECT_ANY 2 |
#define IMAGE_COMDAT_SELECT_SAME_SIZE 3 |
#define IMAGE_COMDAT_SELECT_EXACT_MATCH 4 |
#define IMAGE_COMDAT_SELECT_ASSOCIATIVE 5 |
#define IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY 1 |
#define IMAGE_WEAK_EXTERN_SEARCH_LIBRARY 2 |
#define IMAGE_WEAK_EXTERN_SEARCH_ALIAS 3 |
// |
// Relocation format. |
// |
typedef struct _IMAGE_RELOCATION { |
UINT32 VirtualAddress; |
UINT32 SymbolTableIndex; |
UINT16 Type; |
} IMAGE_RELOCATION; |
#define IMAGE_SIZEOF_RELOCATION 10 |
// |
// I386 relocation types. |
// |
#define IMAGE_REL_I386_ABSOLUTE 0 // Reference is absolute, no relocation is necessary |
#define IMAGE_REL_I386_DIR16 01 // Direct 16-bit reference to the symbols virtual address |
#define IMAGE_REL_I386_REL16 02 // PC-relative 16-bit reference to the symbols virtual address |
#define IMAGE_REL_I386_DIR32 06 // Direct 32-bit reference to the symbols virtual address |
#define IMAGE_REL_I386_DIR32NB 07 // Direct 32-bit reference to the symbols virtual address, base not included |
#define IMAGE_REL_I386_SEG12 011 // Direct 16-bit reference to the segment-selector bits of a 32-bit virtual address |
#define IMAGE_REL_I386_SECTION 012 |
#define IMAGE_REL_I386_SECREL 013 |
#define IMAGE_REL_I386_REL32 024 // PC-relative 32-bit reference to the symbols virtual address |
// |
// MIPS relocation types. |
// |
#define IMAGE_REL_MIPS_ABSOLUTE 0 // Reference is absolute, no relocation is necessary |
#define IMAGE_REL_MIPS_REFHALF 01 |
#define IMAGE_REL_MIPS_REFWORD 02 |
#define IMAGE_REL_MIPS_JMPADDR 03 |
#define IMAGE_REL_MIPS_REFHI 04 |
#define IMAGE_REL_MIPS_REFLO 05 |
#define IMAGE_REL_MIPS_GPREL 06 |
#define IMAGE_REL_MIPS_LITERAL 07 |
#define IMAGE_REL_MIPS_SECTION 012 |
#define IMAGE_REL_MIPS_SECREL 013 |
#define IMAGE_REL_MIPS_REFWORDNB 042 |
#define IMAGE_REL_MIPS_PAIR 045 |
// |
// Alpha Relocation types. |
// |
#define IMAGE_REL_ALPHA_ABSOLUTE 0x0 |
#define IMAGE_REL_ALPHA_REFLONG 0x1 |
#define IMAGE_REL_ALPHA_REFQUAD 0x2 |
#define IMAGE_REL_ALPHA_GPREL32 0x3 |
#define IMAGE_REL_ALPHA_LITERAL 0x4 |
#define IMAGE_REL_ALPHA_LITUSE 0x5 |
#define IMAGE_REL_ALPHA_GPDISP 0x6 |
#define IMAGE_REL_ALPHA_BRADDR 0x7 |
#define IMAGE_REL_ALPHA_HINT 0x8 |
#define IMAGE_REL_ALPHA_INLINE_REFLONG 0x9 |
#define IMAGE_REL_ALPHA_REFHI 0xA |
#define IMAGE_REL_ALPHA_REFLO 0xB |
#define IMAGE_REL_ALPHA_PAIR 0xC |
#define IMAGE_REL_ALPHA_MATCH 0xD |
#define IMAGE_REL_ALPHA_SECTION 0xE |
#define IMAGE_REL_ALPHA_SECREL 0xF |
#define IMAGE_REL_ALPHA_REFLONGNB 0x10 |
// |
// IBM PowerPC relocation types. |
// |
#define IMAGE_REL_PPC_ABSOLUTE 0x0000 // NOP |
#define IMAGE_REL_PPC_ADDR64 0x0001 // 64-bit address |
#define IMAGE_REL_PPC_ADDR32 0x0002 // 32-bit address |
#define IMAGE_REL_PPC_ADDR24 0x0003 // 26-bit address, shifted left 2 (branch absolute) |
#define IMAGE_REL_PPC_ADDR16 0x0004 // 16-bit address |
#define IMAGE_REL_PPC_ADDR14 0x0005 // 16-bit address, shifted left 2 (load doubleword) |
#define IMAGE_REL_PPC_REL24 0x0006 // 26-bit PC-relative offset, shifted left 2 (branch relative) |
#define IMAGE_REL_PPC_REL14 0x0007 // 16-bit PC-relative offset, shifted left 2 (br cond relative) |
#define IMAGE_REL_PPC_TOCREL16 0x0008 // 16-bit offset from TOC base |
#define IMAGE_REL_PPC_TOCREL14 0x0009 // 16-bit offset from TOC base, shifted left 2 (load doubleword) |
#define IMAGE_REL_PPC_ADDR32NB 0x000A // 32-bit addr w/o image base |
#define IMAGE_REL_PPC_SECREL 0x000B // va of containing section (as in an image sectionhdr) |
#define IMAGE_REL_PPC_SECTION 0x000C // sectionheader number |
#define IMAGE_REL_PPC_IFGLUE 0x000D // substitute TOC restore instruction iff symbol is glue code |
#define IMAGE_REL_PPC_IMGLUE 0x000E // symbol is glue code; virtual address is TOC restore instruction |
#define IMAGE_REL_PPC_TYPEMASK 0x00FF // mask to isolate above values in IMAGE_RELOCATION.Type |
// Flag bits in IMAGE_RELOCATION.TYPE |
#define IMAGE_REL_PPC_NEG 0x0100 // subtract reloc value rather than adding it |
#define IMAGE_REL_PPC_BRTAKEN 0x0200 // fix branch prediction bit to predict branch taken |
#define IMAGE_REL_PPC_BRNTAKEN 0x0400 // fix branch prediction bit to predict branch not taken |
#define IMAGE_REL_PPC_TOCDEFN 0x0800 // toc slot defined in file (or, data in toc) |
// |
// Based relocation format. |
// |
typedef struct _IMAGE_BASE_RELOCATION { |
UINT32 VirtualAddress; |
UINT32 SizeOfBlock; |
// UINT16 TypeOffset[1]; |
} IMAGE_BASE_RELOCATION, *PIMAGE_BASE_RELOCATION; |
#define IMAGE_SIZEOF_BASE_RELOCATION 8 |
// |
// Based relocation types. |
// |
#define IMAGE_REL_BASED_ABSOLUTE 0 |
#define IMAGE_REL_BASED_HIGH 1 |
#define IMAGE_REL_BASED_LOW 2 |
#define IMAGE_REL_BASED_HIGHLOW 3 |
#define IMAGE_REL_BASED_HIGHADJ 4 |
#define IMAGE_REL_BASED_MIPS_JMPADDR 5 |
#define IMAGE_REL_BASED_IA64_IMM64 9 |
#define IMAGE_REL_BASED_DIR64 10 |
// |
// Line number format. |
// |
typedef struct _IMAGE_LINENUMBER { |
union { |
UINT32 SymbolTableIndex; // Symbol table index of function name if Linenumber is 0. |
UINT32 VirtualAddress; // Virtual address of line number. |
} Type; |
UINT16 Linenumber; // Line number. |
} IMAGE_LINENUMBER; |
#define IMAGE_SIZEOF_LINENUMBER 6 |
// |
// Archive format. |
// |
#define IMAGE_ARCHIVE_START_SIZE 8 |
#define IMAGE_ARCHIVE_START "!<arch>\n" |
#define IMAGE_ARCHIVE_END "`\n" |
#define IMAGE_ARCHIVE_PAD "\n" |
#define IMAGE_ARCHIVE_LINKER_MEMBER "/ " |
#define IMAGE_ARCHIVE_LONGNAMES_MEMBER "// " |
typedef struct _IMAGE_ARCHIVE_MEMBER_HEADER { |
UINT8 Name[16]; // File member name - `/' terminated. |
UINT8 Date[12]; // File member date - decimal. |
UINT8 UserID[6]; // File member user id - decimal. |
UINT8 GroupID[6]; // File member group id - decimal. |
UINT8 Mode[8]; // File member mode - octal. |
UINT8 Size[10]; // File member size - decimal. |
UINT8 EndHeader[2]; // String to end header. |
} IMAGE_ARCHIVE_MEMBER_HEADER, *PIMAGE_ARCHIVE_MEMBER_HEADER; |
#define IMAGE_SIZEOF_ARCHIVE_MEMBER_HDR 60 |
// |
// DLL support. |
// |
// |
// Export Format |
// |
typedef struct _IMAGE_EXPORT_DIRECTORY { |
UINT32 Characteristics; |
UINT32 TimeDateStamp; |
UINT16 MajorVersion; |
UINT16 MinorVersion; |
UINT32 Name; |
UINT32 Base; |
UINT32 NumberOfFunctions; |
UINT32 NumberOfNames; |
UINT32 *AddressOfFunctions; |
UINT32 *AddressOfNames; |
UINT32 *AddressOfNameOrdinals; |
} IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY; |
// |
// Import Format |
// |
typedef struct _IMAGE_IMPORT_BY_NAME { |
UINT16 Hint; |
UINT8 Name[1]; |
} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME; |
typedef struct _IMAGE_THUNK_DATA { |
union { |
UINT32 Function; |
UINT32 Ordinal; |
PIMAGE_IMPORT_BY_NAME AddressOfData; |
} u1; |
} IMAGE_THUNK_DATA, *PIMAGE_THUNK_DATA; |
#define IMAGE_ORDINAL_FLAG 0x80000000 |
#define IMAGE_SNAP_BY_ORDINAL(Ordinal) ((Ordinal & IMAGE_ORDINAL_FLAG) != 0) |
#define IMAGE_ORDINAL(Ordinal) (Ordinal & 0xffff) |
typedef struct _IMAGE_IMPORT_DESCRIPTOR { |
UINT32 Characteristics; |
UINT32 TimeDateStamp; |
UINT32 ForwarderChain; |
UINT32 Name; |
PIMAGE_THUNK_DATA FirstThunk; |
} IMAGE_IMPORT_DESCRIPTOR, *PIMAGE_IMPORT_DESCRIPTOR; |
#endif |
/tags/0.3.0/boot/arch/ia64/loader/gefi/inc/efinet.h |
---|
0,0 → 1,340 |
#ifndef _EFINET_H |
#define _EFINET_H |
/*++ |
Copyright (c) 1999 Intel Corporation |
Module Name: |
efinet.h |
Abstract: |
EFI Simple Network protocol |
Revision History |
--*/ |
/////////////////////////////////////////////////////////////////////////////// |
// |
// Simple Network Protocol |
// |
#define EFI_SIMPLE_NETWORK_PROTOCOL \ |
{ 0xA19832B9, 0xAC25, 0x11D3, {0x9A, 0x2D, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0x4D} } |
INTERFACE_DECL(_EFI_SIMPLE_NETWORK); |
/////////////////////////////////////////////////////////////////////////////// |
// |
typedef struct { |
// |
// Total number of frames received. Includes frames with errors and |
// dropped frames. |
// |
UINT64 RxTotalFrames; |
// |
// Number of valid frames received and copied into receive buffers. |
// |
UINT64 RxGoodFrames; |
// |
// Number of frames below the minimum length for the media. |
// This would be <64 for ethernet. |
// |
UINT64 RxUndersizeFrames; |
// |
// Number of frames longer than the maxminum length for the |
// media. This would be >1500 for ethernet. |
// |
UINT64 RxOversizeFrames; |
// |
// Valid frames that were dropped because receive buffers were full. |
// |
UINT64 RxDroppedFrames; |
// |
// Number of valid unicast frames received and not dropped. |
// |
UINT64 RxUnicastFrames; |
// |
// Number of valid broadcast frames received and not dropped. |
// |
UINT64 RxBroadcastFrames; |
// |
// Number of valid mutlicast frames received and not dropped. |
// |
UINT64 RxMulticastFrames; |
// |
// Number of frames w/ CRC or alignment errors. |
// |
UINT64 RxCrcErrorFrames; |
// |
// Total number of bytes received. Includes frames with errors |
// and dropped frames. |
// |
UINT64 RxTotalBytes; |
// |
// Transmit statistics. |
// |
UINT64 TxTotalFrames; |
UINT64 TxGoodFrames; |
UINT64 TxUndersizeFrames; |
UINT64 TxOversizeFrames; |
UINT64 TxDroppedFrames; |
UINT64 TxUnicastFrames; |
UINT64 TxBroadcastFrames; |
UINT64 TxMulticastFrames; |
UINT64 TxCrcErrorFrames; |
UINT64 TxTotalBytes; |
// |
// Number of collisions detection on this subnet. |
// |
UINT64 Collisions; |
// |
// Number of frames destined for unsupported protocol. |
// |
UINT64 UnsupportedProtocol; |
} EFI_NETWORK_STATISTICS; |
/////////////////////////////////////////////////////////////////////////////// |
// |
typedef enum { |
EfiSimpleNetworkStopped, |
EfiSimpleNetworkStarted, |
EfiSimpleNetworkInitialized, |
EfiSimpleNetworkMaxState |
} EFI_SIMPLE_NETWORK_STATE; |
/////////////////////////////////////////////////////////////////////////////// |
// |
#define EFI_SIMPLE_NETWORK_RECEIVE_UNICAST 0x01 |
#define EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST 0x02 |
#define EFI_SIMPLE_NETWORK_RECEIVE_BROADCAST 0x04 |
#define EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS 0x08 |
#define EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS_MULTICAST 0x10 |
/////////////////////////////////////////////////////////////////////////////// |
// |
#define EFI_SIMPLE_NETWORK_RECEIVE_INTERRUPT 0x01 |
#define EFI_SIMPLE_NETWORK_TRANSMIT_INTERRUPT 0x02 |
#define EFI_SIMPLE_NETWORK_COMMAND_INTERRUPT 0x04 |
#define EFI_SIMPLE_NETWORK_SOFTWARE_INTERRUPT 0x08 |
/////////////////////////////////////////////////////////////////////////////// |
// |
#define MAX_MCAST_FILTER_CNT 16 |
typedef struct { |
UINT32 State; |
UINT32 HwAddressSize; |
UINT32 MediaHeaderSize; |
UINT32 MaxPacketSize; |
UINT32 NvRamSize; |
UINT32 NvRamAccessSize; |
UINT32 ReceiveFilterMask; |
UINT32 ReceiveFilterSetting; |
UINT32 MaxMCastFilterCount; |
UINT32 MCastFilterCount; |
EFI_MAC_ADDRESS MCastFilter[MAX_MCAST_FILTER_CNT]; |
EFI_MAC_ADDRESS CurrentAddress; |
EFI_MAC_ADDRESS BroadcastAddress; |
EFI_MAC_ADDRESS PermanentAddress; |
UINT8 IfType; |
BOOLEAN MacAddressChangeable; |
BOOLEAN MultipleTxSupported; |
BOOLEAN MediaPresentSupported; |
BOOLEAN MediaPresent; |
} EFI_SIMPLE_NETWORK_MODE; |
/////////////////////////////////////////////////////////////////////////////// |
// |
typedef |
EFI_STATUS |
(EFIAPI *EFI_SIMPLE_NETWORK_START) ( |
IN struct _EFI_SIMPLE_NETWORK *This |
); |
/////////////////////////////////////////////////////////////////////////////// |
// |
typedef |
EFI_STATUS |
(EFIAPI *EFI_SIMPLE_NETWORK_STOP) ( |
IN struct _EFI_SIMPLE_NETWORK *This |
); |
/////////////////////////////////////////////////////////////////////////////// |
// |
typedef |
EFI_STATUS |
(EFIAPI *EFI_SIMPLE_NETWORK_INITIALIZE) ( |
IN struct _EFI_SIMPLE_NETWORK *This, |
IN UINTN ExtraRxBufferSize OPTIONAL, |
IN UINTN ExtraTxBufferSize OPTIONAL |
); |
/////////////////////////////////////////////////////////////////////////////// |
// |
typedef |
EFI_STATUS |
(EFIAPI *EFI_SIMPLE_NETWORK_RESET) ( |
IN struct _EFI_SIMPLE_NETWORK *This, |
IN BOOLEAN ExtendedVerification |
); |
/////////////////////////////////////////////////////////////////////////////// |
// |
typedef |
EFI_STATUS |
(EFIAPI *EFI_SIMPLE_NETWORK_SHUTDOWN) ( |
IN struct _EFI_SIMPLE_NETWORK *This |
); |
/////////////////////////////////////////////////////////////////////////////// |
// |
typedef |
EFI_STATUS |
(EFIAPI *EFI_SIMPLE_NETWORK_RECEIVE_FILTERS) ( |
IN struct _EFI_SIMPLE_NETWORK *This, |
IN UINT32 Enable, |
IN UINT32 Disable, |
IN BOOLEAN ResetMCastFilter, |
IN UINTN MCastFilterCnt OPTIONAL, |
IN EFI_MAC_ADDRESS *MCastFilter OPTIONAL |
); |
/////////////////////////////////////////////////////////////////////////////// |
// |
typedef |
EFI_STATUS |
(EFIAPI *EFI_SIMPLE_NETWORK_STATION_ADDRESS) ( |
IN struct _EFI_SIMPLE_NETWORK *This, |
IN BOOLEAN Reset, |
IN EFI_MAC_ADDRESS *New OPTIONAL |
); |
/////////////////////////////////////////////////////////////////////////////// |
// |
typedef |
EFI_STATUS |
(EFIAPI *EFI_SIMPLE_NETWORK_STATISTICS) ( |
IN struct _EFI_SIMPLE_NETWORK *This, |
IN BOOLEAN Reset, |
IN OUT UINTN *StatisticsSize OPTIONAL, |
OUT EFI_NETWORK_STATISTICS *StatisticsTable OPTIONAL |
); |
/////////////////////////////////////////////////////////////////////////////// |
// |
typedef |
EFI_STATUS |
(EFIAPI *EFI_SIMPLE_NETWORK_MCAST_IP_TO_MAC) ( |
IN struct _EFI_SIMPLE_NETWORK *This, |
IN BOOLEAN IPv6, |
IN EFI_IP_ADDRESS *IP, |
OUT EFI_MAC_ADDRESS *MAC |
); |
/////////////////////////////////////////////////////////////////////////////// |
// |
typedef |
EFI_STATUS |
(EFIAPI *EFI_SIMPLE_NETWORK_NVDATA) ( |
IN struct _EFI_SIMPLE_NETWORK *This, |
IN BOOLEAN ReadWrite, |
IN UINTN Offset, |
IN UINTN BufferSize, |
IN OUT VOID *Buffer |
); |
/////////////////////////////////////////////////////////////////////////////// |
// |
typedef |
EFI_STATUS |
(EFIAPI *EFI_SIMPLE_NETWORK_GET_STATUS) ( |
IN struct _EFI_SIMPLE_NETWORK *This, |
OUT UINT32 *InterruptStatus OPTIONAL, |
OUT VOID **TxBuf OPTIONAL |
); |
/////////////////////////////////////////////////////////////////////////////// |
// |
typedef |
EFI_STATUS |
(EFIAPI *EFI_SIMPLE_NETWORK_TRANSMIT) ( |
IN struct _EFI_SIMPLE_NETWORK *This, |
IN UINTN HeaderSize, |
IN UINTN BufferSize, |
IN VOID *Buffer, |
IN EFI_MAC_ADDRESS *SrcAddr OPTIONAL, |
IN EFI_MAC_ADDRESS *DestAddr OPTIONAL, |
IN UINT16 *Protocol OPTIONAL |
); |
/////////////////////////////////////////////////////////////////////////////// |
// |
typedef |
EFI_STATUS |
(EFIAPI *EFI_SIMPLE_NETWORK_RECEIVE) ( |
IN struct _EFI_SIMPLE_NETWORK *This, |
OUT UINTN *HeaderSize OPTIONAL, |
IN OUT UINTN *BufferSize, |
OUT VOID *Buffer, |
OUT EFI_MAC_ADDRESS *SrcAddr OPTIONAL, |
OUT EFI_MAC_ADDRESS *DestAddr OPTIONAL, |
OUT UINT16 *Protocol OPTIONAL |
); |
/////////////////////////////////////////////////////////////////////////////// |
// |
#define EFI_SIMPLE_NETWORK_INTERFACE_REVISION 0x00010000 |
typedef struct _EFI_SIMPLE_NETWORK { |
UINT64 Revision; |
EFI_SIMPLE_NETWORK_START Start; |
EFI_SIMPLE_NETWORK_STOP Stop; |
EFI_SIMPLE_NETWORK_INITIALIZE Initialize; |
EFI_SIMPLE_NETWORK_RESET Reset; |
EFI_SIMPLE_NETWORK_SHUTDOWN Shutdown; |
EFI_SIMPLE_NETWORK_RECEIVE_FILTERS ReceiveFilters; |
EFI_SIMPLE_NETWORK_STATION_ADDRESS StationAddress; |
EFI_SIMPLE_NETWORK_STATISTICS Statistics; |
EFI_SIMPLE_NETWORK_MCAST_IP_TO_MAC MCastIpToMac; |
EFI_SIMPLE_NETWORK_NVDATA NvData; |
EFI_SIMPLE_NETWORK_GET_STATUS GetStatus; |
EFI_SIMPLE_NETWORK_TRANSMIT Transmit; |
EFI_SIMPLE_NETWORK_RECEIVE Receive; |
EFI_EVENT WaitForPacket; |
EFI_SIMPLE_NETWORK_MODE *Mode; |
} EFI_SIMPLE_NETWORK; |
#endif /* _EFINET_H */ |
/tags/0.3.0/boot/arch/ia64/loader/gefi/inc/efidebug.h |
---|
0,0 → 1,110 |
#ifndef _EFI_DEBUG_H |
#define _EFI_DEBUG_H |
/*++ |
Copyright (c) 1998 Intel Corporation |
Module Name: |
efidebug.h |
Abstract: |
EFI library debug functions |
Revision History |
--*/ |
extern UINTN EFIDebug; |
#if EFI_DEBUG |
#define DBGASSERT(a) DbgAssert(__FILE__, __LINE__, #a) |
#define DEBUG(a) DbgPrint a |
#else |
#define DBGASSERT(a) |
#define DEBUG(a) |
#endif |
#if EFI_DEBUG_CLEAR_MEMORY |
#define DBGSETMEM(a,l) SetMem(a,l,(CHAR8)BAD_POINTER) |
#else |
#define DBGSETMEM(a,l) |
#endif |
#define D_INIT 0x00000001 // Initialization style messages |
#define D_WARN 0x00000002 // Warnings |
#define D_LOAD 0x00000004 // Load events |
#define D_FS 0x00000008 // EFI File system |
#define D_POOL 0x00000010 // Alloc & Free's |
#define D_PAGE 0x00000020 // Alloc & Free's |
#define D_INFO 0x00000040 // Verbose |
#define D_VAR 0x00000100 // Variable |
#define D_PARSE 0x00000200 // Command parsing |
#define D_BM 0x00000400 // Boot manager |
#define D_BLKIO 0x00001000 // BlkIo Driver |
#define D_BLKIO_ULTRA 0x00002000 // BlkIo Driver |
#define D_NET 0x00004000 // SNI Driver |
#define D_NET_ULTRA 0x00008000 // SNI Driver |
#define D_TXTIN 0x00010000 // Simple Input Driver |
#define D_TXTOUT 0x00020000 // Simple Text Output Driver |
#define D_ERROR_ATA 0x00040000 // ATA error messages |
#define D_ERROR 0x80000000 // Error |
#define D_RESERVED 0x7fffC880 // Bits not reserved above |
// |
// Current Debug level of the system, value of EFIDebug |
// |
//#define EFI_DBUG_MASK (D_ERROR | D_WARN | D_LOAD | D_BLKIO | D_INIT) |
#define EFI_DBUG_MASK (D_ERROR) |
// |
// |
// |
#if EFI_DEBUG |
#define ASSERT(a) if(!(a)) DBGASSERT(a) |
#define ASSERT_LOCKED(l) if(!(l)->Lock) DBGASSERT(l not locked) |
#define ASSERT_STRUCT(p,t) DBGASSERT(t not structure), p |
#else |
#define ASSERT(a) |
#define ASSERT_LOCKED(l) |
#define ASSERT_STRUCT(p,t) |
#endif |
// |
// Prototypes |
// |
INTN |
DbgAssert ( |
CHAR8 *file, |
INTN lineno, |
CHAR8 *string |
); |
INTN |
DbgPrint ( |
INTN mask, |
CHAR8 *format, |
... |
); |
#endif |
/tags/0.3.0/boot/arch/ia64/loader/gefi/inc/protocol/intload.h |
---|
0,0 → 1,27 |
/*++ |
Copyright (c) 1999 Intel Corporation |
Module Name: |
intload |
Abstract: |
EFI support for loading internally linked in apps |
Revision History |
--*/ |
#ifndef _INTERNAL_LOAD_INCLUDE_ |
#define _INTERNAL_LOAD_INCLUDE_ |
// {D65A6B8C-71E5-4df0-A909-F0D2992B5AA9} |
#define INTERNAL_SHELL_GUID \ |
{ 0xd65a6b8c, 0x71e5, 0x4df0, {0xa9, 0x09, 0xf0, 0xd2, 0x99, 0x2b, 0x5a, 0xa9} } |
#endif |
/tags/0.3.0/boot/arch/ia64/loader/gefi/inc/protocol/efivar.h |
---|
0,0 → 1,133 |
/*++ |
Copyright (c) 1998 Intel Corporation |
Module Name: |
Abstract: |
Revision History |
--*/ |
// |
// The variable store protocol interface is specific to the reference |
// implementation. The initialization code adds variable store devices |
// to the system, and the FW connects to the devices to provide the |
// variable store interfaces through these devices. |
// |
// |
// Variable Store Device protocol |
// |
#define VARIABLE_STORE_PROTOCOL \ |
{ 0xf088cd91, 0xa046, 0x11d2, {0x8e, 0x42, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} } |
INTERFACE_DECL(_EFI_VARIABLE_STORE); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_STORE_CLEAR) ( |
IN struct _EFI_VARIABLE_STORE *This, |
IN UINTN BankNo, |
IN OUT VOID *Scratch |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_STORE_READ) ( |
IN struct _EFI_VARIABLE_STORE *This, |
IN UINTN BankNo, |
IN UINTN Offset, |
IN UINTN BufferSize, |
OUT VOID *Buffer |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_STORE_UPDATE) ( |
IN struct _EFI_VARIABLE_STORE *This, |
IN UINTN BankNo, |
IN UINTN Offset, |
IN UINTN BufferSize, |
IN VOID *Buffer |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_STORE_SIZE) ( |
IN struct _EFI_VARIABLE_STORE *This, |
IN UINTN NoBanks |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_TRANSACTION_UPDATE) ( |
IN struct _EFI_VARIABLE_STORE *This, |
IN UINTN BankNo, |
IN VOID *NewContents |
); |
typedef struct _EFI_VARIABLE_STORE { |
// |
// Number of banks and bank size |
// |
UINT32 Attributes; |
UINT32 BankSize; |
UINT32 NoBanks; |
// |
// Functions to access the storage banks |
// |
EFI_STORE_CLEAR ClearStore; |
EFI_STORE_READ ReadStore; |
EFI_STORE_UPDATE UpdateStore; |
EFI_STORE_SIZE SizeStore OPTIONAL; |
EFI_TRANSACTION_UPDATE TransactionUpdate OPTIONAL; |
} EFI_VARIABLE_STORE; |
// |
// |
// ClearStore() - A function to clear the requested storage bank. A cleared |
// bank contains all "on" bits. |
// |
// ReadStore() - Read data from the requested store. |
// |
// UpdateStore() - Updates data on the requested store. The FW will only |
// ever issue updates to clear bits in the store. Updates must be |
// performed in LSb to MSb order of the update buffer. |
// |
// SizeStore() - An optional function for non-runtime stores that can be |
// dynamically sized. The FW will only ever increase or decrease the store |
// by 1 banksize at a time, and it is always adding or removing a bank from |
// the end of the store. |
// |
// By default the FW will update variables and storage banks in an |
// "atomic" manner by keeping 1 old copy of the data during an update, |
// and recovering appropiately if the power is lost during the middle |
// of an operation. To do this the FW needs to have multiple banks |
// of storage dedicated to its use. If that's not possible, the driver |
// can implement an atomic bank update function and the FW will allow |
// 1 bank in this case. (It will allow any number of banks, |
// but it won't require an "extra" bank to provide its bank transaction |
// function). |
// |
// TransactionUpdate() - An optional function that can clear & update an |
// entire bank in an "atomic" fashion. If the operation fails in the |
// middle the driver is responsible for having either the previous copy |
// of the bank's data or the new copy. A copy that's partially written |
// is not valid as internal data settings may get lost. Supply this |
// function only when needed. |
// |
/tags/0.3.0/boot/arch/ia64/loader/gefi/inc/protocol/ia64/eficontext.h |
---|
0,0 → 1,208 |
/* |
* Copyright (c) 1999, 2000 |
* Intel Corporation. |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* |
* This product includes software developed by Intel Corporation and |
* its contributors. |
* |
* 4. Neither the name of Intel Corporation or its contributors may be |
* used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION AND CONTRIBUTORS ``AS IS'' |
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION OR CONTRIBUTORS BE |
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF |
* THE POSSIBILITY OF SUCH DAMAGE. |
* |
*/ |
#ifndef _EFICONTEXT_H_ |
#define _EFICONTEXT_H_ |
// |
// IA-64 processor exception types |
// |
#define EXCPT_ALT_DTLB 4 |
#define EXCPT_DNESTED_TLB 5 |
#define EXCPT_BREAKPOINT 11 |
#define EXCPT_EXTERNAL_INTERRUPT 12 |
#define EXCPT_GEN_EXCEPT 24 |
#define EXCPT_NAT_CONSUMPTION 26 |
#define EXCPT_DEBUG_EXCEPT 29 |
#define EXCPT_UNALIGNED_ACCESS 30 |
#define EXCPT_FP_FAULT 32 |
#define EXCPT_FP_TRAP 33 |
#define EXCPT_TAKEN_BRANCH 35 |
#define EXCPT_SINGLE_STEP 36 |
// |
// IA-64 processor context definition - must be 512 byte aligned!!! |
// |
typedef |
struct { |
UINT64 reserved; // necessary to preserve alignment for the correct bits in UNAT and to insure F2 is 16 byte aligned... |
UINT64 r1; |
UINT64 r2; |
UINT64 r3; |
UINT64 r4; |
UINT64 r5; |
UINT64 r6; |
UINT64 r7; |
UINT64 r8; |
UINT64 r9; |
UINT64 r10; |
UINT64 r11; |
UINT64 r12; |
UINT64 r13; |
UINT64 r14; |
UINT64 r15; |
UINT64 r16; |
UINT64 r17; |
UINT64 r18; |
UINT64 r19; |
UINT64 r20; |
UINT64 r21; |
UINT64 r22; |
UINT64 r23; |
UINT64 r24; |
UINT64 r25; |
UINT64 r26; |
UINT64 r27; |
UINT64 r28; |
UINT64 r29; |
UINT64 r30; |
UINT64 r31; |
UINT64 f2[2]; |
UINT64 f3[2]; |
UINT64 f4[2]; |
UINT64 f5[2]; |
UINT64 f6[2]; |
UINT64 f7[2]; |
UINT64 f8[2]; |
UINT64 f9[2]; |
UINT64 f10[2]; |
UINT64 f11[2]; |
UINT64 f12[2]; |
UINT64 f13[2]; |
UINT64 f14[2]; |
UINT64 f15[2]; |
UINT64 f16[2]; |
UINT64 f17[2]; |
UINT64 f18[2]; |
UINT64 f19[2]; |
UINT64 f20[2]; |
UINT64 f21[2]; |
UINT64 f22[2]; |
UINT64 f23[2]; |
UINT64 f24[2]; |
UINT64 f25[2]; |
UINT64 f26[2]; |
UINT64 f27[2]; |
UINT64 f28[2]; |
UINT64 f29[2]; |
UINT64 f30[2]; |
UINT64 f31[2]; |
UINT64 pr; |
UINT64 b0; |
UINT64 b1; |
UINT64 b2; |
UINT64 b3; |
UINT64 b4; |
UINT64 b5; |
UINT64 b6; |
UINT64 b7; |
// application registers |
UINT64 ar_rsc; |
UINT64 ar_bsp; |
UINT64 ar_bspstore; |
UINT64 ar_rnat; |
UINT64 ar_fcr; |
UINT64 ar_eflag; |
UINT64 ar_csd; |
UINT64 ar_ssd; |
UINT64 ar_cflg; |
UINT64 ar_fsr; |
UINT64 ar_fir; |
UINT64 ar_fdr; |
UINT64 ar_ccv; |
UINT64 ar_unat; |
UINT64 ar_fpsr; |
UINT64 ar_pfs; |
UINT64 ar_lc; |
UINT64 ar_ec; |
// control registers |
UINT64 cr_dcr; |
UINT64 cr_itm; |
UINT64 cr_iva; |
UINT64 cr_pta; |
UINT64 cr_ipsr; |
UINT64 cr_isr; |
UINT64 cr_iip; |
UINT64 cr_ifa; |
UINT64 cr_itir; |
UINT64 cr_iipa; |
UINT64 cr_ifs; |
UINT64 cr_iim; |
UINT64 cr_iha; |
// debug registers |
UINT64 dbr0; |
UINT64 dbr1; |
UINT64 dbr2; |
UINT64 dbr3; |
UINT64 dbr4; |
UINT64 dbr5; |
UINT64 dbr6; |
UINT64 dbr7; |
UINT64 ibr0; |
UINT64 ibr1; |
UINT64 ibr2; |
UINT64 ibr3; |
UINT64 ibr4; |
UINT64 ibr5; |
UINT64 ibr6; |
UINT64 ibr7; |
// virtual registers |
UINT64 int_nat; // nat bits for R1-R31 |
} SYSTEM_CONTEXT; |
#endif /* _EFI_CONTEXT_H_ */ |
/tags/0.3.0/boot/arch/ia64/loader/gefi/inc/protocol/eficonsplit.h |
---|
0,0 → 1,32 |
#ifndef _EFI_CONFORK_H |
#define _EFI_CONFORK_H |
/*++ |
Copyright (c) 1999 Intel Corporation |
Module Name: |
Abstract: |
Revision History |
--*/ |
// |
// ConOut Forker Protocol |
// |
#define TEXT_OUT_SPLITER_PROTOCOL \ |
{ 0x56d830a0, 0x7e7a, 0x11d3, {0xbb, 0xa0, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} } |
#define ERROR_OUT_SPLITER_PROTOCOL \ |
{ 0xf0ba9039, 0x68f1, 0x425e, {0xaa, 0x7f, 0xd9, 0xaa, 0xf9, 0x1b, 0x82, 0xa1}} |
#define TEXT_IN_SPLITER_PROTOCOL \ |
{ 0xf9a3c550, 0x7fb5, 0x11d3, {0xbb, 0xa0, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} } |
#endif |
/tags/0.3.0/boot/arch/ia64/loader/gefi/inc/protocol/efidbg.h |
---|
0,0 → 1,210 |
/* |
* Copyright (c) 1999, 2000 |
* Intel Corporation. |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* 1. Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* |
* This product includes software developed by Intel Corporation and |
* its contributors. |
* |
* 4. Neither the name of Intel Corporation or its contributors may be |
* used to endorse or promote products derived from this software |
* without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION AND CONTRIBUTORS ``AS IS'' |
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION OR CONTRIBUTORS BE |
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF |
* THE POSSIBILITY OF SUCH DAMAGE. |
* |
*/ |
#ifndef _EFIDBG_H_ |
#define _EFIDBG_H_ |
#include "eficontext.h" |
#include "efiser.h" |
typedef struct _DEBUGPORT_16550_CONFIG_DATA { |
UINT32 PortAddress; |
UINT64 BaudRate; |
UINT32 ReceiveFifoDepth; |
UINT32 Timeout; |
UINT8 Parity; |
UINT8 DataBits; |
UINT8 StopBits; |
UINT32 ControlMask; |
BOOLEAN RtsCtsEnable; // RTS, CTS control |
} DEBUGPORT_16550_CONFIG_DATA; |
typedef struct _DEBUGPORT_16550_DEVICE_PATH { |
EFI_DEVICE_PATH Header; |
DEBUGPORT_16550_CONFIG_DATA ConfigData; |
} DEBUGPORT_16550_DEVICE_PATH; |
typedef union { |
EFI_DEVICE_PATH DevPath; |
DEBUGPORT_16550_DEVICE_PATH Uart; |
// add new types of debugport device paths to this union... |
} DEBUGPORT_DEV_PATH; |
// |
// Debug Support protocol {2755590C-6F3C-42FA-9EA4-A3BA543CDA25} |
// |
#define DEBUG_SUPPORT_PROTOCOL \ |
{ 0x2755590C, 0x6F3C, 0x42fa, 0x9E, 0xA4, 0xA3, 0xBA, 0x54, 0x3C, 0xDA, 0x25 } |
typedef UINTN EXCEPTION_TYPE; |
typedef |
VOID |
(*EXCEPTION_HANDLER) ( |
IN EXCEPTION_TYPE ExceptionType, |
IN SYSTEM_CONTEXT *SystemContext |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_REGISTER_TIMER_TICK_CALLBACK) ( |
IN struct _EFI_DEBUG_SUPPORT_INTERFACE *This, |
IN EXCEPTION_HANDLER TimerTickCallback |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_REGISTER_EXCEPTION_HANDLER) ( |
IN struct _EFI_DEBUG_SUPPORT_INTERFACE *This, |
IN EXCEPTION_HANDLER ExceptionHandler, |
IN EXCEPTION_TYPE ExceptionType |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_IP_CALL_TRACE) ( |
IN struct _EFI_DEBUG_SUPPORT_INTERFACE *This |
); |
#define EFI_DEBUG_SUPPORT_INTERFACE_REVISION 0x00010000 |
typedef struct _EFI_DEBUG_SUPPORT_INTERFACE { |
UINT32 Revision; |
EFI_REGISTER_TIMER_TICK_CALLBACK RegisterTimerTickCallback; |
EFI_REGISTER_EXCEPTION_HANDLER RegisterExceptionHandler; |
EFI_IP_CALL_TRACE IpCallTrace; |
} EFI_DEBUG_SUPPORT_INTERFACE; |
// |
// Debugport io protocol {EBA4E8D2-3858-41EC-A281-2647BA9660D0} |
// |
#define DEBUGPORT_IO_PROTOCOL \ |
{ 0XEBA4E8D2, 0X3858, 0X41EC, 0XA2, 0X81, 0X26, 0X47, 0XBA, 0X96, 0X60, 0XD0 } |
typedef |
EFI_STATUS |
(EFIAPI *EFI_DEBUGPORT_IO_RESET) ( |
IN struct _EFI_DEBUGPORT_IO_INTERFACE *This |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_DEBUGPORT_IO_READ) ( |
IN struct _EFI_DEBUGPORT_IO_INTERFACE *This, |
IN OUT UINTN *BufferSize, |
OUT VOID *Buffer |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_DEBUGPORT_IO_WRITE) ( |
IN struct _EFI_DEBUGPORT_IO_INTERFACE *This, |
IN OUT UINTN *BufferSize, |
IN VOID *Buffer |
); |
#define EFI_DEBUGPORT_IO_INTERFACE_REVISION 0x00010000 |
typedef struct _EFI_DEBUGPORT_IO_INTERFACE { |
UINT32 Revision; |
EFI_DEBUGPORT_IO_READ Read; |
EFI_DEBUGPORT_IO_WRITE Write; |
EFI_DEBUGPORT_IO_RESET Reset; |
} EFI_DEBUGPORT_IO_INTERFACE; |
// |
// Debugport UART16550 control protocol {628EA978-4C26-4605-BC02-A42A496917DD} |
// |
#define DEBUGPORT_UART16550_CONTROL_PROTOCOL \ |
{ 0X628EA978, 0X4C26, 0X4605, 0XBC, 0X2, 0XA4, 0X2A, 0X49, 0X69, 0X17, 0XDD } |
// Note: The definitions for EFI_PARITY_TYPE, EFI_STOP_BITS_TYPE, and |
// SERIAL_IO_MODE are included from efiser.h |
typedef |
EFI_STATUS |
(EFIAPI *EFI_UART16550_SET_ATTRIBUTES) ( |
IN struct _EFI_DEBUGPORT_UART16550_CONTROL_INTERFACE *This, |
IN UINT64 BaudRate, |
IN UINT32 ReceiveFifoDepth, |
IN UINT32 Timeout, |
IN EFI_PARITY_TYPE Parity, |
IN UINT8 DataBits, |
IN EFI_STOP_BITS_TYPE StopBits |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_UART16550_SET_CONTROL_BITS) ( |
IN struct _EFI_DEBUGPORT_UART16550_CONTROL_INTERFACE *This, |
IN UINT32 Control |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_UART16550_GET_CONTROL_BITS) ( |
IN struct _EFI_DEBUGPORT_UART16550_CONTROL_INTERFACE *This, |
OUT UINT32 *Control |
); |
#define EFI_DEBUGPORT_UART16550_CONTROL_INTERFACE_REVISION 0x00010000 |
typedef struct _EFI_DEBUGPORT_UART16550_CONTROL_INTERFACE { |
UINT32 Revision; |
EFI_UART16550_SET_ATTRIBUTES SetAttributes; |
EFI_UART16550_SET_CONTROL_BITS SetControl; |
EFI_UART16550_GET_CONTROL_BITS GetControl; |
DEBUGPORT_16550_CONFIG_DATA *Mode; |
} EFI_DEBUGPORT_UART16550_CONTROL_INTERFACE; |
#define DEVICE_PATH_DEBUGPORT DEBUGPORT_IO_PROTOCOL |
#endif /* _EFIDBG_H_ */ |
/tags/0.3.0/boot/arch/ia64/loader/gefi/inc/protocol/piflash64.h |
---|
0,0 → 1,121 |
#ifndef _PIFLASH64_H |
#define _PIFLASH64_H |
/*++ |
Copyright (c) 1999 Intel Corporation |
Module Name: |
PIflash64.h |
Abstract: |
Iflash64.efi protocol to abstract iflash from |
the system. |
Revision History |
--*/ |
// |
// Guid that identifies the IFLASH protocol |
// |
#define IFLASH64_PROTOCOL_PROTOCOL \ |
{ 0x65cba110, 0x74ab, 0x11d3, 0xbb, 0x89, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 }; |
// |
// Unlock FLASH from StartAddress to EndAddress and return a LockKey |
// |
typedef |
EFI_STATUS |
(EFIAPI *UNLOCK_FLASH_API)( |
IN struct _IFLASH64_PROTOCOL_INTERFACE *This |
); |
// |
// Lock the flash represented by the LockKey |
// |
typedef |
EFI_STATUS |
(EFIAPI *LOCK_FLASH_API)( |
IN struct _IFLASH64_PROTOCOL_INTERFACE *This |
); |
// |
// Status callback for a utility like IFLASH64 |
// |
// Token would map to a list like Ted proposed. The utility has no idea what |
// happens on the other side. |
// ErrorStatus - Level of Error or success. Independent of Token. If you |
// don't know the token you will at least know pass or fail. |
// String - Optional extra information about the error. Could be used for |
// debug or future expansion |
// |
// Attributes - Options screen attributes for String. Could allow the string to be different colors. |
// |
typedef |
EFI_STATUS |
(EFIAPI *UTILITY_PROGRESS_API)( |
IN struct _IFLASH64_PROTOCOL_INTERFACE *This, |
IN UINTN Token, |
IN EFI_STATUS ErrorStatus, |
IN CHAR16 *String, OPTIONAL |
IN UINTN *Attributes OPTIONAL |
); |
// |
// Token Values |
// |
// IFlash64 Token Codes |
#define IFLASH_TOKEN_IFLASHSTART 0xB0 // IFlash64 has started |
#define IFLASH_TOKEN_READINGFILE 0xB1 // Reading File |
#define IFLASH_TOKEN_INITVPP 0xB2 // Initializing Vpp |
#define IFLASH_TOKEN_DISABLEVPP 0x10 // Disable Vpp |
#define IFLASH_TOKEN_FLASHUNLOCK 0xB3 // Unlocking FLASH Devices |
#define IFLASH_TOKEN_FLASHERASE 0xB4 // Erasing FLASH Devices |
#define IFLASH_TOKEN_FLASHPROGRAM 0xB5 // Programming FLASH |
#define IFLASH_TOKEN_FLASHVERIFY 0xB6 // Verifying FLASH |
#define IFLASH_TOKEN_UPDATESUCCES 0xB7 // FLASH Updage Success! |
#define IFLASH_TOKEN_PROGRESS_READINGFILE 0x11 // % Reading File |
#define IFLASH_TOKEN_PROGRESS_FLASHUNLOCK 0x13 // % Unlocking FLASH Devices |
#define IFLASH_TOKEN_PROGRESS_FLASHERASE 0x14 // % Erasing FLASH Devices |
#define IFLASH_TOKEN_PROGRESS_FLASHPROGRAM 0x15 // % Programming FLASH |
#define IFLASH_TOKEN_PROGRESS_FLASHVERIFY 0x16 // % Verifying FLASH |
#define IFLASH_TOKEN_READINGFILE_ER 0xB8 // File Read Error |
#define IFLASH_TOKEN_INITVPP_ER 0xB9 // Initialization of IFB Error |
#define IFLASH_TOKEN_FLASHUNLOCK_ER 0xBA // FLASH Unlock Error |
#define IFLASH_TOKEN_FLASHERASE_ER 0xBB // FLASH Erase Error |
#define IFLASH_TOKEN_FLASHVERIFY_ER 0xBC // FLASH Verify Error |
#define IFLASH_TOKEN_FLASHPROG_ER 0xBD // FLASH Program Error |
#define IFLASH_TABLE_END 0x00 |
// |
// If this number changes one of the existing API's has changes |
// |
#define IFLASH_PI_MAJOR_VERSION 0x01 |
// |
// This number changes when new APIs or data variables get added to the end |
// of the data structure |
// |
#define IFLASH_PI_MINOR_VERSION 0x01 |
typedef struct _IFLASH64_PROTOCOL_INTERFACE { |
UINT32 MajorVersion; |
UINT32 MinorVersion; |
UNLOCK_FLASH_API UnlockFlash; |
LOCK_FLASH_API LockFlash; |
UTILITY_PROGRESS_API Progress; |
// |
// Future expansion goes here |
// |
} IFLASH64_PROTOCOL_INTERFACE; |
#endif |
/tags/0.3.0/boot/arch/ia64/loader/gefi/inc/protocol/make.inf |
---|
0,0 → 1,13 |
# |
# |
# |
[sources] |
efivar.h |
legacyboot.h |
VgaClass.h |
intload.h |
[ia32sources] |
[ia64sources] |
/tags/0.3.0/boot/arch/ia64/loader/gefi/inc/protocol/makefile.hdr |
---|
0,0 → 1,29 |
# |
# This is a machine generated file - DO NOT EDIT |
# Generated by genmake.exe |
# Generated from make.inf |
# Copyright (c) 1998 Intel Corporation |
# |
INC_DEPS = $(INC_DEPS) \ |
$(SDK_INSTALL_DIR)\include\efi\protocol\efivar.h \ |
$(SDK_INSTALL_DIR)\include\efi\protocol\legacyboot.h \ |
$(SDK_INSTALL_DIR)\include\efi\protocol\vgaclass.h \ |
$(SDK_INSTALL_DIR)\include\efi\protocol\efidbg.h \ |
!IF "$(PROCESSOR)" == "Ia32" |
INC_DEPS = $(INC_DEPS) \ |
!ENDIF |
!IF "$(PROCESSOR)" == "Ia64" |
INC_DEPS = $(INC_DEPS) \ |
$(SDK_INSTALL_DIR)\include\efi\protocol\$(PROCESSOR)\eficontext.h \ |
!ENDIF |
/tags/0.3.0/boot/arch/ia64/loader/gefi/inc/protocol/vgaclass.h |
---|
0,0 → 1,95 |
#ifndef _VGA_CLASS_H |
#define _VGA_CLASS_H |
/*++ |
Copyright (c) 1999 Intel Corporation |
Module Name: |
VgaClass.h |
Abstract: |
Vga Mini port binding to Vga Class protocol |
Revision History |
--*/ |
// |
// VGA Device Structure |
// |
// {0E3D6310-6FE4-11d3-BB81-0080C73C8881} |
#define VGA_CLASS_DRIVER_PROTOCOL \ |
{ 0xe3d6310, 0x6fe4, 0x11d3, {0xbb, 0x81, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81} } |
typedef |
EFI_STATUS |
(* INIT_VGA_CARD) ( |
IN UINTN VgaMode, |
IN VOID *Context |
); |
typedef struct { |
UINTN MaxColumns; |
UINTN MaxRows; |
} MAX_CONSOLE_GEOMETRY; |
#define VGA_CON_OUT_DEV_SIGNATURE EFI_SIGNATURE_32('c','v','g','a') |
typedef struct { |
UINTN Signature; |
EFI_HANDLE Handle; |
SIMPLE_TEXT_OUTPUT_INTERFACE ConOut; |
SIMPLE_TEXT_OUTPUT_MODE ConOutMode; |
EFI_DEVICE_PATH *DevicePath; |
UINT8 *Buffer; |
EFI_DEVICE_IO_INTERFACE *DeviceIo; |
// |
// Video Card Context |
// |
INIT_VGA_CARD InitVgaCard; |
VOID *VgaCardContext; |
MAX_CONSOLE_GEOMETRY *Geometry; |
// |
// Video buffer normally 0xb8000 |
// |
UINT64 VideoBuffer; |
// |
// Clear Screen & Default Attribute |
// |
UINT32 Attribute; |
// |
// -1 means search for active VGA device |
// |
EFI_PCI_ADDRESS_UNION Pci; |
} VGA_CON_OUT_DEV; |
#define VGA_CON_OUT_DEV_FROM_THIS(a) CR(a, VGA_CON_OUT_DEV, ConOut, VGA_CON_OUT_DEV_SIGNATURE) |
// |
// Vga Class Driver Protocol. |
// GUID defined in EFI Lib |
// |
typedef |
EFI_STATUS |
(EFIAPI *INSTALL_VGA_DRIVER) ( |
IN VGA_CON_OUT_DEV *ConOutDev |
); |
typedef struct { |
UINT32 Version; |
INSTALL_VGA_DRIVER InstallGenericVgaDriver; |
} INSTALL_VGA_DRIVER_INTERFACE; |
#endif |
/tags/0.3.0/boot/arch/ia64/loader/gefi/inc/protocol/readme.txt |
---|
0,0 → 1,3 |
The protocol directory contains non Architectural |
Protocols that span the FW, Platform, or application |
space. |
/tags/0.3.0/boot/arch/ia64/loader/gefi/inc/protocol/adapterdebug.h |
---|
0,0 → 1,32 |
#ifndef _ADAPTER_DEBUG_H |
#define _ADAPTER_DEBUG_H |
/*++ |
Copyright (c) 1999 Intel Corporation |
Module Name: |
AdapterDebug.h |
Abstract: |
Protocol to debug the EDD 3.0 enablement of BIOS option ROMs |
Revision History |
--*/ |
// {82F86881-282B-11d4-BC7D-0080C73C8881} |
#define ADAPTER_DEBUG_PROTOCOL \ |
{ 0x82f86881, 0x282b, 0x11d4, {0xbc, 0x7d, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81} } |
// |
// This protocol points to the BIOS_LEGACY_DRIVE data structure |
// see edd.h for more details |
// |
#endif |
/tags/0.3.0/boot/arch/ia64/loader/gefi/inc/protocol/legacyboot.h |
---|
0,0 → 1,119 |
/*++ |
Copyright (c) 1999 Intel Corporation |
Module Name: |
legacyboot |
Abstract: |
EFI support for legacy boot |
Revision History |
--*/ |
#ifndef _LEGACY_BOOT_INCLUDE_ |
#define _LEGACY_BOOT_INCLUDE_ |
#define LEGACY_BOOT_PROTOCOL \ |
{ 0x376e5eb2, 0x30e4, 0x11d3, { 0xba, 0xe5, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 } } |
#pragma pack(1) |
// |
// BBS 1.01 (See Appendix A) IPL and BCV Table Entry Data structure. |
// Seg:Off pointers have been converted to EFI pointers in this data structure |
// This is the structure that also maps to the EFI device path for the boot selection |
// |
typedef struct { |
UINT16 DeviceType; |
UINT16 StatusFlag; |
UINT32 Reserved; |
VOID *BootHandler; // Not an EFI entry point |
CHAR8 *DescString; |
} BBS_TABLE_ENTRY; |
#pragma pack() |
typedef |
EFI_STATUS |
(EFIAPI *LEGACY_BOOT_CALL) ( |
IN EFI_DEVICE_PATH *DevicePath |
); |
// |
// BBS support functions |
// PnP Call numbers and BiosSelector hidden in implementation |
// |
typedef enum { |
IplRelative, |
BcvRelative |
} BBS_TYPE; |
INTERFACE_DECL(_LEGACY_BOOT_INTERFACE); |
// |
// == PnP Function 0x60 then BbsVersion == 0x0101 if this call fails then BbsVersion == 0x0000 |
// |
// |
// == PnP Function 0x61 |
// |
typedef |
EFI_STATUS |
(EFIAPI *GET_DEVICE_COUNT) ( |
IN struct _LEGACY_BOOT_INTERFACE *This, |
IN BBS_TYPE *TableType, |
OUT UINTN *DeviceCount, |
OUT UINTN *MaxCount |
); |
// |
// == PnP Function 0x62 |
// |
typedef |
EFI_STATUS |
(EFIAPI *GET_PRIORITY_AND_TABLE) ( |
IN struct _LEGACY_BOOT_INTERFACE *This, |
IN BBS_TYPE *TableType, |
IN OUT UINTN *PrioritySize, // MaxCount * sizeof(UINT8) |
OUT UINTN *Priority, |
IN OUT UINTN *TableSize, // MaxCount * sizeof(BBS_TABLE_ENTRY) |
OUT BBS_TABLE_ENTRY *TableEntrySize |
); |
// |
// == PnP Function 0x63 |
// |
typedef |
EFI_STATUS |
(EFIAPI *SET_PRIORITY) ( |
IN struct _LEGACY_BOOT_INTERFACE *This, |
IN BBS_TYPE *TableType, |
IN OUT UINTN *PrioritySize, |
OUT UINTN *Priority |
); |
typedef struct _LEGACY_BOOT_INTERFACE { |
LEGACY_BOOT_CALL BootIt; |
// |
// New functions to allow BBS booting to be configured from EFI |
// |
UINTN BbsVersion; // Currently 0x0101 |
GET_DEVICE_COUNT GetDeviceCount; |
GET_PRIORITY_AND_TABLE GetPriorityAndTable; |
SET_PRIORITY SetPriority; |
} LEGACY_BOOT_INTERFACE; |
EFI_STATUS |
PlInitializeLegacyBoot ( |
VOID |
); |
#endif |
/tags/0.3.0/boot/arch/ia64/loader/gefi/inc/efierr.h |
---|
0,0 → 1,60 |
#ifndef _EFI_ERR_H |
#define _EFI_ERR_H |
/*++ |
Copyright (c) 1998 Intel Corporation |
Module Name: |
efierr.h |
Abstract: |
EFI error codes |
Revision History |
--*/ |
#define EFIWARN(a) (a) |
#define EFI_ERROR(a) (((INTN) a) < 0) |
#define EFI_SUCCESS 0 |
#define EFI_LOAD_ERROR EFIERR(1) |
#define EFI_INVALID_PARAMETER EFIERR(2) |
#define EFI_UNSUPPORTED EFIERR(3) |
#define EFI_BAD_BUFFER_SIZE EFIERR(4) |
#define EFI_BUFFER_TOO_SMALL EFIERR(5) |
#define EFI_NOT_READY EFIERR(6) |
#define EFI_DEVICE_ERROR EFIERR(7) |
#define EFI_WRITE_PROTECTED EFIERR(8) |
#define EFI_OUT_OF_RESOURCES EFIERR(9) |
#define EFI_VOLUME_CORRUPTED EFIERR(10) |
#define EFI_VOLUME_FULL EFIERR(11) |
#define EFI_NO_MEDIA EFIERR(12) |
#define EFI_MEDIA_CHANGED EFIERR(13) |
#define EFI_NOT_FOUND EFIERR(14) |
#define EFI_ACCESS_DENIED EFIERR(15) |
#define EFI_NO_RESPONSE EFIERR(16) |
#define EFI_NO_MAPPING EFIERR(17) |
#define EFI_TIMEOUT EFIERR(18) |
#define EFI_NOT_STARTED EFIERR(19) |
#define EFI_ALREADY_STARTED EFIERR(20) |
#define EFI_ABORTED EFIERR(21) |
#define EFI_ICMP_ERROR EFIERR(22) |
#define EFI_TFTP_ERROR EFIERR(23) |
#define EFI_PROTOCOL_ERROR EFIERR(24) |
#define EFI_WARN_UNKOWN_GLYPH EFIWARN(1) |
#define EFI_WARN_DELETE_FAILURE EFIWARN(2) |
#define EFI_WARN_WRITE_FAILURE EFIWARN(3) |
#define EFI_WARN_BUFFER_TOO_SMALL EFIWARN(4) |
#endif |
/tags/0.3.0/boot/arch/ia64/loader/gefi/inc/efiser.h |
---|
0,0 → 1,132 |
#ifndef _EFI_SER_H |
#define _EFI_SER_H |
/*++ |
Copyright (c) 1998 Intel Corporation |
Module Name: |
efiser.h |
Abstract: |
EFI serial protocol |
Revision History |
--*/ |
// |
// Serial protocol |
// |
#define SERIAL_IO_PROTOCOL \ |
{ 0xBB25CF6F, 0xF1D4, 0x11D2, {0x9A, 0x0C, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0xFD} } |
INTERFACE_DECL(_SERIAL_IO_INTERFACE); |
typedef enum { |
DefaultParity, |
NoParity, |
EvenParity, |
OddParity, |
MarkParity, |
SpaceParity |
} EFI_PARITY_TYPE; |
typedef enum { |
DefaultStopBits, |
OneStopBit, // 1 stop bit |
OneFiveStopBits, // 1.5 stop bits |
TwoStopBits // 2 stop bits |
} EFI_STOP_BITS_TYPE; |
#define EFI_SERIAL_CLEAR_TO_SEND 0x0010 // RO |
#define EFI_SERIAL_DATA_SET_READY 0x0020 // RO |
#define EFI_SERIAL_RING_INDICATE 0x0040 // RO |
#define EFI_SERIAL_CARRIER_DETECT 0x0080 // RO |
#define EFI_SERIAL_REQUEST_TO_SEND 0x0002 // WO |
#define EFI_SERIAL_DATA_TERMINAL_READY 0x0001 // WO |
#define EFI_SERIAL_INPUT_BUFFER_EMPTY 0x0100 // RO |
#define EFI_SERIAL_OUTPUT_BUFFER_EMPTY 0x0200 // RO |
#define EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE 0x1000 // RW |
#define EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE 0x2000 // RW |
#define EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE 0x4000 // RW |
typedef |
EFI_STATUS |
(EFIAPI *EFI_SERIAL_RESET) ( |
IN struct _SERIAL_IO_INTERFACE *This |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_SERIAL_SET_ATTRIBUTES) ( |
IN struct _SERIAL_IO_INTERFACE *This, |
IN UINT64 BaudRate, |
IN UINT32 ReceiveFifoDepth, |
IN UINT32 Timeout, |
IN EFI_PARITY_TYPE Parity, |
IN UINT8 DataBits, |
IN EFI_STOP_BITS_TYPE StopBits |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_SERIAL_SET_CONTROL_BITS) ( |
IN struct _SERIAL_IO_INTERFACE *This, |
IN UINT32 Control |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_SERIAL_GET_CONTROL_BITS) ( |
IN struct _SERIAL_IO_INTERFACE *This, |
OUT UINT32 *Control |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_SERIAL_WRITE) ( |
IN struct _SERIAL_IO_INTERFACE *This, |
IN OUT UINTN *BufferSize, |
IN VOID *Buffer |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_SERIAL_READ) ( |
IN struct _SERIAL_IO_INTERFACE *This, |
IN OUT UINTN *BufferSize, |
OUT VOID *Buffer |
); |
typedef struct { |
UINT32 ControlMask; |
// current Attributes |
UINT32 Timeout; |
UINT64 BaudRate; |
UINT32 ReceiveFifoDepth; |
UINT32 DataBits; |
UINT32 Parity; |
UINT32 StopBits; |
} SERIAL_IO_MODE; |
#define SERIAL_IO_INTERFACE_REVISION 0x00010000 |
typedef struct _SERIAL_IO_INTERFACE { |
UINT32 Revision; |
EFI_SERIAL_RESET Reset; |
EFI_SERIAL_SET_ATTRIBUTES SetAttributes; |
EFI_SERIAL_SET_CONTROL_BITS SetControl; |
EFI_SERIAL_GET_CONTROL_BITS GetControl; |
EFI_SERIAL_WRITE Write; |
EFI_SERIAL_READ Read; |
SERIAL_IO_MODE *Mode; |
} SERIAL_IO_INTERFACE; |
#endif |
/tags/0.3.0/boot/arch/ia64/loader/gefi/inc/ia64/efilibplat.h |
---|
0,0 → 1,80 |
#ifndef _EFI_LIB_PLAT_H |
#define _EFI_LIB_PLAT_H |
/*++ |
Copyright (c) 1998 Intel Corporation |
Module Name: |
efilibplat.h |
Abstract: |
EFI to compile bindings |
Revision History |
--*/ |
#include "salproc.h" |
VOID |
InitializeLibPlatform ( |
IN EFI_HANDLE ImageHandle, |
IN EFI_SYSTEM_TABLE *SystemTable |
); |
VOID |
LibInitSalAndPalProc( |
OUT PLABEL *SalPlabel, |
OUT UINT64 *PalEntry |
); |
EFI_STATUS |
LibGetSalIoPortMapping ( |
OUT UINT64 *IoPortMapping |
); |
EFI_STATUS |
LibGetSalIpiBlock ( |
OUT UINT64 *IpiBlock |
); |
EFI_STATUS |
LibGetSalWakeupVector ( |
OUT UINT64 *WakeVector |
); |
VOID * |
LibSearchSalSystemTable ( |
IN UINT8 EntryType |
); |
VOID |
LibSalProc ( |
IN UINT64 Arg1, |
IN UINT64 Arg2, |
IN UINT64 Arg3, |
IN UINT64 Arg4, |
IN UINT64 Arg5, |
IN UINT64 Arg6, |
IN UINT64 Arg7, |
IN UINT64 Arg8, |
OUT rArg *Results OPTIONAL |
); |
VOID |
LibPalProc ( |
IN UINT64 Arg1, |
IN UINT64 Arg2, |
IN UINT64 Arg3, |
IN UINT64 Arg4, |
OUT rArg *Results OPTIONAL |
); |
#endif |
/tags/0.3.0/boot/arch/ia64/loader/gefi/inc/ia64/efibind.h |
---|
0,0 → 1,209 |
/*++ |
Copyright (c) 1998 Intel Corporation |
Module Name: |
efefind.h |
Abstract: |
EFI to compile bindings |
Revision History |
--*/ |
#pragma pack() |
// |
// Basic int types of various widths |
// |
#if (__STDC_VERSION__ < 199901L ) |
// No ANSI C 1999/2000 stdint.h integer width declarations |
#if _MSC_EXTENSIONS |
// Use Microsoft C compiler integer width declarations |
typedef unsigned __int64 uint64_t; |
typedef __int64 int64_t; |
typedef unsigned __int32 uint32_t; |
typedef __int32 int32_t; |
typedef unsigned __int16 uint16_t; |
typedef __int16 int16_t; |
typedef unsigned __int8 uint8_t; |
typedef __int8 int8_t; |
#else |
#ifdef UNIX_LP64 |
// Use LP64 programming model from C_FLAGS for integer width declarations |
typedef unsigned long uint64_t; |
typedef long int64_t; |
typedef unsigned int uint32_t; |
typedef int int32_t; |
typedef unsigned short uint16_t; |
typedef short int16_t; |
typedef unsigned char uint8_t; |
typedef char int8_t; |
#else |
// Assume P64 programming model from C_FLAGS for integer width declarations |
typedef unsigned long long uint64_t; |
typedef long long int64_t; |
typedef unsigned int uint32_t; |
typedef int int32_t; |
typedef unsigned short uint16_t; |
typedef short int16_t; |
typedef unsigned char uint8_t; |
typedef char int8_t; |
#endif |
#endif |
#endif |
// |
// Basic EFI types of various widths |
// |
#ifndef __WCHAR_TYPE__ |
# define __WCHAR_TYPE__ short |
#endif |
typedef uint64_t UINT64; |
typedef int64_t INT64; |
typedef uint32_t UINT32; |
typedef int32_t INT32; |
typedef uint16_t UINT16; |
typedef int16_t INT16; |
typedef uint8_t UINT8; |
typedef int8_t INT8; |
typedef __WCHAR_TYPE__ WCHAR; |
#undef VOID |
#define VOID void |
typedef int64_t INTN; |
typedef uint64_t UINTN; |
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// BugBug: Code to debug |
// |
#define BIT63 0x8000000000000000 |
#define PLATFORM_IOBASE_ADDRESS (0xffffc000000 | BIT63) |
#define PORT_TO_MEMD(_Port) (PLATFORM_IOBASE_ADDRESS | ( ( ( (_Port) & 0xfffc) << 10 ) | ( (_Port) & 0x0fff) ) ) |
// |
// Macro's with casts make this much easier to use and read. |
// |
#define PORT_TO_MEM8D(_Port) (*(UINT8 *)(PORT_TO_MEMD(_Port))) |
#define POST_CODE(_Data) (PORT_TO_MEM8D(0x80) = (_Data)) |
// |
// BugBug: End Debug Code!!! |
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
#define EFIERR(a) (0x8000000000000000 | a) |
#define EFI_ERROR_MASK 0x8000000000000000 |
#define EFIERR_OEM(a) (0xc000000000000000 | a) |
#define BAD_POINTER 0xFBFBFBFBFBFBFBFB |
#define MAX_ADDRESS 0xFFFFFFFFFFFFFFFF |
#define BREAKPOINT() while (TRUE) |
// |
// Pointers must be aligned to these address to function |
// you will get an alignment fault if this value is less than 8 |
// |
#define MIN_ALIGNMENT_SIZE 8 |
#define ALIGN_VARIABLE(Value , Adjustment) \ |
(UINTN) Adjustment = 0; \ |
if((UINTN)Value % MIN_ALIGNMENT_SIZE) \ |
(UINTN)Adjustment = MIN_ALIGNMENT_SIZE - ((UINTN)Value % MIN_ALIGNMENT_SIZE); \ |
Value = (UINTN)Value + (UINTN)Adjustment |
// |
// Define macros to create data structure signatures. |
// |
#define EFI_SIGNATURE_16(A,B) ((A) | (B<<8)) |
#define EFI_SIGNATURE_32(A,B,C,D) (EFI_SIGNATURE_16(A,B) | (EFI_SIGNATURE_16(C,D) << 16)) |
#define EFI_SIGNATURE_64(A,B,C,D,E,F,G,H) (EFI_SIGNATURE_32(A,B,C,D) | ((UINT64)(EFI_SIGNATURE_32(E,F,G,H)) << 32)) |
// |
// To export & import functions in the EFI emulator environment |
// |
#define EXPORTAPI |
// |
// EFIAPI - prototype calling convention for EFI function pointers |
// BOOTSERVICE - prototype for implementation of a boot service interface |
// RUNTIMESERVICE - prototype for implementation of a runtime service interface |
// RUNTIMEFUNCTION - prototype for implementation of a runtime function that is not a service |
// RUNTIME_CODE - pragma macro for declaring runtime code |
// |
#ifndef EFIAPI // Forces EFI calling conventions reguardless of compiler options |
#if _MSC_EXTENSIONS |
#define EFIAPI __cdecl // Force C calling convention for Microsoft C compiler |
#else |
#define EFIAPI // Substitute expresion to force C calling convention |
#endif |
#endif |
#define BOOTSERVICE |
#define RUNTIMESERVICE |
#define RUNTIMEFUNCTION |
#define RUNTIME_CODE(a) alloc_text("rtcode", a) |
#define BEGIN_RUNTIME_DATA() data_seg("rtdata") |
#define END_RUNTIME_DATA() data_seg("") |
#define VOLATILE volatile |
// |
// BugBug: Need to find out if this is portable accross compliers. |
// |
#ifdef __GNUC__ |
#define MEMORY_FENCE() __asm__ __volatile__ ("mf.a" ::: "memory") |
#else |
void __mf (void); |
#pragma intrinsic (__mf) |
#define MEMORY_FENCE() __mf() |
#endif |
// |
// When build similiar to FW, then link everything together as |
// one big module. |
// |
#define EFI_DRIVER_ENTRY_POINT(InitFunction) |
#define LOAD_INTERNAL_DRIVER(_if, type, name, entry) \ |
(_if)->LoadInternal(type, name, entry) |
// |
// Some compilers don't support the forward reference construct: |
// typedef struct XXXXX |
// |
// The following macro provide a workaround for such cases. |
// |
#ifdef NO_INTERFACE_DECL |
#define INTERFACE_DECL(x) |
#else |
#ifdef __GNUC__ |
#define INTERFACE_DECL(x) struct x |
#else |
#define INTERFACE_DECL(x) typedef struct x |
#endif |
#endif |
/tags/0.3.0/boot/arch/ia64/loader/gefi/inc/ia64/salproc.h |
---|
0,0 → 1,264 |
#ifndef _SAL_PROC_H |
#define _SAL_PROC_H |
// |
// |
//Copyright (c) 1999 Intel Corporation |
// |
//Module Name: |
// |
// SalProc.h |
// |
//Abstract: |
// |
// Main SAL interface routins for IA-64 calls. |
// |
// |
//Revision History |
// |
// |
// return value that mimicks r8,r9,r10 & r11 registers |
typedef struct { |
UINT64 p0; |
UINT64 p1; |
UINT64 p2; |
UINT64 p3; |
} rArg; |
#define SAL_PCI_CONFIG_READ 0x01000010 |
#define SAL_PCI_CONFIG_WRITE 0x01000011 |
typedef VOID (*PFN)(); |
typedef rArg (*PFN_SAL_PROC)(UINT64,UINT64,UINT64,UINT64,UINT64,UINT64,UINT64,UINT64); |
typedef rArg (*PFN_SAL_CALLBACK)(UINT64,UINT64,UINT64,UINT64,UINT64,UINT64,UINT64,UINT64); |
typedef struct _PLABEL { |
UINT64 ProcEntryPoint; |
UINT64 GP; |
} PLABEL; |
typedef struct tagIA32_BIOS_REGISTER_STATE { |
// general registers |
UINT32 eax; |
UINT32 ecx; |
UINT32 edx; |
UINT32 ebx; |
// stack registers |
UINT32 esp; |
UINT32 ebp; |
UINT32 esi; |
UINT32 edi; |
// eflags |
UINT32 eflags; |
// instruction pointer |
UINT32 eip; |
UINT16 cs; |
UINT16 ds; |
UINT16 es; |
UINT16 fs; |
UINT16 gs; |
UINT16 ss; |
// Reserved |
UINT32 Reserved1; |
UINT64 Reserved2; |
} IA32_BIOS_REGISTER_STATE; |
VOID EFIInitMsg(VOID); |
EFI_STATUS |
PlRegisterAndStartTimer( |
IN UINTN Period |
); |
EFI_STATUS |
PlDeRegisterAndCancelTimer(VOID); |
VOID |
SalProc ( |
IN UINT64 Arg1, |
IN UINT64 Arg2, |
IN UINT64 Arg3, |
IN UINT64 Arg4, |
IN UINT64 Arg5, |
IN UINT64 Arg6, |
IN UINT64 Arg7, |
IN UINT64 Arg8, |
OUT rArg *Results OPTIONAL |
); |
VOID |
SalCallBack ( |
IN UINT64 Arg1, |
IN UINT64 Arg2, |
IN UINT64 Arg3, |
IN UINT64 Arg4, |
IN UINT64 Arg5, |
IN UINT64 Arg6, |
IN UINT64 Arg7, |
IN UINT64 Arg8, |
OUT rArg *Results OPTIONAL |
); |
VOID |
RUNTIMEFUNCTION |
RtSalCallBack ( |
IN UINT64 Arg1, |
IN UINT64 Arg2, |
IN UINT64 Arg3, |
IN UINT64 Arg4, |
IN UINT64 Arg5, |
IN UINT64 Arg6, |
IN UINT64 Arg7, |
IN UINT64 Arg8, |
OUT rArg *Results OPTIONAL |
); |
extern PLABEL RtGlobalSalProcEntry; |
extern PLABEL RtGlobalSALCallBack; |
#pragma pack(1) |
// |
// SAL System Table |
// |
typedef struct { |
UINT32 Signature; |
UINT32 Length; |
UINT16 Revision; |
UINT16 EntryCount; |
UINT8 CheckSum; |
UINT8 Reserved[7]; |
UINT16 SALA_Ver; |
UINT16 SALB_Ver; |
UINT8 OemId[32]; |
UINT8 ProductID[32]; |
UINT8 Reserved2[8]; |
} SAL_SYSTEM_TABLE_HDR; |
#define SAL_ST_ENTRY_POINT 0 |
#define SAL_ST_MEMORY_DESCRIPTOR 1 |
#define SAL_ST_PLATFORM_FEATURES 2 |
#define SAL_ST_TR_USAGE 3 |
#define SAL_ST_PTC 4 |
#define SAL_ST_AP_WAKEUP 5 |
typedef struct { |
UINT8 Type; // Type == 0 |
UINT8 Reserved[7]; |
UINT64 PalProcEntry; |
UINT64 SalProcEntry; |
UINT64 GlobalDataPointer; |
UINT64 Reserved2[2]; |
} SAL_ST_ENTRY_POINT_DESCRIPTOR; |
typedef struct { |
UINT8 Type; // Type == 1 |
UINT8 NeedVirtualRegistration; |
UINT8 MemoryAttributes; |
UINT8 PageAccessRights; |
UINT8 SupportedAttributes; |
UINT8 Reserved; |
UINT16 MemoryType; |
UINT64 PhysicalMemoryAddress; |
UINT32 Length; |
UINT32 Reserved1; |
UINT64 OemReserved; |
} SAL_ST_MEMORY_DESCRIPTOR_ENTRY; |
// |
// MemoryType info |
// |
#define SAL_SAPIC_IPI_BLOCK 0x0002 |
#define SAL_IO_PORT_MAPPING 0x0003 |
typedef struct { |
UINT8 Type; // Type == 2 |
UINT8 PlatformFeatures; |
UINT8 Reserved[14]; |
} SAL_ST_MEMORY_DECRIPTOR; |
typedef struct { |
UINT8 Type; // Type == 3 |
UINT8 TRType; |
UINT8 TRNumber; |
UINT8 Reserved[5]; |
UINT64 VirtualAddress; |
UINT64 EncodedPageSize; |
UINT64 Reserved1; |
} SAL_ST_TR_DECRIPTOR; |
typedef struct { |
UINT64 NumberOfProcessors; |
UINT64 LocalIDRegister; |
} SAL_COHERENCE_DOMAIN_INFO; |
typedef struct { |
UINT8 Type; // Type == 4 |
UINT8 Reserved[3]; |
UINT32 NumberOfDomains; |
SAL_COHERENCE_DOMAIN_INFO *DomainInformation; |
} SAL_ST_CACHE_COHERENCE_DECRIPTOR; |
typedef struct { |
UINT8 Type; // Type == 5 |
UINT8 WakeUpType; |
UINT8 Reserved[6]; |
UINT64 ExternalInterruptVector; |
} SAL_ST_AP_WAKEUP_DECRIPTOR; |
typedef struct { |
SAL_SYSTEM_TABLE_HDR Header; |
SAL_ST_ENTRY_POINT_DESCRIPTOR Entry0; |
} SAL_SYSTEM_TABLE_ASCENDING_ORDER; |
#define FIT_ENTRY_PTR (0x100000000 - 32) // 4GB - 24 |
#define FIT_PALA_ENTRY (0x100000000 - 48) // 4GB - 32 |
#define FIT_PALB_TYPE 01 |
typedef struct { |
UINT64 Address; |
UINT8 Size[3]; |
UINT8 Reserved; |
UINT16 Revision; |
UINT8 Type:7; |
UINT8 CheckSumValid:1; |
UINT8 CheckSum; |
} FIT_ENTRY; |
#pragma pack() |
typedef |
rArg |
(*CALL_SAL_PROC)( |
IN UINT64 Arg1, |
IN UINT64 Arg2, |
IN UINT64 Arg3, |
IN UINT64 Arg4, |
IN UINT64 Arg5, |
IN UINT64 Arg6, |
IN UINT64 Arg7, |
IN UINT64 Arg8 |
); |
typedef |
rArg |
(*CALL_PAL_PROC)( |
IN UINT64 Arg1, |
IN UINT64 Arg2, |
IN UINT64 Arg3, |
IN UINT64 Arg4 |
); |
extern CALL_SAL_PROC GlobalSalProc; |
extern CALL_PAL_PROC GlobalPalProc; |
extern PLABEL SalProcPlabel; |
extern PLABEL PalProcPlabel; |
#endif |
/tags/0.3.0/boot/arch/ia64/loader/gefi/inc/ia64/pe.h |
---|
0,0 → 1,597 |
/* |
PE32+ header file |
*/ |
#ifndef _PE_H |
#define _PE_H |
#define IMAGE_DOS_SIGNATURE 0x5A4D // MZ |
#define IMAGE_OS2_SIGNATURE 0x454E // NE |
#define IMAGE_OS2_SIGNATURE_LE 0x454C // LE |
#define IMAGE_NT_SIGNATURE 0x00004550 // PE00 |
#define IMAGE_EDOS_SIGNATURE 0x44454550 // PEED |
/***************************************************************************** |
* The following stuff comes from winnt.h from the ia64sdk, plus the Plabel for |
* loading EM executables. |
*****************************************************************************/ |
// |
// Intel IA64 specific |
// |
#define IMAGE_REL_BASED_IA64_IMM64 9 |
#define IMAGE_REL_BASED_IA64_DIR64 10 |
struct Plabel { |
UINT64 EntryPoint; |
UINT64 NewGP; |
}; |
typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header |
UINT16 e_magic; // Magic number |
UINT16 e_cblp; // Bytes on last page of file |
UINT16 e_cp; // Pages in file |
UINT16 e_crlc; // Relocations |
UINT16 e_cparhdr; // Size of header in paragraphs |
UINT16 e_minalloc; // Minimum extra paragraphs needed |
UINT16 e_maxalloc; // Maximum extra paragraphs needed |
UINT16 e_ss; // Initial (relative) SS value |
UINT16 e_sp; // Initial SP value |
UINT16 e_csum; // Checksum |
UINT16 e_ip; // Initial IP value |
UINT16 e_cs; // Initial (relative) CS value |
UINT16 e_lfarlc; // File address of relocation table |
UINT16 e_ovno; // Overlay number |
UINT16 e_res[4]; // Reserved words |
UINT16 e_oemid; // OEM identifier (for e_oeminfo) |
UINT16 e_oeminfo; // OEM information; e_oemid specific |
UINT16 e_res2[10]; // Reserved words |
UINT32 e_lfanew; // File address of new exe header |
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER; |
typedef struct _IMAGE_OS2_HEADER { // OS/2 .EXE header |
UINT16 ne_magic; // Magic number |
UINT8 ne_ver; // Version number |
UINT8 ne_rev; // Revision number |
UINT16 ne_enttab; // Offset of Entry Table |
UINT16 ne_cbenttab; // Number of bytes in Entry Table |
UINT32 ne_crc; // Checksum of whole file |
UINT16 ne_flags; // Flag UINT16 |
UINT16 ne_autodata; // Automatic data segment number |
UINT16 ne_heap; // Initial heap allocation |
UINT16 ne_stack; // Initial stack allocation |
UINT32 ne_csip; // Initial CS:IP setting |
UINT32 ne_sssp; // Initial SS:SP setting |
UINT16 ne_cseg; // Count of file segments |
UINT16 ne_cmod; // Entries in Module Reference Table |
UINT16 ne_cbnrestab; // Size of non-resident name table |
UINT16 ne_segtab; // Offset of Segment Table |
UINT16 ne_rsrctab; // Offset of Resource Table |
UINT16 ne_restab; // Offset of resident name table |
UINT16 ne_modtab; // Offset of Module Reference Table |
UINT16 ne_imptab; // Offset of Imported Names Table |
UINT32 ne_nrestab; // Offset of Non-resident Names Table |
UINT16 ne_cmovent; // Count of movable entries |
UINT16 ne_align; // Segment alignment shift count |
UINT16 ne_cres; // Count of resource segments |
UINT8 ne_exetyp; // Target Operating system |
UINT8 ne_flagsothers; // Other .EXE flags |
UINT16 ne_pretthunks; // offset to return thunks |
UINT16 ne_psegrefbytes; // offset to segment ref. bytes |
UINT16 ne_swaparea; // Minimum code swap area size |
UINT16 ne_expver; // Expected Windows version number |
} IMAGE_OS2_HEADER, *PIMAGE_OS2_HEADER; |
// |
// File header format. |
// |
typedef struct _IMAGE_FILE_HEADER { |
UINT16 Machine; |
UINT16 NumberOfSections; |
UINT32 TimeDateStamp; |
UINT32 PointerToSymbolTable; |
UINT32 NumberOfSymbols; |
UINT16 SizeOfOptionalHeader; |
UINT16 Characteristics; |
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER; |
#define IMAGE_SIZEOF_FILE_HEADER 20 |
#define IMAGE_FILE_RELOCS_STRIPPED 0x0001 // Relocation info stripped from file. |
#define IMAGE_FILE_EXECUTABLE_IMAGE 0x0002 // File is executable (i.e. no unresolved externel references). |
#define IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004 // Line nunbers stripped from file. |
#define IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008 // Local symbols stripped from file. |
#define IMAGE_FILE_BYTES_REVERSED_LO 0x0080 // Bytes of machine word are reversed. |
#define IMAGE_FILE_32BIT_MACHINE 0x0100 // 32 bit word machine. |
#define IMAGE_FILE_DEBUG_STRIPPED 0x0200 // Debugging info stripped from file in .DBG file |
#define IMAGE_FILE_SYSTEM 0x1000 // System File. |
#define IMAGE_FILE_DLL 0x2000 // File is a DLL. |
#define IMAGE_FILE_BYTES_REVERSED_HI 0x8000 // Bytes of machine word are reversed. |
#define IMAGE_FILE_MACHINE_UNKNOWN 0 |
#define IMAGE_FILE_MACHINE_I386 0x14c // Intel 386. |
#define IMAGE_FILE_MACHINE_R3000 0x162 // MIPS little-endian, 0540 big-endian |
#define IMAGE_FILE_MACHINE_R4000 0x166 // MIPS little-endian |
#define IMAGE_FILE_MACHINE_ALPHA 0x184 // Alpha_AXP |
#define IMAGE_FILE_MACHINE_POWERPC 0x1F0 // IBM PowerPC Little-Endian |
#define IMAGE_FILE_MACHINE_TAHOE 0x7cc // Intel EM machine |
// |
// Directory format. |
// |
typedef struct _IMAGE_DATA_DIRECTORY { |
UINT32 VirtualAddress; |
UINT32 Size; |
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY; |
#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16 |
typedef struct _IMAGE_ROM_OPTIONAL_HEADER { |
UINT16 Magic; |
UINT8 MajorLinkerVersion; |
UINT8 MinorLinkerVersion; |
UINT32 SizeOfCode; |
UINT32 SizeOfInitializedData; |
UINT32 SizeOfUninitializedData; |
UINT32 AddressOfEntryPoint; |
UINT32 BaseOfCode; |
UINT32 BaseOfData; |
UINT32 BaseOfBss; |
UINT32 GprMask; |
UINT32 CprMask[4]; |
UINT32 GpValue; |
} IMAGE_ROM_OPTIONAL_HEADER, *PIMAGE_ROM_OPTIONAL_HEADER; |
typedef struct _IMAGE_OPTIONAL_HEADER { |
UINT16 Magic; |
UINT8 MajorLinkerVersion; |
UINT8 MinorLinkerVersion; |
UINT32 SizeOfCode; |
UINT32 SizeOfInitializedData; |
UINT32 SizeOfUninitializedData; |
UINT32 AddressOfEntryPoint; |
UINT32 BaseOfCode; |
// UINT32 BaseOfData; |
UINT64 ImageBase; |
UINT32 SectionAlignment; |
UINT32 FileAlignment; |
UINT16 MajorOperatingSystemVersion; |
UINT16 MinorOperatingSystemVersion; |
UINT16 MajorImageVersion; |
UINT16 MinorImageVersion; |
UINT16 MajorSubsystemVersion; |
UINT16 MinorSubsystemVersion; |
UINT32 Win32VersionValue; |
UINT32 SizeOfImage; |
UINT32 SizeOfHeaders; |
UINT32 CheckSum; |
UINT16 Subsystem; |
UINT16 DllCharacteristics; |
UINT64 SizeOfStackReserve; |
UINT64 SizeOfStackCommit; |
UINT64 SizeOfHeapReserve; |
UINT64 SizeOfHeapCommit; |
UINT32 LoaderFlags; |
UINT32 NumberOfRvaAndSizes; |
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; |
} IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER; |
#define IMAGE_SIZEOF_ROM_OPTIONAL_HEADER 56 |
#define IMAGE_SIZEOF_STD_OPTIONAL_HEADER 28 |
#define IMAGE_SIZEOF_NT_OPTIONAL_HEADER 224 |
#define IMAGE_SIZEOF_NT_OPTIONAL64_HEADER 244 |
#define IMAGE_NT_OPTIONAL_HDR_MAGIC 0x10b |
#define IMAGE_NT_OPTIONAL_HDR64_MAGIC 0x20b |
#define IMAGE_ROM_OPTIONAL_HDR_MAGIC 0x107 |
typedef struct _IMAGE_NT_HEADERS { |
UINT32 Signature; |
IMAGE_FILE_HEADER FileHeader; |
IMAGE_OPTIONAL_HEADER OptionalHeader; |
} IMAGE_NT_HEADERS, *PIMAGE_NT_HEADERS; |
typedef struct _IMAGE_ROM_HEADERS { |
IMAGE_FILE_HEADER FileHeader; |
IMAGE_ROM_OPTIONAL_HEADER OptionalHeader; |
} IMAGE_ROM_HEADERS, *PIMAGE_ROM_HEADERS; |
#define IMAGE_FIRST_SECTION( ntheader ) ((PIMAGE_SECTION_HEADER) \ |
((UINT32)ntheader + \ |
FIELD_OFFSET( IMAGE_NT_HEADERS, OptionalHeader ) + \ |
((PIMAGE_NT_HEADERS)(ntheader))->FileHeader.SizeOfOptionalHeader \ |
)) |
// Subsystem Values |
#define IMAGE_SUBSYSTEM_UNKNOWN 0 // Unknown subsystem. |
#define IMAGE_SUBSYSTEM_NATIVE 1 // Image doesn't require a subsystem. |
#define IMAGE_SUBSYSTEM_WINDOWS_GUI 2 // Image runs in the Windows GUI subsystem. |
#define IMAGE_SUBSYSTEM_WINDOWS_CUI 3 // Image runs in the Windows character subsystem. |
#define IMAGE_SUBSYSTEM_OS2_CUI 5 // image runs in the OS/2 character subsystem. |
#define IMAGE_SUBSYSTEM_POSIX_CUI 7 // image run in the Posix character subsystem. |
// Directory Entries |
#define IMAGE_DIRECTORY_ENTRY_EXPORT 0 // Export Directory |
#define IMAGE_DIRECTORY_ENTRY_IMPORT 1 // Import Directory |
#define IMAGE_DIRECTORY_ENTRY_RESOURCE 2 // Resource Directory |
#define IMAGE_DIRECTORY_ENTRY_EXCEPTION 3 // Exception Directory |
#define IMAGE_DIRECTORY_ENTRY_SECURITY 4 // Security Directory |
#define IMAGE_DIRECTORY_ENTRY_BASERELOC 5 // Base Relocation Table |
#define IMAGE_DIRECTORY_ENTRY_DEBUG 6 // Debug Directory |
#define IMAGE_DIRECTORY_ENTRY_COPYRIGHT 7 // Description String |
#define IMAGE_DIRECTORY_ENTRY_GLOBALPTR 8 // Machine Value (MIPS GP) |
#define IMAGE_DIRECTORY_ENTRY_TLS 9 // TLS Directory |
#define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10 // Load Configuration Directory |
// |
// Section header format. |
// |
#define IMAGE_SIZEOF_SHORT_NAME 8 |
typedef struct _IMAGE_SECTION_HEADER { |
UINT8 Name[IMAGE_SIZEOF_SHORT_NAME]; |
union { |
UINT32 PhysicalAddress; |
UINT32 VirtualSize; |
} Misc; |
UINT32 VirtualAddress; |
UINT32 SizeOfRawData; |
UINT32 PointerToRawData; |
UINT32 PointerToRelocations; |
UINT32 PointerToLinenumbers; |
UINT16 NumberOfRelocations; |
UINT16 NumberOfLinenumbers; |
UINT32 Characteristics; |
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER; |
#define IMAGE_SIZEOF_SECTION_HEADER 40 |
#define IMAGE_SCN_TYPE_NO_PAD 0x00000008 // Reserved. |
#define IMAGE_SCN_CNT_CODE 0x00000020 // Section contains code. |
#define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040 // Section contains initialized data. |
#define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080 // Section contains uninitialized data. |
#define IMAGE_SCN_LNK_OTHER 0x00000100 // Reserved. |
#define IMAGE_SCN_LNK_INFO 0x00000200 // Section contains comments or some other type of information. |
#define IMAGE_SCN_LNK_REMOVE 0x00000800 // Section contents will not become part of image. |
#define IMAGE_SCN_LNK_COMDAT 0x00001000 // Section contents comdat. |
#define IMAGE_SCN_ALIGN_1BYTES 0x00100000 // |
#define IMAGE_SCN_ALIGN_2BYTES 0x00200000 // |
#define IMAGE_SCN_ALIGN_4BYTES 0x00300000 // |
#define IMAGE_SCN_ALIGN_8BYTES 0x00400000 // |
#define IMAGE_SCN_ALIGN_16BYTES 0x00500000 // Default alignment if no others are specified. |
#define IMAGE_SCN_ALIGN_32BYTES 0x00600000 // |
#define IMAGE_SCN_ALIGN_64BYTES 0x00700000 // |
#define IMAGE_SCN_MEM_DISCARDABLE 0x02000000 // Section can be discarded. |
#define IMAGE_SCN_MEM_NOT_CACHED 0x04000000 // Section is not cachable. |
#define IMAGE_SCN_MEM_NOT_PAGED 0x08000000 // Section is not pageable. |
#define IMAGE_SCN_MEM_SHARED 0x10000000 // Section is shareable. |
#define IMAGE_SCN_MEM_EXECUTE 0x20000000 // Section is executable. |
#define IMAGE_SCN_MEM_READ 0x40000000 // Section is readable. |
#define IMAGE_SCN_MEM_WRITE 0x80000000 // Section is writeable. |
// |
// Symbol format. |
// |
#define IMAGE_SIZEOF_SYMBOL 18 |
// |
// Section values. |
// |
// Symbols have a section number of the section in which they are |
// defined. Otherwise, section numbers have the following meanings: |
// |
#define IMAGE_SYM_UNDEFINED (UINT16)0 // Symbol is undefined or is common. |
#define IMAGE_SYM_ABSOLUTE (UINT16)-1 // Symbol is an absolute value. |
#define IMAGE_SYM_DEBUG (UINT16)-2 // Symbol is a special debug item. |
// |
// Type (fundamental) values. |
// |
#define IMAGE_SYM_TYPE_NULL 0 // no type. |
#define IMAGE_SYM_TYPE_VOID 1 // |
#define IMAGE_SYM_TYPE_CHAR 2 // type character. |
#define IMAGE_SYM_TYPE_SHORT 3 // type short integer. |
#define IMAGE_SYM_TYPE_INT 4 // |
#define IMAGE_SYM_TYPE_LONG 5 // |
#define IMAGE_SYM_TYPE_FLOAT 6 // |
#define IMAGE_SYM_TYPE_DOUBLE 7 // |
#define IMAGE_SYM_TYPE_STRUCT 8 // |
#define IMAGE_SYM_TYPE_UNION 9 // |
#define IMAGE_SYM_TYPE_ENUM 10 // enumeration. |
#define IMAGE_SYM_TYPE_MOE 11 // member of enumeration. |
#define IMAGE_SYM_TYPE_BYTE 12 // |
#define IMAGE_SYM_TYPE_WORD 13 // |
#define IMAGE_SYM_TYPE_UINT 14 // |
#define IMAGE_SYM_TYPE_DWORD 15 // |
// |
// Type (derived) values. |
// |
#define IMAGE_SYM_DTYPE_NULL 0 // no derived type. |
#define IMAGE_SYM_DTYPE_POINTER 1 // pointer. |
#define IMAGE_SYM_DTYPE_FUNCTION 2 // function. |
#define IMAGE_SYM_DTYPE_ARRAY 3 // array. |
// |
// Storage classes. |
// |
#define IMAGE_SYM_CLASS_END_OF_FUNCTION (BYTE )-1 |
#define IMAGE_SYM_CLASS_NULL 0 |
#define IMAGE_SYM_CLASS_AUTOMATIC 1 |
#define IMAGE_SYM_CLASS_EXTERNAL 2 |
#define IMAGE_SYM_CLASS_STATIC 3 |
#define IMAGE_SYM_CLASS_REGISTER 4 |
#define IMAGE_SYM_CLASS_EXTERNAL_DEF 5 |
#define IMAGE_SYM_CLASS_LABEL 6 |
#define IMAGE_SYM_CLASS_UNDEFINED_LABEL 7 |
#define IMAGE_SYM_CLASS_MEMBER_OF_STRUCT 8 |
#define IMAGE_SYM_CLASS_ARGUMENT 9 |
#define IMAGE_SYM_CLASS_STRUCT_TAG 10 |
#define IMAGE_SYM_CLASS_MEMBER_OF_UNION 11 |
#define IMAGE_SYM_CLASS_UNION_TAG 12 |
#define IMAGE_SYM_CLASS_TYPE_DEFINITION 13 |
#define IMAGE_SYM_CLASS_UNDEFINED_STATIC 14 |
#define IMAGE_SYM_CLASS_ENUM_TAG 15 |
#define IMAGE_SYM_CLASS_MEMBER_OF_ENUM 16 |
#define IMAGE_SYM_CLASS_REGISTER_PARAM 17 |
#define IMAGE_SYM_CLASS_BIT_FIELD 18 |
#define IMAGE_SYM_CLASS_BLOCK 100 |
#define IMAGE_SYM_CLASS_FUNCTION 101 |
#define IMAGE_SYM_CLASS_END_OF_STRUCT 102 |
#define IMAGE_SYM_CLASS_FILE 103 |
// new |
#define IMAGE_SYM_CLASS_SECTION 104 |
#define IMAGE_SYM_CLASS_WEAK_EXTERNAL 105 |
// type packing constants |
#define N_BTMASK 017 |
#define N_TMASK 060 |
#define N_TMASK1 0300 |
#define N_TMASK2 0360 |
#define N_BTSHFT 4 |
#define N_TSHIFT 2 |
// MACROS |
// |
// Communal selection types. |
// |
#define IMAGE_COMDAT_SELECT_NODUPLICATES 1 |
#define IMAGE_COMDAT_SELECT_ANY 2 |
#define IMAGE_COMDAT_SELECT_SAME_SIZE 3 |
#define IMAGE_COMDAT_SELECT_EXACT_MATCH 4 |
#define IMAGE_COMDAT_SELECT_ASSOCIATIVE 5 |
#define IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY 1 |
#define IMAGE_WEAK_EXTERN_SEARCH_LIBRARY 2 |
#define IMAGE_WEAK_EXTERN_SEARCH_ALIAS 3 |
// |
// Relocation format. |
// |
typedef struct _IMAGE_RELOCATION { |
UINT32 VirtualAddress; |
UINT32 SymbolTableIndex; |
UINT16 Type; |
} IMAGE_RELOCATION; |
#define IMAGE_SIZEOF_RELOCATION 10 |
// |
// I386 relocation types. |
// |
#define IMAGE_REL_I386_ABSOLUTE 0 // Reference is absolute, no relocation is necessary |
#define IMAGE_REL_I386_DIR16 01 // Direct 16-bit reference to the symbols virtual address |
#define IMAGE_REL_I386_REL16 02 // PC-relative 16-bit reference to the symbols virtual address |
#define IMAGE_REL_I386_DIR32 06 // Direct 32-bit reference to the symbols virtual address |
#define IMAGE_REL_I386_DIR32NB 07 // Direct 32-bit reference to the symbols virtual address, base not included |
#define IMAGE_REL_I386_SEG12 011 // Direct 16-bit reference to the segment-selector bits of a 32-bit virtual address |
#define IMAGE_REL_I386_SECTION 012 |
#define IMAGE_REL_I386_SECREL 013 |
#define IMAGE_REL_I386_REL32 024 // PC-relative 32-bit reference to the symbols virtual address |
// |
// MIPS relocation types. |
// |
#define IMAGE_REL_MIPS_ABSOLUTE 0 // Reference is absolute, no relocation is necessary |
#define IMAGE_REL_MIPS_REFHALF 01 |
#define IMAGE_REL_MIPS_REFWORD 02 |
#define IMAGE_REL_MIPS_JMPADDR 03 |
#define IMAGE_REL_MIPS_REFHI 04 |
#define IMAGE_REL_MIPS_REFLO 05 |
#define IMAGE_REL_MIPS_GPREL 06 |
#define IMAGE_REL_MIPS_LITERAL 07 |
#define IMAGE_REL_MIPS_SECTION 012 |
#define IMAGE_REL_MIPS_SECREL 013 |
#define IMAGE_REL_MIPS_REFWORDNB 042 |
#define IMAGE_REL_MIPS_PAIR 045 |
// |
// Alpha Relocation types. |
// |
#define IMAGE_REL_ALPHA_ABSOLUTE 0x0 |
#define IMAGE_REL_ALPHA_REFLONG 0x1 |
#define IMAGE_REL_ALPHA_REFQUAD 0x2 |
#define IMAGE_REL_ALPHA_GPREL32 0x3 |
#define IMAGE_REL_ALPHA_LITERAL 0x4 |
#define IMAGE_REL_ALPHA_LITUSE 0x5 |
#define IMAGE_REL_ALPHA_GPDISP 0x6 |
#define IMAGE_REL_ALPHA_BRADDR 0x7 |
#define IMAGE_REL_ALPHA_HINT 0x8 |
#define IMAGE_REL_ALPHA_INLINE_REFLONG 0x9 |
#define IMAGE_REL_ALPHA_REFHI 0xA |
#define IMAGE_REL_ALPHA_REFLO 0xB |
#define IMAGE_REL_ALPHA_PAIR 0xC |
#define IMAGE_REL_ALPHA_MATCH 0xD |
#define IMAGE_REL_ALPHA_SECTION 0xE |
#define IMAGE_REL_ALPHA_SECREL 0xF |
#define IMAGE_REL_ALPHA_REFLONGNB 0x10 |
// |
// IBM PowerPC relocation types. |
// |
#define IMAGE_REL_PPC_ABSOLUTE 0x0000 // NOP |
#define IMAGE_REL_PPC_ADDR64 0x0001 // 64-bit address |
#define IMAGE_REL_PPC_ADDR32 0x0002 // 32-bit address |
#define IMAGE_REL_PPC_ADDR24 0x0003 // 26-bit address, shifted left 2 (branch absolute) |
#define IMAGE_REL_PPC_ADDR16 0x0004 // 16-bit address |
#define IMAGE_REL_PPC_ADDR14 0x0005 // 16-bit address, shifted left 2 (load doubleword) |
#define IMAGE_REL_PPC_REL24 0x0006 // 26-bit PC-relative offset, shifted left 2 (branch relative) |
#define IMAGE_REL_PPC_REL14 0x0007 // 16-bit PC-relative offset, shifted left 2 (br cond relative) |
#define IMAGE_REL_PPC_TOCREL16 0x0008 // 16-bit offset from TOC base |
#define IMAGE_REL_PPC_TOCREL14 0x0009 // 16-bit offset from TOC base, shifted left 2 (load doubleword) |
#define IMAGE_REL_PPC_ADDR32NB 0x000A // 32-bit addr w/o image base |
#define IMAGE_REL_PPC_SECREL 0x000B // va of containing section (as in an image sectionhdr) |
#define IMAGE_REL_PPC_SECTION 0x000C // sectionheader number |
#define IMAGE_REL_PPC_IFGLUE 0x000D // substitute TOC restore instruction iff symbol is glue code |
#define IMAGE_REL_PPC_IMGLUE 0x000E // symbol is glue code; virtual address is TOC restore instruction |
#define IMAGE_REL_PPC_TYPEMASK 0x00FF // mask to isolate above values in IMAGE_RELOCATION.Type |
// Flag bits in IMAGE_RELOCATION.TYPE |
#define IMAGE_REL_PPC_NEG 0x0100 // subtract reloc value rather than adding it |
#define IMAGE_REL_PPC_BRTAKEN 0x0200 // fix branch prediction bit to predict branch taken |
#define IMAGE_REL_PPC_BRNTAKEN 0x0400 // fix branch prediction bit to predict branch not taken |
#define IMAGE_REL_PPC_TOCDEFN 0x0800 // toc slot defined in file (or, data in toc) |
// |
// Based relocation format. |
// |
typedef struct _IMAGE_BASE_RELOCATION { |
UINT32 VirtualAddress; |
UINT32 SizeOfBlock; |
// UINT16 TypeOffset[1]; |
} IMAGE_BASE_RELOCATION, *PIMAGE_BASE_RELOCATION; |
#define IMAGE_SIZEOF_BASE_RELOCATION 8 |
// |
// Based relocation types. |
// |
#define IMAGE_REL_BASED_ABSOLUTE 0 |
#define IMAGE_REL_BASED_HIGH 1 |
#define IMAGE_REL_BASED_LOW 2 |
#define IMAGE_REL_BASED_HIGHLOW 3 |
#define IMAGE_REL_BASED_HIGHADJ 4 |
#define IMAGE_REL_BASED_MIPS_JMPADDR 5 |
#define IMAGE_REL_BASED_IA64_IMM64 9 |
#define IMAGE_REL_BASED_DIR64 10 |
// |
// Line number format. |
// |
typedef struct _IMAGE_LINENUMBER { |
union { |
UINT32 SymbolTableIndex; // Symbol table index of function name if Linenumber is 0. |
UINT32 VirtualAddress; // Virtual address of line number. |
} Type; |
UINT16 Linenumber; // Line number. |
} IMAGE_LINENUMBER; |
#define IMAGE_SIZEOF_LINENUMBER 6 |
// |
// Archive format. |
// |
#define IMAGE_ARCHIVE_START_SIZE 8 |
#define IMAGE_ARCHIVE_START "!<arch>\n" |
#define IMAGE_ARCHIVE_END "`\n" |
#define IMAGE_ARCHIVE_PAD "\n" |
#define IMAGE_ARCHIVE_LINKER_MEMBER "/ " |
#define IMAGE_ARCHIVE_LONGNAMES_MEMBER "// " |
typedef struct _IMAGE_ARCHIVE_MEMBER_HEADER { |
UINT8 Name[16]; // File member name - `/' terminated. |
UINT8 Date[12]; // File member date - decimal. |
UINT8 UserID[6]; // File member user id - decimal. |
UINT8 GroupID[6]; // File member group id - decimal. |
UINT8 Mode[8]; // File member mode - octal. |
UINT8 Size[10]; // File member size - decimal. |
UINT8 EndHeader[2]; // String to end header. |
} IMAGE_ARCHIVE_MEMBER_HEADER, *PIMAGE_ARCHIVE_MEMBER_HEADER; |
#define IMAGE_SIZEOF_ARCHIVE_MEMBER_HDR 60 |
// |
// DLL support. |
// |
// |
// Export Format |
// |
typedef struct _IMAGE_EXPORT_DIRECTORY { |
UINT32 Characteristics; |
UINT32 TimeDateStamp; |
UINT16 MajorVersion; |
UINT16 MinorVersion; |
UINT32 Name; |
UINT32 Base; |
UINT32 NumberOfFunctions; |
UINT32 NumberOfNames; |
UINT32 AddressOfFunctions; |
UINT32 AddressOfNames; |
UINT32 AddressOfNameOrdinals; |
} IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY; |
// |
// Import Format |
// |
typedef struct _IMAGE_IMPORT_BY_NAME { |
UINT16 Hint; |
UINT8 Name[1]; |
} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME; |
typedef struct _IMAGE_THUNK_DATA { |
union { |
UINT32 Function; |
UINT32 Ordinal; |
PIMAGE_IMPORT_BY_NAME AddressOfData; |
} u1; |
} IMAGE_THUNK_DATA, *PIMAGE_THUNK_DATA; |
#define IMAGE_ORDINAL_FLAG 0x80000000 |
#define IMAGE_SNAP_BY_ORDINAL(Ordinal) ((Ordinal & IMAGE_ORDINAL_FLAG) != 0) |
#define IMAGE_ORDINAL(Ordinal) (Ordinal & 0xffff) |
typedef struct _IMAGE_IMPORT_DESCRIPTOR { |
UINT32 Characteristics; |
UINT32 TimeDateStamp; |
UINT32 ForwarderChain; |
UINT32 Name; |
PIMAGE_THUNK_DATA FirstThunk; |
} IMAGE_IMPORT_DESCRIPTOR, *PIMAGE_IMPORT_DESCRIPTOR; |
#endif |
/tags/0.3.0/boot/arch/ia64/loader/gefi/inc/efigpt.h |
---|
0,0 → 1,68 |
#ifndef _EFI_GPT_H |
#define _EFI_GPT_H |
/*++ |
Copyright (c) 1998 Intel Corporation |
Module Name: |
EfiGpt.h |
Abstract: |
Include file for EFI partitioning scheme |
Revision History |
--*/ |
#define PRIMARY_PART_HEADER_LBA 1 |
typedef struct { |
EFI_TABLE_HEADER Header; |
EFI_LBA MyLBA; |
EFI_LBA AlternateLBA; |
EFI_LBA FirstUsableLBA; |
EFI_LBA LastUsableLBA; |
EFI_GUID DiskGUID; |
EFI_LBA PartitionEntryLBA; |
UINT32 NumberOfPartitionEntries; |
UINT32 SizeOfPartitionEntry; |
UINT32 PartitionEntryArrayCRC32; |
} EFI_PARTITION_TABLE_HEADER; |
#define EFI_PTAB_HEADER_ID "EFI PART" |
typedef struct { |
EFI_GUID PartitionTypeGUID; |
EFI_GUID UniquePartitionGUID; |
EFI_LBA StartingLBA; |
EFI_LBA EndingLBA; |
UINT64 Attributes; |
CHAR16 PartitionName[36]; |
} EFI_PARTITION_ENTRY; |
// |
// EFI Partition Attributes |
// |
#define EFI_PART_USED_BY_EFI 0x0000000000000001 |
#define EFI_PART_REQUIRED_TO_FUNCTION 0x0000000000000002 |
#define EFI_PART_USED_BY_OS 0x0000000000000004 |
#define EFI_PART_REQUIRED_BY_OS 0x0000000000000008 |
#define EFI_PART_BACKUP_REQUIRED 0x0000000000000010 |
#define EFI_PART_USER_DATA 0x0000000000000020 |
#define EFI_PART_CRITICAL_USER_DATA 0x0000000000000040 |
#define EFI_PART_REDUNDANT_PARTITION 0x0000000000000080 |
#define EFI_PART_TYPE_UNUSED_GUID \ |
{ 0x00000000, 0x0000, 0x0000, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } |
#define EFI_PART_TYPE_EFI_SYSTEM_PART_GUID \ |
{ 0xc12a7328, 0xf81f, 0x11d2, {0xba, 0x4b, 0x00, 0xa0, 0xc9, 0x3e, 0xc9, 0x3b} } |
#define EFI_PART_TYPE_LEGACY_MBR_GUID \ |
{ 0x024dee41, 0x33e7, 0x11d3, {0x9d, 0x69, 0x00, 0x08, 0xc7, 0x81, 0xf3, 0x9f} } |
#endif |
/tags/0.3.0/boot/arch/ia64/loader/gefi/inc/efi_pxe.h |
---|
0,0 → 1,1743 |
#ifndef _EFI_PXE_H |
#define _EFI_PXE_H |
/*++ |
Copyright (c) Intel 1999 |
Module name: |
efi_pxe.h |
32/64-bit PXE specification: |
alpha-4, 99-Dec-17 |
Abstract: |
This header file contains all of the PXE type definitions, |
structure prototypes, global variables and constants that |
are needed for porting PXE to EFI. |
--*/ |
#pragma pack(1) |
#define PXE_INTEL_ORDER 1 // Intel order |
//#define PXE_NETWORK_ORDER 1 // network order |
#define PXE_UINT64_SUPPORT 1 // UINT64 supported |
//#define PXE_NO_UINT64_SUPPORT 1 // UINT64 not supported |
#define PXE_BUSTYPE(a,b,c,d) \ |
((((PXE_UINT32)(d) & 0xFF) << 24) | \ |
(((PXE_UINT32)(c) & 0xFF) << 16) | \ |
(((PXE_UINT32)(b) & 0xFF) << 8) | \ |
((PXE_UINT32)(a) & 0xFF)) |
// |
// UNDI ROM ID and devive ID signature |
// |
#define PXE_BUSTYPE_PXE PXE_BUSTYPE('!', 'P', 'X', 'E') |
// |
// BUS ROM ID signatures |
// |
#define PXE_BUSTYPE_PCI PXE_BUSTYPE('P', 'C', 'I', 'R') |
#define PXE_BUSTYPE_PC_CARD PXE_BUSTYPE('P', 'C', 'C', 'R') |
#define PXE_BUSTYPE_USB PXE_BUSTYPE('U', 'S', 'B', 'R') |
#define PXE_BUSTYPE_1394 PXE_BUSTYPE('1', '3', '9', '4') |
#define PXE_SWAP_UINT16(n) \ |
((((PXE_UINT16)(n) & 0x00FF) << 8) | \ |
(((PXE_UINT16)(n) & 0xFF00) >> 8)) |
#define PXE_SWAP_UINT32(n) \ |
((((PXE_UINT32)(n) & 0x000000FF) << 24) | \ |
(((PXE_UINT32)(n) & 0x0000FF00) << 8) | \ |
(((PXE_UINT32)(n) & 0x00FF0000) >> 8) | \ |
(((PXE_UINT32)(n) & 0xFF000000) >> 24)) |
#if PXE_UINT64_SUPPORT != 0 |
#define PXE_SWAP_UINT64(n) \ |
((((PXE_UINT64)(n) & 0x00000000000000FF) << 56) | \ |
(((PXE_UINT64)(n) & 0x000000000000FF00) << 40) | \ |
(((PXE_UINT64)(n) & 0x0000000000FF0000) << 24) | \ |
(((PXE_UINT64)(n) & 0x00000000FF000000) << 8) | \ |
(((PXE_UINT64)(n) & 0x000000FF00000000) >> 8) | \ |
(((PXE_UINT64)(n) & 0x0000FF0000000000) >> 24) | \ |
(((PXE_UINT64)(n) & 0x00FF000000000000) >> 40) | \ |
(((PXE_UINT64)(n) & 0xFF00000000000000) >> 56)) |
#endif // PXE_UINT64_SUPPORT |
#if PXE_NO_UINT64_SUPPORT != 0 |
#define PXE_SWAP_UINT64(n) \ |
{ \ |
PXE_UINT32 tmp = (PXE_UINT64)(n)[1]; \ |
(PXE_UINT64)(n)[1] = PXE_SWAP_UINT32((PXE_UINT64)(n)[0]); \ |
(PXE_UINT64)(n)[0] = tmp; \ |
} |
#endif // PXE_NO_UINT64_SUPPORT |
#define PXE_CPBSIZE_NOT_USED 0 // zero |
#define PXE_DBSIZE_NOT_USED 0 // zero |
#define PXE_CPBADDR_NOT_USED (PXE_UINT64)0 // zero |
#define PXE_DBADDR_NOT_USED (PXE_UINT64)0 // zero |
#define PXE_CONST const |
#define PXE_VOLATILE volatile |
typedef void PXE_VOID; |
typedef unsigned char PXE_UINT8; |
typedef unsigned short PXE_UINT16; |
typedef unsigned PXE_UINT32; |
#if PXE_UINT64_SUPPORT != 0 |
// typedef unsigned long PXE_UINT64; |
typedef UINT64 PXE_UINT64; |
#endif // PXE_UINT64_SUPPORT |
#if PXE_NO_UINT64_SUPPORT != 0 |
typedef PXE_UINT32 PXE_UINT64[2]; |
#endif // PXE_NO_UINT64_SUPPORT |
typedef unsigned PXE_UINTN; |
typedef PXE_UINT8 PXE_BOOL; |
#define PXE_FALSE 0 // zero |
#define PXE_TRUE (!PXE_FALSE) |
typedef PXE_UINT16 PXE_OPCODE; |
// |
// Return UNDI operational state. |
// |
#define PXE_OPCODE_GET_STATE 0x0000 |
// |
// Change UNDI operational state from Stopped to Started. |
// |
#define PXE_OPCODE_START 0x0001 |
// |
// Change UNDI operational state from Started to Stopped. |
// |
#define PXE_OPCODE_STOP 0x0002 |
// |
// Get UNDI initialization information. |
// |
#define PXE_OPCODE_GET_INIT_INFO 0x0003 |
// |
// Get NIC configuration information. |
// |
#define PXE_OPCODE_GET_CONFIG_INFO 0x0004 |
// |
// Changed UNDI operational state from Started to Initialized. |
// |
#define PXE_OPCODE_INITIALIZE 0x0005 |
// |
// Re-initialize the NIC H/W. |
// |
#define PXE_OPCODE_RESET 0x0006 |
// |
// Change the UNDI operational state from Initialized to Started. |
// |
#define PXE_OPCODE_SHUTDOWN 0x0007 |
// |
// Read & change state of external interrupt enables. |
// |
#define PXE_OPCODE_INTERRUPT_ENABLES 0x0008 |
// |
// Read & change state of packet receive filters. |
// |
#define PXE_OPCODE_RECEIVE_FILTERS 0x0009 |
// |
// Read & change station MAC address. |
// |
#define PXE_OPCODE_STATION_ADDRESS 0x000A |
// |
// Read traffic statistics. |
// |
#define PXE_OPCODE_STATISTICS 0x000B |
// |
// Convert multicast IP address to multicast MAC address. |
// |
#define PXE_OPCODE_MCAST_IP_TO_MAC 0x000C |
// |
// Read or change non-volatile storage on the NIC. |
// |
#define PXE_OPCODE_NVDATA 0x000D |
// |
// Get & clear interrupt status. |
// |
#define PXE_OPCODE_GET_STATUS 0x000E |
// |
// Fill media header in packet for transmit. |
// |
#define PXE_OPCODE_FILL_HEADER 0x000F |
// |
// Transmit packet(s). |
// |
#define PXE_OPCODE_TRANSMIT 0x0010 |
// |
// Receive packet. |
// |
#define PXE_OPCODE_RECEIVE 0x0011 |
// last valid opcode: |
#define PXE_OPCODE_VALID_MAX 0x0011 |
// |
// Last valid PXE UNDI OpCode number. |
// |
#define PXE_OPCODE_LAST_VALID 0x0011 |
typedef PXE_UINT16 PXE_OPFLAGS; |
#define PXE_OPFLAGS_NOT_USED 0x0000 |
//////////////////////////////////////// |
// UNDI Get State |
// |
// No OpFlags |
//////////////////////////////////////// |
// UNDI Start |
// |
// No OpFlags |
//////////////////////////////////////// |
// UNDI Stop |
// |
// No OpFlags |
//////////////////////////////////////// |
// UNDI Get Init Info |
// |
// No Opflags |
//////////////////////////////////////// |
// UNDI Get Config Info |
// |
// No Opflags |
//////////////////////////////////////// |
// UNDI Initialize |
// |
#define PXE_OPFLAGS_INITIALIZE_CABLE_DETECT_MASK 0x0001 |
#define PXE_OPFLAGS_INITIALIZE_DETECT_CABLE 0x0000 |
#define PXE_OPFLAGS_INITIALIZE_DO_NOT_DETECT_CABLE 0x0001 |
//////////////////////////////////////// |
// UNDI Reset |
// |
#define PXE_OPFLAGS_RESET_DISABLE_INTERRUPTS 0x0001 |
#define PXE_OPFLAGS_RESET_DISABLE_FILTERS 0x0002 |
//////////////////////////////////////// |
// UNDI Shutdown |
// |
// No OpFlags |
//////////////////////////////////////// |
// UNDI Interrupt Enables |
// |
// |
// Select whether to enable or disable external interrupt signals. |
// Setting both enable and disable will return PXE_STATCODE_INVALID_OPFLAGS. |
// |
#define PXE_OPFLAGS_INTERRUPT_OPMASK 0xC000 |
#define PXE_OPFLAGS_INTERRUPT_ENABLE 0x8000 |
#define PXE_OPFLAGS_INTERRUPT_DISABLE 0x4000 |
#define PXE_OPFLAGS_INTERRUPT_READ 0x0000 |
// |
// Enable receive interrupts. An external interrupt will be generated |
// after a complete non-error packet has been received. |
// |
#define PXE_OPFLAGS_INTERRUPT_RECEIVE 0x0001 |
// |
// Enable transmit interrupts. An external interrupt will be generated |
// after a complete non-error packet has been transmitted. |
// |
#define PXE_OPFLAGS_INTERRUPT_TRANSMIT 0x0002 |
// |
// Enable command interrupts. An external interrupt will be generated |
// when command execution stops. |
// |
#define PXE_OPFLAGS_INTERRUPT_COMMAND 0x0004 |
// |
// Generate software interrupt. Setting this bit generates an external |
// interrupt, if it is supported by the hardware. |
// |
#define PXE_OPFLAGS_INTERRUPT_SOFTWARE 0x0008 |
//////////////////////////////////////// |
// UNDI Receive Filters |
// |
// |
// Select whether to enable or disable receive filters. |
// Setting both enable and disable will return PXE_STATCODE_INVALID_OPCODE. |
// |
#define PXE_OPFLAGS_RECEIVE_FILTER_OPMASK 0xC000 |
#define PXE_OPFLAGS_RECEIVE_FILTER_ENABLE 0x8000 |
#define PXE_OPFLAGS_RECEIVE_FILTER_DISABLE 0x4000 |
#define PXE_OPFLAGS_RECEIVE_FILTER_READ 0x0000 |
// |
// To reset the contents of the multicast MAC address filter list, |
// set this OpFlag: |
// |
#define PXE_OPFLAGS_RECEIVE_FILTER_RESET_MCAST_LIST 0x2000 |
// |
// Enable unicast packet receiving. Packets sent to the current station |
// MAC address will be received. |
// |
#define PXE_OPFLAGS_RECEIVE_FILTER_UNICAST 0x0001 |
// |
// Enable broadcast packet receiving. Packets sent to the broadcast |
// MAC address will be received. |
// |
#define PXE_OPFLAGS_RECEIVE_FILTER_BROADCAST 0x0002 |
// |
// Enable filtered multicast packet receiving. Packets sent to any |
// of the multicast MAC addresses in the multicast MAC address filter |
// list will be received. If the filter list is empty, no multicast |
// |
#define PXE_OPFLAGS_RECEIVE_FILTER_FILTERED_MULTICAST 0x0004 |
// |
// Enable promiscuous packet receiving. All packets will be received. |
// |
#define PXE_OPFLAGS_RECEIVE_FILTER_PROMISCUOUS 0x0008 |
// |
// Enable promiscuous multicast packet receiving. All multicast |
// packets will be received. |
// |
#define PXE_OPFLAGS_RECEIVE_FILTER_ALL_MULTICAST 0x0010 |
//////////////////////////////////////// |
// UNDI Station Address |
// |
#define PXE_OPFLAGS_STATION_ADDRESS_READ 0x0000 |
#define PXE_OPFLAGS_STATION_ADDRESS_RESET 0x0001 |
//////////////////////////////////////// |
// UNDI Statistics |
// |
#define PXE_OPFLAGS_STATISTICS_READ 0x0000 |
#define PXE_OPFLAGS_STATISTICS_RESET 0x0001 |
//////////////////////////////////////// |
// UNDI MCast IP to MAC |
// |
// |
// Identify the type of IP address in the CPB. |
// |
#define PXE_OPFLAGS_MCAST_IP_TO_MAC_OPMASK 0x0003 |
#define PXE_OPFLAGS_MCAST_IPV4_TO_MAC 0x0000 |
#define PXE_OPFLAGS_MCAST_IPV6_TO_MAC 0x0001 |
//////////////////////////////////////// |
// UNDI NvData |
// |
// |
// Select the type of non-volatile data operation. |
// |
#define PXE_OPFLAGS_NVDATA_OPMASK 0x0001 |
#define PXE_OPFLAGS_NVDATA_READ 0x0000 |
#define PXE_OPFLAGS_NVDATA_WRITE 0x0001 |
//////////////////////////////////////// |
// UNDI Get Status |
// |
// |
// Return current interrupt status. This will also clear any interrupts |
// that are currently set. This can be used in a polling routine. The |
// interrupt flags are still set and cleared even when the interrupts |
// are disabled. |
// |
#define PXE_OPFLAGS_GET_INTERRUPT_STATUS 0x0001 |
// |
// Return list of transmitted buffers for recycling. Transmit buffers |
// must not be changed or unallocated until they have recycled. After |
// issuing a transmit command, wait for a transmit complete interrupt. |
// When a transmit complete interrupt is received, read the transmitted |
// buffers. Do not plan on getting one buffer per interrupt. Some |
// NICs and UNDIs may transmit multiple buffers per interrupt. |
// |
#define PXE_OPFLAGS_GET_TRANSMITTED_BUFFERS 0x0002 |
//////////////////////////////////////// |
// UNDI Fill Header |
// |
#define PXE_OPFLAGS_FILL_HEADER_OPMASK 0x0001 |
#define PXE_OPFLAGS_FILL_HEADER_FRAGMENTED 0x0001 |
#define PXE_OPFLAGS_FILL_HEADER_WHOLE 0x0000 |
//////////////////////////////////////// |
// UNDI Transmit |
// |
// |
// S/W UNDI only. Return after the packet has been transmitted. A |
// transmit complete interrupt will still be generated and the transmit |
// buffer will have to be recycled. |
// |
#define PXE_OPFLAGS_SWUNDI_TRANSMIT_OPMASK 0x0001 |
#define PXE_OPFLAGS_TRANSMIT_BLOCK 0x0001 |
#define PXE_OPFLAGS_TRANSMIT_DONT_BLOCK 0x0000 |
// |
// |
// |
#define PXE_OPFLAGS_TRANSMIT_OPMASK 0x0002 |
#define PXE_OPFLAGS_TRANSMIT_FRAGMENTED 0x0002 |
#define PXE_OPFLAGS_TRANSMIT_WHOLE 0x0000 |
//////////////////////////////////////// |
// UNDI Receive |
// |
// No OpFlags |
typedef PXE_UINT16 PXE_STATFLAGS; |
#define PXE_STATFLAGS_INITIALIZE 0x0000 |
//////////////////////////////////////// |
// Common StatFlags that can be returned by all commands. |
// |
// |
// The COMMAND_COMPLETE and COMMAND_FAILED status flags must be |
// implemented by all UNDIs. COMMAND_QUEUED is only needed by UNDIs |
// that support command queuing. |
// |
#define PXE_STATFLAGS_STATUS_MASK 0xC000 |
#define PXE_STATFLAGS_COMMAND_COMPLETE 0xC000 |
#define PXE_STATFLAGS_COMMAND_FAILED 0x8000 |
#define PXE_STATFLAGS_COMMAND_QUEUED 0x4000 |
//#define PXE_STATFLAGS_INITIALIZE 0x0000 |
#define PXE_STATFLAGS_DB_WRITE_TRUNCATED 0x2000 |
//////////////////////////////////////// |
// UNDI Get State |
// |
#define PXE_STATFLAGS_GET_STATE_MASK 0x0003 |
#define PXE_STATFLAGS_GET_STATE_INITIALIZED 0x0002 |
#define PXE_STATFLAGS_GET_STATE_STARTED 0x0001 |
#define PXE_STATFLAGS_GET_STATE_STOPPED 0x0000 |
//////////////////////////////////////// |
// UNDI Start |
// |
// No additional StatFlags |
//////////////////////////////////////// |
// UNDI Get Init Info |
// |
#define PXE_STATFLAGS_CABLE_DETECT_MASK 0x0001 |
#define PXE_STATFLAGS_CABLE_DETECT_NOT_SUPPORTED 0x0000 |
#define PXE_STATFLAGS_CABLE_DETECT_SUPPORTED 0x0001 |
//////////////////////////////////////// |
// UNDI Initialize |
// |
#define PXE_STATFLAGS_INITIALIZED_NO_MEDIA 0x0001 |
//////////////////////////////////////// |
// UNDI Reset |
// |
#define PXE_STATFLAGS_RESET_NO_MEDIA 0x0001 |
//////////////////////////////////////// |
// UNDI Shutdown |
// |
// No additional StatFlags |
//////////////////////////////////////// |
// UNDI Interrupt Enables |
// |
// |
// If set, receive interrupts are enabled. |
// |
#define PXE_STATFLAGS_INTERRUPT_RECEIVE 0x0001 |
// |
// If set, transmit interrupts are enabled. |
// |
#define PXE_STATFLAGS_INTERRUPT_TRANSMIT 0x0002 |
// |
// If set, command interrupts are enabled. |
// |
#define PXE_STATFLAGS_INTERRUPT_COMMAND 0x0004 |
//////////////////////////////////////// |
// UNDI Receive Filters |
// |
// |
// If set, unicast packets will be received. |
// |
#define PXE_STATFLAGS_RECEIVE_FILTER_UNICAST 0x0001 |
// |
// If set, broadcast packets will be received. |
// |
#define PXE_STATFLAGS_RECEIVE_FILTER_BROADCAST 0x0002 |
// |
// If set, multicast packets that match up with the multicast address |
// filter list will be received. |
// |
#define PXE_STATFLAGS_RECEIVE_FILTER_FILTERED_MULTICAST 0x0004 |
// |
// If set, all packets will be received. |
// |
#define PXE_STATFLAGS_RECEIVE_FILTER_PROMISCUOUS 0x0008 |
// |
// If set, all multicast packets will be received. |
// |
#define PXE_STATFLAGS_RECEIVE_FILTER_ALL_MULTICAST 0x0010 |
//////////////////////////////////////// |
// UNDI Station Address |
// |
// No additional StatFlags |
//////////////////////////////////////// |
// UNDI Statistics |
// |
// No additional StatFlags |
//////////////////////////////////////// |
// UNDI MCast IP to MAC |
// |
// No additional StatFlags |
//////////////////////////////////////// |
// UNDI NvData |
// |
// No additional StatFlags |
//////////////////////////////////////// |
// UNDI Get Status |
// |
// |
// Use to determine if an interrupt has occurred. |
// |
#define PXE_STATFLAGS_GET_STATUS_INTERRUPT_MASK 0x000F |
#define PXE_STATFLAGS_GET_STATUS_NO_INTERRUPTS 0x0000 |
// |
// If set, at least one receive interrupt occurred. |
// |
#define PXE_STATFLAGS_GET_STATUS_RECEIVE 0x0001 |
// |
// If set, at least one transmit interrupt occurred. |
// |
#define PXE_STATFLAGS_GET_STATUS_TRANSMIT 0x0002 |
// |
// If set, at least one command interrupt occurred. |
// |
#define PXE_STATFLAGS_GET_STATUS_COMMAND 0x0004 |
// |
// If set, at least one software interrupt occurred. |
// |
#define PXE_STATFLAGS_GET_STATUS_SOFTWARE 0x0008 |
// |
// This flag is set if the transmitted buffer queue is empty. This flag |
// will be set if all transmitted buffer addresses get written into the DB. |
// |
#define PXE_STATFLAGS_GET_STATUS_TXBUF_QUEUE_EMPTY 0x0010 |
// |
// This flag is set if no transmitted buffer addresses were written |
// into the DB. (This could be because DBsize was too small.) |
// |
#define PXE_STATFLAGS_GET_STATUS_NO_TXBUFS_WRITTEN 0x0020 |
//////////////////////////////////////// |
// UNDI Fill Header |
// |
// No additional StatFlags |
//////////////////////////////////////// |
// UNDI Transmit |
// |
// No additional StatFlags. |
//////////////////////////////////////// |
// UNDI Receive |
// |
// No additional StatFlags. |
typedef PXE_UINT16 PXE_STATCODE; |
#define PXE_STATCODE_INITIALIZE 0x0000 |
//////////////////////////////////////// |
// Common StatCodes returned by all UNDI commands, UNDI protocol functions |
// and BC protocol functions. |
// |
#define PXE_STATCODE_SUCCESS 0x0000 |
#define PXE_STATCODE_INVALID_CDB 0x0001 |
#define PXE_STATCODE_INVALID_CPB 0x0002 |
#define PXE_STATCODE_BUSY 0x0003 |
#define PXE_STATCODE_QUEUE_FULL 0x0004 |
#define PXE_STATCODE_ALREADY_STARTED 0x0005 |
#define PXE_STATCODE_NOT_STARTED 0x0006 |
#define PXE_STATCODE_NOT_SHUTDOWN 0x0007 |
#define PXE_STATCODE_ALREADY_INITIALIZED 0x0008 |
#define PXE_STATCODE_NOT_INITIALIZED 0x0009 |
#define PXE_STATCODE_DEVICE_FAILURE 0x000A |
#define PXE_STATCODE_NVDATA_FAILURE 0x000B |
#define PXE_STATCODE_UNSUPPORTED 0x000C |
#define PXE_STATCODE_BUFFER_FULL 0x000D |
#define PXE_STATCODE_INVALID_PARAMETER 0x000E |
#define PXE_STATCODE_INVALID_UNDI 0x000F |
#define PXE_STATCODE_IPV4_NOT_SUPPORTED 0x0010 |
#define PXE_STATCODE_IPV6_NOT_SUPPORTED 0x0011 |
#define PXE_STATCODE_NOT_ENOUGH_MEMORY 0x0012 |
#define PXE_STATCODE_NO_DATA 0x0013 |
typedef PXE_UINT16 PXE_IFNUM; |
// |
// This interface number must be passed to the S/W UNDI Start command. |
// |
#define PXE_IFNUM_START 0x0000 |
// |
// This interface number is returned by the S/W UNDI Get State and |
// Start commands if information in the CDB, CPB or DB is invalid. |
// |
#define PXE_IFNUM_INVALID 0x0000 |
typedef PXE_UINT16 PXE_CONTROL; |
// |
// Setting this flag directs the UNDI to queue this command for later |
// execution if the UNDI is busy and it supports command queuing. |
// If queuing is not supported, a PXE_STATCODE_INVALID_CONTROL error |
// is returned. If the queue is full, a PXE_STATCODE_CDB_QUEUE_FULL |
// error is returned. |
// |
#define PXE_CONTROL_QUEUE_IF_BUSY 0x0002 |
// |
// These two bit values are used to determine if there are more UNDI |
// CDB structures following this one. If the link bit is set, there |
// must be a CDB structure following this one. Execution will start |
// on the next CDB structure as soon as this one completes successfully. |
// If an error is generated by this command, execution will stop. |
// |
#define PXE_CONTROL_LINK 0x0001 |
#define PXE_CONTROL_LAST_CDB_IN_LIST 0x0000 |
typedef PXE_UINT8 PXE_FRAME_TYPE; |
#define PXE_FRAME_TYPE_NONE 0x00 |
#define PXE_FRAME_TYPE_UNICAST 0x01 |
#define PXE_FRAME_TYPE_BROADCAST 0x02 |
#define PXE_FRAME_TYPE_MULTICAST 0x03 |
#define PXE_FRAME_TYPE_PROMISCUOUS 0x04 |
typedef PXE_UINT32 PXE_IPV4; |
typedef PXE_UINT32 PXE_IPV6[4]; |
#define PXE_MAC_LENGTH 32 |
typedef PXE_UINT8 PXE_MAC_ADDR[PXE_MAC_LENGTH]; |
typedef PXE_UINT8 PXE_IFTYPE; |
typedef PXE_UINT16 PXE_MEDIA_PROTOCOL; |
// |
// This information is from the ARP section of RFC 1700. |
// |
// 1 Ethernet (10Mb) [JBP] |
// 2 Experimental Ethernet (3Mb) [JBP] |
// 3 Amateur Radio AX.25 [PXK] |
// 4 Proteon ProNET Token Ring [JBP] |
// 5 Chaos [GXP] |
// 6 IEEE 802 Networks [JBP] |
// 7 ARCNET [JBP] |
// 8 Hyperchannel [JBP] |
// 9 Lanstar [TU] |
// 10 Autonet Short Address [MXB1] |
// 11 LocalTalk [JKR1] |
// 12 LocalNet (IBM PCNet or SYTEK LocalNET) [JXM] |
// 13 Ultra link [RXD2] |
// 14 SMDS [GXC1] |
// 15 Frame Relay [AGM] |
// 16 Asynchronous Transmission Mode (ATM) [JXB2] |
// 17 HDLC [JBP] |
// 18 Fibre Channel [Yakov Rekhter] |
// 19 Asynchronous Transmission Mode (ATM) [Mark Laubach] |
// 20 Serial Line [JBP] |
// 21 Asynchronous Transmission Mode (ATM) [MXB1] |
// |
#define PXE_IFTYPE_ETHERNET 0x01 |
#define PXE_IFTYPE_TOKENRING 0x04 |
#define PXE_IFTYPE_FIBRE_CHANNEL 0x12 |
typedef struct s_pxe_hw_undi { |
PXE_UINT32 Signature; // PXE_ROMID_SIGNATURE |
PXE_UINT8 Len; // sizeof(PXE_HW_UNDI) |
PXE_UINT8 Fudge; // makes 8-bit cksum equal zero |
PXE_UINT8 Rev; // PXE_ROMID_REV |
PXE_UINT8 IFcnt; // physical connector count |
PXE_UINT8 MajorVer; // PXE_ROMID_MAJORVER |
PXE_UINT8 MinorVer; // PXE_ROMID_MINORVER |
PXE_UINT16 reserved; // zero, not used |
PXE_UINT32 Implementation; // implementation flags |
// reserved // vendor use |
// PXE_UINT32 Status; // status port |
// PXE_UINT32 Command; // command port |
// PXE_UINT64 CDBaddr; // CDB address port |
} PXE_HW_UNDI; |
// |
// Status port bit definitions |
// |
// |
// UNDI operation state |
// |
#define PXE_HWSTAT_STATE_MASK 0xC0000000 |
#define PXE_HWSTAT_BUSY 0xC0000000 |
#define PXE_HWSTAT_INITIALIZED 0x80000000 |
#define PXE_HWSTAT_STARTED 0x40000000 |
#define PXE_HWSTAT_STOPPED 0x00000000 |
// |
// If set, last command failed |
// |
#define PXE_HWSTAT_COMMAND_FAILED 0x20000000 |
// |
// If set, identifies enabled receive filters |
// |
#define PXE_HWSTAT_PROMISCUOUS_MULTICAST_RX_ENABLED 0x00001000 |
#define PXE_HWSTAT_PROMISCUOUS_RX_ENABLED 0x00000800 |
#define PXE_HWSTAT_BROADCAST_RX_ENABLED 0x00000400 |
#define PXE_HWSTAT_MULTICAST_RX_ENABLED 0x00000200 |
#define PXE_HWSTAT_UNICAST_RX_ENABLED 0x00000100 |
// |
// If set, identifies enabled external interrupts |
// |
#define PXE_HWSTAT_SOFTWARE_INT_ENABLED 0x00000080 |
#define PXE_HWSTAT_TX_COMPLETE_INT_ENABLED 0x00000040 |
#define PXE_HWSTAT_PACKET_RX_INT_ENABLED 0x00000020 |
#define PXE_HWSTAT_CMD_COMPLETE_INT_ENABLED 0x00000010 |
// |
// If set, identifies pending interrupts |
// |
#define PXE_HWSTAT_SOFTWARE_INT_PENDING 0x00000008 |
#define PXE_HWSTAT_TX_COMPLETE_INT_PENDING 0x00000004 |
#define PXE_HWSTAT_PACKET_RX_INT_PENDING 0x00000002 |
#define PXE_HWSTAT_CMD_COMPLETE_INT_PENDING 0x00000001 |
// |
// Command port definitions |
// |
// |
// If set, CDB identified in CDBaddr port is given to UNDI. |
// If not set, other bits in this word will be processed. |
// |
#define PXE_HWCMD_ISSUE_COMMAND 0x80000000 |
#define PXE_HWCMD_INTS_AND_FILTS 0x00000000 |
// |
// Use these to enable/disable receive filters. |
// |
#define PXE_HWCMD_PROMISCUOUS_MULTICAST_RX_ENABLE 0x00001000 |
#define PXE_HWCMD_PROMISCUOUS_RX_ENABLE 0x00000800 |
#define PXE_HWCMD_BROADCAST_RX_ENABLE 0x00000400 |
#define PXE_HWCMD_MULTICAST_RX_ENABLE 0x00000200 |
#define PXE_HWCMD_UNICAST_RX_ENABLE 0x00000100 |
// |
// Use these to enable/disable external interrupts |
// |
#define PXE_HWCMD_SOFTWARE_INT_ENABLE 0x00000080 |
#define PXE_HWCMD_TX_COMPLETE_INT_ENABLE 0x00000040 |
#define PXE_HWCMD_PACKET_RX_INT_ENABLE 0x00000020 |
#define PXE_HWCMD_CMD_COMPLETE_INT_ENABLE 0x00000010 |
// |
// Use these to clear pending external interrupts |
// |
#define PXE_HWCMD_CLEAR_SOFTWARE_INT 0x00000008 |
#define PXE_HWCMD_CLEAR_TX_COMPLETE_INT 0x00000004 |
#define PXE_HWCMD_CLEAR_PACKET_RX_INT 0x00000002 |
#define PXE_HWCMD_CLEAR_CMD_COMPLETE_INT 0x00000001 |
typedef struct s_pxe_sw_undi { |
PXE_UINT32 Signature; // PXE_ROMID_SIGNATURE |
PXE_UINT8 Len; // sizeof(PXE_SW_UNDI) |
PXE_UINT8 Fudge; // makes 8-bit cksum zero |
PXE_UINT8 Rev; // PXE_ROMID_REV |
PXE_UINT8 IFcnt; // physical connector count |
PXE_UINT8 MajorVer; // PXE_ROMID_MAJORVER |
PXE_UINT8 MinorVer; // PXE_ROMID_MINORVER |
PXE_UINT16 reserved1; // zero, not used |
PXE_UINT32 Implementation; // Implementation flags |
PXE_UINT64 EntryPoint; // API entry point |
PXE_UINT8 reserved2[3]; // zero, not used |
PXE_UINT8 BusCnt; // number of bustypes supported |
PXE_UINT32 BusType[1]; // list of supported bustypes |
} PXE_SW_UNDI; |
typedef union u_pxe_undi { |
PXE_HW_UNDI hw; |
PXE_SW_UNDI sw; |
} PXE_UNDI; |
// |
// Signature of !PXE structure |
// |
#define PXE_ROMID_SIGNATURE PXE_BUSTYPE('!', 'P', 'X', 'E') |
// |
// !PXE structure format revision |
// |
#define PXE_ROMID_REV 0x02 |
// |
// UNDI command interface revision. These are the values that get sent |
// in option 94 (Client Network Interface Identifier) in the DHCP Discover |
// and PXE Boot Server Request packets. |
// |
#define PXE_ROMID_MAJORVER 0x03 |
#define PXE_ROMID_MINORVER 0x00 |
// |
// Implementation flags |
// |
#define PXE_ROMID_IMP_HW_UNDI 0x80000000 |
#define PXE_ROMID_IMP_SW_VIRT_ADDR 0x40000000 |
#define PXE_ROMID_IMP_64BIT_DEVICE 0x00010000 |
#define PXE_ROMID_IMP_FRAG_SUPPORTED 0x00008000 |
#define PXE_ROMID_IMP_CMD_LINK_SUPPORTED 0x00004000 |
#define PXE_ROMID_IMP_CMD_QUEUE_SUPPORTED 0x00002000 |
#define PXE_ROMID_IMP_MULTI_FRAME_SUPPORTED 0x00001000 |
#define PXE_ROMID_IMP_NVDATA_SUPPORT_MASK 0x00000C00 |
#define PXE_ROMID_IMP_NVDATA_BULK_WRITABLE 0x00000C00 |
#define PXE_ROMID_IMP_NVDATA_SPARSE_WRITABLE 0x00000800 |
#define PXE_ROMID_IMP_NVDATA_READ_ONLY 0x00000400 |
#define PXE_ROMID_IMP_NVDATA_NOT_AVAILABLE 0x00000000 |
#define PXE_ROMID_IMP_STATISTICS_SUPPORTED 0x00000200 |
#define PXE_ROMID_IMP_STATION_ADDR_SETTABLE 0x00000100 |
#define PXE_ROMID_IMP_PROMISCUOUS_MULTICAST_RX_SUPPORTED 0x00000080 |
#define PXE_ROMID_IMP_PROMISCUOUS_RX_SUPPORTED 0x00000040 |
#define PXE_ROMID_IMP_BROADCAST_RX_SUPPORTED 0x00000020 |
#define PXE_ROMID_IMP_FILTERED_MULTICAST_RX_SUPPORTED 0x00000010 |
#define PXE_ROMID_IMP_SOFTWARE_INT_SUPPORTED 0x00000008 |
#define PXE_ROMID_IMP_TX_COMPLETE_INT_SUPPORTED 0x00000004 |
#define PXE_ROMID_IMP_PACKET_RX_INT_SUPPORTED 0x00000002 |
#define PXE_ROMID_IMP_CMD_COMPLETE_INT_SUPPORTED 0x00000001 |
typedef struct s_pxe_cdb { |
PXE_OPCODE OpCode; |
PXE_OPFLAGS OpFlags; |
PXE_UINT16 CPBsize; |
PXE_UINT16 DBsize; |
UINT64 CPBaddr; |
UINT64 DBaddr; |
PXE_STATCODE StatCode; |
PXE_STATFLAGS StatFlags; |
PXE_UINT16 IFnum; |
PXE_CONTROL Control; |
} PXE_CDB; |
typedef union u_pxe_ip_addr { |
PXE_IPV6 IPv6; |
PXE_IPV4 IPv4; |
} PXE_IP_ADDR; |
typedef union pxe_device { |
// |
// PCI and PC Card NICs are both identified using bus, device |
// and function numbers. For PC Card, this may require PC |
// Card services to be loaded in the BIOS or preboot |
// environment. |
// |
struct { |
// |
// See S/W UNDI ROMID structure definition for PCI and |
// PCC BusType definitions. |
// |
PXE_UINT32 BusType; |
// |
// Bus, device & function numbers that locate this device. |
// |
PXE_UINT16 Bus; |
PXE_UINT8 Device; |
PXE_UINT8 Function; |
} PCI, PCC; |
// |
// %%TBD - More information is needed about enumerating |
// USB and 1394 devices. |
// |
struct { |
PXE_UINT32 BusType; |
PXE_UINT32 tdb; |
} USB, _1394; |
} PXE_DEVICE; |
// cpb and db definitions |
#define MAX_PCI_CONFIG_LEN 64 // # of dwords |
#define MAX_EEPROM_LEN 128 // #of dwords |
#define MAX_XMIT_BUFFERS 32 // recycling Q length for xmit_done |
#define MAX_MCAST_ADDRESS_CNT 8 |
typedef struct s_pxe_cpb_start { |
// |
// PXE_VOID Delay(PXE_UINT64 microseconds); |
// |
// UNDI will never request a delay smaller than 10 microseconds |
// and will always request delays in increments of 10 microseconds. |
// The Delay() CallBack routine must delay between n and n + 10 |
// microseconds before returning control to the UNDI. |
// |
// This field cannot be set to zero. |
// |
PXE_UINT64 Delay; |
// |
// PXE_VOID Block(PXE_UINT32 enable); |
// |
// UNDI may need to block multi-threaded/multi-processor access to |
// critical code sections when programming or accessing the network |
// device. To this end, a blocking service is needed by the UNDI. |
// When UNDI needs a block, it will call Block() passing a non-zero |
// value. When UNDI no longer needs a block, it will call Block() |
// with a zero value. When called, if the Block() is already enabled, |
// do not return control to the UNDI until the previous Block() is |
// disabled. |
// |
// This field cannot be set to zero. |
// |
PXE_UINT64 Block; |
// |
// PXE_VOID Virt2Phys(PXE_UINT64 virtual, PXE_UINT64 physical_ptr); |
// |
// UNDI will pass the virtual address of a buffer and the virtual |
// address of a 64-bit physical buffer. Convert the virtual address |
// to a physical address and write the result to the physical address |
// buffer. If virtual and physical addresses are the same, just |
// copy the virtual address to the physical address buffer. |
// |
// This field can be set to zero if virtual and physical addresses |
// are equal. |
// |
PXE_UINT64 Virt2Phys; |
// |
// PXE_VOID Mem_IO(PXE_UINT8 read_write, PXE_UINT8 len, PXE_UINT64 port, |
// PXE_UINT64 buf_addr); |
// |
// UNDI will read or write the device io space using this call back |
// function. It passes the number of bytes as the len parameter and it |
// will be either 1,2,4 or 8. |
// |
// This field can not be set to zero. |
// |
PXE_UINT64 Mem_IO; |
} PXE_CPB_START; |
#define PXE_DELAY_MILLISECOND 1000 |
#define PXE_DELAY_SECOND 1000000 |
#define PXE_IO_READ 0 |
#define PXE_IO_WRITE 1 |
#define PXE_MEM_READ 2 |
#define PXE_MEM_WRITE 4 |
typedef struct s_pxe_db_get_init_info { |
// |
// Minimum length of locked memory buffer that must be given to |
// the Initialize command. Giving UNDI more memory will generally |
// give better performance. |
// |
// If MemoryRequired is zero, the UNDI does not need and will not |
// use system memory to receive and transmit packets. |
// |
PXE_UINT32 MemoryRequired; |
// |
// Maximum frame data length for Tx/Rx excluding the media header. |
// |
PXE_UINT32 FrameDataLen; |
// |
// Supported link speeds are in units of mega bits. Common ethernet |
// values are 10, 100 and 1000. Unused LinkSpeeds[] entries are zero |
// filled. |
// |
PXE_UINT32 LinkSpeeds[4]; |
// |
// Number of non-volatile storage items. |
// |
PXE_UINT32 NvCount; |
// |
// Width of non-volatile storage item in bytes. 0, 1, 2 or 4 |
// |
PXE_UINT16 NvWidth; |
// |
// Media header length. This is the typical media header length for |
// this UNDI. This information is needed when allocating receive |
// and transmit buffers. |
// |
PXE_UINT16 MediaHeaderLen; |
// |
// Number of bytes in the NIC hardware (MAC) address. |
// |
PXE_UINT16 HWaddrLen; |
// |
// Maximum number of multicast MAC addresses in the multicast |
// MAC address filter list. |
// |
PXE_UINT16 MCastFilterCnt; |
// |
// Default number and size of transmit and receive buffers that will |
// be allocated by the UNDI. If MemoryRequired is non-zero, this |
// allocation will come out of the memory buffer given to the Initialize |
// command. If MemoryRequired is zero, this allocation will come out of |
// memory on the NIC. |
// |
PXE_UINT16 TxBufCnt; |
PXE_UINT16 TxBufSize; |
PXE_UINT16 RxBufCnt; |
PXE_UINT16 RxBufSize; |
// |
// Hardware interface types defined in the Assigned Numbers RFC |
// and used in DHCP and ARP packets. |
// See the PXE_IFTYPE typedef and PXE_IFTYPE_xxx macros. |
// |
PXE_UINT8 IFtype; |
// |
// Supported duplex. See PXE_DUPLEX_xxxxx #defines below. |
// |
PXE_UINT8 Duplex; |
// |
// Supported loopback options. See PXE_LOOPBACK_xxxxx #defines below. |
// |
PXE_UINT8 LoopBack; |
} PXE_DB_GET_INIT_INFO; |
#define PXE_MAX_TXRX_UNIT_ETHER 1500 |
#define PXE_HWADDR_LEN_ETHER 0x0006 |
#define PXE_MAC_HEADER_LEN_ETHER 0x000E |
#define PXE_DUPLEX_ENABLE_FULL_SUPPORTED 1 |
#define PXE_DUPLEX_FORCE_FULL_SUPPORTED 2 |
#define PXE_LOOPBACK_INTERNAL_SUPPORTED 1 |
#define PXE_LOOPBACK_EXTERNAL_SUPPORTED 2 |
typedef struct s_pxe_pci_config_info { |
// |
// This is the flag field for the PXE_DB_GET_CONFIG_INFO union. |
// For PCI bus devices, this field is set to PXE_BUSTYPE_PCI. |
// |
PXE_UINT32 BusType; |
// |
// This identifies the PCI network device that this UNDI interface |
// is bound to. |
// |
PXE_UINT16 Bus; |
PXE_UINT8 Device; |
PXE_UINT8 Function; |
// |
// This is a copy of the PCI configuration space for this |
// network device. |
// |
union { |
PXE_UINT8 Byte[256]; |
PXE_UINT16 Word[128]; |
PXE_UINT32 Dword[64]; |
} Config; |
} PXE_PCI_CONFIG_INFO; |
typedef struct s_pxe_pcc_config_info { |
// |
// This is the flag field for the PXE_DB_GET_CONFIG_INFO union. |
// For PCC bus devices, this field is set to PXE_BUSTYPE_PCC. |
// |
PXE_UINT32 BusType; |
// |
// This identifies the PCC network device that this UNDI interface |
// is bound to. |
// |
PXE_UINT16 Bus; |
PXE_UINT8 Device; |
PXE_UINT8 Function; |
// |
// This is a copy of the PCC configuration space for this |
// network device. |
// |
union { |
PXE_UINT8 Byte[256]; |
PXE_UINT16 Word[128]; |
PXE_UINT32 Dword[64]; |
} Config; |
} PXE_PCC_CONFIG_INFO; |
typedef struct s_pxe_usb_config_info { |
PXE_UINT32 BusType; |
// %%TBD What should we return here... |
} PXE_USB_CONFIG_INFO; |
typedef struct s_pxe_1394_config_info { |
PXE_UINT32 BusType; |
// %%TBD What should we return here... |
} PXE_1394_CONFIG_INFO; |
typedef union u_pxe_db_get_config_info { |
PXE_PCI_CONFIG_INFO pci; |
PXE_PCC_CONFIG_INFO pcc; |
PXE_USB_CONFIG_INFO usb; |
PXE_1394_CONFIG_INFO _1394; |
} PXE_DB_GET_CONFIG_INFO; |
typedef struct s_pxe_cpb_initialize { |
// |
// Address of first (lowest) byte of the memory buffer. This buffer must |
// be in contiguous physical memory and cannot be swapped out. The UNDI |
// will be using this for transmit and receive buffering. |
// |
PXE_UINT64 MemoryAddr; |
// |
// MemoryLength must be greater than or equal to MemoryRequired |
// returned by the Get Init Info command. |
// |
PXE_UINT32 MemoryLength; |
// |
// Desired link speed in Mbit/sec. Common ethernet values are 10, 100 |
// and 1000. Setting a value of zero will auto-detect and/or use the |
// default link speed (operation depends on UNDI/NIC functionality). |
// |
PXE_UINT32 LinkSpeed; |
// |
// Suggested number and size of receive and transmit buffers to |
// allocate. If MemoryAddr and MemoryLength are non-zero, this |
// allocation comes out of the supplied memory buffer. If MemoryAddr |
// and MemoryLength are zero, this allocation comes out of memory |
// on the NIC. |
// |
// If these fields are set to zero, the UNDI will allocate buffer |
// counts and sizes as it sees fit. |
// |
PXE_UINT16 TxBufCnt; |
PXE_UINT16 TxBufSize; |
PXE_UINT16 RxBufCnt; |
PXE_UINT16 RxBufSize; |
// |
// The following configuration parameters are optional and must be zero |
// to use the default values. |
// |
PXE_UINT8 Duplex; |
PXE_UINT8 LoopBack; |
} PXE_CPB_INITIALIZE; |
#define PXE_DUPLEX_DEFAULT 0x00 |
#define PXE_FORCE_FULL_DUPLEX 0x01 |
#define PXE_ENABLE_FULL_DUPLEX 0x02 |
#define LOOPBACK_NORMAL 0 |
#define LOOPBACK_INTERNAL 1 |
#define LOOPBACK_EXTERNAL 2 |
typedef struct s_pxe_db_initialize { |
// |
// Actual amount of memory used from the supplied memory buffer. This |
// may be less that the amount of memory suppllied and may be zero if |
// the UNDI and network device do not use external memory buffers. |
// |
// Memory used by the UNDI and network device is allocated from the |
// lowest memory buffer address. |
// |
PXE_UINT32 MemoryUsed; |
// |
// Actual number and size of receive and transmit buffers that were |
// allocated. |
// |
PXE_UINT16 TxBufCnt; |
PXE_UINT16 TxBufSize; |
PXE_UINT16 RxBufCnt; |
PXE_UINT16 RxBufSize; |
} PXE_DB_INITIALIZE; |
typedef struct s_pxe_cpb_receive_filters { |
// |
// List of multicast MAC addresses. This list, if present, will |
// replace the existing multicast MAC address filter list. |
// |
PXE_MAC_ADDR MCastList[MAX_MCAST_ADDRESS_CNT]; |
} PXE_CPB_RECEIVE_FILTERS; |
typedef struct s_pxe_db_receive_filters { |
// |
// Filtered multicast MAC address list. |
// |
PXE_MAC_ADDR MCastList[MAX_MCAST_ADDRESS_CNT]; |
} PXE_DB_RECEIVE_FILTERS; |
typedef struct s_pxe_cpb_station_address { |
// |
// If supplied and supported, the current station MAC address |
// will be changed. |
// |
PXE_MAC_ADDR StationAddr; |
} PXE_CPB_STATION_ADDRESS; |
typedef struct s_pxe_dpb_station_address { |
// |
// Current station MAC address. |
// |
PXE_MAC_ADDR StationAddr; |
// |
// Station broadcast MAC address. |
// |
PXE_MAC_ADDR BroadcastAddr; |
// |
// Permanent station MAC address. |
// |
PXE_MAC_ADDR PermanentAddr; |
} PXE_DB_STATION_ADDRESS; |
typedef struct s_pxe_db_statistics { |
// |
// Bit field identifying what statistic data is collected by the |
// UNDI/NIC. |
// If bit 0x00 is set, Data[0x00] is collected. |
// If bit 0x01 is set, Data[0x01] is collected. |
// If bit 0x20 is set, Data[0x20] is collected. |
// If bit 0x21 is set, Data[0x21] is collected. |
// Etc. |
// |
PXE_UINT64 Supported; |
// |
// Statistic data. |
// |
PXE_UINT64 Data[64]; |
} PXE_DB_STATISTICS; |
// |
// Total number of frames received. Includes frames with errors and |
// dropped frames. |
// |
#define PXE_STATISTICS_RX_TOTAL_FRAMES 0x00 |
// |
// Number of valid frames received and copied into receive buffers. |
// |
#define PXE_STATISTICS_RX_GOOD_FRAMES 0x01 |
// |
// Number of frames below the minimum length for the media. |
// This would be <64 for ethernet. |
// |
#define PXE_STATISTICS_RX_UNDERSIZE_FRAMES 0x02 |
// |
// Number of frames longer than the maxminum length for the |
// media. This would be >1500 for ethernet. |
// |
#define PXE_STATISTICS_RX_OVERSIZE_FRAMES 0x03 |
// |
// Valid frames that were dropped because receive buffers were full. |
// |
#define PXE_STATISTICS_RX_DROPPED_FRAMES 0x04 |
// |
// Number of valid unicast frames received and not dropped. |
// |
#define PXE_STATISTICS_RX_UNICAST_FRAMES 0x05 |
// |
// Number of valid broadcast frames received and not dropped. |
// |
#define PXE_STATISTICS_RX_BROADCAST_FRAMES 0x06 |
// |
// Number of valid mutlicast frames received and not dropped. |
// |
#define PXE_STATISTICS_RX_MULTICAST_FRAMES 0x07 |
// |
// Number of frames w/ CRC or alignment errors. |
// |
#define PXE_STATISTICS_RX_CRC_ERROR_FRAMES 0x08 |
// |
// Total number of bytes received. Includes frames with errors |
// and dropped frames. |
// |
#define PXE_STATISTICS_RX_TOTAL_BYTES 0x09 |
// |
// Transmit statistics. |
// |
#define PXE_STATISTICS_TX_TOTAL_FRAMES 0x0A |
#define PXE_STATISTICS_TX_GOOD_FRAMES 0x0B |
#define PXE_STATISTICS_TX_UNDERSIZE_FRAMES 0x0C |
#define PXE_STATISTICS_TX_OVERSIZE_FRAMES 0x0D |
#define PXE_STATISTICS_TX_DROPPED_FRAMES 0x0E |
#define PXE_STATISTICS_TX_UNICAST_FRAMES 0x0F |
#define PXE_STATISTICS_TX_BROADCAST_FRAMES 0x10 |
#define PXE_STATISTICS_TX_MULTICAST_FRAMES 0x11 |
#define PXE_STATISTICS_TX_CRC_ERROR_FRAMES 0x12 |
#define PXE_STATISTICS_TX_TOTAL_BYTES 0x13 |
// |
// Number of collisions detection on this subnet. |
// |
#define PXE_STATISTICS_COLLISIONS 0x14 |
// |
// Number of frames destined for unsupported protocol. |
// |
#define PXE_STATISTICS_UNSUPPORTED_PROTOCOL 0x15 |
typedef struct s_pxe_cpb_mcast_ip_to_mac { |
// |
// Multicast IP address to be converted to multicast MAC address. |
// |
PXE_IP_ADDR IP; |
} PXE_CPB_MCAST_IP_TO_MAC; |
typedef struct s_pxe_db_mcast_ip_to_mac { |
// |
// Multicast MAC address. |
// |
PXE_MAC_ADDR MAC; |
} PXE_DB_MCAST_IP_TO_MAC; |
typedef struct s_pxe_cpb_nvdata_sparse { |
// |
// NvData item list. Only items in this list will be updated. |
// |
struct { |
// Non-volatile storage address to be changed. |
PXE_UINT32 Addr; |
// Data item to write into above storage address. |
union { |
PXE_UINT8 Byte; |
PXE_UINT16 Word; |
PXE_UINT32 Dword; |
} Data; |
} Item[MAX_EEPROM_LEN]; |
} PXE_CPB_NVDATA_SPARSE; |
// |
// When using bulk update, the size of the CPB structure must be |
// the same size as the non-volatile NIC storage. |
// |
typedef union u_pxe_cpb_nvdata_bulk { |
// |
// Array of byte-wide data items. |
// |
PXE_UINT8 Byte[MAX_EEPROM_LEN << 2]; |
// |
// Array of word-wide data items. |
// |
PXE_UINT16 Word[MAX_EEPROM_LEN << 1]; |
// |
// Array of dword-wide data items. |
// |
PXE_UINT32 Dword[MAX_EEPROM_LEN]; |
} PXE_CPB_NVDATA_BULK; |
typedef struct s_pxe_db_nvdata { |
// Arrays of data items from non-volatile storage. |
union { |
// |
// Array of byte-wide data items. |
// |
PXE_UINT8 Byte[MAX_EEPROM_LEN << 2]; |
// |
// Array of word-wide data items. |
// |
PXE_UINT16 Word[MAX_EEPROM_LEN << 1]; |
// Array of dword-wide data items. |
PXE_UINT32 Dword[MAX_EEPROM_LEN]; |
} Data; |
} PXE_DB_NVDATA; |
typedef struct s_pxe_db_get_status { |
// |
// Length of next receive frame (header + data). If this is zero, |
// there is no next receive frame available. |
// |
PXE_UINT32 RxFrameLen; |
// |
// Reserved, set to zero. |
// |
PXE_UINT32 reserved; |
// |
// Addresses of transmitted buffers that need to be recycled. |
// |
PXE_UINT64 TxBuffer[MAX_XMIT_BUFFERS]; |
} PXE_DB_GET_STATUS; |
typedef struct s_pxe_cpb_fill_header { |
// |
// Source and destination MAC addresses. These will be copied into |
// the media header without doing byte swapping. |
// |
PXE_MAC_ADDR SrcAddr; |
PXE_MAC_ADDR DestAddr; |
// |
// Address of first byte of media header. The first byte of packet data |
// follows the last byte of the media header. |
// |
PXE_UINT64 MediaHeader; |
// |
// Length of packet data in bytes (not including the media header). |
// |
PXE_UINT32 PacketLen; |
// |
// Protocol type. This will be copied into the media header without |
// doing byte swapping. Protocol type numbers can be obtained from |
// the Assigned Numbers RFC 1700. |
// |
PXE_UINT16 Protocol; |
// |
// Length of the media header in bytes. |
// |
PXE_UINT16 MediaHeaderLen; |
} PXE_CPB_FILL_HEADER; |
#define PXE_PROTOCOL_ETHERNET_IP 0x0800 |
#define PXE_PROTOCOL_ETHERNET_ARP 0x0806 |
#define MAX_XMIT_FRAGMENTS 16 |
typedef struct s_pxe_cpb_fill_header_fragmented { |
// |
// Source and destination MAC addresses. These will be copied into |
// the media header without doing byte swapping. |
// |
PXE_MAC_ADDR SrcAddr; |
PXE_MAC_ADDR DestAddr; |
// |
// Length of packet data in bytes (not including the media header). |
// |
PXE_UINT32 PacketLen; |
// |
// Protocol type. This will be copied into the media header without |
// doing byte swapping. Protocol type numbers can be obtained from |
// the Assigned Numbers RFC 1700. |
// |
PXE_MEDIA_PROTOCOL Protocol; |
// |
// Length of the media header in bytes. |
// |
PXE_UINT16 MediaHeaderLen; |
// |
// Number of packet fragment descriptors. |
// |
PXE_UINT16 FragCnt; |
// |
// Reserved, must be set to zero. |
// |
PXE_UINT16 reserved; |
// |
// Array of packet fragment descriptors. The first byte of the media |
// header is the first byte of the first fragment. |
// |
struct { |
// |
// Address of this packet fragment. |
// |
PXE_UINT64 FragAddr; |
// |
// Length of this packet fragment. |
// |
PXE_UINT32 FragLen; |
// |
// Reserved, must be set to zero. |
// |
PXE_UINT32 reserved; |
} FragDesc[MAX_XMIT_FRAGMENTS]; |
} PXE_CPB_FILL_HEADER_FRAGMENTED; |
typedef struct s_pxe_cpb_transmit { |
// |
// Address of first byte of frame buffer. This is also the first byte |
// of the media header. |
// |
PXE_UINT64 FrameAddr; |
// |
// Length of the data portion of the frame buffer in bytes. Do not |
// include the length of the media header. |
// |
PXE_UINT32 DataLen; |
// |
// Length of the media header in bytes. |
// |
PXE_UINT16 MediaheaderLen; |
// |
// Reserved, must be zero. |
// |
PXE_UINT16 reserved; |
} PXE_CPB_TRANSMIT; |
typedef struct s_pxe_cpb_transmit_fragments { |
// |
// Length of packet data in bytes (not including the media header). |
// |
PXE_UINT32 FrameLen; |
// |
// Length of the media header in bytes. |
// |
PXE_UINT16 MediaheaderLen; |
// |
// Number of packet fragment descriptors. |
// |
PXE_UINT16 FragCnt; |
// |
// Array of frame fragment descriptors. The first byte of the first |
// fragment is also the first byte of the media header. |
// |
struct { |
// |
// Address of this frame fragment. |
// |
PXE_UINT64 FragAddr; |
// |
// Length of this frame fragment. |
// |
PXE_UINT32 FragLen; |
// |
// Reserved, must be set to zero. |
// |
PXE_UINT32 reserved; |
} FragDesc[MAX_XMIT_FRAGMENTS]; |
} PXE_CPB_TRANSMIT_FRAGMENTS; |
typedef struct s_pxe_cpb_receive { |
// |
// Address of first byte of receive buffer. This is also the first byte |
// of the frame header. |
// |
PXE_UINT64 BufferAddr; |
// |
// Length of receive buffer. This must be large enough to hold the |
// received frame (media header + data). If the length of smaller than |
// the received frame, data will be lost. |
// |
PXE_UINT32 BufferLen; |
// |
// Reserved, must be set to zero. |
// |
PXE_UINT32 reserved; |
} PXE_CPB_RECEIVE; |
typedef struct s_pxe_db_receive { |
// |
// Source and destination MAC addresses from media header. |
// |
PXE_MAC_ADDR SrcAddr; |
PXE_MAC_ADDR DestAddr; |
// |
// Length of received frame. May be larger than receive buffer size. |
// The receive buffer will not be overwritten. This is how to tell |
// if data was lost because the receive buffer was too small. |
// |
PXE_UINT32 FrameLen; |
// |
// Protocol type from media header. |
// |
PXE_MEDIA_PROTOCOL Protocol; |
// |
// Length of media header in received frame. |
// |
PXE_UINT16 MediaHeaderLen; |
// |
// Type of receive frame. |
// |
PXE_FRAME_TYPE Type; |
// |
// Reserved, must be zero. |
// |
PXE_UINT8 reserved[7]; |
} PXE_DB_RECEIVE; |
#pragma pack() |
/* EOF - efi_pxe.h */ |
#endif /* _EFI_PXE_H */ |
/tags/0.3.0/boot/arch/ia64/loader/gefi/inc/pci22.h |
---|
0,0 → 1,193 |
#ifndef _PCI22_H |
#define _PCI22_H |
/*++ |
Copyright (c) 1999 Intel Corporation |
Module Name: |
pci22.h |
Abstract: |
Support for PCI 2.2 standard. |
Revision History |
--*/ |
#ifdef SOFT_SDV |
#define PCI_MAX_BUS 1 |
#else |
#define PCI_MAX_BUS 255 |
#endif |
#define PCI_MAX_DEVICE 31 |
#define PCI_MAX_FUNC 7 |
// |
// Command |
// |
#define PCI_VGA_PALETTE_SNOOP_DISABLED 0x20 |
#pragma pack(1) |
typedef struct { |
UINT16 VendorId; |
UINT16 DeviceId; |
UINT16 Command; |
UINT16 Status; |
UINT8 RevisionID; |
UINT8 ClassCode[3]; |
UINT8 CacheLineSize; |
UINT8 LaytencyTimer; |
UINT8 HeaderType; |
UINT8 BIST; |
} PCI_DEVICE_INDEPENDENT_REGION; |
typedef struct { |
UINT32 Bar[6]; |
UINT32 CISPtr; |
UINT16 SubsystemVendorID; |
UINT16 SubsystemID; |
UINT32 ExpansionRomBar; |
UINT32 Reserved[2]; |
UINT8 InterruptLine; |
UINT8 InterruptPin; |
UINT8 MinGnt; |
UINT8 MaxLat; |
} PCI_DEVICE_HEADER_TYPE_REGION; |
typedef struct { |
PCI_DEVICE_INDEPENDENT_REGION Hdr; |
PCI_DEVICE_HEADER_TYPE_REGION Device; |
} PCI_TYPE00; |
typedef struct { |
UINT32 Bar[2]; |
UINT8 PrimaryBus; |
UINT8 SecondaryBus; |
UINT8 SubordinateBus; |
UINT8 SecondaryLatencyTimer; |
UINT8 IoBase; |
UINT8 IoLimit; |
UINT16 SecondaryStatus; |
UINT16 MemoryBase; |
UINT16 MemoryLimit; |
UINT16 PrefetchableMemoryBase; |
UINT16 PrefetchableMemoryLimit; |
UINT32 PrefetchableBaseUpper32; |
UINT32 PrefetchableLimitUpper32; |
UINT16 IoBaseUpper16; |
UINT16 IoLimitUpper16; |
UINT32 Reserved; |
UINT32 ExpansionRomBAR; |
UINT8 InterruptLine; |
UINT8 InterruptPin; |
UINT16 BridgeControl; |
} PCI_BRIDGE_CONTROL_REGISTER; |
#define PCI_CLASS_DISPLAY_CTRL 0x03 |
#define PCI_CLASS_VGA 0x00 |
#define PCI_CLASS_BRIDGE 0x06 |
#define PCI_CLASS_ISA 0x01 |
#define PCI_CLASS_ISA_POSITIVE_DECODE 0x80 |
#define PCI_CLASS_NETWORK 0x02 |
#define PCI_CLASS_ETHERNET 0x00 |
#define HEADER_TYPE_DEVICE 0x00 |
#define HEADER_TYPE_PCI_TO_PCI_BRIDGE 0x01 |
#define HEADER_TYPE_MULTI_FUNCTION 0x80 |
#define HEADER_LAYOUT_CODE 0x7f |
#define IS_PCI_BRIDGE(_p) ((((_p)->Hdr.HeaderType) & HEADER_LAYOUT_CODE) == HEADER_TYPE_PCI_TO_PCI_BRIDGE) |
#define IS_PCI_MULTI_FUNC(_p) (((_p)->Hdr.HeaderType) & HEADER_TYPE_MULTI_FUNCTION) |
typedef struct { |
PCI_DEVICE_INDEPENDENT_REGION Hdr; |
PCI_BRIDGE_CONTROL_REGISTER Bridge; |
} PCI_TYPE01; |
typedef struct { |
UINT8 Register; |
UINT8 Function; |
UINT8 Device; |
UINT8 Bus; |
UINT8 Reserved[4]; |
} DEFIO_PCI_ADDR; |
typedef struct { |
UINT32 Reg : 8; |
UINT32 Func : 3; |
UINT32 Dev : 5; |
UINT32 Bus : 8; |
UINT32 Reserved: 7; |
UINT32 Enable : 1; |
} PCI_CONFIG_ACCESS_CF8; |
#pragma pack() |
#define EFI_ROOT_BRIDGE_LIST 'eprb' |
typedef struct { |
UINTN Signature; |
UINT16 BridgeNumber; |
UINT16 PrimaryBus; |
UINT16 SubordinateBus; |
EFI_DEVICE_PATH *DevicePath; |
LIST_ENTRY Link; |
} PCI_ROOT_BRIDGE_ENTRY; |
#define PCI_EXPANSION_ROM_HEADER_SIGNATURE 0xaa55 |
#define EFI_PCI_EXPANSION_ROM_HEADER_EFISIGNATURE 0x0EF1 |
#define PCI_DATA_STRUCTURE_SIGNATURE EFI_SIGNATURE_32('P','C','I','R') |
#pragma pack(1) |
typedef struct { |
UINT16 Signature; // 0xaa55 |
UINT8 Reserved[0x16]; |
UINT16 PcirOffset; |
} PCI_EXPANSION_ROM_HEADER; |
typedef struct { |
UINT16 Signature; // 0xaa55 |
UINT16 InitializationSize; |
UINT16 EfiSignature; // 0x0EF1 |
UINT16 EfiSubsystem; |
UINT16 EfiMachineType; |
UINT8 Reserved[0x0A]; |
UINT16 EfiImageHeaderOffset; |
UINT16 PcirOffset; |
} EFI_PCI_EXPANSION_ROM_HEADER; |
typedef struct { |
UINT32 Signature; // "PCIR" |
UINT16 VendorId; |
UINT16 DeviceId; |
UINT16 Reserved0; |
UINT16 Length; |
UINT8 Revision; |
UINT8 ClassCode[3]; |
UINT16 ImageLength; |
UINT16 CodeRevision; |
UINT8 CodeType; |
UINT8 Indicator; |
UINT16 Reserved1; |
} PCI_DATA_STRUCTURE; |
#pragma pack() |
#endif |
/tags/0.3.0/boot/arch/ia64/loader/gefi/inc/efilink.h |
---|
0,0 → 1,177 |
#ifndef _EFI_LINK_H |
#define _EFI_LINK_H |
/*++ |
Copyright (c) 1998 Intel Corporation |
Module Name: |
link.h (renamed efilink.h to avoid conflicts) |
Abstract: |
EFI link list macro's |
Revision History |
--*/ |
#ifndef EFI_NT_EMUL |
// |
// List entry - doubly linked list |
// |
typedef struct _LIST_ENTRY { |
struct _LIST_ENTRY *Flink; |
struct _LIST_ENTRY *Blink; |
} LIST_ENTRY; |
#endif |
// |
// VOID |
// InitializeListHead( |
// LIST_ENTRY *ListHead |
// ); |
// |
#define InitializeListHead(ListHead) \ |
(ListHead)->Flink = ListHead; \ |
(ListHead)->Blink = ListHead; |
// |
// BOOLEAN |
// IsListEmpty( |
// PLIST_ENTRY ListHead |
// ); |
// |
#define IsListEmpty(ListHead) \ |
((ListHead)->Flink == (ListHead)) |
// |
// VOID |
// RemoveEntryList( |
// PLIST_ENTRY Entry |
// ); |
// |
#define _RemoveEntryList(Entry) { \ |
LIST_ENTRY *_Blink, *_Flink; \ |
_Flink = (Entry)->Flink; \ |
_Blink = (Entry)->Blink; \ |
_Blink->Flink = _Flink; \ |
_Flink->Blink = _Blink; \ |
} |
#if EFI_DEBUG |
#define RemoveEntryList(Entry) \ |
_RemoveEntryList(Entry); \ |
(Entry)->Flink = (LIST_ENTRY *) BAD_POINTER; \ |
(Entry)->Blink = (LIST_ENTRY *) BAD_POINTER; |
#else |
#define RemoveEntryList(Entry) \ |
_RemoveEntryList(Entry); |
#endif |
// |
// VOID |
// InsertTailList( |
// PLIST_ENTRY ListHead, |
// PLIST_ENTRY Entry |
// ); |
// |
#define InsertTailList(ListHead,Entry) {\ |
LIST_ENTRY *_ListHead, *_Blink; \ |
_ListHead = (ListHead); \ |
_Blink = _ListHead->Blink; \ |
(Entry)->Flink = _ListHead; \ |
(Entry)->Blink = _Blink; \ |
_Blink->Flink = (Entry); \ |
_ListHead->Blink = (Entry); \ |
} |
// |
// VOID |
// InsertHeadList( |
// PLIST_ENTRY ListHead, |
// PLIST_ENTRY Entry |
// ); |
// |
#define InsertHeadList(ListHead,Entry) {\ |
LIST_ENTRY *_ListHead, *_Flink; \ |
_ListHead = (ListHead); \ |
_Flink = _ListHead->Flink; \ |
(Entry)->Flink = _Flink; \ |
(Entry)->Blink = _ListHead; \ |
_Flink->Blink = (Entry); \ |
_ListHead->Flink = (Entry); \ |
} |
// VOID |
// SwapListEntries( |
// PLIST_ENTRY Entry1, |
// PLIST_ENTRY Entry2 |
// ); |
// |
// Put Entry2 before Entry1 |
// |
#define SwapListEntries(Entry1,Entry2) {\ |
LIST_ENTRY *Entry1Flink, *Entry1Blink; \ |
LIST_ENTRY *Entry2Flink, *Entry2Blink; \ |
Entry2Flink = (Entry2)->Flink; \ |
Entry2Blink = (Entry2)->Blink; \ |
Entry1Flink = (Entry1)->Flink; \ |
Entry1Blink = (Entry1)->Blink; \ |
Entry2Blink->Flink = Entry2Flink; \ |
Entry2Flink->Blink = Entry2Blink; \ |
(Entry2)->Flink = Entry1; \ |
(Entry2)->Blink = Entry1Blink; \ |
Entry1Blink->Flink = (Entry2); \ |
(Entry1)->Blink = (Entry2); \ |
} |
// |
// EFI_FIELD_OFFSET - returns the byte offset to a field within a structure |
// |
#define EFI_FIELD_OFFSET(TYPE,Field) ((UINTN)(&(((TYPE *) 0)->Field))) |
// |
// CONTAINING_RECORD - returns a pointer to the structure |
// from one of it's elements. |
// |
#define _CR(Record, TYPE, Field) \ |
((TYPE *) ( (CHAR8 *)(Record) - (CHAR8 *) &(((TYPE *) 0)->Field))) |
#if EFI_DEBUG |
#define CR(Record, TYPE, Field, Sig) \ |
_CR(Record, TYPE, Field)->Signature != Sig ? \ |
(TYPE *) ASSERT_STRUCT(_CR(Record, TYPE, Field), Record) : \ |
_CR(Record, TYPE, Field) |
#else |
#define CR(Record, TYPE, Field, Signature) \ |
_CR(Record, TYPE, Field) |
#endif |
// |
// A lock structure |
// |
typedef struct _FLOCK { |
EFI_TPL Tpl; |
EFI_TPL OwnerTpl; |
UINTN Lock; |
} FLOCK; |
#endif |
/tags/0.3.0/boot/arch/ia64/loader/gefi/inc/efidevp.h |
---|
0,0 → 1,393 |
#ifndef _DEVPATH_H |
#define _DEVPATH_H |
/*++ |
Copyright (c) 1998 Intel Corporation |
Module Name: |
devpath.h |
Abstract: |
Defines for parsing the EFI Device Path structures |
Revision History |
--*/ |
// |
// Device Path structures - Section C |
// |
typedef struct _EFI_DEVICE_PATH { |
UINT8 Type; |
UINT8 SubType; |
UINT8 Length[2]; |
} EFI_DEVICE_PATH; |
#define EFI_DP_TYPE_MASK 0x7F |
#define EFI_DP_TYPE_UNPACKED 0x80 |
//#define END_DEVICE_PATH_TYPE 0xff |
#define END_DEVICE_PATH_TYPE 0x7f |
//#define END_DEVICE_PATH_TYPE_UNPACKED 0x7f |
#define END_ENTIRE_DEVICE_PATH_SUBTYPE 0xff |
#define END_INSTANCE_DEVICE_PATH_SUBTYPE 0x01 |
#define END_DEVICE_PATH_LENGTH (sizeof(EFI_DEVICE_PATH)) |
#define DP_IS_END_TYPE(a) |
#define DP_IS_END_SUBTYPE(a) ( ((a)->SubType == END_ENTIRE_DEVICE_PATH_SUBTYPE ) |
#define DevicePathType(a) ( ((a)->Type) & EFI_DP_TYPE_MASK ) |
#define DevicePathSubType(a) ( (a)->SubType ) |
#define DevicePathNodeLength(a) ( ((a)->Length[0]) | ((a)->Length[1] << 8) ) |
#define NextDevicePathNode(a) ( (EFI_DEVICE_PATH *) ( ((UINT8 *) (a)) + DevicePathNodeLength(a))) |
//#define IsDevicePathEndType(a) ( DevicePathType(a) == END_DEVICE_PATH_TYPE_UNPACKED ) |
#define IsDevicePathEndType(a) ( DevicePathType(a) == END_DEVICE_PATH_TYPE ) |
#define IsDevicePathEndSubType(a) ( (a)->SubType == END_ENTIRE_DEVICE_PATH_SUBTYPE ) |
#define IsDevicePathEnd(a) ( IsDevicePathEndType(a) && IsDevicePathEndSubType(a) ) |
#define IsDevicePathUnpacked(a) ( (a)->Type & EFI_DP_TYPE_UNPACKED ) |
#define SetDevicePathNodeLength(a,l) { \ |
(a)->Length[0] = (UINT8) (l); \ |
(a)->Length[1] = (UINT8) ((l) >> 8); \ |
} |
#define SetDevicePathEndNode(a) { \ |
(a)->Type = END_DEVICE_PATH_TYPE; \ |
(a)->SubType = END_ENTIRE_DEVICE_PATH_SUBTYPE; \ |
(a)->Length[0] = sizeof(EFI_DEVICE_PATH); \ |
(a)->Length[1] = 0; \ |
} |
/* |
* |
*/ |
#define HARDWARE_DEVICE_PATH 0x01 |
#define HW_PCI_DP 0x01 |
typedef struct _PCI_DEVICE_PATH { |
EFI_DEVICE_PATH Header; |
UINT8 Function; |
UINT8 Device; |
} PCI_DEVICE_PATH; |
#define HW_PCCARD_DP 0x02 |
typedef struct _PCCARD_DEVICE_PATH { |
EFI_DEVICE_PATH Header; |
UINT8 SocketNumber; |
} PCCARD_DEVICE_PATH; |
#define HW_MEMMAP_DP 0x03 |
typedef struct _MEMMAP_DEVICE_PATH { |
EFI_DEVICE_PATH Header; |
UINT32 MemoryType; |
EFI_PHYSICAL_ADDRESS StartingAddress; |
EFI_PHYSICAL_ADDRESS EndingAddress; |
} MEMMAP_DEVICE_PATH; |
#define HW_VENDOR_DP 0x04 |
typedef struct _VENDOR_DEVICE_PATH { |
EFI_DEVICE_PATH Header; |
EFI_GUID Guid; |
} VENDOR_DEVICE_PATH; |
#define UNKNOWN_DEVICE_GUID \ |
{ 0xcf31fac5, 0xc24e, 0x11d2, {0x85, 0xf3, 0x0, 0xa0, 0xc9, 0x3e, 0xc9, 0x3b} } |
typedef struct _UKNOWN_DEVICE_VENDOR_DP { |
VENDOR_DEVICE_PATH DevicePath; |
UINT8 LegacyDriveLetter; |
} UNKNOWN_DEVICE_VENDOR_DEVICE_PATH; |
#define HW_CONTROLLER_DP 0x05 |
typedef struct _CONTROLLER_DEVICE_PATH { |
EFI_DEVICE_PATH Header; |
UINT32 Controller; |
} CONTROLLER_DEVICE_PATH; |
/* |
* |
*/ |
#define ACPI_DEVICE_PATH 0x02 |
#define ACPI_DP 0x01 |
typedef struct _ACPI_HID_DEVICE_PATH { |
EFI_DEVICE_PATH Header; |
UINT32 HID; |
UINT32 UID; |
} ACPI_HID_DEVICE_PATH; |
// |
// EISA ID Macro |
// EISA ID Definition 32-bits |
// bits[15:0] - three character compressed ASCII EISA ID. |
// bits[31:16] - binary number |
// Compressed ASCII is 5 bits per character 0b00001 = 'A' 0b11010 = 'Z' |
// |
#define PNP_EISA_ID_CONST 0x41d0 |
#define EISA_ID(_Name, _Num) ((UINT32) ((_Name) | (_Num) << 16)) |
#define EISA_PNP_ID(_PNPId) (EISA_ID(PNP_EISA_ID_CONST, (_PNPId))) |
#define PNP_EISA_ID_MASK 0xffff |
#define EISA_ID_TO_NUM(_Id) ((_Id) >> 16) |
/* |
* |
*/ |
#define MESSAGING_DEVICE_PATH 0x03 |
#define MSG_ATAPI_DP 0x01 |
typedef struct _ATAPI_DEVICE_PATH { |
EFI_DEVICE_PATH Header; |
UINT8 PrimarySecondary; |
UINT8 SlaveMaster; |
UINT16 Lun; |
} ATAPI_DEVICE_PATH; |
#define MSG_SCSI_DP 0x02 |
typedef struct _SCSI_DEVICE_PATH { |
EFI_DEVICE_PATH Header; |
UINT16 Pun; |
UINT16 Lun; |
} SCSI_DEVICE_PATH; |
#define MSG_FIBRECHANNEL_DP 0x03 |
typedef struct _FIBRECHANNEL_DEVICE_PATH { |
EFI_DEVICE_PATH Header; |
UINT32 Reserved; |
UINT64 WWN; |
UINT64 Lun; |
} FIBRECHANNEL_DEVICE_PATH; |
#define MSG_1394_DP 0x04 |
typedef struct _F1394_DEVICE_PATH { |
EFI_DEVICE_PATH Header; |
UINT32 Reserved; |
UINT64 Guid; |
} F1394_DEVICE_PATH; |
#define MSG_USB_DP 0x05 |
typedef struct _USB_DEVICE_PATH { |
EFI_DEVICE_PATH Header; |
UINT8 Port; |
UINT8 Endpoint; |
} USB_DEVICE_PATH; |
#define MSG_USB_CLASS_DP 0x0F |
typedef struct _USB_CLASS_DEVICE_PATH { |
EFI_DEVICE_PATH Header; |
UINT16 VendorId; |
UINT16 ProductId; |
UINT8 DeviceClass; |
UINT8 DeviceSubclass; |
UINT8 DeviceProtocol; |
} USB_CLASS_DEVICE_PATH; |
#define MSG_I2O_DP 0x06 |
typedef struct _I2O_DEVICE_PATH { |
EFI_DEVICE_PATH Header; |
UINT32 Tid; |
} I2O_DEVICE_PATH; |
#define MSG_MAC_ADDR_DP 0x0b |
typedef struct _MAC_ADDR_DEVICE_PATH { |
EFI_DEVICE_PATH Header; |
EFI_MAC_ADDRESS MacAddress; |
UINT8 IfType; |
} MAC_ADDR_DEVICE_PATH; |
#define MSG_IPv4_DP 0x0c |
typedef struct _IPv4_DEVICE_PATH { |
EFI_DEVICE_PATH Header; |
EFI_IPv4_ADDRESS LocalIpAddress; |
EFI_IPv4_ADDRESS RemoteIpAddress; |
UINT16 LocalPort; |
UINT16 RemotePort; |
UINT16 Protocol; |
BOOLEAN StaticIpAddress; |
} IPv4_DEVICE_PATH; |
#define MSG_IPv6_DP 0x0d |
typedef struct _IPv6_DEVICE_PATH { |
EFI_DEVICE_PATH Header; |
EFI_IPv6_ADDRESS LocalIpAddress; |
EFI_IPv6_ADDRESS RemoteIpAddress; |
UINT16 LocalPort; |
UINT16 RemotePort; |
UINT16 Protocol; |
BOOLEAN StaticIpAddress; |
} IPv6_DEVICE_PATH; |
#define MSG_INFINIBAND_DP 0x09 |
typedef struct _INFINIBAND_DEVICE_PATH { |
EFI_DEVICE_PATH Header; |
UINT32 Reserved; |
UINT64 NodeGuid; |
UINT64 IocGuid; |
UINT64 DeviceId; |
} INFINIBAND_DEVICE_PATH; |
#define MSG_UART_DP 0x0e |
typedef struct _UART_DEVICE_PATH { |
EFI_DEVICE_PATH Header; |
UINT32 Reserved; |
UINT64 BaudRate; |
UINT8 DataBits; |
UINT8 Parity; |
UINT8 StopBits; |
} UART_DEVICE_PATH; |
#define MSG_VENDOR_DP 0x0A |
/* Use VENDOR_DEVICE_PATH struct */ |
#define DEVICE_PATH_MESSAGING_PC_ANSI \ |
{ 0xe0c14753, 0xf9be, 0x11d2, {0x9a, 0x0c, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d} } |
#define DEVICE_PATH_MESSAGING_VT_100 \ |
{ 0xdfa66065, 0xb419, 0x11d3, {0x9a, 0x2d, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d} } |
#define MEDIA_DEVICE_PATH 0x04 |
#define MEDIA_HARDDRIVE_DP 0x01 |
typedef struct _HARDDRIVE_DEVICE_PATH { |
EFI_DEVICE_PATH Header; |
UINT32 PartitionNumber; |
UINT64 PartitionStart; |
UINT64 PartitionSize; |
UINT8 Signature[16]; |
UINT8 MBRType; |
UINT8 SignatureType; |
} HARDDRIVE_DEVICE_PATH; |
#define MBR_TYPE_PCAT 0x01 |
#define MBR_TYPE_EFI_PARTITION_TABLE_HEADER 0x02 |
#define SIGNATURE_TYPE_MBR 0x01 |
#define SIGNATURE_TYPE_GUID 0x02 |
#define MEDIA_CDROM_DP 0x02 |
typedef struct _CDROM_DEVICE_PATH { |
EFI_DEVICE_PATH Header; |
UINT32 BootEntry; |
UINT64 PartitionStart; |
UINT64 PartitionSize; |
} CDROM_DEVICE_PATH; |
#define MEDIA_VENDOR_DP 0x03 |
/* Use VENDOR_DEVICE_PATH struct */ |
#define MEDIA_FILEPATH_DP 0x04 |
typedef struct _FILEPATH_DEVICE_PATH { |
EFI_DEVICE_PATH Header; |
CHAR16 PathName[1]; |
} FILEPATH_DEVICE_PATH; |
#define SIZE_OF_FILEPATH_DEVICE_PATH EFI_FIELD_OFFSET(FILEPATH_DEVICE_PATH,PathName) |
#define MEDIA_PROTOCOL_DP 0x05 |
typedef struct _MEDIA_PROTOCOL_DEVICE_PATH { |
EFI_DEVICE_PATH Header; |
EFI_GUID Protocol; |
} MEDIA_PROTOCOL_DEVICE_PATH; |
#define BBS_DEVICE_PATH 0x05 |
#define BBS_BBS_DP 0x01 |
typedef struct _BBS_BBS_DEVICE_PATH { |
EFI_DEVICE_PATH Header; |
UINT16 DeviceType; |
UINT16 StatusFlag; |
CHAR8 String[1]; |
} BBS_BBS_DEVICE_PATH; |
/* DeviceType definitions - from BBS specification */ |
#define BBS_TYPE_FLOPPY 0x01 |
#define BBS_TYPE_HARDDRIVE 0x02 |
#define BBS_TYPE_CDROM 0x03 |
#define BBS_TYPE_PCMCIA 0x04 |
#define BBS_TYPE_USB 0x05 |
#define BBS_TYPE_EMBEDDED_NETWORK 0x06 |
#define BBS_TYPE_DEV 0x80 |
#define BBS_TYPE_UNKNOWN 0xFF |
typedef union { |
EFI_DEVICE_PATH DevPath; |
PCI_DEVICE_PATH Pci; |
PCCARD_DEVICE_PATH PcCard; |
MEMMAP_DEVICE_PATH MemMap; |
VENDOR_DEVICE_PATH Vendor; |
UNKNOWN_DEVICE_VENDOR_DEVICE_PATH UnknownVendor; |
CONTROLLER_DEVICE_PATH Controller; |
ACPI_HID_DEVICE_PATH Acpi; |
ATAPI_DEVICE_PATH Atapi; |
SCSI_DEVICE_PATH Scsi; |
FIBRECHANNEL_DEVICE_PATH FibreChannel; |
F1394_DEVICE_PATH F1394; |
USB_DEVICE_PATH Usb; |
USB_CLASS_DEVICE_PATH UsbClass; |
I2O_DEVICE_PATH I2O; |
MAC_ADDR_DEVICE_PATH MacAddr; |
IPv4_DEVICE_PATH Ipv4; |
IPv6_DEVICE_PATH Ipv6; |
INFINIBAND_DEVICE_PATH InfiniBand; |
UART_DEVICE_PATH Uart; |
HARDDRIVE_DEVICE_PATH HardDrive; |
CDROM_DEVICE_PATH CD; |
FILEPATH_DEVICE_PATH FilePath; |
MEDIA_PROTOCOL_DEVICE_PATH MediaProtocol; |
BBS_BBS_DEVICE_PATH Bbs; |
} EFI_DEV_PATH; |
typedef union { |
EFI_DEVICE_PATH *DevPath; |
PCI_DEVICE_PATH *Pci; |
PCCARD_DEVICE_PATH *PcCard; |
MEMMAP_DEVICE_PATH *MemMap; |
VENDOR_DEVICE_PATH *Vendor; |
UNKNOWN_DEVICE_VENDOR_DEVICE_PATH *UnknownVendor; |
CONTROLLER_DEVICE_PATH *Controller; |
ACPI_HID_DEVICE_PATH *Acpi; |
ATAPI_DEVICE_PATH *Atapi; |
SCSI_DEVICE_PATH *Scsi; |
FIBRECHANNEL_DEVICE_PATH *FibreChannel; |
F1394_DEVICE_PATH *F1394; |
USB_DEVICE_PATH *Usb; |
USB_CLASS_DEVICE_PATH *UsbClass; |
I2O_DEVICE_PATH *I2O; |
MAC_ADDR_DEVICE_PATH *MacAddr; |
IPv4_DEVICE_PATH *Ipv4; |
IPv6_DEVICE_PATH *Ipv6; |
INFINIBAND_DEVICE_PATH *InfiniBand; |
UART_DEVICE_PATH *Uart; |
HARDDRIVE_DEVICE_PATH *HardDrive; |
FILEPATH_DEVICE_PATH *FilePath; |
MEDIA_PROTOCOL_DEVICE_PATH *MediaProtocol; |
CDROM_DEVICE_PATH *CD; |
BBS_BBS_DEVICE_PATH *Bbs; |
} EFI_DEV_PATH_PTR; |
#endif |
/tags/0.3.0/boot/arch/ia64/loader/gefi/inc/efidef.h |
---|
0,0 → 1,195 |
#ifndef _EFI_DEF_H |
#define _EFI_DEF_H |
/*++ |
Copyright (c) 1998 Intel Corporation |
Module Name: |
efidef.h |
Abstract: |
EFI definitions |
Revision History |
--*/ |
typedef UINT16 CHAR16; |
typedef UINT8 CHAR8; |
typedef UINT8 BOOLEAN; |
#ifndef TRUE |
#define TRUE ((BOOLEAN) 1) |
#define FALSE ((BOOLEAN) 0) |
#endif |
#ifndef NULL |
#define NULL ((VOID *) 0) |
#endif |
typedef UINTN EFI_STATUS; |
typedef UINT64 EFI_LBA; |
typedef UINTN EFI_TPL; |
typedef VOID *EFI_HANDLE; |
typedef VOID *EFI_EVENT; |
// |
// Prototype argument decoration for EFI parameters to indicate |
// their direction |
// |
// IN - argument is passed into the function |
// OUT - argument (pointer) is returned from the function |
// OPTIONAL - argument is optional |
// |
#ifndef IN |
#define IN |
#define OUT |
#define OPTIONAL |
#endif |
// |
// A GUID |
// |
typedef struct { |
UINT32 Data1; |
UINT16 Data2; |
UINT16 Data3; |
UINT8 Data4[8]; |
} EFI_GUID; |
// |
// Time |
// |
typedef struct { |
UINT16 Year; // 1998 - 20XX |
UINT8 Month; // 1 - 12 |
UINT8 Day; // 1 - 31 |
UINT8 Hour; // 0 - 23 |
UINT8 Minute; // 0 - 59 |
UINT8 Second; // 0 - 59 |
UINT8 Pad1; |
UINT32 Nanosecond; // 0 - 999,999,999 |
INT16 TimeZone; // -1440 to 1440 or 2047 |
UINT8 Daylight; |
UINT8 Pad2; |
} EFI_TIME; |
// Bit definitions for EFI_TIME.Daylight |
#define EFI_TIME_ADJUST_DAYLIGHT 0x01 |
#define EFI_TIME_IN_DAYLIGHT 0x02 |
// Value definition for EFI_TIME.TimeZone |
#define EFI_UNSPECIFIED_TIMEZONE 0x07FF |
// |
// Networking |
// |
typedef struct { |
UINT8 Addr[4]; |
} EFI_IPv4_ADDRESS; |
typedef struct { |
UINT8 Addr[16]; |
} EFI_IPv6_ADDRESS; |
typedef struct { |
UINT8 Addr[32]; |
} EFI_MAC_ADDRESS; |
// |
// Memory |
// |
typedef UINT64 EFI_PHYSICAL_ADDRESS; |
typedef UINT64 EFI_VIRTUAL_ADDRESS; |
typedef enum { |
AllocateAnyPages, |
AllocateMaxAddress, |
AllocateAddress, |
MaxAllocateType |
} EFI_ALLOCATE_TYPE; |
//Preseve the attr on any range supplied. |
//ConventialMemory must have WB,SR,SW when supplied. |
//When allocating from ConventialMemory always make it WB,SR,SW |
//When returning to ConventialMemory always make it WB,SR,SW |
//When getting the memory map, or on RT for runtime types |
typedef enum { |
EfiReservedMemoryType, |
EfiLoaderCode, |
EfiLoaderData, |
EfiBootServicesCode, |
EfiBootServicesData, |
EfiRuntimeServicesCode, |
EfiRuntimeServicesData, |
EfiConventionalMemory, |
EfiUnusableMemory, |
EfiACPIReclaimMemory, |
EfiACPIMemoryNVS, |
EfiMemoryMappedIO, |
EfiMemoryMappedIOPortSpace, |
EfiPalCode, |
EfiMaxMemoryType |
} EFI_MEMORY_TYPE; |
// possible caching types for the memory range |
#define EFI_MEMORY_UC 0x0000000000000001 |
#define EFI_MEMORY_WC 0x0000000000000002 |
#define EFI_MEMORY_WT 0x0000000000000004 |
#define EFI_MEMORY_WB 0x0000000000000008 |
#define EFI_MEMORY_UCE 0x0000000000000010 |
// physical memory protection on range |
#define EFI_MEMORY_WP 0x0000000000001000 |
#define EFI_MEMORY_RP 0x0000000000002000 |
#define EFI_MEMORY_XP 0x0000000000004000 |
// range requires a runtime mapping |
#define EFI_MEMORY_RUNTIME 0x8000000000000000 |
#define EFI_MEMORY_DESCRIPTOR_VERSION 1 |
typedef struct { |
UINT32 Type; // Field size is 32 bits followed by 32 bit pad |
EFI_PHYSICAL_ADDRESS PhysicalStart; // Field size is 64 bits |
EFI_VIRTUAL_ADDRESS VirtualStart; // Field size is 64 bits |
UINT64 NumberOfPages; // Field size is 64 bits |
UINT64 Attribute; // Field size is 64 bits |
} EFI_MEMORY_DESCRIPTOR; |
// |
// International Language |
// |
typedef UINT8 ISO_639_2; |
#define ISO_639_2_ENTRY_SIZE 3 |
// |
// |
// |
#define EFI_PAGE_SIZE 4096 |
#define EFI_PAGE_MASK 0xFFF |
#define EFI_PAGE_SHIFT 12 |
#define EFI_SIZE_TO_PAGES(a) \ |
( ((a) >> EFI_PAGE_SHIFT) + ((a) & EFI_PAGE_MASK ? 1 : 0) ) |
#endif |
/tags/0.3.0/boot/arch/ia64/loader/gefi/inc/libsmbios.h |
---|
0,0 → 1,132 |
#ifndef _LIB_SMBIOS_H |
#define _LIB_SMBIOS_H |
/*++ |
Copyright (c) 2000 Intel Corporation |
Module Name: |
LibSmbios.h |
Abstract: |
Lib include for SMBIOS services. Used to get system serial number and GUID |
Revision History |
--*/ |
// |
// Define SMBIOS tables. |
// |
#pragma pack(1) |
typedef struct { |
UINT8 AnchorString[4]; |
UINT8 EntryPointStructureChecksum; |
UINT8 EntryPointLength; |
UINT8 MajorVersion; |
UINT8 MinorVersion; |
UINT16 MaxStructureSize; |
UINT8 EntryPointRevision; |
UINT8 FormattedArea[5]; |
UINT8 IntermediateAnchorString[5]; |
UINT8 IntermediateChecksum; |
UINT16 TableLength; |
UINT32 TableAddress; |
UINT16 NumberOfSmbiosStructures; |
UINT8 SmbiosBcdRevision; |
} SMBIOS_STRUCTURE_TABLE; |
// |
// Please note that SMBIOS structures can be odd byte aligned since the |
// unformated section of each record is a set of arbitrary size strings. |
// |
typedef struct { |
UINT8 Type; |
UINT8 Length; |
UINT8 Handle[2]; |
} SMBIOS_HEADER; |
typedef UINT8 SMBIOS_STRING; |
typedef struct { |
SMBIOS_HEADER Hdr; |
SMBIOS_STRING Vendor; |
SMBIOS_STRING BiosVersion; |
UINT8 BiosSegment[2]; |
SMBIOS_STRING BiosReleaseDate; |
UINT8 BiosSize; |
UINT8 BiosCharacteristics[8]; |
} SMBIOS_TYPE0; |
typedef struct { |
SMBIOS_HEADER Hdr; |
SMBIOS_STRING Manufacturer; |
SMBIOS_STRING ProductName; |
SMBIOS_STRING Version; |
SMBIOS_STRING SerialNumber; |
// |
// always byte copy this data to prevent alignment faults! |
// |
EFI_GUID Uuid; |
UINT8 WakeUpType; |
} SMBIOS_TYPE1; |
typedef struct { |
SMBIOS_HEADER Hdr; |
SMBIOS_STRING Manufacturer; |
SMBIOS_STRING ProductName; |
SMBIOS_STRING Version; |
SMBIOS_STRING SerialNumber; |
} SMBIOS_TYPE2; |
typedef struct { |
SMBIOS_HEADER Hdr; |
SMBIOS_STRING Manufacturer; |
UINT8 Type; |
SMBIOS_STRING Version; |
SMBIOS_STRING SerialNumber; |
SMBIOS_STRING AssetTag; |
UINT8 BootupState; |
UINT8 PowerSupplyState; |
UINT8 ThermalState; |
UINT8 SecurityStatus; |
UINT8 OemDefined[4]; |
} SMBIOS_TYPE3; |
typedef struct { |
SMBIOS_HEADER Hdr; |
UINT8 Socket; |
UINT8 ProcessorType; |
UINT8 ProcessorFamily; |
SMBIOS_STRING ProcessorManufacture; |
UINT8 ProcessorId[8]; |
SMBIOS_STRING ProcessorVersion; |
UINT8 Voltage; |
UINT8 ExternalClock[2]; |
UINT8 MaxSpeed[2]; |
UINT8 CurrentSpeed[2]; |
UINT8 Status; |
UINT8 ProcessorUpgrade; |
UINT8 L1CacheHandle[2]; |
UINT8 L2CacheHandle[2]; |
UINT8 L3CacheHandle[2]; |
} SMBIOS_TYPE4; |
typedef union { |
SMBIOS_HEADER *Hdr; |
SMBIOS_TYPE0 *Type0; |
SMBIOS_TYPE1 *Type1; |
SMBIOS_TYPE2 *Type2; |
SMBIOS_TYPE3 *Type3; |
SMBIOS_TYPE4 *Type4; |
UINT8 *Raw; |
} SMBIOS_STRUCTURE_POINTER; |
#pragma pack() |
#endif |
/tags/0.3.0/boot/arch/ia64/loader/gefi/inc/efipxebc.h |
---|
0,0 → 1,463 |
#ifndef _EFIPXEBC_H |
#define _EFIPXEBC_H |
/*++ |
Copyright (c) 1998 Intel Corporation |
Module Name: |
efipxebc.h |
Abstract: |
EFI PXE Base Code Protocol |
Revision History |
--*/ |
// |
// PXE Base Code protocol |
// |
#define EFI_PXE_BASE_CODE_PROTOCOL \ |
{ 0x03c4e603, 0xac28, 0x11d3, {0x9a, 0x2d, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d} } |
INTERFACE_DECL(_EFI_PXE_BASE_CODE); |
#define DEFAULT_TTL 4 |
#define DEFAULT_ToS 0 |
// |
// Address definitions |
// |
typedef union { |
UINT32 Addr[4]; |
EFI_IPv4_ADDRESS v4; |
EFI_IPv6_ADDRESS v6; |
} EFI_IP_ADDRESS; |
typedef UINT16 EFI_PXE_BASE_CODE_UDP_PORT; |
// |
// Packet definitions |
// |
typedef struct { |
UINT8 BootpOpcode; |
UINT8 BootpHwType; |
UINT8 BootpHwAddrLen; |
UINT8 BootpGateHops; |
UINT32 BootpIdent; |
UINT16 BootpSeconds; |
UINT16 BootpFlags; |
UINT8 BootpCiAddr[4]; |
UINT8 BootpYiAddr[4]; |
UINT8 BootpSiAddr[4]; |
UINT8 BootpGiAddr[4]; |
UINT8 BootpHwAddr[16]; |
UINT8 BootpSrvName[64]; |
UINT8 BootpBootFile[128]; |
UINT32 DhcpMagik; |
UINT8 DhcpOptions[56]; |
} EFI_PXE_BASE_CODE_DHCPV4_PACKET; |
// TBD in EFI v1.1 |
//typedef struct { |
// UINT8 reserved; |
//} EFI_PXE_BASE_CODE_DHCPV6_PACKET; |
typedef union { |
UINT8 Raw[1472]; |
EFI_PXE_BASE_CODE_DHCPV4_PACKET Dhcpv4; |
// EFI_PXE_BASE_CODE_DHCPV6_PACKET Dhcpv6; |
} EFI_PXE_BASE_CODE_PACKET; |
typedef struct { |
UINT8 Type; |
UINT8 Code; |
UINT16 Checksum; |
union { |
UINT32 reserved; |
UINT32 Mtu; |
UINT32 Pointer; |
struct { |
UINT16 Identifier; |
UINT16 Sequence; |
} Echo; |
} u; |
UINT8 Data[494]; |
} EFI_PXE_BASE_CODE_ICMP_ERROR; |
typedef struct { |
UINT8 ErrorCode; |
CHAR8 ErrorString[127]; |
} EFI_PXE_BASE_CODE_TFTP_ERROR; |
// |
// IP Receive Filter definitions |
// |
#define EFI_PXE_BASE_CODE_MAX_IPCNT 8 |
typedef struct { |
UINT8 Filters; |
UINT8 IpCnt; |
UINT16 reserved; |
EFI_IP_ADDRESS IpList[EFI_PXE_BASE_CODE_MAX_IPCNT]; |
} EFI_PXE_BASE_CODE_IP_FILTER; |
#define EFI_PXE_BASE_CODE_IP_FILTER_STATION_IP 0x0001 |
#define EFI_PXE_BASE_CODE_IP_FILTER_BROADCAST 0x0002 |
#define EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS 0x0004 |
#define EFI_PXE_BASE_CODE_IP_FILTER_PROMISCUOUS_MULTICAST 0x0008 |
// |
// ARP Cache definitions |
// |
typedef struct { |
EFI_IP_ADDRESS IpAddr; |
EFI_MAC_ADDRESS MacAddr; |
} EFI_PXE_BASE_CODE_ARP_ENTRY; |
typedef struct { |
EFI_IP_ADDRESS IpAddr; |
EFI_IP_ADDRESS SubnetMask; |
EFI_IP_ADDRESS GwAddr; |
} EFI_PXE_BASE_CODE_ROUTE_ENTRY; |
// |
// UDP definitions |
// |
#define EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_IP 0x0001 |
#define EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_SRC_PORT 0x0002 |
#define EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_IP 0x0004 |
#define EFI_PXE_BASE_CODE_UDP_OPFLAGS_ANY_DEST_PORT 0x0008 |
#define EFI_PXE_BASE_CODE_UDP_OPFLAGS_USE_FILTER 0x0010 |
#define EFI_PXE_BASE_CODE_UDP_OPFLAGS_MAY_FRAGMENT 0x0020 |
// |
// Discover() definitions |
// |
#define EFI_PXE_BASE_CODE_BOOT_TYPE_BOOTSTRAP 0 |
#define EFI_PXE_BASE_CODE_BOOT_TYPE_MS_WINNT_RIS 1 |
#define EFI_PXE_BASE_CODE_BOOT_TYPE_INTEL_LCM 2 |
#define EFI_PXE_BASE_CODE_BOOT_TYPE_DOSUNDI 3 |
#define EFI_PXE_BASE_CODE_BOOT_TYPE_NEC_ESMPRO 4 |
#define EFI_PXE_BASE_CODE_BOOT_TYPE_IBM_WSoD 5 |
#define EFI_PXE_BASE_CODE_BOOT_TYPE_IBM_LCCM 6 |
#define EFI_PXE_BASE_CODE_BOOT_TYPE_CA_UNICENTER_TNG 7 |
#define EFI_PXE_BASE_CODE_BOOT_TYPE_HP_OPENVIEW 8 |
#define EFI_PXE_BASE_CODE_BOOT_TYPE_ALTIRIS_9 9 |
#define EFI_PXE_BASE_CODE_BOOT_TYPE_ALTIRIS_10 10 |
#define EFI_PXE_BASE_CODE_BOOT_TYPE_ALTIRIS_11 11 |
#define EFI_PXE_BASE_CODE_BOOT_TYPE_NOT_USED_12 12 |
#define EFI_PXE_BASE_CODE_BOOT_TYPE_REDHAT_INSTALL 13 |
#define EFI_PXE_BASE_CODE_BOOT_TYPE_REDHAT_BOOT 14 |
#define EFI_PXE_BASE_CODE_BOOT_TYPE_REMBO 15 |
#define EFI_PXE_BASE_CODE_BOOT_TYPE_BEOBOOT 16 |
// |
// 17 through 32767 are reserved |
// 32768 through 65279 are for vendor use |
// 65280 through 65534 are reserved |
// |
#define EFI_PXE_BASE_CODE_BOOT_TYPE_PXETEST 65535 |
#define EFI_PXE_BASE_CODE_BOOT_LAYER_MASK 0x7FFF |
#define EFI_PXE_BASE_CODE_BOOT_LAYER_INITIAL 0x0000 |
typedef struct { |
UINT16 Type; |
BOOLEAN AcceptAnyResponse; |
UINT8 Reserved; |
EFI_IP_ADDRESS IpAddr; |
} EFI_PXE_BASE_CODE_SRVLIST; |
typedef struct { |
BOOLEAN UseMCast; |
BOOLEAN UseBCast; |
BOOLEAN UseUCast; |
BOOLEAN MustUseList; |
EFI_IP_ADDRESS ServerMCastIp; |
UINT16 IpCnt; |
EFI_PXE_BASE_CODE_SRVLIST SrvList[1]; |
} EFI_PXE_BASE_CODE_DISCOVER_INFO; |
// |
// Mtftp() definitions |
// |
typedef enum { |
EFI_PXE_BASE_CODE_TFTP_FIRST, |
EFI_PXE_BASE_CODE_TFTP_GET_FILE_SIZE, |
EFI_PXE_BASE_CODE_TFTP_READ_FILE, |
EFI_PXE_BASE_CODE_TFTP_WRITE_FILE, |
EFI_PXE_BASE_CODE_TFTP_READ_DIRECTORY, |
EFI_PXE_BASE_CODE_MTFTP_GET_FILE_SIZE, |
EFI_PXE_BASE_CODE_MTFTP_READ_FILE, |
EFI_PXE_BASE_CODE_MTFTP_READ_DIRECTORY, |
EFI_PXE_BASE_CODE_MTFTP_LAST |
} EFI_PXE_BASE_CODE_TFTP_OPCODE; |
typedef struct { |
EFI_IP_ADDRESS MCastIp; |
EFI_PXE_BASE_CODE_UDP_PORT CPort; |
EFI_PXE_BASE_CODE_UDP_PORT SPort; |
UINT16 ListenTimeout; |
UINT16 TransmitTimeout; |
} EFI_PXE_BASE_CODE_MTFTP_INFO; |
// |
// PXE Base Code Mode structure |
// |
#define EFI_PXE_BASE_CODE_MAX_ARP_ENTRIES 8 |
#define EFI_PXE_BASE_CODE_MAX_ROUTE_ENTRIES 8 |
typedef struct { |
BOOLEAN Started; |
BOOLEAN Ipv6Available; |
BOOLEAN Ipv6Supported; |
BOOLEAN UsingIpv6; |
BOOLEAN BisSupported; |
BOOLEAN BisDetected; |
BOOLEAN AutoArp; |
BOOLEAN SendGUID; |
BOOLEAN DhcpDiscoverValid; |
BOOLEAN DhcpAckReceived; |
BOOLEAN ProxyOfferReceived; |
BOOLEAN PxeDiscoverValid; |
BOOLEAN PxeReplyReceived; |
BOOLEAN PxeBisReplyReceived; |
BOOLEAN IcmpErrorReceived; |
BOOLEAN TftpErrorReceived; |
BOOLEAN MakeCallbacks; |
UINT8 TTL; |
UINT8 ToS; |
EFI_IP_ADDRESS StationIp; |
EFI_IP_ADDRESS SubnetMask; |
EFI_PXE_BASE_CODE_PACKET DhcpDiscover; |
EFI_PXE_BASE_CODE_PACKET DhcpAck; |
EFI_PXE_BASE_CODE_PACKET ProxyOffer; |
EFI_PXE_BASE_CODE_PACKET PxeDiscover; |
EFI_PXE_BASE_CODE_PACKET PxeReply; |
EFI_PXE_BASE_CODE_PACKET PxeBisReply; |
EFI_PXE_BASE_CODE_IP_FILTER IpFilter; |
UINT32 ArpCacheEntries; |
EFI_PXE_BASE_CODE_ARP_ENTRY ArpCache[EFI_PXE_BASE_CODE_MAX_ARP_ENTRIES]; |
UINT32 RouteTableEntries; |
EFI_PXE_BASE_CODE_ROUTE_ENTRY RouteTable[EFI_PXE_BASE_CODE_MAX_ROUTE_ENTRIES]; |
EFI_PXE_BASE_CODE_ICMP_ERROR IcmpError; |
EFI_PXE_BASE_CODE_TFTP_ERROR TftpError; |
} EFI_PXE_BASE_CODE_MODE; |
// |
// PXE Base Code Interface Function definitions |
// |
typedef |
EFI_STATUS |
(EFIAPI *EFI_PXE_BASE_CODE_START) ( |
IN struct _EFI_PXE_BASE_CODE *This, |
IN BOOLEAN UseIpv6 |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_PXE_BASE_CODE_STOP) ( |
IN struct _EFI_PXE_BASE_CODE *This |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_PXE_BASE_CODE_DHCP) ( |
IN struct _EFI_PXE_BASE_CODE *This, |
IN BOOLEAN SortOffers |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_PXE_BASE_CODE_DISCOVER) ( |
IN struct _EFI_PXE_BASE_CODE *This, |
IN UINT16 Type, |
IN UINT16 *Layer, |
IN BOOLEAN UseBis, |
IN OUT EFI_PXE_BASE_CODE_DISCOVER_INFO *Info OPTIONAL |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_PXE_BASE_CODE_MTFTP) ( |
IN struct _EFI_PXE_BASE_CODE *This, |
IN EFI_PXE_BASE_CODE_TFTP_OPCODE Operation, |
IN OUT VOID *BufferPtr OPTIONAL, |
IN BOOLEAN Overwrite, |
IN OUT UINTN *BufferSize, |
IN UINTN *BlockSize OPTIONAL, |
IN EFI_IP_ADDRESS *ServerIp, |
IN UINT8 *Filename, |
IN EFI_PXE_BASE_CODE_MTFTP_INFO *Info OPTIONAL, |
IN BOOLEAN DontUseBuffer |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_PXE_BASE_CODE_UDP_WRITE) ( |
IN struct _EFI_PXE_BASE_CODE *This, |
IN UINT16 OpFlags, |
IN EFI_IP_ADDRESS *DestIp, |
IN EFI_PXE_BASE_CODE_UDP_PORT *DestPort, |
IN EFI_IP_ADDRESS *GatewayIp, OPTIONAL |
IN EFI_IP_ADDRESS *SrcIp, OPTIONAL |
IN OUT EFI_PXE_BASE_CODE_UDP_PORT *SrcPort, OPTIONAL |
IN UINTN *HeaderSize, OPTIONAL |
IN VOID *HeaderPtr, OPTIONAL |
IN UINTN *BufferSize, |
IN VOID *BufferPtr |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_PXE_BASE_CODE_UDP_READ) ( |
IN struct _EFI_PXE_BASE_CODE *This, |
IN UINT16 OpFlags, |
IN OUT EFI_IP_ADDRESS *DestIp, OPTIONAL |
IN OUT EFI_PXE_BASE_CODE_UDP_PORT *DestPort, OPTIONAL |
IN OUT EFI_IP_ADDRESS *SrcIp, OPTIONAL |
IN OUT EFI_PXE_BASE_CODE_UDP_PORT *SrcPort, OPTIONAL |
IN UINTN *HeaderSize, OPTIONAL |
IN VOID *HeaderPtr, OPTIONAL |
IN OUT UINTN *BufferSize, |
IN VOID *BufferPtr |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_PXE_BASE_CODE_SET_IP_FILTER) ( |
IN struct _EFI_PXE_BASE_CODE *This, |
IN EFI_PXE_BASE_CODE_IP_FILTER *NewFilter |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_PXE_BASE_CODE_ARP) ( |
IN struct _EFI_PXE_BASE_CODE *This, |
IN EFI_IP_ADDRESS *IpAddr, |
IN EFI_MAC_ADDRESS *MacAddr OPTIONAL |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_PXE_BASE_CODE_SET_PARAMETERS) ( |
IN struct _EFI_PXE_BASE_CODE *This, |
IN BOOLEAN *NewAutoArp, OPTIONAL |
IN BOOLEAN *NewSendGUID, OPTIONAL |
IN UINT8 *NewTTL, OPTIONAL |
IN UINT8 *NewToS, OPTIONAL |
IN BOOLEAN *NewMakeCallback OPTIONAL |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_PXE_BASE_CODE_SET_STATION_IP) ( |
IN struct _EFI_PXE_BASE_CODE *This, |
IN EFI_IP_ADDRESS *NewStationIp, OPTIONAL |
IN EFI_IP_ADDRESS *NewSubnetMask OPTIONAL |
); |
typedef |
EFI_STATUS |
(EFIAPI *EFI_PXE_BASE_CODE_SET_PACKETS) ( |
IN struct _EFI_PXE_BASE_CODE *This, |
BOOLEAN *NewDhcpDiscoverValid, OPTIONAL |
BOOLEAN *NewDhcpAckReceived, OPTIONAL |
BOOLEAN *NewProxyOfferReceived, OPTIONAL |
BOOLEAN *NewPxeDiscoverValid, OPTIONAL |
BOOLEAN *NewPxeReplyReceived, OPTIONAL |
BOOLEAN *NewPxeBisReplyReceived,OPTIONAL |
IN EFI_PXE_BASE_CODE_PACKET *NewDhcpDiscover, OPTIONAL |
IN EFI_PXE_BASE_CODE_PACKET *NewDhcpAck, OPTIONAL |
IN EFI_PXE_BASE_CODE_PACKET *NewProxyOffer, OPTIONAL |
IN EFI_PXE_BASE_CODE_PACKET *NewPxeDiscover, OPTIONAL |
IN EFI_PXE_BASE_CODE_PACKET *NewPxeReply, OPTIONAL |
IN EFI_PXE_BASE_CODE_PACKET *NewPxeBisReply OPTIONAL |
); |
// |
// PXE Base Code Protocol structure |
// |
#define EFI_PXE_BASE_CODE_INTERFACE_REVISION 0x00010000 |
typedef struct _EFI_PXE_BASE_CODE { |
UINT64 Revision; |
EFI_PXE_BASE_CODE_START Start; |
EFI_PXE_BASE_CODE_STOP Stop; |
EFI_PXE_BASE_CODE_DHCP Dhcp; |
EFI_PXE_BASE_CODE_DISCOVER Discover; |
EFI_PXE_BASE_CODE_MTFTP Mtftp; |
EFI_PXE_BASE_CODE_UDP_WRITE UdpWrite; |
EFI_PXE_BASE_CODE_UDP_READ UdpRead; |
EFI_PXE_BASE_CODE_SET_IP_FILTER SetIpFilter; |
EFI_PXE_BASE_CODE_ARP Arp; |
EFI_PXE_BASE_CODE_SET_PARAMETERS SetParameters; |
EFI_PXE_BASE_CODE_SET_STATION_IP SetStationIp; |
EFI_PXE_BASE_CODE_SET_PACKETS SetPackets; |
EFI_PXE_BASE_CODE_MODE *Mode; |
} EFI_PXE_BASE_CODE; |
// |
// Call Back Definitions |
// |
#define EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL \ |
{ 0x245dca21, 0xfb7b, 0x11d3, {0x8f, 0x01, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b} } |
// |
// Revision Number |
// |
#define EFI_PXE_BASE_CODE_CALLBACK_INTERFACE_REVISION 0x00010000 |
INTERFACE_DECL(_EFI_PXE_BASE_CODE_CALLBACK); |
typedef enum { |
EFI_PXE_BASE_CODE_FUNCTION_FIRST, |
EFI_PXE_BASE_CODE_FUNCTION_DHCP, |
EFI_PXE_BASE_CODE_FUNCTION_DISCOVER, |
EFI_PXE_BASE_CODE_FUNCTION_MTFTP, |
EFI_PXE_BASE_CODE_FUNCTION_UDP_WRITE, |
EFI_PXE_BASE_CODE_FUNCTION_UDP_READ, |
EFI_PXE_BASE_CODE_FUNCTION_ARP, |
EFI_PXE_BASE_CODE_FUNCTION_IGMP, |
EFI_PXE_BASE_CODE_PXE_FUNCTION_LAST |
} EFI_PXE_BASE_CODE_FUNCTION; |
typedef enum { |
EFI_PXE_BASE_CODE_CALLBACK_STATUS_FIRST, |
EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE, |
EFI_PXE_BASE_CODE_CALLBACK_STATUS_ABORT, |
EFI_PXE_BASE_CODE_CALLBACK_STATUS_LAST |
} EFI_PXE_BASE_CODE_CALLBACK_STATUS; |
typedef |
EFI_PXE_BASE_CODE_CALLBACK_STATUS |
(EFIAPI *EFI_PXE_CALLBACK) ( |
IN struct _EFI_PXE_BASE_CODE_CALLBACK *This, |
IN EFI_PXE_BASE_CODE_FUNCTION Function, |
IN BOOLEAN Received, |
IN UINT32 PacketLen, |
IN EFI_PXE_BASE_CODE_PACKET *Packet OPTIONAL |
); |
typedef struct _EFI_PXE_BASE_CODE_CALLBACK { |
UINT64 Revision; |
EFI_PXE_CALLBACK Callback; |
} EFI_PXE_BASE_CODE_CALLBACK; |
#endif /* _EFIPXEBC_H */ |
/tags/0.3.0/boot/arch/ia64/loader/gefi/inc/Makefile |
---|
0,0 → 1,21 |
include ../Make.defaults |
CDIR=$(TOPDIR)/.. |
all: |
clean: |
install: |
mkdir -p $(INSTALLROOT)/include/efi |
mkdir -p $(INSTALLROOT)/include/efi/protocol |
mkdir -p $(INSTALLROOT)/include/efi/$(ARCH) |
$(INSTALL) -m 644 *.h $(INSTALLROOT)/include/efi |
$(INSTALL) -m 644 protocol/*.h $(INSTALLROOT)/include/efi/protocol |
$(INSTALL) -m 644 $(ARCH)/*.h $(INSTALLROOT)/include/efi/$(ARCH) |
ifeq ($(ARCH),ia64) |
mkdir -p $(INSTALLROOT)/include/efi/protocol/ia64 |
$(INSTALL) -m 644 protocol/ia64/*.h $(INSTALLROOT)/include/efi/protocol/ia64 |
endif |
include ../Make.rules |
/tags/0.3.0/boot/arch/ia64/loader/gefi/Makefile |
---|
0,0 → 1,51 |
# |
# Copyright (C) 1999-2001 Hewlett-Packard Co. |
# Contributed by David Mosberger <davidm@hpl.hp.com> |
# Contributed by Stephane Eranian <eranian@hpl.hp.com> |
# |
# This file is part of the gnu-efi package. |
# |
# GNU-EFI is free software; you can redistribute it and/or modify |
# it under the terms of the GNU General Public License as published by |
# the Free Software Foundation; either version 2, or (at your option) |
# any later version. |
# |
# GNU-EFI is distributed in the hope that it will be useful, |
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
# GNU General Public License for more details. |
# |
# You should have received a copy of the GNU General Public License |
# along with GNU-EFI; see the file COPYING. If not, write to the Free |
# Software Foundation, 59 Temple Place - Suite 330, Boston, MA |
# 02111-1307, USA. |
# |
include Make.defaults |
SUBDIRS = lib gnuefi inc apps |
all: check_gcc $(SUBDIRS) |
$(SUBDIRS): |
$(MAKE) -C $@ |
clean: |
rm -f *~ |
@for d in $(SUBDIRS); do $(MAKE) -C $$d clean; done |
install: |
@for d in $(SUBDIRS); do $(MAKE) -C $$d install; done |
.PHONY: $(SUBDIRS) clean depend |
# |
# on both platforms you must use gcc 3.0 or higher |
# |
check_gcc: |
ifeq ($(GCC_VERSION),2) |
@echo "you need to use a version of gcc >= 3.0, you are using `$(CC) --version`" |
@exit 1 |
endif |
include Make.rules |
/tags/0.3.0/boot/arch/ia64/loader/gefi/gnuefi/reloc_ia32.c |
---|
0,0 → 1,103 |
/* reloc_ia32.c - position independent x86 ELF shared object relocator |
Copyright (C) 1999 Hewlett-Packard Co. |
Contributed by David Mosberger <davidm@hpl.hp.com>. |
This file is part of GNU-EFI, the GNU EFI development environment. |
GNU EFI is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 2, or (at your option) |
any later version. |
GNU EFI is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with GNU EFI; see the file COPYING. If not, write to the Free |
Software Foundation, 59 Temple Place - Suite 330, Boston, MA |
02111-1307, USA. */ |
#include <elf.h> |
#include <link.h> /* get _DYNAMIC decl and ElfW and ELFW macros */ |
#undef NULL |
#define uint64_t efi_uint64_t |
#define int64_t efi_int64_t |
#define uint32_t efi_uint32_t |
#define int32_t efi_int32_t |
#define uint16_t efi_uint16_t |
#define int16_t efi_int16_t |
#define uint8_t efi_uint8_t |
#define int8_t efi_int8_t |
#undef NULL |
#define uint64_t efi_uint64_t |
#define int64_t efi_int64_t |
#define uint32_t efi_uint32_t |
#define int32_t efi_int32_t |
#define uint16_t efi_uint16_t |
#define int16_t efi_int16_t |
#define uint8_t efi_uint8_t |
#define int8_t efi_int8_t |
#include <efi.h> |
#include <efilib.h> |
int |
_relocate (long ldbase, ElfW(Dyn) *dyn, EFI_HANDLE image, EFI_SYSTEM_TABLE *systab) |
{ |
extern EFI_STATUS efi_main (EFI_HANDLE, EFI_SYSTEM_TABLE *); |
long relsz = 0, relent = 0; |
ElfW(Rel) *rel = 0; |
int i; |
for (i = 0; dyn[i].d_tag != DT_NULL; ++i) { |
switch (dyn[i].d_tag) { |
case DT_REL: |
rel = (ElfW(Rel)*) ((long) dyn[i].d_un.d_ptr + ldbase); |
break; |
case DT_RELSZ: |
relsz = dyn[i].d_un.d_val; |
break; |
case DT_RELENT: |
relent = dyn[i].d_un.d_val; |
break; |
case DT_RELA: |
break; |
default: |
break; |
} |
} |
while (relsz > 0) { |
if (!rel || relent == 0) |
return EFI_LOAD_ERROR; |
/* apply the relocs */ |
switch (ELF32_R_TYPE (rel->r_info)) { |
case R_386_NONE: |
break; |
case R_386_RELATIVE: |
{ |
long *addr; |
addr = (long *) (ldbase + rel->r_offset); |
*addr += ldbase; |
break; |
} |
default: |
return EFI_LOAD_ERROR; |
} |
rel = (ElfW(Rel)*) ((char *) rel + relent); |
relsz -= relent; |
} |
return EFI_SUCCESS; |
} |
/tags/0.3.0/boot/arch/ia64/loader/gefi/gnuefi/crt0-efi-ia32.S |
---|
0,0 → 1,62 |
/* crt0-efi-ia32.S - x86 EFI startup code. |
Copyright (C) 1999 Hewlett-Packard Co. |
Contributed by David Mosberger <davidm@hpl.hp.com>. |
This file is part of GNU-EFI, the GNU EFI development environment. |
GNU EFI is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 2, or (at your option) |
any later version. |
GNU EFI is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with GNU EFI; see the file COPYING. If not, write to the Free |
Software Foundation, 59 Temple Place - Suite 330, Boston, MA |
02111-1307, USA. */ |
.text |
.align 4 |
.globl _start |
_start: |
pushl %ebp |
movl %esp,%ebp |
pushl 12(%ebp) # copy "image" argument |
pushl 8(%ebp) # copy "systab" argument |
call 0f |
0: popl %eax |
movl %eax,%ebx |
addl $ImageBase-0b,%eax # %eax = ldbase |
addl $_DYNAMIC-0b,%ebx # %ebx = _DYNAMIC |
pushl %ebx # pass _DYNAMIC as second argument |
pushl %eax # pass ldbase as first argument |
call _relocate |
popl %ebx |
popl %ebx |
testl %eax,%eax |
jne .exit |
call efi_main # call app with "image" and "systab" argument |
.exit: leave |
ret |
// hand-craft a dummy .reloc section so EFI knows it's a relocatable executable: |
.data |
dummy: .long 0 |
#define IMAGE_REL_ABSOLUTE 0 |
.section .reloc, "a" |
.long dummy // Page RVA |
.long 10 // Block Size (2*4+2) |
.word (IMAGE_REL_ABSOLUTE<<12) + 0 // reloc for dummy |
/tags/0.3.0/boot/arch/ia64/loader/gefi/gnuefi/elf_ia32_efi.lds |
---|
0,0 → 1,62 |
OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386") |
OUTPUT_ARCH(i386) |
ENTRY(_start) |
SECTIONS |
{ |
. = 0; |
ImageBase = .; |
.hash : { *(.hash) } /* this MUST come first! */ |
. = ALIGN(4096); |
.text : |
{ |
*(.text) |
*(.text.*) |
*(.gnu.linkonce.t.*) |
} |
.reloc : |
{ |
*(.reloc) |
} |
. = ALIGN(4096); |
.data : |
{ |
*(.rodata*) |
*(.data) |
*(.data1) |
*(.data.*) |
*(.sdata) |
*(.got.plt) |
*(.got) |
/* the EFI loader doesn't seem to like a .bss section, so we stick |
it all into .data: */ |
*(.sbss) |
*(.scommon) |
*(.dynbss) |
*(.bss) |
*(COMMON) |
} |
. = ALIGN(4096); |
.dynamic : { *(.dynamic) } |
. = ALIGN(4096); |
.rel : |
{ |
*(.rel.data) |
*(.rel.data.*) |
*(.rel.got) |
*(.rel.stab) |
*(.data.rel.ro.local) |
*(.data.rel.local) |
*(.data.rel.ro) |
*(.data.rel*) |
} |
. = ALIGN(4096); |
.dynsym : { *(.dynsym) } |
. = ALIGN(4096); |
.dynstr : { *(.dynstr) } |
. = ALIGN(4096); |
/DISCARD/ : |
{ |
*(.rel.reloc) |
*(.eh_frame) |
} |
} |
/tags/0.3.0/boot/arch/ia64/loader/gefi/gnuefi/reloc_ia64.S |
---|
0,0 → 1,212 |
/* reloc_ia64.S - position independent IA-64 ELF shared object relocator |
Copyright (C) 1999 Hewlett-Packard Co. |
Contributed by David Mosberger <davidm@hpl.hp.com>. |
This file is part of GNU-EFI, the GNU EFI development environment. |
GNU EFI is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 2, or (at your option) |
any later version. |
GNU EFI is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with GNU EFI; see the file COPYING. If not, write to the Free |
Software Foundation, 59 Temple Place - Suite 330, Boston, MA |
02111-1307, USA. */ |
/* |
* This is written in assembly because the entire code needs to be position |
* independent. Note that the compiler does not generate code that's position |
* independent by itself because it relies on the global offset table being |
* relocated. |
*/ |
.text |
.psr abi64 |
.psr lsb |
.lsb |
/* |
* This constant determines how many R_IA64_FPTR64LSB relocations we |
* can deal with. If you get EFI_BUFFER_TOO_SMALL errors, you may |
* need to increase this number. |
*/ |
#define MAX_FUNCTION_DESCRIPTORS 750 |
#define ST_VALUE_OFF 8 /* offset of st_value in elf sym */ |
#define EFI_SUCCESS 0 |
#define EFI_LOAD_ERROR 1 |
#define EFI_BUFFER_TOO_SMALL 5 |
#define DT_NULL 0 /* Marks end of dynamic section */ |
#define DT_RELA 7 /* Address of Rela relocs */ |
#define DT_RELASZ 8 /* Total size of Rela relocs */ |
#define DT_RELAENT 9 /* Size of one Rela reloc */ |
#define DT_SYMTAB 6 /* Address of symbol table */ |
#define DT_SYMENT 11 /* Size of one symbol table entry */ |
#define R_IA64_NONE 0 |
#define R_IA64_REL64MSB 0x6e |
#define R_IA64_REL64LSB 0x6f |
#define R_IA64_DIR64MSB 0x26 |
#define R_IA64_DIR64LSB 0x27 |
#define R_IA64_FPTR64MSB 0x46 |
#define R_IA64_FPTR64LSB 0x47 |
#define ldbase in0 /* load address (address of .text) */ |
#define dyn in1 /* address of _DYNAMIC */ |
#define d_tag r16 |
#define d_val r17 |
#define rela r18 |
#define relasz r19 |
#define relaent r20 |
#define addr r21 |
#define r_info r22 |
#define r_offset r23 |
#define r_addend r24 |
#define r_type r25 |
#define r_sym r25 /* alias of r_type ! */ |
#define fptr r26 |
#define fptr_limit r27 |
#define symtab f8 |
#define syment f9 |
#define ftmp f10 |
#define target r16 |
#define val r17 |
#define NLOC 0 |
#define Pnull p6 |
#define Prela p7 |
#define Prelasz p8 |
#define Prelaent p9 |
#define Psymtab p10 |
#define Psyment p11 |
#define Pnone p6 |
#define Prel p7 |
#define Pfptr p8 |
#define Pmore p6 |
#define Poom p6 /* out-of-memory */ |
.global _relocate |
.proc _relocate |
_relocate: |
alloc r2=ar.pfs,2,0,0,0 |
movl fptr = @gprel(fptr_mem_base) |
;; |
add fptr = fptr, gp |
movl fptr_limit = @gprel(fptr_mem_limit) |
;; |
add fptr_limit = fptr_limit, gp |
search_dynamic: |
ld8 d_tag = [dyn],8 |
;; |
ld8 d_val = [dyn],8 |
cmp.eq Pnull,p0 = DT_NULL,d_tag |
(Pnull) br.cond.sptk.few apply_relocs |
cmp.eq Prela,p0 = DT_RELA,d_tag |
cmp.eq Prelasz,p0 = DT_RELASZ,d_tag |
cmp.eq Psymtab,p0 = DT_SYMTAB,d_tag |
cmp.eq Psyment,p0 = DT_SYMENT,d_tag |
cmp.eq Prelaent,p0 = DT_RELAENT,d_tag |
;; |
(Prela) add rela = d_val, ldbase |
(Prelasz) mov relasz = d_val |
(Prelaent) mov relaent = d_val |
(Psymtab) add val = d_val, ldbase |
(Psyment) setf.sig syment = d_val |
;; |
(Psymtab) setf.sig symtab = val |
br.sptk.few search_dynamic |
apply_loop: |
ld8 r_offset = [rela] |
add addr = 8,rela |
sub relasz = relasz,relaent |
;; |
ld8 r_info = [addr],8 |
;; |
ld8 r_addend = [addr] |
add target = ldbase, r_offset |
add rela = rela,relaent |
extr.u r_type = r_info, 0, 32 |
;; |
cmp.eq Pnone,p0 = R_IA64_NONE,r_type |
cmp.eq Prel,p0 = R_IA64_REL64LSB,r_type |
cmp.eq Pfptr,p0 = R_IA64_FPTR64LSB,r_type |
(Prel) br.cond.sptk.few apply_REL64 |
;; |
cmp.eq Prel,p0 = R_IA64_DIR64LSB,r_type // treat DIR64 just like REL64 |
(Pnone) br.cond.sptk.few apply_relocs |
(Prel) br.cond.sptk.few apply_REL64 |
(Pfptr) br.cond.sptk.few apply_FPTR64 |
mov r8 = EFI_LOAD_ERROR |
br.ret.sptk.few rp |
apply_relocs: |
cmp.ltu Pmore,p0=0,relasz |
(Pmore) br.cond.sptk.few apply_loop |
mov r8 = EFI_SUCCESS |
br.ret.sptk.few rp |
apply_REL64: |
ld8 val = [target] |
;; |
add val = val,ldbase |
;; |
st8 [target] = val |
br.cond.sptk.few apply_relocs |
// FPTR relocs are a bit more interesting: we need to lookup |
// the symbol's value in symtab, allocate 16 bytes of memory, |
// store the value in [target] in the first and the gp in the |
// second dword. |
apply_FPTR64: |
st8 [target] = fptr |
extr.u r_sym = r_info,32,32 |
add target = 8,fptr |
;; |
setf.sig ftmp = r_sym |
mov r8=EFI_BUFFER_TOO_SMALL |
;; |
cmp.geu Poom,p0 = fptr,fptr_limit |
xma.lu ftmp = ftmp,syment,symtab |
(Poom) br.ret.sptk.few rp |
;; |
getf.sig addr = ftmp |
st8 [target] = gp |
;; |
add addr = ST_VALUE_OFF, addr |
;; |
ld8 val = [addr] |
;; |
add val = val,ldbase |
;; |
st8 [fptr] = val,16 |
br.cond.sptk.few apply_relocs |
.endp _relocate |
.data |
.align 16 |
fptr_mem_base: |
.space MAX_FUNCTION_DESCRIPTORS*16 |
fptr_mem_limit: |
/tags/0.3.0/boot/arch/ia64/loader/gefi/gnuefi/crt0-efi-ia64.S |
---|
0,0 → 1,74 |
/* crt0-efi-ia64.S - IA-64 EFI startup code. |
Copyright (C) 1999 Hewlett-Packard Co. |
Contributed by David Mosberger <davidm@hpl.hp.com>. |
This file is part of GNU-EFI, the GNU EFI development environment. |
GNU EFI is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 2, or (at your option) |
any later version. |
GNU EFI is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with GNU EFI; see the file COPYING. If not, write to the Free |
Software Foundation, 59 Temple Place - Suite 330, Boston, MA |
02111-1307, USA. */ |
.text |
.psr abi64 |
.psr lsb |
.lsb |
.proc _start |
_start: |
alloc loc0=ar.pfs,2,2,2,0 |
mov loc1=rp |
movl out0=@gprel(ImageBase) // out0 <- ImageBase (ldbase) |
;; |
add out0=out0,gp |
movl out1=@gprel(_DYNAMIC) // out1 <- _DYNAMIC |
;; // avoid WAW on CFM |
add out1=out1,gp |
br.call.sptk.few rp=_relocate |
.Lret0: |
cmp.ne p6,p0=r0,r8 // r8 == EFI_SUCCESS? |
(p6) br.cond.sptk.few .exit // no -> |
.Lret1: |
mov out0=in0 // image handle |
mov out1=in1 // systab |
br.call.sptk.few rp=efi_main |
.Lret2: |
.exit: |
mov ar.pfs=loc0 |
mov rp=loc1 |
;; |
br.ret.sptk.few rp |
.endp _start |
// PE32+ wants a PLABEL, not the code address of the entry point: |
.align 16 |
.global _start_plabel |
.section .plabel, "a" |
_start_plabel: |
data8 _start |
data8 __gp |
// hand-craft a .reloc section for the plabel: |
#define IMAGE_REL_BASED_DIR64 10 |
.section .reloc, "a" |
data4 _start_plabel // Page RVA |
data4 12 // Block Size (2*4+2*2) |
data2 (IMAGE_REL_BASED_DIR64<<12) + 0 // reloc for plabel's entry point |
data2 (IMAGE_REL_BASED_DIR64<<12) + 8 // reloc for plabel's global pointer |
/tags/0.3.0/boot/arch/ia64/loader/gefi/gnuefi/Makefile |
---|
0,0 → 1,44 |
# |
# Copyright (C) 1999-2001 Hewlett-Packard Co. |
# Contributed by David Mosberger <davidm@hpl.hp.com> |
# Contributed by Stephane Eranian <eranian@hpl.hp.com> |
# |
# This file is part of the gnu-efi package. |
# |
# GNU-EFI is free software; you can redistribute it and/or modify |
# it under the terms of the GNU General Public License as published by |
# the Free Software Foundation; either version 2, or (at your option) |
# any later version. |
# |
# GNU-EFI is distributed in the hope that it will be useful, |
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
# GNU General Public License for more details. |
# |
# You should have received a copy of the GNU General Public License |
# along with GNU-EFI; see the file COPYING. If not, write to the Free |
# Software Foundation, 59 Temple Place - Suite 330, Boston, MA |
# 02111-1307, USA. |
# |
include ../Make.defaults |
CDIR=$(TOPDIR)/.. |
FILES = reloc_$(ARCH) |
OBJS = $(FILES:%=%.o) |
TARGETS = crt0-efi-$(ARCH).o libgnuefi.a |
all: $(TARGETS) |
libgnuefi.a: libgnuefi.a($(OBJS)) |
clean: |
rm -f $(TARGETS) *~ *.o $(OBJS) |
install: |
mkdir -p $(INSTALLROOT)/lib |
$(INSTALL) -m 644 $(TARGETS) $(INSTALLROOT)/lib |
$(INSTALL) -m 644 elf_$(ARCH)_efi.lds $(INSTALLROOT)/lib |
include ../Make.rules |
/tags/0.3.0/boot/arch/ia64/loader/gefi/gnuefi/elf_ia64_efi.lds |
---|
0,0 → 1,70 |
OUTPUT_FORMAT("elf64-ia64-little") |
OUTPUT_ARCH(ia64) |
ENTRY(_start_plabel) |
SECTIONS |
{ |
. = 0; |
ImageBase = .; |
.hash : { *(.hash) } /* this MUST come first! */ |
. = ALIGN(4096); |
.text : |
{ |
*(.text) |
*(.text.*) |
*(.gnu.linkonce.t.*) |
} |
. = ALIGN(4096); |
__gp = ALIGN (8) + 0x200000; |
.sdata : |
{ |
*(.got.plt) |
*(.got) |
*(.srodata) |
*(.sdata) |
*(.sbss) |
*(.scommon) |
} |
. = ALIGN(4096); |
.data : |
{ |
*(.rodata*) |
*(.ctors) |
*(.data*) |
*(.gnu.linkonce.d*) |
*(.plabel) /* data whose relocs we want to ignore */ |
/* the EFI loader doesn't seem to like a .bss section, so we stick |
it all into .data: */ |
*(.dynbss) |
*(.bss) |
*(COMMON) |
} |
. = ALIGN(4096); |
.dynamic : { *(.dynamic) } |
. = ALIGN(4096); |
.rela : |
{ |
*(.rela.text) |
*(.rela.data*) |
*(.rela.sdata) |
*(.rela.got) |
*(.rela.gnu.linkonce.d*) |
*(.rela.stab) |
*(.rela.ctors) |
} |
. = ALIGN(4096); |
.reloc : /* This is the PECOFF .reloc section! */ |
{ |
*(.reloc) |
} |
. = ALIGN(4096); |
.dynsym : { *(.dynsym) } |
. = ALIGN(4096); |
.dynstr : { *(.dynstr) } |
/DISCARD/ : |
{ |
*(.rela.plabel) |
*(.rela.reloc) |
*(.IA_64.unwind*) |
*(.IA64.unwind*) |
} |
} |
/tags/0.3.0/boot/arch/ia64/loader/Makefile |
---|
0,0 → 1,135 |
# |
# Copyright (c) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
include ../../../../version |
include ../../../Makefile.config |
## Toolchain configuration |
# |
TARGET = ia64-pc-linux-gnu |
TOOLCHAIN_DIR = /usr/local/ia64/bin |
ifeq ($(COMPILER),gcc_native) |
CC = gcc |
AS = as |
LD = ld |
OBJCOPY = objcopy |
OBJDUMP = objdump |
GEFI_PREXIX = |
endif |
ifeq ($(COMPILER),icc_native) |
CC = icc |
AS = as |
LD = ld |
OBJCOPY = objcopy |
OBJDUMP = objdump |
endif |
ifeq ($(COMPILER),gcc_cross) |
CC = $(TOOLCHAIN_DIR)/$(TARGET)-gcc |
AS = $(TOOLCHAIN_DIR)/$(TARGET)-as |
LD = $(TOOLCHAIN_DIR)/$(TARGET)-ld |
OBJCOPY = $(TOOLCHAIN_DIR)/$(TARGET)-objcopy |
OBJDUMP = $(TOOLCHAIN_DIR)/$(TARGET)-objdump |
GEFI_PREFIX = $(TOOLCHAIN_DIR)/$(TARGET)- |
endif |
#-mno-pic means do not use gp + imm22 to address data |
CFLAGS = -DRELEASE=\"$(RELEASE)\" -I. -I../../../generic -I../../../genarch -I../../../../kernel/generic/include -nostdinc -nostdlib -fno-builtin -Werror-implicit-function-declaration -Wmissing-prototypes -Werror -O3 -fno-unwind-tables -mfixed-range=f32-f127 -mno-pic |
ifdef REVISION |
CFLAGS += "-DREVISION=\"$(REVISION)\"" |
endif |
ifdef TIMESTAMP |
CFLAGS += "-DTIMESTAMP=\"$(TIMESTAMP)\"" |
endif |
SOURCES = \ |
main.c \ |
../../../generic/printf.c \ |
../../../generic/string.c \ |
../../../genarch/balloc.c \ |
asm.S \ |
boot.S |
COMPONENTS = \ |
$(KERNELDIR)/kernel.bin \ |
$(USPACEDIR)/srv/ns/ns \ |
$(USPACEDIR)/srv/fb/fb \ |
$(USPACEDIR)/srv/kbd/kbd \ |
$(USPACEDIR)/srv/console/console \ |
$(USPACEDIR)/srv/vfs/vfs \ |
$(USPACEDIR)/srv/fs/tmpfs/tmpfs \ |
$(USPACEDIR)/srv/fs/fat/fat \ |
$(USPACEDIR)/srv/devmap/devmap \ |
$(USPACEDIR)/app/init/init \ |
$(USPACEDIR)/app/tetris/tetris \ |
$(USPACEDIR)/app/tester/tester \ |
$(USPACEDIR)/app/klog/klog |
OBJECTS := $(addsuffix .o,$(basename $(SOURCES))) |
COMPONENT_OBJECTS := $(addsuffix .o,$(basename $(notdir $(COMPONENTS)))) |
.PHONY: all clean depend |
all: hello.efi disasm |
-include Makefile.depend |
hello.efi: image.boot |
make -C gefi/HelenOS PREFIX=$(GEFI_PREFIX) |
cp gefi/HelenOS/hello.efi ../../../../ |
# cp gefi/HelenOS/hello.efi /boot/efi/ |
cp gefi/HelenOS/image.bin ../../../../ |
image.boot: depend _components.h _link.ld $(COMPONENT_OBJECTS) $(OBJECTS) |
$(LD) -Map boot.map -no-check-sections -N -T _link.ld $(COMPONENT_OBJECTS) $(OBJECTS) -o $@ |
depend: |
-makedepend $(DEFS) $(CFLAGS) -f - $(SOURCES) > Makefile.depend 2> /dev/null |
clean: |
-rm -f _components.h _link.ld $(COMPONENT_OBJECTS) $(OBJECTS) image.boot boot.disasm Makefile.depend |
make -C gefi/HelenOS clean |
_components.h _link.ld $(COMPONENT_OBJECTS): $(COMPONENTS) |
./pack $(IMAGE) $(OBJCOPY) $(COMPONENTS) |
%.o: %.S |
$(CC) $(DEFS) $(CFLAGS) -D__ASM__ -c $< -o $@ |
%.o: %.c |
$(CC) $(DEFS) $(CFLAGS) -c $< -o $@ |
disasm: image.boot |
$(OBJDUMP) -d image.boot > boot.disasm |
/tags/0.3.0/boot/arch/ia64/loader/boot.S |
---|
0,0 → 1,68 |
# |
# Copyright (c) 2006 Martin Decky |
# Copyright (c) 2006 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
#include <stack.h> |
.section BOOTSTRAP, "ax" |
.global start |
start: |
mov ar.rsc = r0 |
# movl r8 = (VRN_KERNEL << VRN_SHIFT) ;; |
movl r1 = 0x4400000 |
movl r8 = initial_stack ;; |
mov ar.bspstore = r8 |
loadrs |
# initialize memory stack to some sane value |
movl r12 = initial_stack_top ;; |
add r12 = -16, r12 /* allocate a scratch area on the stack */ |
# initialize gp (Global Pointer) register |
#movl r1 = _hardcoded_load_address |
ssm (1 << 19) ;; /* Disable f32 - f127 */ |
srlz.i |
srlz.d ;; |
movl r18 = bootstrap ;; |
mov b1 = r18 ;; |
br.call.sptk.many b0 = b1 |
.bss #on this line is ".bss", it cannot be seen in my mcedit :-( |
.align 8192 |
initial_stack: |
.space 8192 |
initial_stack_top: |
/tags/0.3.0/boot/arch/ia64/loader/pack |
---|
0,0 → 1,121 |
#! /bin/sh |
# |
# Copyright (C) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
[ "$#" -lt 1 ] && exit 1 |
OBJCOPY="$1" |
LINK="_link.ld" |
HEADER="_components.h" |
shift |
echo 'OUTPUT_FORMAT("elf64-ia64-little") |
ENTRY(start) |
SECTIONS { |
.boot 0x4400000: AT (0x4400000) { |
*(BOOTSTRAP); |
. = ALIGN (0x4000); |
' > "$LINK" |
echo '#ifndef ___COMPONENTS_H__ |
#define ___COMPONENTS_H__ |
typedef struct { |
char *name; |
void *start; |
void *end; |
unsigned int size; |
} component_t;' > "$HEADER" |
COUNT="0" |
DATA="" |
for TASK in "$@" ; do |
BASENAME="`basename "$TASK" | sed 's/^\(.*\)\.[^.]*$/\1/'`" |
OBJECT="${BASENAME}.o" |
SYMBOL="`echo "_binary_$TASK" | tr "./" "__"`" |
MACRO="`echo "$BASENAME" | tr [:lower:] [:upper:]`" |
echo "$TASK -> $OBJECT" |
echo " |
*(.${BASENAME}_image); |
. = ALIGN (0x4000);" >> "$LINK" |
echo " |
extern int ${SYMBOL}_start; |
extern int ${SYMBOL}_end; |
#define ${MACRO}_START ((void *) &${SYMBOL}_start) |
#define ${MACRO}_END ((void *) &${SYMBOL}_end) |
#define ${MACRO}_SIZE ((unsigned long) ${MACRO}_END - (unsigned long) ${MACRO}_START)" >> "$HEADER" |
"$OBJCOPY" -I binary -O elf64-ia64-little -B ia64 --rename-section ".data=.${BASENAME}_image" "$TASK" "$OBJECT" |
DATA="${DATA} |
components[$COUNT].name = \"${BASENAME}\"; |
components[$COUNT].start = ${MACRO}_START; |
components[$COUNT].end = ${MACRO}_END; |
components[$COUNT].size = ${MACRO}_SIZE;"; |
COUNT="`expr "$COUNT" + 1`" |
done |
echo ' |
*(.text); |
*(.rodata); |
*(.rodata.*); |
*(.data); /* initialized data */ |
_got = . ; |
*(.got .got.*); |
*(.sdata); |
*(.sdata2); |
*(.sbss); |
*(.bss); /* uninitialized static variables */ |
*(COMMON);' >> "$LINK" |
echo ' } |
/DISCARD/ : { |
*(.comment); |
*(.note*); |
} |
}' >> "$LINK" |
echo " |
#define COMPONENTS $COUNT |
static void init_components(component_t components[]) |
{ |
$DATA |
} |
#endif |
" >> "$HEADER" |
Property changes: |
Added: svn:executable |
+* |
\ No newline at end of property |
/tags/0.3.0/boot/arch/ia64/loader/asm.S |
---|
0,0 → 1,43 |
# |
# Copyright (c) 2006 Martin Decky |
# Copyright (c) 2006 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
#include <stack.h> |
.text |
.global jump_to_kernel |
jump_to_kernel: |
alloc loc0 = ar.pfs, 1, 1, 0, 0 |
movl r8 = 0x4404000;; |
mov b1 = r8 ;; |
mov r1 = in0; |
br.call.sptk.many b0 = b1;; |
.global ofw |
ofw: |
/tags/0.3.0/boot/arch/ia64/loader/main.c |
---|
0,0 → 1,110 |
/* |
* Copyright (c) 2005 Martin Decky |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#include "main.h" |
#include <printf.h> |
#include "asm.h" |
#include "_components.h" |
#include <align.h> |
#include <balloc.h> |
bootinfo_t bootinfo; |
component_t components[COMPONENTS]; |
char *release = RELEASE; |
void write(const char *str, const int len) |
{ |
return; |
} |
#ifdef REVISION |
char *revision = ", revision " REVISION; |
#else |
char *revision = ""; |
#endif |
#ifdef TIMESTAMP |
char *timestamp = "\nBuilt on " TIMESTAMP; |
#else |
char *timestamp = ""; |
#endif |
/** Print version information. */ |
static void version_print(void) |
{ |
printf("HelenOS IA64 Bootloader\nRelease %s%s%s\nCopyright (c) 2006 HelenOS project\n", release, revision, timestamp); |
} |
void bootstrap(void) |
{ |
int ii; |
//for(ii=0;ii<KERNEL_SIZE;ii++) ((char *)(0x100000))[ii] = ((char *)KERNEL_START)[ii+1]; |
//((int *)(0x100000))[0]++; |
version_print(); |
init_components(components); |
printf("\nSystem info\n"); |
printf("\nMemory statistics\n"); |
printf(" %P: boot info structure\n", &bootinfo); |
unsigned int i; |
for (i = 0; i < COMPONENTS; i++) |
printf(" %P: %s image (size %d bytes)\n", components[i].start, |
components[i].name, components[i].size); |
bootinfo.taskmap.count = 0; |
for (i = 0; i < COMPONENTS; i++) { |
if (i > 0) { |
bootinfo.taskmap.tasks[bootinfo.taskmap.count].addr = components[i].start; |
bootinfo.taskmap.tasks[bootinfo.taskmap.count].size = components[i].size; |
bootinfo.taskmap.count++; |
} |
} |
jump_to_kernel(&bootinfo); |
} |
/tags/0.3.0/boot/arch/ia64/loader/asm.h |
---|
0,0 → 1,48 |
/* |
* Copyright (c) 2006 Martin Decky |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#ifndef BOOT_ia64_ASM_H_ |
#define BOOT_ia64_ASM_H_ |
#include "types.h" |
#include "main.h" |
#define PAGE_WIDTH 14 |
#define PAGE_SIZE (1 << PAGE_WIDTH) |
#define memcpy(dst, src, cnt) __builtin_memcpy((dst), (src), (cnt)) |
extern void halt(void); |
/*extern void jump_to_kernel(void *entry, uint64_t cfg, bootinfo_t *bootinfo, |
unsigned int bootinfo_size) __attribute__((noreturn));*/ |
extern void jump_to_kernel(void *) __attribute__((noreturn)); |
#endif |
/tags/0.3.0/boot/arch/ia64/loader/main.h |
---|
0,0 → 1,58 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#ifndef BOOT_ia64_MAIN_H_ |
#define BOOT_ia64_MAIN_H_ |
#include <ofw.h> |
#include <ofw_tree.h> |
#include <types.h> |
#define CONFIG_INIT_TASKS 32 |
typedef struct { |
void *addr; |
size_t size; |
} init_task_t; |
typedef struct { |
count_t count; |
init_task_t tasks[CONFIG_INIT_TASKS]; |
} init_t; |
typedef struct { |
init_t taskmap; |
} bootinfo_t; |
extern bootinfo_t bootinfo; |
extern void start(void); |
extern void bootstrap(void); |
#endif |
/tags/0.3.0/boot/arch/ia64/loader/types.h |
---|
0,0 → 1,47 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#ifndef BOOT_ia64_TYPES_H_ |
#define BOOT_ia64_TYPES_H_ |
#include <gentypes.h> |
typedef signed char int8_t; |
typedef unsigned char uint8_t; |
typedef unsigned short uint16_t; |
typedef unsigned int uint32_t; |
typedef unsigned long uint64_t; |
typedef uint64_t uintptr_t; |
typedef uint64_t unative_t; |
typedef unsigned long count_t; |
#endif |
/tags/0.3.0/boot/arch/ia64/loader/stack.h |
---|
0,0 → 1,36 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#ifndef BOOT_ia64_STACK_H_ |
#define BOOT_ia64_STACK_H_ |
#define STACK_ALIGNMENT 16 |
#define STACK_BIAS 2047 |
#define STACK_WINDOW_SAVE_AREA_SIZE (16*8) |
#endif |
/tags/0.3.0/boot/arch/ia64/Makefile.inc |
---|
0,0 → 1,64 |
# |
# Copyright (c) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
#ifeq ($(MACHINE),ski) |
#VMAXLMA_SRC = tools/ia64/vmaxlma.c |
#build: $(BASE)/kernel.bin |
#echo Building SKI |
#$(BASE)/kernel.bin: $(KERNELDIR)/kernel.bin vmaxlma |
# cp $(KERNELDIR)/kernel.bin $(BASE)/kernel.bin |
# ./vmaxlma $(BASE)/kernel.bin |
#vmaxlma: $(VMAXLMA_SRC) |
# $(CC) $(VMAXLMA_SRC) -o $@ |
#clean: |
# -rm -f $(BASE)/kernel.bin vmaxlma |
#else |
build: $(BASE)/image.boot |
$(BASE)/image.boot: depend arch/$(ARCH)/loader/image.boot |
cp arch/$(ARCH)/loader/image.boot $(BASE)/image.boot |
depend: |
-rm arch/$(ARCH)/loader/image.boot |
arch/$(ARCH)/loader/image.boot: |
make -C arch/$(ARCH)/loader COMPILER=$(COMPILER) KERNELDIR=../../../$(KERNELDIR) USPACEDIR=../../../$(USPACEDIR) "DEFS=$(DEFS)" |
clean: generic_clean |
make -C arch/$(ARCH)/loader clean COMPILER=$(COMPILER) KERNELDIR=../../../$(KERNELDIR) USPACEDIR=../../../$(USPACEDIR) "DEFS=$(DEFS)" |
-rm -f $(BASE)/image.boot |
#endif |
/tags/0.3.0/boot/arch/sparc64/loader/Makefile |
---|
0,0 → 1,126 |
# |
# Copyright (c) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
include ../../../../version |
include ../../../Makefile.config |
## Toolchain configuration |
# |
TARGET = sparc64-linux-gnu |
TOOLCHAIN_DIR = /usr/local/sparc64/bin |
ifeq ($(COMPILER),gcc_native) |
CC = gcc |
AS = as |
LD = ld |
OBJCOPY = objcopy |
OBJDUMP = objdump |
endif |
ifeq ($(COMPILER),icc_native) |
CC = icc |
AS = as |
LD = ld |
OBJCOPY = objcopy |
OBJDUMP = objdump |
endif |
ifeq ($(COMPILER),gcc_cross) |
CC = $(TOOLCHAIN_DIR)/$(TARGET)-gcc |
AS = $(TOOLCHAIN_DIR)/$(TARGET)-as |
LD = $(TOOLCHAIN_DIR)/$(TARGET)-ld |
OBJCOPY = $(TOOLCHAIN_DIR)/$(TARGET)-objcopy |
OBJDUMP = $(TOOLCHAIN_DIR)/$(TARGET)-objdump |
endif |
CFLAGS = -DRELEASE=\"$(RELEASE)\" -I. -I../../../generic -I../../../genarch -nostdinc -nostdlib -fno-builtin -Werror-implicit-function-declaration -Wmissing-prototypes -Werror -O3 -mcpu=ultrasparc -m64 |
ifdef REVISION |
CFLAGS += "-DREVISION=\"$(REVISION)\"" |
endif |
ifdef TIMESTAMP |
CFLAGS += "-DTIMESTAMP=\"$(TIMESTAMP)\"" |
endif |
SOURCES = \ |
main.c \ |
../../../generic/printf.c \ |
../../../generic/string.c \ |
../../../genarch/balloc.c \ |
../../../genarch/ofw.c \ |
../../../genarch/ofw_tree.c \ |
ofwarch.c \ |
asm.S \ |
boot.S |
COMPONENTS = \ |
$(KERNELDIR)/kernel.bin \ |
$(USPACEDIR)/srv/ns/ns \ |
$(USPACEDIR)/srv/fb/fb \ |
$(USPACEDIR)/srv/kbd/kbd \ |
$(USPACEDIR)/srv/console/console \ |
$(USPACEDIR)/srv/vfs/vfs \ |
$(USPACEDIR)/srv/fs/tmpfs/tmpfs \ |
$(USPACEDIR)/srv/fs/fat/fat \ |
$(USPACEDIR)/srv/devmap/devmap \ |
$(USPACEDIR)/app/init/init \ |
$(USPACEDIR)/app/tetris/tetris \ |
$(USPACEDIR)/app/tester/tester \ |
$(USPACEDIR)/app/klog/klog |
OBJECTS := $(addsuffix .o,$(basename $(SOURCES))) |
COMPONENT_OBJECTS := $(addsuffix .o,$(basename $(notdir $(COMPONENTS)))) |
.PHONY: all clean depend |
all: image.boot disasm |
-include Makefile.depend |
image.boot: depend _components.h _link.ld $(COMPONENT_OBJECTS) $(OBJECTS) |
$(LD) -Map image.map -no-check-sections -N -T _link.ld $(COMPONENT_OBJECTS) $(OBJECTS) -o $@ |
depend: |
-makedepend $(DEFS) $(CFLAGS) -f - $(SOURCES) > Makefile.depend 2> /dev/null |
clean: |
-rm -f _components.h _link.ld $(COMPONENT_OBJECTS) $(OBJECTS) image.boot boot.disasm Makefile.depend |
_components.h _link.ld $(COMPONENT_OBJECTS): $(COMPONENTS) |
./pack $(IMAGE) $(OBJCOPY) $(COMPONENTS) |
%.o: %.S |
$(CC) $(DEFS) $(CFLAGS) -D__ASM__ -c $< -o $@ |
%.o: %.c |
$(CC) $(DEFS) $(CFLAGS) -c $< -o $@ |
disasm: image.boot |
$(OBJDUMP) -d image.boot > boot.disasm |
/tags/0.3.0/boot/arch/sparc64/loader/pack |
---|
0,0 → 1,113 |
#! /bin/sh |
# |
# Copyright (C) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
[ "$#" -lt 1 ] && exit 1 |
OBJCOPY="$1" |
LINK="_link.ld" |
HEADER="_components.h" |
shift |
echo 'OUTPUT_FORMAT("elf64-sparc") |
ENTRY(start) |
SECTIONS { |
.boot 0x4000: AT (0x4000) { |
*(BOOTSTRAP); |
*(.text); |
*(.rodata); |
*(.rodata.*); |
*(.data); /* initialized data */ |
*(.sdata); |
*(.sdata2); |
*(.sbss); |
*(.bss); /* uninitialized static variables */ |
*(COMMON);' > "$LINK" |
echo '#ifndef ___COMPONENTS_H__ |
#define ___COMPONENTS_H__ |
typedef struct { |
char *name; |
void *start; |
void *end; |
unsigned int size; |
} component_t;' > "$HEADER" |
COUNT="0" |
DATA="" |
for TASK in "$@" ; do |
BASENAME="`basename "$TASK" | sed 's/^\(.*\)\.[^.]*$/\1/'`" |
OBJECT="${BASENAME}.o" |
SYMBOL="`echo "_binary_$TASK" | tr "./" "__"`" |
MACRO="`echo "$BASENAME" | tr [:lower:] [:upper:]`" |
echo "$TASK -> $OBJECT" |
echo " |
*(.${BASENAME}_image);" >> "$LINK" |
echo " |
extern int ${SYMBOL}_start; |
extern int ${SYMBOL}_end; |
#define ${MACRO}_START ((void *) &${SYMBOL}_start) |
#define ${MACRO}_END ((void *) &${SYMBOL}_end) |
#define ${MACRO}_SIZE ((unsigned long) ${MACRO}_END - (unsigned long) ${MACRO}_START)" >> "$HEADER" |
"$OBJCOPY" -I binary -O elf64-sparc -B sparc --rename-section ".data=.${BASENAME}_image" "$TASK" "$OBJECT" |
DATA="${DATA} |
components[$COUNT].name = \"${BASENAME}\"; |
components[$COUNT].start = ${MACRO}_START; |
components[$COUNT].end = ${MACRO}_END; |
components[$COUNT].size = ${MACRO}_SIZE;"; |
COUNT="`expr "$COUNT" + 1`" |
done |
echo ' } |
/DISCARD/ : { |
*(.comment); |
*(.note*); |
} |
}' >> "$LINK" |
echo " |
#define COMPONENTS $COUNT |
static void init_components(component_t components[]) |
{ |
$DATA |
} |
#endif |
" >> "$HEADER" |
Property changes: |
Added: svn:executable |
+* |
\ No newline at end of property |
/tags/0.3.0/boot/arch/sparc64/loader/main.c |
---|
0,0 → 1,154 |
/* |
* Copyright (c) 2005 Martin Decky |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#include "main.h" |
#include <printf.h> |
#include "asm.h" |
#include "_components.h" |
#include <balloc.h> |
#include <ofw.h> |
#include <ofw_tree.h> |
#include "ofwarch.h" |
#include <align.h> |
bootinfo_t bootinfo; |
component_t components[COMPONENTS]; |
char *release = RELEASE; |
#ifdef REVISION |
char *revision = ", revision " REVISION; |
#else |
char *revision = ""; |
#endif |
#ifdef TIMESTAMP |
char *timestamp = "\nBuilt on " TIMESTAMP; |
#else |
char *timestamp = ""; |
#endif |
/** Print version information. */ |
static void version_print(void) |
{ |
printf("HelenOS SPARC64 Bootloader\nRelease %s%s%s\nCopyright (c) 2006 HelenOS project\n", release, revision, timestamp); |
} |
void bootstrap(void) |
{ |
version_print(); |
init_components(components); |
if (!ofw_get_physmem_start(&bootinfo.physmem_start)) { |
printf("Error: unable to get start of physical memory.\n"); |
halt(); |
} |
if (!ofw_memmap(&bootinfo.memmap)) { |
printf("Error: unable to get memory map, halting.\n"); |
halt(); |
} |
if (bootinfo.memmap.total == 0) { |
printf("Error: no memory detected, halting.\n"); |
halt(); |
} |
printf("\nSystem info\n"); |
printf(" memory: %dM starting at %P\n", |
bootinfo.memmap.total >> 20, bootinfo.physmem_start); |
printf("\nMemory statistics\n"); |
printf(" kernel entry point at %P\n", KERNEL_VIRTUAL_ADDRESS); |
printf(" %P: boot info structure\n", &bootinfo); |
unsigned int i; |
for (i = 0; i < COMPONENTS; i++) |
printf(" %P: %s image (size %d bytes)\n", components[i].start, |
components[i].name, components[i].size); |
void * base = (void *) KERNEL_VIRTUAL_ADDRESS; |
unsigned int top = 0; |
printf("\nCopying components\n"); |
bootinfo.taskmap.count = 0; |
for (i = 0; i < COMPONENTS; i++) { |
printf(" %s...", components[i].name); |
top = ALIGN_UP(top, PAGE_SIZE); |
/* |
* At this point, we claim the physical memory that we are |
* going to use. We should be safe in case of the virtual |
* address space because the OpenFirmware, according to its |
* SPARC binding, should restrict its use of virtual memory |
* to addresses from [0xffd00000; 0xffefffff] and |
* [0xfe000000; 0xfeffffff]. |
*/ |
(void) ofw_claim_phys(bootinfo.physmem_start + base + top, |
ALIGN_UP(components[i].size, PAGE_SIZE)); |
memcpy(base + top, components[i].start, components[i].size); |
if (i > 0) { |
bootinfo.taskmap.tasks[bootinfo.taskmap.count].addr = |
base + top; |
bootinfo.taskmap.tasks[bootinfo.taskmap.count].size = |
components[i].size; |
bootinfo.taskmap.count++; |
} |
top += components[i].size; |
printf("done.\n"); |
} |
/* |
* Claim the physical memory for the boot allocator. |
* Initialize the boot allocator. |
*/ |
(void) ofw_claim_phys(bootinfo.physmem_start + |
base + ALIGN_UP(top, PAGE_SIZE), BALLOC_MAX_SIZE); |
balloc_init(&bootinfo.ballocs, ALIGN_UP(((uintptr_t) base) + top, |
PAGE_SIZE)); |
printf("\nCanonizing OpenFirmware device tree..."); |
bootinfo.ofw_root = ofw_tree_build(); |
printf("done.\n"); |
#ifdef CONFIG_SMP |
printf("\nChecking for secondary processors..."); |
if (!ofw_cpu()) |
printf("Error: unable to get CPU properties\n"); |
printf("done.\n"); |
#endif |
printf("\nBooting the kernel...\n"); |
jump_to_kernel((void *) KERNEL_VIRTUAL_ADDRESS, |
bootinfo.physmem_start | BSP_PROCESSOR, &bootinfo, |
sizeof(bootinfo)); |
} |
/tags/0.3.0/boot/arch/sparc64/loader/asm.h |
---|
0,0 → 1,45 |
/* |
* Copyright (c) 2006 Martin Decky |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#ifndef BOOT_sparc64_ASM_H_ |
#define BOOT_sparc64_ASM_H_ |
#include "types.h" |
#include "main.h" |
#define PAGE_WIDTH 14 |
#define PAGE_SIZE (1 << PAGE_WIDTH) |
#define memcpy(dst, src, cnt) __builtin_memcpy((dst), (src), (cnt)) |
extern void halt(void); |
extern void jump_to_kernel(void *entry, uint64_t cfg, bootinfo_t *bootinfo, |
unsigned int bootinfo_size) __attribute__((noreturn)); |
#endif |
/tags/0.3.0/boot/arch/sparc64/loader/ofwarch.c |
---|
0,0 → 1,118 |
/* |
* Copyright (c) 2005 Martin Decky |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** |
* @file |
* @brief Architecture dependent parts of OpenFirmware interface. |
*/ |
#include <ofwarch.h> |
#include <ofw.h> |
#include <printf.h> |
#include <string.h> |
#include <register.h> |
#include "main.h" |
#include "asm.h" |
void write(const char *str, const int len) |
{ |
int i; |
for (i = 0; i < len; i++) { |
if (str[i] == '\n') |
ofw_write("\r", 1); |
ofw_write(&str[i], 1); |
} |
} |
int ofw_translate_failed(ofw_arg_t flag) |
{ |
return flag != -1; |
} |
int ofw_cpu(void) |
{ |
char type_name[BUF_SIZE]; |
phandle node; |
node = ofw_get_child_node(ofw_root); |
if (node == 0 || node == -1) { |
printf("Could not find any child nodes of the root node.\n"); |
return 0; |
} |
uint64_t current_mid; |
asm volatile ("ldxa [%1] %2, %0\n" : "=r" (current_mid) : "r" (0), "i" (ASI_UPA_CONFIG)); |
current_mid >>= UPA_CONFIG_MID_SHIFT; |
current_mid &= UPA_CONFIG_MID_MASK; |
int cpus; |
for (cpus = 0; node != 0 && node != -1; node = ofw_get_peer_node(node), cpus++) { |
if (ofw_get_property(node, "device_type", type_name, sizeof(type_name)) > 0) { |
if (strcmp(type_name, "cpu") == 0) { |
uint32_t mid; |
if (ofw_get_property(node, "upa-portid", &mid, sizeof(mid)) <= 0) |
continue; |
if (current_mid != mid) { |
/* |
* Start secondary processor. |
*/ |
(void) ofw_call("SUNW,start-cpu", 3, 1, NULL, node, |
KERNEL_VIRTUAL_ADDRESS, |
bootinfo.physmem_start | AP_PROCESSOR); |
} |
} |
} |
} |
return cpus; |
} |
/** Get physical memory starting address. |
* |
* @param start Pointer to variable where the physical memory starting |
* address will be stored. |
* |
* @return Non-zero on succes, zero on failure. |
*/ |
int ofw_get_physmem_start(uintptr_t *start) |
{ |
uint32_t memreg[4]; |
if (ofw_get_property(ofw_memory, "reg", &memreg, sizeof(memreg)) <= 0) |
return 0; |
*start = (((uint64_t) memreg[0]) << 32) | memreg[1]; |
return 1; |
} |
/tags/0.3.0/boot/arch/sparc64/loader/ofwarch.h |
---|
0,0 → 1,41 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#ifndef BOOT_sparc64_OFWARCH_H_ |
#define BOOT_sparc64_OFWARCH_H_ |
#include "main.h" |
#include "types.h" |
#define OFW_ADDRESS_CELLS 2 |
#define OFW_SIZE_CELLS 2 |
extern int ofw_cpu(void); |
extern int ofw_get_physmem_start(uintptr_t *start); |
#endif |
/tags/0.3.0/boot/arch/sparc64/loader/asm.S |
---|
0,0 → 1,124 |
# |
# Copyright (c) 2006 Martin Decky |
# Copyright (c) 2006 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
#include <stack.h> |
#include <register.h> |
.text |
.global halt |
.global memcpy |
.global jump_to_kernel |
halt: |
b halt |
nop |
memcpy: |
.register %g2, #scratch |
.register %g3, #scratch |
add %o1, 7, %g1 |
and %g1, -8, %g1 |
cmp %o1, %g1 |
be,pn %xcc, 3f |
add %o0, 7, %g1 |
mov 0, %g3 |
0: |
brz,pn %o2, 2f |
mov 0, %g2 |
1: |
ldub [%g3 + %o1], %g1 |
add %g2, 1, %g2 |
cmp %o2, %g2 |
stb %g1, [%g3 + %o0] |
bne,pt %xcc, 1b |
mov %g2, %g3 |
2: |
jmp %o7 + 8 ! exit point |
mov %o1, %o0 |
3: |
and %g1, -8, %g1 |
cmp %o0, %g1 |
bne,pt %xcc, 0b |
mov 0, %g3 |
srlx %o2, 3, %g4 |
brz,pn %g4, 5f |
mov 0, %g5 |
4: |
sllx %g3, 3, %g2 |
add %g5, 1, %g3 |
ldx [%o1 + %g2], %g1 |
mov %g3, %g5 |
cmp %g4, %g3 |
bne,pt %xcc, 4b |
stx %g1, [%o0 + %g2] |
5: |
and %o2, 7, %o2 |
brz,pn %o2, 2b |
sllx %g4, 3, %g1 |
mov 0, %g2 |
add %g1, %o0, %o0 |
add %g1, %o1, %g4 |
mov 0, %g3 |
6: |
ldub [%g2 + %g4], %g1 |
stb %g1, [%g2 + %o0] |
add %g3, 1, %g2 |
cmp %o2, %g2 |
bne,pt %xcc, 6b |
mov %g2, %g3 |
jmp %o7 + 8 ! exit point |
mov %o1, %o0 |
jump_to_kernel: |
mov %o0, %l1 |
mov %o1, %o0 |
mov %o2, %o1 |
mov %o3, %o2 |
jmp %l1 ! jump to kernel |
nop |
.global ofw |
ofw: |
save %sp, -STACK_WINDOW_SAVE_AREA_SIZE, %sp |
set ofw_cif, %l0 |
ldx [%l0], %l0 |
rdpr %pstate, %l1 |
and %l1, ~PSTATE_AM_BIT, %l2 |
wrpr %l2, 0, %pstate |
jmpl %l0, %o7 |
mov %i0, %o0 |
wrpr %l1, 0, %pstate |
ret |
restore %o0, 0, %o0 |
/tags/0.3.0/boot/arch/sparc64/loader/boot.S |
---|
0,0 → 1,84 |
# |
# Copyright (c) 2006 Martin Decky |
# Copyright (c) 2006 Jakub Jermar |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
#include <stack.h> |
#include <register.h> |
#define INITIAL_STACK_SIZE 8192 |
#define NWINDOWS 8 |
.register %g2, #scratch |
.register %g3, #scratch |
.register %g6, #scratch |
.register %g7, #scratch |
.section BOOTSTRAP, "ax" |
.global start |
start: |
b 1f |
nop |
/* |
* This header forces SILO to load the image at 0x4000. |
* More precisely, SILO will think this is an old version of Linux. |
*/ |
.ascii "HdrS" |
.word 0 |
.half 0 |
.align 8 |
1: |
/* |
* Disable interrupts and disable address masking. |
*/ |
wrpr %g0, PSTATE_PRIV_BIT, %pstate |
wrpr %g0, NWINDOWS - 2, %cansave ! set maximum saveable windows |
wrpr %g0, 0, %canrestore ! get rid of windows we will never need again |
wrpr %g0, 0, %otherwin ! make sure the window state is consistent |
wrpr %g0, NWINDOWS - 1, %cleanwin ! prevent needless clean_window traps for kernel |
set initial_stack_top, %sp |
add %sp, -STACK_BIAS, %sp |
set ofw_cif, %l0 |
call ofw_init ! initialize OpenFirmware |
stx %o4, [%l0] |
b bootstrap |
nop |
.align STACK_ALIGNMENT |
initial_stack: |
.space INITIAL_STACK_SIZE |
initial_stack_top: |
.space STACK_WINDOW_SAVE_AREA_SIZE |
/tags/0.3.0/boot/arch/sparc64/loader/main.h |
---|
0,0 → 1,67 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#ifndef BOOT_sparc64_MAIN_H_ |
#define BOOT_sparc64_MAIN_H_ |
#include <ofw.h> |
#include <ofw_tree.h> |
#include <balloc.h> |
#include <types.h> |
#define KERNEL_VIRTUAL_ADDRESS 0x400000 |
#define TASKMAP_MAX_RECORDS 32 |
#define BSP_PROCESSOR 1 |
#define AP_PROCESSOR 0 |
typedef struct { |
void *addr; |
uint32_t size; |
} task_t; |
typedef struct { |
uint32_t count; |
task_t tasks[TASKMAP_MAX_RECORDS]; |
} taskmap_t; |
typedef struct { |
uintptr_t physmem_start; |
taskmap_t taskmap; |
memmap_t memmap; |
ballocs_t ballocs; |
ofw_tree_node_t *ofw_root; |
} bootinfo_t; |
extern bootinfo_t bootinfo; |
extern void start(void); |
extern void bootstrap(void); |
#endif |
/tags/0.3.0/boot/arch/sparc64/loader/register.h |
---|
0,0 → 1,40 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#ifndef BOOT_sparc64_REGISTER_H_ |
#define BOOT_sparc64_REGISTER_H_ |
#define PSTATE_IE_BIT 2 |
#define PSTATE_PRIV_BIT 4 |
#define PSTATE_AM_BIT 8 |
#define ASI_UPA_CONFIG 0x4a |
#define UPA_CONFIG_MID_SHIFT 17 |
#define UPA_CONFIG_MID_MASK 0x1f |
#endif |
/tags/0.3.0/boot/arch/sparc64/loader/types.h |
---|
0,0 → 1,44 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#ifndef BOOT_sparc64_TYPES_H_ |
#define BOOT_sparc64_TYPES_H_ |
#include <gentypes.h> |
typedef signed char int8_t; |
typedef unsigned char uint8_t; |
typedef unsigned short uint16_t; |
typedef unsigned int uint32_t; |
typedef unsigned long uint64_t; |
typedef uint64_t uintptr_t; |
typedef uint64_t unative_t; |
#endif |
/tags/0.3.0/boot/arch/sparc64/loader/stack.h |
---|
0,0 → 1,36 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#ifndef BOOT_sparc64_STACK_H_ |
#define BOOT_sparc64_STACK_H_ |
#define STACK_ALIGNMENT 16 |
#define STACK_BIAS 2047 |
#define STACK_WINDOW_SAVE_AREA_SIZE (16*8) |
#endif |
/tags/0.3.0/boot/arch/sparc64/silo/silo.tar.gz |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/tags/0.3.0/boot/arch/sparc64/silo/silo.conf |
---|
0,0 → 1,3 |
timeout = 0 |
image = /HelenOS/image.boot |
label = HelenOS |
/tags/0.3.0/boot/arch/sparc64/silo/README |
---|
0,0 → 1,5 |
For licensing terms of SILO boot loader see the file COPYING contained |
in this directory. Full version of SILO, including its source code, |
can be downloaded from SILO's project page: |
http://www.sparc-boot.org/ |
/tags/0.3.0/boot/arch/sparc64/silo/COPYING |
---|
0,0 → 1,340 |
GNU GENERAL PUBLIC LICENSE |
Version 2, June 1991 |
Copyright (C) 1989, 1991 Free Software Foundation, Inc. |
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
Everyone is permitted to copy and distribute verbatim copies |
of this license document, but changing it is not allowed. |
Preamble |
The licenses for most software are designed to take away your |
freedom to share and change it. By contrast, the GNU General Public |
License is intended to guarantee your freedom to share and change free |
software--to make sure the software is free for all its users. This |
General Public License applies to most of the Free Software |
Foundation's software and to any other program whose authors commit to |
using it. (Some other Free Software Foundation software is covered by |
the GNU Library General Public License instead.) You can apply it to |
your programs, too. |
When we speak of free software, we are referring to freedom, not |
price. Our General Public Licenses are designed to make sure that you |
have the freedom to distribute copies of free software (and charge for |
this service if you wish), that you receive source code or can get it |
if you want it, that you can change the software or use pieces of it |
in new free programs; and that you know you can do these things. |
To protect your rights, we need to make restrictions that forbid |
anyone to deny you these rights or to ask you to surrender the rights. |
These restrictions translate to certain responsibilities for you if you |
distribute copies of the software, or if you modify it. |
For example, if you distribute copies of such a program, whether |
gratis or for a fee, you must give the recipients all the rights that |
you have. You must make sure that they, too, receive or can get the |
source code. And you must show them these terms so they know their |
rights. |
We protect your rights with two steps: (1) copyright the software, and |
(2) offer you this license which gives you legal permission to copy, |
distribute and/or modify the software. |
Also, for each author's protection and ours, we want to make certain |
that everyone understands that there is no warranty for this free |
software. If the software is modified by someone else and passed on, we |
want its recipients to know that what they have is not the original, so |
that any problems introduced by others will not reflect on the original |
authors' reputations. |
Finally, any free program is threatened constantly by software |
patents. We wish to avoid the danger that redistributors of a free |
program will individually obtain patent licenses, in effect making the |
program proprietary. To prevent this, we have made it clear that any |
patent must be licensed for everyone's free use or not licensed at all. |
The precise terms and conditions for copying, distribution and |
modification follow. |
GNU GENERAL PUBLIC LICENSE |
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION |
0. This License applies to any program or other work which contains |
a notice placed by the copyright holder saying it may be distributed |
under the terms of this General Public License. The "Program", below, |
refers to any such program or work, and a "work based on the Program" |
means either the Program or any derivative work under copyright law: |
that is to say, a work containing the Program or a portion of it, |
either verbatim or with modifications and/or translated into another |
language. (Hereinafter, translation is included without limitation in |
the term "modification".) Each licensee is addressed as "you". |
Activities other than copying, distribution and modification are not |
covered by this License; they are outside its scope. The act of |
running the Program is not restricted, and the output from the Program |
is covered only if its contents constitute a work based on the |
Program (independent of having been made by running the Program). |
Whether that is true depends on what the Program does. |
1. You may copy and distribute verbatim copies of the Program's |
source code as you receive it, in any medium, provided that you |
conspicuously and appropriately publish on each copy an appropriate |
copyright notice and disclaimer of warranty; keep intact all the |
notices that refer to this License and to the absence of any warranty; |
and give any other recipients of the Program a copy of this License |
along with the Program. |
You may charge a fee for the physical act of transferring a copy, and |
you may at your option offer warranty protection in exchange for a fee. |
2. You may modify your copy or copies of the Program or any portion |
of it, thus forming a work based on the Program, and copy and |
distribute such modifications or work under the terms of Section 1 |
above, provided that you also meet all of these conditions: |
a) You must cause the modified files to carry prominent notices |
stating that you changed the files and the date of any change. |
b) You must cause any work that you distribute or publish, that in |
whole or in part contains or is derived from the Program or any |
part thereof, to be licensed as a whole at no charge to all third |
parties under the terms of this License. |
c) If the modified program normally reads commands interactively |
when run, you must cause it, when started running for such |
interactive use in the most ordinary way, to print or display an |
announcement including an appropriate copyright notice and a |
notice that there is no warranty (or else, saying that you provide |
a warranty) and that users may redistribute the program under |
these conditions, and telling the user how to view a copy of this |
License. (Exception: if the Program itself is interactive but |
does not normally print such an announcement, your work based on |
the Program is not required to print an announcement.) |
These requirements apply to the modified work as a whole. If |
identifiable sections of that work are not derived from the Program, |
and can be reasonably considered independent and separate works in |
themselves, then this License, and its terms, do not apply to those |
sections when you distribute them as separate works. But when you |
distribute the same sections as part of a whole which is a work based |
on the Program, the distribution of the whole must be on the terms of |
this License, whose permissions for other licensees extend to the |
entire whole, and thus to each and every part regardless of who wrote it. |
Thus, it is not the intent of this section to claim rights or contest |
your rights to work written entirely by you; rather, the intent is to |
exercise the right to control the distribution of derivative or |
collective works based on the Program. |
In addition, mere aggregation of another work not based on the Program |
with the Program (or with a work based on the Program) on a volume of |
a storage or distribution medium does not bring the other work under |
the scope of this License. |
3. You may copy and distribute the Program (or a work based on it, |
under Section 2) in object code or executable form under the terms of |
Sections 1 and 2 above provided that you also do one of the following: |
a) Accompany it with the complete corresponding machine-readable |
source code, which must be distributed under the terms of Sections |
1 and 2 above on a medium customarily used for software interchange; or, |
b) Accompany it with a written offer, valid for at least three |
years, to give any third party, for a charge no more than your |
cost of physically performing source distribution, a complete |
machine-readable copy of the corresponding source code, to be |
distributed under the terms of Sections 1 and 2 above on a medium |
customarily used for software interchange; or, |
c) Accompany it with the information you received as to the offer |
to distribute corresponding source code. (This alternative is |
allowed only for noncommercial distribution and only if you |
received the program in object code or executable form with such |
an offer, in accord with Subsection b above.) |
The source code for a work means the preferred form of the work for |
making modifications to it. For an executable work, complete source |
code means all the source code for all modules it contains, plus any |
associated interface definition files, plus the scripts used to |
control compilation and installation of the executable. However, as a |
special exception, the source code distributed need not include |
anything that is normally distributed (in either source or binary |
form) with the major components (compiler, kernel, and so on) of the |
operating system on which the executable runs, unless that component |
itself accompanies the executable. |
If distribution of executable or object code is made by offering |
access to copy from a designated place, then offering equivalent |
access to copy the source code from the same place counts as |
distribution of the source code, even though third parties are not |
compelled to copy the source along with the object code. |
4. You may not copy, modify, sublicense, or distribute the Program |
except as expressly provided under this License. Any attempt |
otherwise to copy, modify, sublicense or distribute the Program is |
void, and will automatically terminate your rights under this License. |
However, parties who have received copies, or rights, from you under |
this License will not have their licenses terminated so long as such |
parties remain in full compliance. |
5. You are not required to accept this License, since you have not |
signed it. However, nothing else grants you permission to modify or |
distribute the Program or its derivative works. These actions are |
prohibited by law if you do not accept this License. Therefore, by |
modifying or distributing the Program (or any work based on the |
Program), you indicate your acceptance of this License to do so, and |
all its terms and conditions for copying, distributing or modifying |
the Program or works based on it. |
6. Each time you redistribute the Program (or any work based on the |
Program), the recipient automatically receives a license from the |
original licensor to copy, distribute or modify the Program subject to |
these terms and conditions. You may not impose any further |
restrictions on the recipients' exercise of the rights granted herein. |
You are not responsible for enforcing compliance by third parties to |
this License. |
7. If, as a consequence of a court judgment or allegation of patent |
infringement or for any other reason (not limited to patent issues), |
conditions are imposed on you (whether by court order, agreement or |
otherwise) that contradict the conditions of this License, they do not |
excuse you from the conditions of this License. If you cannot |
distribute so as to satisfy simultaneously your obligations under this |
License and any other pertinent obligations, then as a consequence you |
may not distribute the Program at all. For example, if a patent |
license would not permit royalty-free redistribution of the Program by |
all those who receive copies directly or indirectly through you, then |
the only way you could satisfy both it and this License would be to |
refrain entirely from distribution of the Program. |
If any portion of this section is held invalid or unenforceable under |
any particular circumstance, the balance of the section is intended to |
apply and the section as a whole is intended to apply in other |
circumstances. |
It is not the purpose of this section to induce you to infringe any |
patents or other property right claims or to contest validity of any |
such claims; this section has the sole purpose of protecting the |
integrity of the free software distribution system, which is |
implemented by public license practices. Many people have made |
generous contributions to the wide range of software distributed |
through that system in reliance on consistent application of that |
system; it is up to the author/donor to decide if he or she is willing |
to distribute software through any other system and a licensee cannot |
impose that choice. |
This section is intended to make thoroughly clear what is believed to |
be a consequence of the rest of this License. |
8. If the distribution and/or use of the Program is restricted in |
certain countries either by patents or by copyrighted interfaces, the |
original copyright holder who places the Program under this License |
may add an explicit geographical distribution limitation excluding |
those countries, so that distribution is permitted only in or among |
countries not thus excluded. In such case, this License incorporates |
the limitation as if written in the body of this License. |
9. The Free Software Foundation may publish revised and/or new versions |
of the General Public License from time to time. Such new versions will |
be similar in spirit to the present version, but may differ in detail to |
address new problems or concerns. |
Each version is given a distinguishing version number. If the Program |
specifies a version number of this License which applies to it and "any |
later version", you have the option of following the terms and conditions |
either of that version or of any later version published by the Free |
Software Foundation. If the Program does not specify a version number of |
this License, you may choose any version ever published by the Free Software |
Foundation. |
10. If you wish to incorporate parts of the Program into other free |
programs whose distribution conditions are different, write to the author |
to ask for permission. For software which is copyrighted by the Free |
Software Foundation, write to the Free Software Foundation; we sometimes |
make exceptions for this. Our decision will be guided by the two goals |
of preserving the free status of all derivatives of our free software and |
of promoting the sharing and reuse of software generally. |
NO WARRANTY |
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY |
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN |
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES |
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED |
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS |
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE |
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, |
REPAIR OR CORRECTION. |
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING |
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR |
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, |
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING |
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED |
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY |
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER |
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE |
POSSIBILITY OF SUCH DAMAGES. |
END OF TERMS AND CONDITIONS |
How to Apply These Terms to Your New Programs |
If you develop a new program, and you want it to be of the greatest |
possible use to the public, the best way to achieve this is to make it |
free software which everyone can redistribute and change under these terms. |
To do so, attach the following notices to the program. It is safest |
to attach them to the start of each source file to most effectively |
convey the exclusion of warranty; and each file should have at least |
the "copyright" line and a pointer to where the full notice is found. |
<one line to give the program's name and a brief idea of what it does.> |
Copyright (C) <year> <name of author> |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 2 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
Also add information on how to contact you by electronic and paper mail. |
If the program is interactive, make it output a short notice like this |
when it starts in an interactive mode: |
Gnomovision version 69, Copyright (C) year name of author |
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. |
This is free software, and you are welcome to redistribute it |
under certain conditions; type `show c' for details. |
The hypothetical commands `show w' and `show c' should show the appropriate |
parts of the General Public License. Of course, the commands you use may |
be called something other than `show w' and `show c'; they could even be |
mouse-clicks or menu items--whatever suits your program. |
You should also get your employer (if you work as a programmer) or your |
school, if any, to sign a "copyright disclaimer" for the program, if |
necessary. Here is a sample; alter the names: |
Yoyodyne, Inc., hereby disclaims all copyright interest in the program |
`Gnomovision' (which makes passes at compilers) written by James Hacker. |
<signature of Ty Coon>, 1 April 1989 |
Ty Coon, President of Vice |
This General Public License does not permit incorporating your program into |
proprietary programs. If your program is a subroutine library, you may |
consider it more useful to permit linking proprietary applications with the |
library. If this is what you want to do, use the GNU Library General |
Public License instead of this License. |
/tags/0.3.0/boot/arch/sparc64/Makefile.inc |
---|
0,0 → 1,50 |
# |
# Copyright (c) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
TMP=distroot |
build: $(BASE)/image.iso |
$(BASE)/image.iso: depend arch/$(ARCH)/loader/image.boot |
mkdir -p $(TMP)/boot |
mkdir -p $(TMP)/HelenOS |
cat arch/$(ARCH)/silo/silo.tar.gz | (cd $(TMP)/boot; tar xvfz -) |
cp arch/$(ARCH)/silo/README arch/$(ARCH)/silo/COPYING arch/$(ARCH)/silo/silo.conf $(TMP)/boot |
cp arch/$(ARCH)/loader/image.boot $(TMP)/HelenOS/image.boot |
mkisofs -f -G $(TMP)/boot/isofs.b -B ... -r -o $(BASE)/image.iso $(TMP)/ |
depend: |
-rm arch/$(ARCH)/loader/image.boot |
arch/$(ARCH)/loader/image.boot: |
$(MAKE) -C arch/$(ARCH)/loader COMPILER=$(COMPILER) KERNELDIR=../../../$(KERNELDIR) USPACEDIR=../../../$(USPACEDIR) "DEFS=$(DEFS)" |
clean: generic_clean |
$(MAKE) -C arch/$(ARCH)/loader clean COMPILER=$(COMPILER) KERNELDIR=../../../$(KERNELDIR) USPACEDIR=../../../$(USPACEDIR) |
-rm -fr $(TMP) |
-rm -f $(BASE)/image.iso |
/tags/0.3.0/boot/arch/arm32/loader/Makefile |
---|
0,0 → 1,119 |
# |
# Copyright (c) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
include ../../../../version |
include ../../../../Makefile.config |
## Toolchain configuration |
# |
TARGET = arm-linux-gnu |
TOOLCHAIN_DIR = /usr/local/arm/bin |
ifeq ($(COMPILER),native) |
CC = gcc |
AS = as |
LD = ld |
OBJCOPY = objcopy |
OBJDUMP = objdump |
else |
CC = $(TOOLCHAIN_DIR)/$(TARGET)-gcc |
AS = $(TOOLCHAIN_DIR)/$(TARGET)-as |
LD = $(TOOLCHAIN_DIR)/$(TARGET)-ld |
OBJCOPY = $(TOOLCHAIN_DIR)/$(TARGET)-objcopy |
OBJDUMP = $(TOOLCHAIN_DIR)/$(TARGET)-objdump |
endif |
CFLAGS = -DRELEASE=\"$(RELEASE)\" -I. -I../../../generic -I../../.. -nostdinc -nostdlib -fno-builtin -Werror-implicit-function-declaration -Wmissing-prototypes -Werror -O3 |
ifdef REVISION |
CFLAGS += "-DREVISION=\"$(REVISION)\"" |
endif |
ifdef TIMESTAMP |
CFLAGS += "-DTIMESTAMP=\"$(TIMESTAMP)\"" |
endif |
ifdef MACHINE |
CFLAGS += "-DMACHINE=$(MACHINE)" |
endif |
SOURCES = \ |
main.c \ |
boot.S \ |
asm.S \ |
mm.c \ |
../../../generic/printf.c \ |
../../../genarch/division.c |
ifeq ($(MACHINE), gxemul_testarm) |
SOURCES += print/gxemul.c |
endif |
COMPONENTS = \ |
$(KERNELDIR)/kernel.bin \ |
$(USPACEDIR)/srv/ns/ns \ |
$(USPACEDIR)/srv/kbd/kbd \ |
$(USPACEDIR)/srv/console/console \ |
$(USPACEDIR)/srv/fb/fb \ |
$(USPACEDIR)/srv/vfs/vfs \ |
$(USPACEDIR)/srv/fs/tmpfs/tmpfs \ |
$(USPACEDIR)/srv/fs/fat/fat \ |
$(USPACEDIR)/srv/devmap/devmap \ |
$(USPACEDIR)/app/init/init \ |
$(USPACEDIR)/app/tester/tester \ |
$(USPACEDIR)/app/klog/klog \ |
$(USPACEDIR)/app/tetris/tetris |
OBJECTS := $(addsuffix .o,$(basename $(SOURCES))) |
COMPONENT_OBJECTS := $(addsuffix .o,$(basename $(notdir $(COMPONENTS)))) |
.PHONY: all clean depend |
all: image.boot |
-include Makefile.depend |
image.boot: depend _components.h _link.ld $(OBJECTS) $(COMPONENT_OBJECTS) |
$(LD) -no-check-sections -N -T _link.ld $(COMPONENT_OBJECTS) $(OBJECTS) -o $@ |
depend: |
-makedepend $(DEFS) $(CFLAGS) -f - $(SOURCES) > Makefile.depend 2> /dev/null |
clean: |
-rm -f _components.h _link.ld $(COMPONENT_OBJECTS) $(OBJECTS) image.boot Makefile.depend |
_components.h _link.ld $(COMPONENT_OBJECTS): $(COMPONENTS) |
./pack $(IMAGE) $(OBJCOPY) $(COMPONENTS) |
%.o: %.S |
$(CC) $(DEFS) $(CFLAGS) -D__ASM__ -c $< -o $@ |
%.o: %.c |
$(CC) $(DEFS) $(CFLAGS) -c $< -o $@ |
/tags/0.3.0/boot/arch/arm32/loader/mm.h |
---|
0,0 → 1,166 |
/* |
* Copyright (c) 2007 Pavel Jancik |
* Copyright (c) 2007 Michal Kebrt |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup arm32boot |
* @{ |
*/ |
/** @file |
* @brief Memory management used while booting the kernel. |
* |
* So called "section" paging is used while booting the kernel. The term |
* "section" comes from the ARM architecture specification and stands for the |
* following: one-level paging, 1MB sized pages, 4096 entries in the page |
* table. |
*/ |
#ifndef BOOT_arm32__MM_H |
#define BOOT_arm32__MM_H |
#ifndef __ASM__ |
#include "types.h" |
#endif |
/** Frame width. */ |
#define FRAME_WIDTH 20 |
/** Frame size. */ |
#define FRAME_SIZE (1 << FRAME_WIDTH) |
/** Page size in 2-level paging which is switched on later after the kernel |
* initialization. |
*/ |
#define KERNEL_PAGE_SIZE (1 << 12) |
#ifndef __ASM__ |
/** Converts kernel address to physical address. */ |
# define KA2PA(x) (((uintptr_t) (x)) - 0x80000000) |
/** Converts physical address to kernel address. */ |
# define PA2KA(x) (((uintptr_t) (x)) + 0x80000000) |
#else |
# define KA2PA(x) ((x) - 0x80000000) |
# define PA2KA(x) ((x) + 0x80000000) |
#endif |
/** Number of entries in PTL0. */ |
#define PTL0_ENTRIES (1 << 12) /* 4096 */ |
/** Size of an entry in PTL0. */ |
#define PTL0_ENTRY_SIZE 4 |
/** Returns number of frame the address belongs to. */ |
#define ADDR2PFN(addr) (((uintptr_t) (addr)) >> FRAME_WIDTH) |
/** Describes "section" page table entry (one-level paging with 1MB sized pages). */ |
#define PTE_DESCRIPTOR_SECTION 0x2 |
/** Page table access rights: user - no access, kernel - read/write. */ |
#define PTE_AP_USER_NO_KERNEL_RW 0x1 |
#ifndef __ASM__ |
/** Page table level 0 entry - "section" format is used (one-level paging, 1MB |
* sized pages). Used only while booting the kernel. |
*/ |
typedef struct { |
unsigned descriptor_type : 2; |
unsigned bufferable : 1; |
unsigned cacheable : 1; |
unsigned impl_specific : 1; |
unsigned domain : 4; |
unsigned should_be_zero_1 : 1; |
unsigned access_permission : 2; |
unsigned should_be_zero_2 : 8; |
unsigned section_base_addr : 12; |
} __attribute__ ((packed)) pte_level0_section_t; |
/** Page table that holds 1:1 virtual to physical mapping used while booting the |
* kernel. |
*/ |
extern pte_level0_section_t page_table[PTL0_ENTRIES]; |
extern void mmu_start(void); |
/** Enables paging. */ |
static inline void enable_paging() |
{ |
/* c3 - each two bits controls access to the one of domains (16) |
* 0b01 - behave as a client (user) of a domain |
*/ |
asm volatile ( |
/* behave as a client of domains */ |
"ldr r0, =0x55555555\n" |
"mcr p15, 0, r0, c3, c0, 0\n" |
/* current settings */ |
"mrc p15, 0, r0, c1, c0, 0\n" |
/* mask to enable paging */ |
"ldr r1, =0x00000001\n" |
"orr r0, r0, r1\n" |
/* store settings */ |
"mcr p15, 0, r0, c1, c0, 0\n" |
: |
: |
: "r0", "r1" |
); |
} |
/** Sets the address of level 0 page table to CP15 register 2. |
* |
* @param pt Address of a page table to set. |
*/ |
static inline void set_ptl0_address(pte_level0_section_t* pt) |
{ |
asm volatile ( |
"mcr p15, 0, %0, c2, c0, 0\n" |
: |
: "r" (pt) |
); |
} |
#endif |
#endif |
/** @} |
*/ |
/tags/0.3.0/boot/arch/arm32/loader/asm.h |
---|
0,0 → 1,72 |
/* |
* Copyright (c) 2007 Michal Kebrt |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup arm32boot |
* @{ |
*/ |
/** @file |
* @brief Functions implemented in assembly. |
*/ |
#ifndef BOOT_arm32_ASM_H |
#define BOOT_arm32_ASM_H |
/** Copies cnt bytes from dst to src. |
* |
* @param dst Destination address. |
* @param src Source address. |
* @param cnt Count of bytes to be copied. |
*/ |
#define memcpy(dst, src, cnt) __builtin_memcpy((dst), (src), (cnt)) |
/** Called when the CPU is switched on. |
* |
* This function is placed to the 0x0 address where ARM CPU starts execution. |
* Jumps to the #bootstrap only. |
*/ |
extern void start(void); |
/** Jumps to the kernel entry point. |
* |
* @param entry Kernel entry point address. |
* @param bootinfo Structure holding information about loaded tasks. |
* @param bootinfo_size Size of the bootinfo structure. |
*/ |
extern void jump_to_kernel(void *entry, void *bootinfo, |
unsigned int bootinfo_size) __attribute__((noreturn)); |
#endif |
/** @} |
*/ |
/tags/0.3.0/boot/arch/arm32/loader/main.h |
---|
0,0 → 1,77 |
/* |
* Copyright (c) 2007 Michal Kebrt |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup arm32boot |
* @{ |
*/ |
/** @file |
* @brief Boot related declarations. |
*/ |
#ifndef BOOT_arm32_MAIN_H |
#define BOOT_arm32_MAIN_H |
/** Aligns to the nearest higher address. |
* |
* @param addr Address or number to be aligned. |
* @param align Size of alignment, must be power of 2. |
*/ |
#define ALIGN_UP(addr, align) (((addr) + ((align) - 1)) & ~((align) - 1)) |
/** Maximum number of tasks in the #bootinfo_t struct. */ |
#define TASKMAP_MAX_RECORDS 32 |
/** Struct holding information about single loaded task. */ |
typedef struct { |
/** Address where the task was placed. */ |
void *addr; |
/** Size of the task's binary. */ |
unsigned int size; |
} task_t; |
/** Struct holding information about loaded tasks. */ |
typedef struct { |
/** Number of loaded tasks. */ |
unsigned int cnt; |
/** Array of loaded tasks. */ |
task_t tasks[TASKMAP_MAX_RECORDS]; |
} bootinfo_t; |
extern void bootstrap(void); |
#endif |
/** @} |
*/ |
/tags/0.3.0/boot/arch/arm32/loader/mm.c |
---|
0,0 → 1,95 |
/* |
* Copyright (c) 2007 Pavel Jancik, Michal Kebrt |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup arm32boot |
* @{ |
*/ |
/** @file |
* @brief Memory management used while booting the kernel. |
*/ |
#include "mm.h" |
/** Initializes "section" page table entry. |
* |
* Will be readable/writable by kernel with no access from user mode. |
* Will belong to domain 0. No cache or buffering is enabled. |
* |
* @param pte Section entry to initialize. |
* @param frame First frame in the section (frame number). |
* |
* @note If frame is not 1MB aligned, first lower 1MB aligned frame will be |
* used. |
*/ |
static void init_pte_level0_section(pte_level0_section_t* pte, |
unsigned int frame) |
{ |
pte->descriptor_type = PTE_DESCRIPTOR_SECTION; |
pte->bufferable = 0; |
pte->cacheable = 0; |
pte->impl_specific = 0; |
pte->domain = 0; |
pte->should_be_zero_1 = 0; |
pte->access_permission = PTE_AP_USER_NO_KERNEL_RW; |
pte->should_be_zero_2 = 0; |
pte->section_base_addr = frame; |
} |
/** Initializes page table used while booting the kernel. */ |
static void init_page_table(void) |
{ |
int i; |
const unsigned int first_kernel_page = ADDR2PFN(PA2KA(0)); |
/* Create 1:1 virtual-physical mapping (in lower 2GB). */ |
for (i = 0; i < first_kernel_page; i++) { |
init_pte_level0_section(&page_table[i], i); |
} |
/* |
* Create 1:1 virtual-physical mapping in kernel space (upper 2GB), |
* physical addresses start from 0. |
*/ |
for (i = first_kernel_page; i < PTL0_ENTRIES; i++) { |
init_pte_level0_section(&page_table[i], i - first_kernel_page); |
} |
} |
/** Starts the MMU - initializes page table and enables paging. */ |
void mmu_start() { |
init_page_table(); |
set_ptl0_address(page_table); |
enable_paging(); |
} |
/** @} |
*/ |
/tags/0.3.0/boot/arch/arm32/loader/types.h |
---|
0,0 → 1,59 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup arm32boot |
* @{ |
*/ |
/** @file |
* @brief Definitions of basic types like #uintptr_t. |
*/ |
#ifndef BOOT_arm32_TYPES_H |
#define BOOT_arm32_TYPES_H |
#include <gentypes.h> |
typedef signed char int8_t; |
typedef unsigned char uint8_t; |
typedef unsigned short uint16_t; |
typedef unsigned int uint32_t; |
typedef unsigned long long uint64_t; |
typedef uint32_t uintptr_t; |
typedef uint32_t unative_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/boot/arch/arm32/loader/print/gxemul.c |
---|
0,0 → 1,70 |
/* |
* Copyright (c) 2007 Michal Kebrt |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup arm32boot |
* @{ |
*/ |
/** @file |
* @brief GXemul specific code. |
*/ |
#include <printf.h> |
/** Address where characters to be printed are expected. */ |
#define PUTC_ADDRESS 0x10000000 |
/** Prints a character to the console. |
* |
* @param ch Character to be printed. |
*/ |
static void putc(char ch) |
{ |
*((volatile char *) PUTC_ADDRESS) = ch; |
} |
/** Prints a string to the console. |
* |
* @param str String to be printed. |
* @param len Number of characters to be printed. |
*/ |
void write(const char *str, const int len) |
{ |
int i; |
for (i = 0; i < len; ++i) { |
putc(str[i]); |
} |
} |
/** @} |
*/ |
/tags/0.3.0/boot/arch/arm32/loader/pack |
---|
0,0 → 1,139 |
#! /bin/sh |
# |
# Copyright (C) 2007 Michal Kebrt |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
OBJCOPY="$1" |
LINK="_link.ld" |
HEADER="_components.h" |
shift 1 |
echo "OUTPUT_FORMAT(\"elf32-littlearm\") |
ENTRY(start) |
SECTIONS { |
.boot 0x0: AT (0) { |
*(BOOTSTRAP); |
*(.text); |
*(.rodata); |
*(.rodata.*); |
*(.data); /* initialized data */ |
*(.sdata); |
*(.sdata2); |
*(.sbss); |
*(.scommon); |
*(.bss); /* uninitialized static variables */ |
*(COMMON); /* global variables */ |
*(.reginfo); |
. = 0x4000; |
*(PT); /* page table placed at 0x4000 */" > "$LINK" |
echo ' |
/** @addtogroup arm32boot |
* @{ |
*/ |
/** @file |
* @brief Components (kernel + tasks) related declarations. |
* |
* Generated by the <code>pack</code> script. This script packs all the |
* components (kernel + tasks) into one image (image.boot) and generates |
* a code that initializes an array of #component_t structs. |
*/ |
#ifndef ___COMPONENTS_H__ |
#define ___COMPONENTS_H__ |
/** Holds information about components packed to one image (kernel + tasks). */ |
typedef struct { |
/** Name. */ |
char *name; |
/** Start address. */ |
void *start; |
/** End address. */ |
void *end; |
/** Size (in bytes). */ |
unsigned int size; |
} component_t; |
/** @} |
*/ |
' > "$HEADER" |
COUNT="0" |
DATA="" |
for TASK in "$@" ; do |
BASENAME="`basename "$TASK" | sed 's/^\(.*\)\.[^.]*$/\1/'`" |
OBJECT="${BASENAME}.o" |
SYMBOL="`echo "_binary_$TASK" | tr "./" "__"`" |
MACRO="`echo "$BASENAME" | tr [:lower:] [:upper:]`" |
echo "$TASK -> $OBJECT" |
echo " |
. = ALIGN(4096); |
*(.${BASENAME}_image);" >> "$LINK" |
echo " |
extern int ${SYMBOL}_start; |
extern int ${SYMBOL}_end; |
#define ${MACRO}_START ((void *) &${SYMBOL}_start) |
#define ${MACRO}_END ((void *) &${SYMBOL}_end) |
#define ${MACRO}_SIZE ((unsigned int) ${MACRO}_END - (unsigned int) ${MACRO}_START)" >> "$HEADER" |
"$OBJCOPY" -I binary -O elf32-littlearm -B arm --rename-section ".data=.${BASENAME}_image" "$TASK" "$OBJECT" |
DATA="${DATA} |
components[$COUNT].name = \"${BASENAME}\"; |
components[$COUNT].start = ${MACRO}_START; |
components[$COUNT].end = ${MACRO}_END; |
components[$COUNT].size = ${MACRO}_SIZE;"; |
COUNT="`expr "$COUNT" + 1`" |
done |
echo ' } |
}' >> "$LINK" |
echo " |
#define COMPONENTS $COUNT |
/** Initializes array of components. */ |
static void init_components(component_t components[]) |
{ |
$DATA |
} |
#endif |
" >> "$HEADER" |
Property changes: |
Added: svn:executable |
+* |
\ No newline at end of property |
/tags/0.3.0/boot/arch/arm32/loader/main.c |
---|
0,0 → 1,115 |
/* |
* Copyright (c) 2007 Michal Kebrt |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup arm32boot |
* @{ |
*/ |
/** @file |
* @brief Bootstrap. |
*/ |
#include "main.h" |
#include "asm.h" |
#include "_components.h" |
#include <printf.h> |
#include "mm.h" |
/** Kernel entry point address. */ |
#define KERNEL_VIRTUAL_ADDRESS 0x80200000 |
char *release = RELEASE; |
#ifdef REVISION |
char *revision = ", revision " REVISION; |
#else |
char *revision = ""; |
#endif |
#ifdef TIMESTAMP |
char *timestamp = "\nBuilt on " TIMESTAMP; |
#else |
char *timestamp = ""; |
#endif |
/** Prints bootloader version information. */ |
static void version_print(void) |
{ |
printf("HelenOS ARM32 Bootloader\nRelease %s%s%s\nCopyright (c) 2007 HelenOS project\n", |
release, revision, timestamp); |
} |
/** Copies all images (kernel + user tasks) to #KERNEL_VIRTUAL_ADDRESS and jumps there. */ |
void bootstrap(void) |
{ |
mmu_start(); |
version_print(); |
component_t components[COMPONENTS]; |
bootinfo_t bootinfo; |
init_components(components); |
printf("\nMemory statistics\n"); |
printf(" kernel entry point at %L\n", KERNEL_VIRTUAL_ADDRESS); |
printf(" %L: boot info structure\n", &bootinfo); |
unsigned int i, j; |
for (i = 0; i < COMPONENTS; i++) { |
printf(" %L: %s image (size %d bytes)\n", |
components[i].start, components[i].name, components[i].size); |
} |
printf("\nCopying components\n"); |
unsigned int top = 0; |
bootinfo.cnt = 0; |
for (i = 0; i < COMPONENTS; i++) { |
printf(" %s...", components[i].name); |
top = ALIGN_UP(top, KERNEL_PAGE_SIZE); |
memcpy(((void *) KERNEL_VIRTUAL_ADDRESS) + top, components[i].start, components[i].size); |
if (i > 0) { |
bootinfo.tasks[bootinfo.cnt].addr = ((void *) KERNEL_VIRTUAL_ADDRESS) + top; |
bootinfo.tasks[bootinfo.cnt].size = components[i].size; |
bootinfo.cnt++; |
} |
top += components[i].size; |
printf("done.\n"); |
} |
printf("\nBooting the kernel...\n"); |
jump_to_kernel((void *) KERNEL_VIRTUAL_ADDRESS, &bootinfo, sizeof(bootinfo)); |
} |
/** @} |
*/ |
/tags/0.3.0/boot/arch/arm32/loader/asm.S |
---|
0,0 → 1,85 |
# |
# Copyright (c) 2007 Michal Kebrt |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
.text |
.global memcpy |
memcpy: |
add r3, r1, #3 |
bic r3, r3, #3 |
cmp r1, r3 |
stmdb sp!, {r4, lr} |
beq 4f |
1: |
cmp r2, #0 |
movne ip, #0 |
beq 3f |
2: |
ldrb r3, [ip, r1] |
strb r3, [ip, r0] |
add ip, ip, #1 |
cmp ip, r2 |
bne 2b |
3: |
mov r0, r1 |
ldmia sp!, {r4, pc} |
4: |
add r3, r0, #3 |
bic r3, r3, #3 |
cmp r0, r3 |
bne 1b |
movs r4, r2, lsr #2 |
moveq lr, r4 |
beq 6f |
mov lr, #0 |
mov ip, lr |
5: |
ldr r3, [ip, r1] |
add lr, lr, #1 |
cmp lr, r4 |
str r3, [ip, r0] |
add ip, ip, #4 |
bne 5b |
6: |
ands r4, r2, #3 |
beq 3b |
mov r3, lr, lsl #2 |
add r0, r3, r0 |
add ip, r3, r1 |
mov r2, #0 |
7: |
ldrb r3, [r2, ip] |
strb r3, [r2, r0] |
add r2, r2, #1 |
cmp r2, r4 |
bne 7b |
b 3b |
/tags/0.3.0/boot/arch/arm32/loader/boot.S |
---|
0,0 → 1,52 |
# |
# Copyright (c) 2007 Michal Kebrt |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
#include "mm.h" |
.section BOOTSTRAP |
.global start |
.global jump_to_kernel |
.global page_table |
start: |
b bootstrap |
jump_to_kernel: |
bx r0 |
# place page_table to PT section |
.section PT |
# make place for PTL0 page table |
page_table: |
.skip PTL0_ENTRIES * PTL0_ENTRY_SIZE |
/tags/0.3.0/boot/arch/arm32/Makefile.inc |
---|
0,0 → 1,42 |
# |
# Copyright (c) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
build: $(BASE)/image.boot |
$(BASE)/image.boot: depend arch/$(ARCH)/loader/image.boot |
cp arch/$(ARCH)/loader/image.boot $(BASE)/image.boot |
depend: |
-rm arch/$(ARCH)/loader/image.boot |
arch/$(ARCH)/loader/image.boot: |
make -C arch/$(ARCH)/loader COMPILER=$(COMPILER) KERNELDIR=../../../$(KERNELDIR) USPACEDIR=../../../$(USPACEDIR) IMAGE=$(IMAGE) |
clean: |
make -C arch/$(ARCH)/loader clean COMPILER=$(COMPILER) KERNELDIR=../../../$(KERNELDIR) USPACEDIR=../../../$(USPACEDIR) IMAGE=$(IMAGE) |
-rm -f $(BASE)/image.boot |
/tags/0.3.0/boot/arch/ppc32/loader/Makefile |
---|
0,0 → 1,120 |
# |
# Copyright (c) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
include ../../../../version |
include ../../../Makefile.config |
## Toolchain configuration |
# |
TARGET = ppc-linux-gnu |
TOOLCHAIN_DIR = /usr/local/ppc/bin |
ifeq ($(COMPILER),gcc_native) |
CC = gcc |
AS = as |
LD = ld |
OBJCOPY = objcopy |
OBJDUMP = objdump |
endif |
ifeq ($(COMPILER),icc_native) |
CC = icc |
AS = as |
LD = ld |
OBJCOPY = objcopy |
OBJDUMP = objdump |
endif |
ifeq ($(COMPILER),gcc_cross) |
CC = $(TOOLCHAIN_DIR)/$(TARGET)-gcc |
AS = $(TOOLCHAIN_DIR)/$(TARGET)-as |
LD = $(TOOLCHAIN_DIR)/$(TARGET)-ld |
OBJCOPY = $(TOOLCHAIN_DIR)/$(TARGET)-objcopy |
OBJDUMP = $(TOOLCHAIN_DIR)/$(TARGET)-objdump |
endif |
CFLAGS = -DRELEASE=\"$(RELEASE)\" -I. -I../../../generic -I../../../genarch -nostdinc -nostdlib -fno-builtin -Werror-implicit-function-declaration -Wmissing-prototypes -Werror -O3 -mcpu=powerpc -msoft-float -m32 |
ifdef REVISION |
CFLAGS += "-DREVISION=\"$(REVISION)\"" |
endif |
ifdef TIMESTAMP |
CFLAGS += "-DTIMESTAMP=\"$(TIMESTAMP)\"" |
endif |
SOURCES = \ |
main.c \ |
ofwarch.c \ |
../../../genarch/ofw.c \ |
../../../generic/printf.c \ |
asm.S \ |
boot.S |
COMPONENTS = \ |
$(KERNELDIR)/kernel.bin \ |
$(USPACEDIR)/srv/ns/ns \ |
$(USPACEDIR)/srv/fb/fb \ |
$(USPACEDIR)/srv/kbd/kbd \ |
$(USPACEDIR)/srv/console/console \ |
$(USPACEDIR)/srv/vfs/vfs \ |
$(USPACEDIR)/srv/fs/tmpfs/tmpfs \ |
$(USPACEDIR)/srv/fs/fat/fat \ |
$(USPACEDIR)/srv/devmap/devmap \ |
$(USPACEDIR)/app/init/init \ |
$(USPACEDIR)/app/tetris/tetris \ |
$(USPACEDIR)/app/tester/tester \ |
$(USPACEDIR)/app/klog/klog |
OBJECTS := $(addsuffix .o,$(basename $(SOURCES))) |
COMPONENT_OBJECTS := $(addsuffix .o,$(basename $(notdir $(COMPONENTS)))) |
.PHONY: all clean depend |
all: image.boot |
-include Makefile.depend |
image.boot: depend _components.h _link.ld $(COMPONENT_OBJECTS) $(OBJECTS) |
$(LD) -no-check-sections -N -T _link.ld $(COMPONENT_OBJECTS) $(OBJECTS) -o $@ |
depend: |
-makedepend $(DEFS) $(CFLAGS) -f - $(SOURCES) > Makefile.depend 2> /dev/null |
clean: |
-rm -f _components.h _link.ld $(COMPONENT_OBJECTS) $(OBJECTS) image.boot Makefile.depend |
_components.h _link.ld $(COMPONENT_OBJECTS): $(COMPONENTS) |
./pack $(OBJCOPY) $(COMPONENTS) |
%.o: %.S |
$(CC) $(DEFS) $(CFLAGS) -D__ASM__ -c $< -o $@ |
%.o: %.c |
$(CC) $(DEFS) $(CFLAGS) -c $< -o $@ |
/tags/0.3.0/boot/arch/ppc32/loader/ofwarch.h |
---|
0,0 → 1,35 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#ifndef BOOT_ppc32_OFWARCH_H_ |
#define BOOT_ppc32_OFWARCH_H_ |
#define OFW_ADDRESS_CELLS 1 |
#define OFW_SIZE_CELLS 1 |
#endif |
/tags/0.3.0/boot/arch/ppc32/loader/asm.S |
---|
0,0 → 1,383 |
# |
# Copyright (c) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
#include "asm.h" |
#include "regname.h" |
#include "debug.inc" |
.text |
.global halt |
.global memcpy |
.global jump_to_kernel |
halt: |
b halt |
memcpy: |
srwi. r7, r5, 3 |
addi r6, r3, -4 |
addi r4, r4, -4 |
beq 2f |
andi. r0, r6, 3 |
mtctr r7 |
bne 5f |
1: |
lwz r7, 4(r4) |
lwzu r8, 8(r4) |
stw r7, 4(r6) |
stwu r8, 8(r6) |
bdnz 1b |
andi. r5, r5, 7 |
2: |
cmplwi 0, r5, 4 |
blt 3f |
lwzu r0, 4(r4) |
addi r5, r5, -4 |
stwu r0, 4(r6) |
3: |
cmpwi 0, r5, 0 |
beqlr |
mtctr r5 |
addi r4, r4, 3 |
addi r6, r6, 3 |
4: |
lbzu r0, 1(r4) |
stbu r0, 1(r6) |
bdnz 4b |
blr |
5: |
subfic r0, r0, 4 |
mtctr r0 |
6: |
lbz r7, 4(r4) |
addi r4, r4, 1 |
stb r7, 4(r6) |
addi r6, r6, 1 |
bdnz 6b |
subf r5, r0, r5 |
rlwinm. r7, r5, 32-3, 3, 31 |
beq 2b |
mtctr r7 |
b 1b |
jump_to_kernel: |
# r3 = bootinfo (pa) |
# r4 = bootinfo_size |
# r5 = trans (pa) |
# r6 = bytes to copy |
# r7 = real_mode (pa) |
# r8 = framebuffer (pa) |
# r9 = scanline |
# disable interrupts |
mfmsr r31 |
rlwinm r31, r31, 0, 17, 15 |
mtmsr r31 |
# set real_mode meeting point address |
mtspr srr0, r7 |
# jumps to real_mode |
mfmsr r31 |
lis r30, ~0@h |
ori r30, r30, ~(msr_ir | msr_dr | msr_ee)@l |
and r31, r31, r30 |
mtspr srr1, r31 |
sync |
isync |
rfi |
.section REALMODE, "ax" |
.align PAGE_WIDTH |
.global real_mode |
real_mode: |
DEBUG_INIT |
DEBUG_real_mode |
# copy kernel to proper location |
# |
# r5 = trans (pa) |
# r6 = bytes to copy |
# r8 = framebuffer (pa) |
# r9 = scanline |
li r31, PAGE_SIZE >> 2 |
li r30, 0 |
page_copy: |
cmpwi r6, 0 |
beq copy_end |
# copy page |
mtctr r31 |
lwz r29, 0(r5) |
DEBUG_INIT |
DEBUG_copy_loop |
copy_loop: |
lwz r28, 0(r29) |
stw r28, 0(r30) |
addi r29, r29, 4 |
addi r30, r30, 4 |
subi r6, r6, 4 |
cmpwi r6, 0 |
beq copy_end |
bdnz copy_loop |
DEBUG_end_copy_loop |
addi r5, r5, 4 |
b page_copy |
copy_end: |
DEBUG_segments |
# initially fill segment registers |
li r31, 0 |
li r29, 8 |
mtctr r29 |
li r30, 0 # ASID 0 (VSIDs 0 .. 7) |
seg_fill_uspace: |
mtsrin r30, r31 |
addi r30, r30, 1 |
addis r31, r31, 0x1000 # move to next SR |
bdnz seg_fill_uspace |
li r29, 8 |
mtctr r29 |
lis r30, 0x4000 # priviledged access only |
ori r30, r30, 8 # ASID 0 (VSIDs 8 .. 15) |
seg_fill_kernel: |
mtsrin r30, r31 |
addi r30, r30, 1 |
addis r31, r31, 0x1000 # move to next SR |
bdnz seg_fill_kernel |
# invalidate block address translation registers |
DEBUG_bat |
li r30, 0 |
mtspr ibat0u, r30 |
mtspr ibat0l, r30 |
mtspr ibat1u, r30 |
mtspr ibat1l, r30 |
mtspr ibat2u, r30 |
mtspr ibat2l, r30 |
mtspr ibat3u, r30 |
mtspr ibat3l, r30 |
mtspr dbat0u, r30 |
mtspr dbat0l, r30 |
mtspr dbat1u, r30 |
mtspr dbat1l, r30 |
mtspr dbat2u, r30 |
mtspr dbat2l, r30 |
mtspr dbat3u, r30 |
mtspr dbat3l, r30 |
# create empty Page Hash Table |
# on top of memory, size 64 KB |
DEBUG_pht |
lwz r31, 0(r3) # r31 = memory size |
lis r30, 65536@h |
ori r30, r30, 65536@l # r30 = 65536 |
subi r29, r30, 1 # r29 = 65535 |
sub r31, r31, r30 |
andc r31, r31, r29 # pht = ALIGN_DOWN(memory_size - 65536, 65536) |
mtsdr1 r31 |
li r29, 2 |
srw r30, r30, r29 # r30 = 16384 |
li r29, 0 |
pht_clear: |
# write zeroes |
stw r29, 0(r31) |
addi r31, r31, 4 |
subi r30, r30, 4 |
cmpwi r30, 0 |
beq clear_end |
bdnz pht_clear |
DEBUG_end_pht_clear |
clear_end: |
#ifdef CONFIG_BAT |
# create BAT identity mapping |
DEBUG_mapping |
lwz r31, 0(r3) # r31 = memory size |
lis r29, 0x0002 |
cmpw r31, r29 |
blt no_bat # less than 128 KB -> no BAT |
li r29, 18 |
srw r31, r31, r29 # r31 = total >> 18 |
# create Block Length mask by replicating |
# the leading logical one 14 times |
li r29, 14 |
mtctr r31 |
li r29, 1 |
bat_mask: |
srw r30, r31, r29 # r30 = mask >> 1 |
or r31, r31, r30 # mask = mask | r30 |
bdnz bat_mask |
DEBUG_bat_mask |
andi. r31, r31, 0x07ff # mask = mask & 0x07ff (BAT can map up to 256 MB) |
li r29, 2 |
slw r31, r31, r29 # mask = mask << 2 |
ori r31, r31, 0x0002 # mask = mask | 0x0002 (priviledged access only) |
lis r29, 0x8000 |
or r29, r29, r31 |
lis r30, 0x0000 |
ori r30, r30, 0x0002 |
mtspr ibat0u, r29 |
mtspr ibat0l, r30 |
mtspr dbat0u, r29 |
mtspr dbat0l, r30 |
no_bat: |
#endif |
DEBUG_tlb |
tlbia |
tlbsync |
DEBUG_prepare |
# start the kernel |
# |
# pc = KERNEL_START_ADDR |
# r3 = bootinfo (pa) |
# sprg0 = KA2PA(KERNEL_START_ADDR) |
# sprg3 = physical memory size |
# sp = 0 (pa) |
lis r31, KERNEL_START_ADDR@ha |
addi r31, r31, KERNEL_START_ADDR@l |
mtspr srr0, r31 |
subis r31, r31, 0x8000 |
mtsprg0 r31 |
lwz r31, 0(r3) |
mtsprg3 r31 |
li sp, 0 |
mfmsr r31 |
ori r31, r31, (msr_ir | msr_dr)@l |
mtspr srr1, r31 |
sync |
isync |
DEBUG_rfi |
rfi |
.align PAGE_WIDTH |
.global trans |
trans: |
.space (TRANS_SIZE * TRANS_ITEM_SIZE) |
/tags/0.3.0/boot/arch/ppc32/loader/boot.S |
---|
0,0 → 1,42 |
# |
# Copyright (c) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
#include "regname.h" |
.section BOOTSTRAP, "ax" |
.global start |
start: |
lis r4, ofw_cif@ha |
addi r4, r4, ofw_cif@l |
stw r5, 0(r4) |
bl ofw_init |
b bootstrap |
/tags/0.3.0/boot/arch/ppc32/loader/regname.h |
---|
0,0 → 1,221 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#ifndef __ppc32_REGNAME_H__ |
#define __ppc32_REGNAME_H__ |
/* Condition Register Bit Fields */ |
#define cr0 0 |
#define cr1 1 |
#define cr2 2 |
#define cr3 3 |
#define cr4 4 |
#define cr5 5 |
#define cr6 6 |
#define cr7 7 |
/* General Purpose Registers (GPRs) */ |
#define r0 0 |
#define r1 1 |
#define r2 2 |
#define r3 3 |
#define r4 4 |
#define r5 5 |
#define r6 6 |
#define r7 7 |
#define r8 8 |
#define r9 9 |
#define r10 10 |
#define r11 11 |
#define r12 12 |
#define r13 13 |
#define r14 14 |
#define r15 15 |
#define r16 16 |
#define r17 17 |
#define r18 18 |
#define r19 19 |
#define r20 20 |
#define r21 21 |
#define r22 22 |
#define r23 23 |
#define r24 24 |
#define r25 25 |
#define r26 26 |
#define r27 27 |
#define r28 28 |
#define r29 29 |
#define r30 30 |
#define r31 31 |
/* GPR Aliases */ |
#define sp 1 |
/* Floating Point Registers (FPRs) */ |
#define fr0 0 |
#define fr1 1 |
#define fr2 2 |
#define fr3 3 |
#define fr4 4 |
#define fr5 5 |
#define fr6 6 |
#define fr7 7 |
#define fr8 8 |
#define fr9 9 |
#define fr10 10 |
#define fr11 11 |
#define fr12 12 |
#define fr13 13 |
#define fr14 14 |
#define fr15 15 |
#define fr16 16 |
#define fr17 17 |
#define fr18 18 |
#define fr19 19 |
#define fr20 20 |
#define fr21 21 |
#define fr22 22 |
#define fr23 23 |
#define fr24 24 |
#define fr25 25 |
#define fr26 26 |
#define fr27 27 |
#define fr28 28 |
#define fr29 29 |
#define fr30 30 |
#define fr31 31 |
#define vr0 0 |
#define vr1 1 |
#define vr2 2 |
#define vr3 3 |
#define vr4 4 |
#define vr5 5 |
#define vr6 6 |
#define vr7 7 |
#define vr8 8 |
#define vr9 9 |
#define vr10 10 |
#define vr11 11 |
#define vr12 12 |
#define vr13 13 |
#define vr14 14 |
#define vr15 15 |
#define vr16 16 |
#define vr17 17 |
#define vr18 18 |
#define vr19 19 |
#define vr20 20 |
#define vr21 21 |
#define vr22 22 |
#define vr23 23 |
#define vr24 24 |
#define vr25 25 |
#define vr26 26 |
#define vr27 27 |
#define vr28 28 |
#define vr29 29 |
#define vr30 30 |
#define vr31 31 |
#define evr0 0 |
#define evr1 1 |
#define evr2 2 |
#define evr3 3 |
#define evr4 4 |
#define evr5 5 |
#define evr6 6 |
#define evr7 7 |
#define evr8 8 |
#define evr9 9 |
#define evr10 10 |
#define evr11 11 |
#define evr12 12 |
#define evr13 13 |
#define evr14 14 |
#define evr15 15 |
#define evr16 16 |
#define evr17 17 |
#define evr18 18 |
#define evr19 19 |
#define evr20 20 |
#define evr21 21 |
#define evr22 22 |
#define evr23 23 |
#define evr24 24 |
#define evr25 25 |
#define evr26 26 |
#define evr27 27 |
#define evr28 28 |
#define evr29 29 |
#define evr30 30 |
#define evr31 31 |
/* Special Purpose Registers (SPRs) */ |
#define xer 1 |
#define lr 8 |
#define ctr 9 |
#define dec 22 |
#define sdr1 25 |
#define srr0 26 |
#define srr1 27 |
#define sprg0 272 |
#define sprg1 273 |
#define sprg2 274 |
#define sprg3 275 |
#define prv 287 |
#define ibat0u 528 |
#define ibat0l 529 |
#define ibat1u 530 |
#define ibat1l 531 |
#define ibat2u 532 |
#define ibat2l 533 |
#define ibat3u 534 |
#define ibat3l 535 |
#define dbat0u 536 |
#define dbat0l 537 |
#define dbat1u 538 |
#define dbat1l 539 |
#define dbat2u 540 |
#define dbat2l 541 |
#define dbat3u 542 |
#define dbat3l 543 |
#define hid0 1008 |
/* MSR bits */ |
#define msr_ir (1 << 4) |
#define msr_dr (1 << 5) |
#define msr_ee (1 << 15) |
/* HID0 bits */ |
#define hid0_ice (1 << 15) |
#define hid0_dce (1 << 14) |
#define hid0_icfi (1 << 11) |
#define hid0_dci (1 << 10) |
#endif |
/tags/0.3.0/boot/arch/ppc32/loader/main.c |
---|
0,0 → 1,181 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#include "main.h" |
#include <printf.h> |
#include "asm.h" |
#include "_components.h" |
#include <ofw.h> |
#include <align.h> |
#define HEAP_GAP 1024000 |
bootinfo_t bootinfo; |
static void check_align(const void *addr, const char *desc) |
{ |
if ((unsigned int) addr % PAGE_SIZE != 0) { |
printf("Error: %s not on page boundary, halting.\n", desc); |
halt(); |
} |
} |
static void fix_overlap(void *va, void **pa, const char *desc, unsigned int *top) |
{ |
if ((unsigned int) *pa + PAGE_SIZE < *top) { |
printf("Warning: %s overlaps kernel physical area\n", desc); |
void *new_va = (void *) (ALIGN_UP((unsigned int) KERNEL_END + HEAP_GAP, PAGE_SIZE) + *top); |
void *new_pa = (void *) (HEAP_GAP + *top); |
*top += PAGE_SIZE; |
if (ofw_map(new_pa, new_va, PAGE_SIZE, 0) != 0) { |
printf("Error: Unable to map page aligned memory at %L (physical %L), halting.\n", new_va, new_pa); |
halt(); |
} |
if ((unsigned int) new_pa + PAGE_SIZE < KERNEL_SIZE) { |
printf("Error: %s cannot be relocated, halting.\n", desc); |
halt(); |
} |
printf("Relocating %L -> %L (physical %L -> %L)\n", va, new_va, *pa, new_pa); |
*pa = new_pa; |
memcpy(new_va, va, PAGE_SIZE); |
} |
} |
char *release = RELEASE; |
#ifdef REVISION |
char *revision = ", revision " REVISION; |
#else |
char *revision = ""; |
#endif |
#ifdef TIMESTAMP |
char *timestamp = "\nBuilt on " TIMESTAMP; |
#else |
char *timestamp = ""; |
#endif |
/** Print version information. */ |
static void version_print(void) |
{ |
printf("HelenOS PPC32 Bootloader\nRelease %s%s%s\nCopyright (c) 2006 HelenOS project\n", release, revision, timestamp); |
} |
void bootstrap(void) |
{ |
version_print(); |
init_components(); |
unsigned int i; |
for (i = 0; i < COMPONENTS; i++) |
check_align(components[i].start, components[i].name); |
check_align(&real_mode, "bootstrap trampoline"); |
check_align(&trans, "translation table"); |
if (!ofw_memmap(&bootinfo.memmap)) { |
printf("Error: unable to get memory map, halting.\n"); |
halt(); |
} |
if (bootinfo.memmap.total == 0) { |
printf("Error: no memory detected, halting.\n"); |
halt(); |
} |
if (!ofw_screen(&bootinfo.screen)) { |
printf("Error: unable to get screen properties, halting.\n"); |
halt(); |
} |
if (!ofw_keyboard(&bootinfo.keyboard)) { |
printf("Error: unable to get keyboard properties, halting.\n"); |
halt(); |
} |
printf("\nDevice statistics\n"); |
printf(" screen at %L, resolution %dx%d, %d bpp (scanline %d bytes)\n", bootinfo.screen.addr, bootinfo.screen.width, bootinfo.screen.height, bootinfo.screen.bpp, bootinfo.screen.scanline); |
printf(" keyboard at %L (size %d bytes)\n", bootinfo.keyboard.addr, bootinfo.keyboard.size); |
void *real_mode_pa = ofw_translate(&real_mode); |
void *trans_pa = ofw_translate(&trans); |
void *bootinfo_pa = ofw_translate(&bootinfo); |
printf("\nMemory statistics (total %d MB)\n", bootinfo.memmap.total >> 20); |
printf(" %L: boot info structure (physical %L)\n", &bootinfo, bootinfo_pa); |
printf(" %L: bootstrap trampoline (physical %L)\n", &real_mode, real_mode_pa); |
printf(" %L: translation table (physical %L)\n", &trans, trans_pa); |
for (i = 0; i < COMPONENTS; i++) |
printf(" %L: %s image (size %d bytes)\n", components[i].start, components[i].name, components[i].size); |
unsigned int top = 0; |
for (i = 0; i < COMPONENTS; i++) |
top += ALIGN_UP(components[i].size, PAGE_SIZE); |
unsigned int pages = ALIGN_UP(KERNEL_SIZE, PAGE_SIZE) >> PAGE_WIDTH; |
for (i = 0; i < pages; i++) { |
void *pa = ofw_translate(KERNEL_START + (i << PAGE_WIDTH)); |
fix_overlap(KERNEL_START + (i << PAGE_WIDTH), &pa, "kernel", &top); |
trans[i] = pa; |
} |
bootinfo.taskmap.count = 0; |
for (i = 1; i < COMPONENTS; i++) { |
unsigned int component_pages = ALIGN_UP(components[i].size, PAGE_SIZE) >> PAGE_WIDTH; |
unsigned int j; |
for (j = 0; j < component_pages; j++) { |
void *pa = ofw_translate(components[i].start + (j << PAGE_WIDTH)); |
fix_overlap(components[i].start + (j << PAGE_WIDTH), &pa, components[i].name, &top); |
trans[pages + j] = pa; |
if (j == 0) { |
bootinfo.taskmap.tasks[bootinfo.taskmap.count].addr = (void *) (pages << PAGE_WIDTH); |
bootinfo.taskmap.tasks[bootinfo.taskmap.count].size = components[i].size; |
bootinfo.taskmap.count++; |
} |
} |
pages += component_pages; |
} |
fix_overlap(&real_mode, &real_mode_pa, "bootstrap trampoline", &top); |
fix_overlap(&trans, &trans_pa, "translation table", &top); |
fix_overlap(&bootinfo, &bootinfo_pa, "boot info", &top); |
printf("\nBooting the kernel...\n"); |
jump_to_kernel(bootinfo_pa, sizeof(bootinfo), trans_pa, pages << PAGE_WIDTH, real_mode_pa, (void *) bootinfo.screen.addr, bootinfo.screen.scanline); |
} |
/tags/0.3.0/boot/arch/ppc32/loader/asm.h |
---|
0,0 → 1,52 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#ifndef BOOT_ppc32_ASM_H_ |
#define BOOT_ppc32_ASM_H_ |
#define PAGE_SIZE 4096 |
#define PAGE_WIDTH 12 |
#define TRANS_SIZE 1024 |
#define TRANS_ITEM_SIZE 4 |
#define KERNEL_START_ADDR 0x80008000 |
#ifndef __ASM__ |
#define memcpy(dst, src, cnt) __builtin_memcpy((dst), (src), (cnt)) |
extern void *trans[TRANS_SIZE]; |
extern void halt(); |
extern void jump_to_kernel(void *bootinfo, unsigned int bootinfo_size, void *trans, unsigned int kernel_size, void *real_mode, void *fb, unsigned int scanline) __attribute__((noreturn)); |
extern void real_mode(); |
#endif |
#endif |
/tags/0.3.0/boot/arch/ppc32/loader/main.h |
---|
0,0 → 1,58 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#ifndef BOOT_ppc32_MAIN_H_ |
#define BOOT_ppc32_MAIN_H_ |
#include "ofw.h" |
#define TASKMAP_MAX_RECORDS 32 |
typedef struct { |
void *addr; |
unsigned int size; |
} task_t; |
typedef struct { |
unsigned int count; |
task_t tasks[TASKMAP_MAX_RECORDS]; |
} taskmap_t; |
typedef struct { |
memmap_t memmap; |
taskmap_t taskmap; |
screen_t screen; |
keyboard_t keyboard; |
} bootinfo_t; |
extern void start(void); |
extern void bootstrap(void); |
extern memmap_t memmap; |
#endif |
/tags/0.3.0/boot/arch/ppc32/loader/ofwarch.c |
---|
0,0 → 1,68 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#include <ofwarch.h> |
#include <ofw.h> |
#include <printf.h> |
typedef int (* ofw_entry_t)(ofw_args_t *args); |
int ofw(ofw_args_t *args) |
{ |
return ((ofw_entry_t) ofw_cif)(args); |
} |
void write(const char *str, const int len) |
{ |
ofw_write(str, len); |
} |
int ofw_keyboard(keyboard_t *keyboard) |
{ |
char device_name[BUF_SIZE]; |
if (ofw_get_property(ofw_aliases, "macio", device_name, sizeof(device_name)) <= 0) |
return false; |
phandle device = ofw_find_device(device_name); |
if (device == -1) |
return false; |
pci_reg_t macio; |
if (ofw_get_property(device, "assigned-addresses", &macio, sizeof(macio)) <= 0) |
return false; |
keyboard->addr = (void *) macio.addr.addr_lo; |
keyboard->size = macio.size_lo; |
return true; |
} |
int ofw_translate_failed(ofw_arg_t flag) |
{ |
return 0; |
} |
/tags/0.3.0/boot/arch/ppc32/loader/types.h |
---|
0,0 → 1,44 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#ifndef BOOT_ppc32_TYPES_H_ |
#define BOOT_ppc32_TYPES_H_ |
#include <gentypes.h> |
typedef signed char int8_t; |
typedef unsigned char uint8_t; |
typedef unsigned short uint16_t; |
typedef unsigned int uint32_t; |
typedef unsigned long long uint64_t; |
typedef uint32_t uintptr_t; |
typedef uint32_t unative_t; |
#endif |
/tags/0.3.0/boot/arch/ppc32/loader/debug.inc |
---|
0,0 → 1,11479 |
# |
# Copyright (C) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
.macro DEBUG_INIT |
#ifdef CONFIG_DEBUG |
lis r11, 65535 |
ori r11, r11, 65535 |
lis r12, 0 |
ori r12, r12, 0 |
mr r10, r8 |
#endif |
.endm |
.macro DEBUG_real_mode |
#ifdef CONFIG_DEBUG |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r11, 108(r10) |
stw r11, 112(r10) |
stw r11, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r11, 240(r10) |
stw r11, 244(r10) |
stw r11, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r11, 112(r10) |
stw r11, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r11, 244(r10) |
stw r11, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r11, 112(r10) |
stw r11, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r11, 244(r10) |
stw r11, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r12, 12(r10) |
stw r11, 16(r10) |
stw r11, 20(r10) |
stw r11, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r11, 112(r10) |
stw r11, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r11, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r12, 176(r10) |
stw r11, 180(r10) |
stw r11, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r11, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r11, 212(r10) |
stw r11, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r11, 236(r10) |
stw r11, 240(r10) |
stw r11, 244(r10) |
stw r11, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r11, 264(r10) |
stw r11, 268(r10) |
stw r11, 272(r10) |
stw r11, 276(r10) |
stw r11, 280(r10) |
stw r12, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r11, 112(r10) |
stw r11, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r11, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r11, 176(r10) |
stw r11, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r11, 196(r10) |
stw r11, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r11, 216(r10) |
stw r11, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r11, 232(r10) |
stw r11, 236(r10) |
stw r12, 240(r10) |
stw r11, 244(r10) |
stw r11, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r11, 260(r10) |
stw r11, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r11, 280(r10) |
stw r11, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r11, 112(r10) |
stw r11, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r11, 164(r10) |
stw r11, 168(r10) |
stw r12, 172(r10) |
stw r11, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r11, 196(r10) |
stw r11, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r11, 216(r10) |
stw r11, 220(r10) |
stw r12, 224(r10) |
stw r11, 228(r10) |
stw r11, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r11, 244(r10) |
stw r11, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r11, 260(r10) |
stw r11, 264(r10) |
stw r11, 268(r10) |
stw r11, 272(r10) |
stw r11, 276(r10) |
stw r11, 280(r10) |
stw r11, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r11, 112(r10) |
stw r11, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r11, 164(r10) |
stw r11, 168(r10) |
stw r12, 172(r10) |
stw r11, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r11, 196(r10) |
stw r11, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r11, 216(r10) |
stw r11, 220(r10) |
stw r12, 224(r10) |
stw r11, 228(r10) |
stw r11, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r11, 244(r10) |
stw r11, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r11, 260(r10) |
stw r11, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r11, 112(r10) |
stw r11, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r11, 164(r10) |
stw r11, 168(r10) |
stw r12, 172(r10) |
stw r11, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r11, 196(r10) |
stw r11, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r11, 216(r10) |
stw r11, 220(r10) |
stw r12, 224(r10) |
stw r11, 228(r10) |
stw r11, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r11, 244(r10) |
stw r11, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r11, 260(r10) |
stw r11, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r11, 112(r10) |
stw r11, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r11, 164(r10) |
stw r11, 168(r10) |
stw r12, 172(r10) |
stw r11, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r11, 196(r10) |
stw r11, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r11, 216(r10) |
stw r11, 220(r10) |
stw r12, 224(r10) |
stw r11, 228(r10) |
stw r11, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r11, 244(r10) |
stw r11, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r11, 260(r10) |
stw r11, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r11, 280(r10) |
stw r11, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r11, 88(r10) |
stw r11, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r11, 108(r10) |
stw r11, 112(r10) |
stw r11, 116(r10) |
stw r11, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r11, 164(r10) |
stw r11, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r11, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r11, 212(r10) |
stw r11, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r11, 232(r10) |
stw r11, 236(r10) |
stw r11, 240(r10) |
stw r12, 244(r10) |
stw r11, 248(r10) |
stw r11, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r11, 264(r10) |
stw r11, 268(r10) |
stw r11, 272(r10) |
stw r11, 276(r10) |
stw r11, 280(r10) |
stw r12, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r11, 132(r10) |
stw r11, 136(r10) |
stw r11, 140(r10) |
stw r11, 144(r10) |
stw r11, 148(r10) |
stw r11, 152(r10) |
stw r11, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
#endif |
.endm |
.macro DEBUG_copy_loop |
#ifdef CONFIG_DEBUG |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r11, 172(r10) |
stw r11, 176(r10) |
stw r11, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r11, 176(r10) |
stw r11, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r11, 176(r10) |
stw r11, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r11, 20(r10) |
stw r11, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r12, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r11, 100(r10) |
stw r11, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r11, 120(r10) |
stw r11, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r11, 176(r10) |
stw r11, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r11, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r11, 212(r10) |
stw r11, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r11, 232(r10) |
stw r11, 236(r10) |
stw r11, 240(r10) |
stw r11, 244(r10) |
stw r11, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r11, 260(r10) |
stw r11, 264(r10) |
stw r12, 268(r10) |
stw r11, 272(r10) |
stw r11, 276(r10) |
stw r11, 280(r10) |
stw r12, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r11, 88(r10) |
stw r11, 92(r10) |
stw r12, 96(r10) |
stw r11, 100(r10) |
stw r11, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r11, 120(r10) |
stw r11, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r11, 176(r10) |
stw r11, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r11, 196(r10) |
stw r11, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r11, 216(r10) |
stw r11, 220(r10) |
stw r12, 224(r10) |
stw r11, 228(r10) |
stw r11, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r11, 248(r10) |
stw r11, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r11, 264(r10) |
stw r11, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r11, 280(r10) |
stw r11, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r11, 88(r10) |
stw r11, 92(r10) |
stw r12, 96(r10) |
stw r11, 100(r10) |
stw r11, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r11, 120(r10) |
stw r11, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r11, 176(r10) |
stw r11, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r11, 196(r10) |
stw r11, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r11, 216(r10) |
stw r11, 220(r10) |
stw r12, 224(r10) |
stw r11, 228(r10) |
stw r11, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r11, 248(r10) |
stw r11, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r11, 264(r10) |
stw r11, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r11, 280(r10) |
stw r11, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r11, 88(r10) |
stw r11, 92(r10) |
stw r12, 96(r10) |
stw r11, 100(r10) |
stw r11, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r11, 120(r10) |
stw r11, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r11, 176(r10) |
stw r11, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r11, 196(r10) |
stw r11, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r11, 216(r10) |
stw r11, 220(r10) |
stw r12, 224(r10) |
stw r11, 228(r10) |
stw r11, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r11, 248(r10) |
stw r11, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r11, 264(r10) |
stw r11, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r11, 280(r10) |
stw r11, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r11, 88(r10) |
stw r11, 92(r10) |
stw r12, 96(r10) |
stw r11, 100(r10) |
stw r11, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r11, 120(r10) |
stw r11, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r11, 176(r10) |
stw r11, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r11, 196(r10) |
stw r11, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r11, 216(r10) |
stw r11, 220(r10) |
stw r12, 224(r10) |
stw r11, 228(r10) |
stw r11, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r11, 248(r10) |
stw r11, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r11, 264(r10) |
stw r11, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r11, 280(r10) |
stw r11, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r11, 88(r10) |
stw r11, 92(r10) |
stw r12, 96(r10) |
stw r11, 100(r10) |
stw r11, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r11, 120(r10) |
stw r11, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r11, 176(r10) |
stw r11, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r11, 196(r10) |
stw r11, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r11, 216(r10) |
stw r11, 220(r10) |
stw r12, 224(r10) |
stw r11, 228(r10) |
stw r11, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r11, 248(r10) |
stw r11, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r11, 264(r10) |
stw r11, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r11, 280(r10) |
stw r11, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r11, 20(r10) |
stw r11, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r11, 104(r10) |
stw r11, 108(r10) |
stw r11, 112(r10) |
stw r11, 116(r10) |
stw r11, 120(r10) |
stw r11, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r11, 172(r10) |
stw r11, 176(r10) |
stw r11, 180(r10) |
stw r11, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r11, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r11, 212(r10) |
stw r11, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r11, 232(r10) |
stw r11, 236(r10) |
stw r11, 240(r10) |
stw r11, 244(r10) |
stw r11, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r11, 264(r10) |
stw r11, 268(r10) |
stw r11, 272(r10) |
stw r11, 276(r10) |
stw r11, 280(r10) |
stw r12, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r11, 120(r10) |
stw r11, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r11, 264(r10) |
stw r11, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r11, 116(r10) |
stw r11, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r11, 132(r10) |
stw r11, 136(r10) |
stw r11, 140(r10) |
stw r11, 144(r10) |
stw r11, 148(r10) |
stw r11, 152(r10) |
stw r11, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r11, 264(r10) |
stw r11, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r11, 100(r10) |
stw r11, 104(r10) |
stw r11, 108(r10) |
stw r11, 112(r10) |
stw r11, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r11, 260(r10) |
stw r11, 264(r10) |
stw r11, 268(r10) |
stw r11, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
#endif |
.endm |
.macro DEBUG_end_copy_loop |
#ifdef CONFIG_DEBUG |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r12, 304(r10) |
stw r12, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r12, 324(r10) |
stw r12, 328(r10) |
stw r12, 332(r10) |
stw r12, 336(r10) |
stw r12, 340(r10) |
stw r12, 344(r10) |
stw r12, 348(r10) |
stw r12, 352(r10) |
stw r12, 356(r10) |
stw r12, 360(r10) |
stw r12, 364(r10) |
stw r12, 368(r10) |
stw r12, 372(r10) |
stw r12, 376(r10) |
stw r12, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r12, 392(r10) |
stw r12, 396(r10) |
stw r12, 400(r10) |
stw r12, 404(r10) |
stw r12, 408(r10) |
stw r12, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r12, 304(r10) |
stw r12, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r12, 324(r10) |
stw r12, 328(r10) |
stw r12, 332(r10) |
stw r12, 336(r10) |
stw r12, 340(r10) |
stw r12, 344(r10) |
stw r12, 348(r10) |
stw r12, 352(r10) |
stw r12, 356(r10) |
stw r12, 360(r10) |
stw r12, 364(r10) |
stw r12, 368(r10) |
stw r12, 372(r10) |
stw r12, 376(r10) |
stw r12, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r12, 392(r10) |
stw r12, 396(r10) |
stw r12, 400(r10) |
stw r12, 404(r10) |
stw r12, 408(r10) |
stw r12, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r11, 300(r10) |
stw r11, 304(r10) |
stw r11, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r12, 324(r10) |
stw r12, 328(r10) |
stw r12, 332(r10) |
stw r12, 336(r10) |
stw r12, 340(r10) |
stw r12, 344(r10) |
stw r12, 348(r10) |
stw r12, 352(r10) |
stw r12, 356(r10) |
stw r12, 360(r10) |
stw r12, 364(r10) |
stw r12, 368(r10) |
stw r12, 372(r10) |
stw r12, 376(r10) |
stw r12, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r12, 392(r10) |
stw r12, 396(r10) |
stw r12, 400(r10) |
stw r12, 404(r10) |
stw r12, 408(r10) |
stw r12, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r11, 304(r10) |
stw r11, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r12, 324(r10) |
stw r12, 328(r10) |
stw r12, 332(r10) |
stw r12, 336(r10) |
stw r12, 340(r10) |
stw r12, 344(r10) |
stw r12, 348(r10) |
stw r12, 352(r10) |
stw r12, 356(r10) |
stw r12, 360(r10) |
stw r12, 364(r10) |
stw r12, 368(r10) |
stw r12, 372(r10) |
stw r12, 376(r10) |
stw r12, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r12, 392(r10) |
stw r12, 396(r10) |
stw r12, 400(r10) |
stw r12, 404(r10) |
stw r12, 408(r10) |
stw r12, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r11, 304(r10) |
stw r11, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r12, 324(r10) |
stw r12, 328(r10) |
stw r12, 332(r10) |
stw r12, 336(r10) |
stw r12, 340(r10) |
stw r12, 344(r10) |
stw r12, 348(r10) |
stw r12, 352(r10) |
stw r12, 356(r10) |
stw r12, 360(r10) |
stw r12, 364(r10) |
stw r12, 368(r10) |
stw r12, 372(r10) |
stw r12, 376(r10) |
stw r12, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r12, 392(r10) |
stw r12, 396(r10) |
stw r12, 400(r10) |
stw r12, 404(r10) |
stw r12, 408(r10) |
stw r12, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r11, 20(r10) |
stw r11, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r12, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r11, 136(r10) |
stw r11, 140(r10) |
stw r11, 144(r10) |
stw r11, 148(r10) |
stw r11, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r11, 176(r10) |
stw r11, 180(r10) |
stw r11, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r11, 196(r10) |
stw r11, 200(r10) |
stw r12, 204(r10) |
stw r11, 208(r10) |
stw r11, 212(r10) |
stw r11, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r11, 228(r10) |
stw r11, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r11, 248(r10) |
stw r11, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r11, 304(r10) |
stw r11, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r12, 324(r10) |
stw r11, 328(r10) |
stw r11, 332(r10) |
stw r11, 336(r10) |
stw r11, 340(r10) |
stw r11, 344(r10) |
stw r12, 348(r10) |
stw r12, 352(r10) |
stw r12, 356(r10) |
stw r11, 360(r10) |
stw r11, 364(r10) |
stw r11, 368(r10) |
stw r11, 372(r10) |
stw r11, 376(r10) |
stw r12, 380(r10) |
stw r12, 384(r10) |
stw r11, 388(r10) |
stw r11, 392(r10) |
stw r12, 396(r10) |
stw r11, 400(r10) |
stw r11, 404(r10) |
stw r11, 408(r10) |
stw r12, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r12, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r11, 132(r10) |
stw r11, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r11, 152(r10) |
stw r11, 156(r10) |
stw r12, 160(r10) |
stw r11, 164(r10) |
stw r11, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r11, 200(r10) |
stw r11, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r11, 216(r10) |
stw r11, 220(r10) |
stw r12, 224(r10) |
stw r11, 228(r10) |
stw r11, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r11, 248(r10) |
stw r11, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r11, 304(r10) |
stw r11, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r11, 324(r10) |
stw r11, 328(r10) |
stw r12, 332(r10) |
stw r12, 336(r10) |
stw r12, 340(r10) |
stw r11, 344(r10) |
stw r11, 348(r10) |
stw r12, 352(r10) |
stw r11, 356(r10) |
stw r11, 360(r10) |
stw r12, 364(r10) |
stw r12, 368(r10) |
stw r12, 372(r10) |
stw r11, 376(r10) |
stw r11, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r11, 392(r10) |
stw r11, 396(r10) |
stw r12, 400(r10) |
stw r12, 404(r10) |
stw r11, 408(r10) |
stw r11, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r11, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r11, 132(r10) |
stw r11, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r11, 164(r10) |
stw r11, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r11, 200(r10) |
stw r11, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r11, 216(r10) |
stw r11, 220(r10) |
stw r12, 224(r10) |
stw r11, 228(r10) |
stw r11, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r11, 248(r10) |
stw r11, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r11, 304(r10) |
stw r11, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r11, 324(r10) |
stw r11, 328(r10) |
stw r12, 332(r10) |
stw r12, 336(r10) |
stw r12, 340(r10) |
stw r11, 344(r10) |
stw r11, 348(r10) |
stw r12, 352(r10) |
stw r11, 356(r10) |
stw r11, 360(r10) |
stw r12, 364(r10) |
stw r12, 368(r10) |
stw r12, 372(r10) |
stw r11, 376(r10) |
stw r11, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r11, 392(r10) |
stw r11, 396(r10) |
stw r12, 400(r10) |
stw r12, 404(r10) |
stw r11, 408(r10) |
stw r11, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r11, 132(r10) |
stw r11, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r11, 164(r10) |
stw r11, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r11, 200(r10) |
stw r11, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r11, 216(r10) |
stw r11, 220(r10) |
stw r12, 224(r10) |
stw r11, 228(r10) |
stw r11, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r11, 248(r10) |
stw r11, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r11, 304(r10) |
stw r11, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r11, 324(r10) |
stw r11, 328(r10) |
stw r12, 332(r10) |
stw r12, 336(r10) |
stw r12, 340(r10) |
stw r11, 344(r10) |
stw r11, 348(r10) |
stw r12, 352(r10) |
stw r11, 356(r10) |
stw r11, 360(r10) |
stw r12, 364(r10) |
stw r12, 368(r10) |
stw r12, 372(r10) |
stw r11, 376(r10) |
stw r11, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r11, 392(r10) |
stw r11, 396(r10) |
stw r12, 400(r10) |
stw r12, 404(r10) |
stw r11, 408(r10) |
stw r11, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r11, 132(r10) |
stw r11, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r11, 164(r10) |
stw r11, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r11, 200(r10) |
stw r11, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r11, 216(r10) |
stw r11, 220(r10) |
stw r12, 224(r10) |
stw r11, 228(r10) |
stw r11, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r11, 248(r10) |
stw r11, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r11, 304(r10) |
stw r11, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r11, 324(r10) |
stw r11, 328(r10) |
stw r12, 332(r10) |
stw r12, 336(r10) |
stw r12, 340(r10) |
stw r11, 344(r10) |
stw r11, 348(r10) |
stw r12, 352(r10) |
stw r11, 356(r10) |
stw r11, 360(r10) |
stw r12, 364(r10) |
stw r12, 368(r10) |
stw r12, 372(r10) |
stw r11, 376(r10) |
stw r11, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r11, 392(r10) |
stw r11, 396(r10) |
stw r12, 400(r10) |
stw r12, 404(r10) |
stw r11, 408(r10) |
stw r11, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r11, 132(r10) |
stw r11, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r11, 152(r10) |
stw r11, 156(r10) |
stw r12, 160(r10) |
stw r11, 164(r10) |
stw r11, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r11, 200(r10) |
stw r11, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r11, 216(r10) |
stw r11, 220(r10) |
stw r12, 224(r10) |
stw r11, 228(r10) |
stw r11, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r11, 248(r10) |
stw r11, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r11, 304(r10) |
stw r11, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r11, 324(r10) |
stw r11, 328(r10) |
stw r12, 332(r10) |
stw r12, 336(r10) |
stw r12, 340(r10) |
stw r11, 344(r10) |
stw r11, 348(r10) |
stw r12, 352(r10) |
stw r11, 356(r10) |
stw r11, 360(r10) |
stw r12, 364(r10) |
stw r12, 368(r10) |
stw r12, 372(r10) |
stw r11, 376(r10) |
stw r11, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r11, 392(r10) |
stw r11, 396(r10) |
stw r12, 400(r10) |
stw r12, 404(r10) |
stw r11, 408(r10) |
stw r11, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r11, 20(r10) |
stw r11, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r11, 88(r10) |
stw r11, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r11, 136(r10) |
stw r11, 140(r10) |
stw r11, 144(r10) |
stw r11, 148(r10) |
stw r11, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r11, 176(r10) |
stw r11, 180(r10) |
stw r11, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r11, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r11, 212(r10) |
stw r11, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r11, 232(r10) |
stw r11, 236(r10) |
stw r11, 240(r10) |
stw r11, 244(r10) |
stw r11, 248(r10) |
stw r11, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r11, 300(r10) |
stw r11, 304(r10) |
stw r11, 308(r10) |
stw r11, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r12, 324(r10) |
stw r11, 328(r10) |
stw r11, 332(r10) |
stw r11, 336(r10) |
stw r11, 340(r10) |
stw r11, 344(r10) |
stw r12, 348(r10) |
stw r12, 352(r10) |
stw r12, 356(r10) |
stw r11, 360(r10) |
stw r11, 364(r10) |
stw r11, 368(r10) |
stw r11, 372(r10) |
stw r11, 376(r10) |
stw r12, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r11, 392(r10) |
stw r11, 396(r10) |
stw r11, 400(r10) |
stw r11, 404(r10) |
stw r11, 408(r10) |
stw r12, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r11, 200(r10) |
stw r11, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r11, 248(r10) |
stw r11, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r12, 304(r10) |
stw r12, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r12, 324(r10) |
stw r12, 328(r10) |
stw r12, 332(r10) |
stw r12, 336(r10) |
stw r12, 340(r10) |
stw r12, 344(r10) |
stw r12, 348(r10) |
stw r12, 352(r10) |
stw r12, 356(r10) |
stw r12, 360(r10) |
stw r12, 364(r10) |
stw r12, 368(r10) |
stw r12, 372(r10) |
stw r12, 376(r10) |
stw r12, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r11, 392(r10) |
stw r11, 396(r10) |
stw r12, 400(r10) |
stw r12, 404(r10) |
stw r12, 408(r10) |
stw r12, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r11, 100(r10) |
stw r11, 104(r10) |
stw r11, 108(r10) |
stw r11, 112(r10) |
stw r11, 116(r10) |
stw r11, 120(r10) |
stw r11, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r11, 200(r10) |
stw r11, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r11, 244(r10) |
stw r11, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r11, 260(r10) |
stw r11, 264(r10) |
stw r11, 268(r10) |
stw r11, 272(r10) |
stw r11, 276(r10) |
stw r11, 280(r10) |
stw r11, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r12, 304(r10) |
stw r12, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r12, 324(r10) |
stw r12, 328(r10) |
stw r12, 332(r10) |
stw r12, 336(r10) |
stw r12, 340(r10) |
stw r12, 344(r10) |
stw r12, 348(r10) |
stw r12, 352(r10) |
stw r12, 356(r10) |
stw r12, 360(r10) |
stw r12, 364(r10) |
stw r12, 368(r10) |
stw r12, 372(r10) |
stw r12, 376(r10) |
stw r12, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r11, 392(r10) |
stw r11, 396(r10) |
stw r12, 400(r10) |
stw r12, 404(r10) |
stw r12, 408(r10) |
stw r12, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r11, 196(r10) |
stw r11, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r11, 228(r10) |
stw r11, 232(r10) |
stw r11, 236(r10) |
stw r11, 240(r10) |
stw r11, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r12, 304(r10) |
stw r12, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r12, 324(r10) |
stw r12, 328(r10) |
stw r12, 332(r10) |
stw r12, 336(r10) |
stw r12, 340(r10) |
stw r12, 344(r10) |
stw r12, 348(r10) |
stw r12, 352(r10) |
stw r12, 356(r10) |
stw r12, 360(r10) |
stw r12, 364(r10) |
stw r12, 368(r10) |
stw r12, 372(r10) |
stw r12, 376(r10) |
stw r12, 380(r10) |
stw r12, 384(r10) |
stw r11, 388(r10) |
stw r11, 392(r10) |
stw r11, 396(r10) |
stw r11, 400(r10) |
stw r12, 404(r10) |
stw r12, 408(r10) |
stw r12, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r12, 304(r10) |
stw r12, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r12, 324(r10) |
stw r12, 328(r10) |
stw r12, 332(r10) |
stw r12, 336(r10) |
stw r12, 340(r10) |
stw r12, 344(r10) |
stw r12, 348(r10) |
stw r12, 352(r10) |
stw r12, 356(r10) |
stw r12, 360(r10) |
stw r12, 364(r10) |
stw r12, 368(r10) |
stw r12, 372(r10) |
stw r12, 376(r10) |
stw r12, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r12, 392(r10) |
stw r12, 396(r10) |
stw r12, 400(r10) |
stw r12, 404(r10) |
stw r12, 408(r10) |
stw r12, 412(r10) |
#endif |
.endm |
.macro DEBUG_segments |
#ifdef CONFIG_DEBUG |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r11, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r11, 20(r10) |
stw r11, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r11, 88(r10) |
stw r11, 92(r10) |
stw r12, 96(r10) |
stw r11, 100(r10) |
stw r11, 104(r10) |
stw r11, 108(r10) |
stw r12, 112(r10) |
stw r11, 116(r10) |
stw r11, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r11, 136(r10) |
stw r11, 140(r10) |
stw r11, 144(r10) |
stw r11, 148(r10) |
stw r11, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r11, 164(r10) |
stw r11, 168(r10) |
stw r12, 172(r10) |
stw r11, 176(r10) |
stw r11, 180(r10) |
stw r11, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r11, 196(r10) |
stw r11, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r11, 212(r10) |
stw r11, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r11, 232(r10) |
stw r11, 236(r10) |
stw r11, 240(r10) |
stw r11, 244(r10) |
stw r11, 248(r10) |
stw r12, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r11, 100(r10) |
stw r11, 104(r10) |
stw r11, 108(r10) |
stw r11, 112(r10) |
stw r11, 116(r10) |
stw r11, 120(r10) |
stw r11, 124(r10) |
stw r12, 128(r10) |
stw r11, 132(r10) |
stw r11, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r11, 152(r10) |
stw r11, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r11, 228(r10) |
stw r11, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r11, 248(r10) |
stw r11, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r11, 100(r10) |
stw r11, 104(r10) |
stw r12, 108(r10) |
stw r11, 112(r10) |
stw r12, 116(r10) |
stw r11, 120(r10) |
stw r11, 124(r10) |
stw r12, 128(r10) |
stw r11, 132(r10) |
stw r11, 136(r10) |
stw r11, 140(r10) |
stw r11, 144(r10) |
stw r11, 148(r10) |
stw r11, 152(r10) |
stw r11, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r11, 232(r10) |
stw r11, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r11, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r11, 100(r10) |
stw r11, 104(r10) |
stw r12, 108(r10) |
stw r11, 112(r10) |
stw r12, 116(r10) |
stw r11, 120(r10) |
stw r11, 124(r10) |
stw r12, 128(r10) |
stw r11, 132(r10) |
stw r11, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r11, 236(r10) |
stw r11, 240(r10) |
stw r11, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r11, 20(r10) |
stw r11, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r11, 100(r10) |
stw r11, 104(r10) |
stw r12, 108(r10) |
stw r11, 112(r10) |
stw r12, 116(r10) |
stw r11, 120(r10) |
stw r11, 124(r10) |
stw r12, 128(r10) |
stw r11, 132(r10) |
stw r11, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r11, 244(r10) |
stw r11, 248(r10) |
stw r12, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r11, 100(r10) |
stw r11, 104(r10) |
stw r12, 108(r10) |
stw r11, 112(r10) |
stw r12, 116(r10) |
stw r11, 120(r10) |
stw r11, 124(r10) |
stw r12, 128(r10) |
stw r11, 132(r10) |
stw r11, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r11, 152(r10) |
stw r11, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r12, 212(r10) |
stw r11, 216(r10) |
stw r11, 220(r10) |
stw r12, 224(r10) |
stw r11, 228(r10) |
stw r11, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r11, 248(r10) |
stw r11, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r11, 20(r10) |
stw r11, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r11, 100(r10) |
stw r11, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r11, 120(r10) |
stw r11, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r11, 136(r10) |
stw r11, 140(r10) |
stw r11, 144(r10) |
stw r11, 148(r10) |
stw r11, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r11, 208(r10) |
stw r11, 212(r10) |
stw r11, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r11, 232(r10) |
stw r11, 236(r10) |
stw r11, 240(r10) |
stw r11, 244(r10) |
stw r11, 248(r10) |
stw r12, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
#endif |
.endm |
.macro DEBUG_bat |
#ifdef CONFIG_DEBUG |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r11, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r11, 20(r10) |
stw r11, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r11, 88(r10) |
stw r11, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r11, 20(r10) |
stw r11, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
#endif |
.endm |
.macro DEBUG_mapping |
#ifdef CONFIG_DEBUG |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r11, 144(r10) |
stw r11, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r11, 144(r10) |
stw r11, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r11, 20(r10) |
stw r11, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r12, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r11, 100(r10) |
stw r11, 104(r10) |
stw r12, 108(r10) |
stw r11, 112(r10) |
stw r11, 116(r10) |
stw r11, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r11, 140(r10) |
stw r11, 144(r10) |
stw r11, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r11, 164(r10) |
stw r11, 168(r10) |
stw r12, 172(r10) |
stw r11, 176(r10) |
stw r11, 180(r10) |
stw r11, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r11, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r12, 212(r10) |
stw r11, 216(r10) |
stw r11, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r11, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r11, 88(r10) |
stw r11, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r11, 104(r10) |
stw r11, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r11, 120(r10) |
stw r11, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r11, 144(r10) |
stw r11, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r11, 196(r10) |
stw r11, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r11, 212(r10) |
stw r11, 216(r10) |
stw r12, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r12, 12(r10) |
stw r11, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r11, 88(r10) |
stw r11, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r11, 104(r10) |
stw r11, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r11, 120(r10) |
stw r11, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r11, 144(r10) |
stw r11, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r11, 196(r10) |
stw r11, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r11, 212(r10) |
stw r11, 216(r10) |
stw r12, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r12, 12(r10) |
stw r11, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r11, 88(r10) |
stw r11, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r11, 104(r10) |
stw r11, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r11, 120(r10) |
stw r11, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r11, 144(r10) |
stw r11, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r11, 196(r10) |
stw r11, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r11, 212(r10) |
stw r11, 216(r10) |
stw r12, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r12, 12(r10) |
stw r11, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r11, 88(r10) |
stw r11, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r11, 104(r10) |
stw r11, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r11, 120(r10) |
stw r11, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r11, 144(r10) |
stw r11, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r11, 196(r10) |
stw r11, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r11, 212(r10) |
stw r11, 216(r10) |
stw r12, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r12, 12(r10) |
stw r11, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r11, 88(r10) |
stw r11, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r11, 104(r10) |
stw r11, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r11, 120(r10) |
stw r11, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r11, 144(r10) |
stw r11, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r11, 196(r10) |
stw r11, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r11, 212(r10) |
stw r11, 216(r10) |
stw r12, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r11, 104(r10) |
stw r11, 108(r10) |
stw r11, 112(r10) |
stw r11, 116(r10) |
stw r11, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r11, 140(r10) |
stw r11, 144(r10) |
stw r11, 148(r10) |
stw r11, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r11, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r11, 212(r10) |
stw r11, 216(r10) |
stw r12, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r11, 104(r10) |
stw r11, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r11, 212(r10) |
stw r11, 216(r10) |
stw r12, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r11, 104(r10) |
stw r11, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r11, 196(r10) |
stw r11, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r11, 212(r10) |
stw r11, 216(r10) |
stw r12, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r11, 100(r10) |
stw r11, 104(r10) |
stw r11, 108(r10) |
stw r11, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r11, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r11, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
#endif |
.endm |
.macro DEBUG_tlb |
#ifdef CONFIG_DEBUG |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r11, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r11, 20(r10) |
stw r11, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r12, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r11, 88(r10) |
stw r11, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r11, 88(r10) |
stw r11, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r11, 88(r10) |
stw r11, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r11, 88(r10) |
stw r11, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r11, 16(r10) |
stw r11, 20(r10) |
stw r11, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
#endif |
.endm |
.macro DEBUG_prepare |
#ifdef CONFIG_DEBUG |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r12, 12(r10) |
stw r11, 16(r10) |
stw r11, 20(r10) |
stw r11, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r12, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r11, 100(r10) |
stw r11, 104(r10) |
stw r12, 108(r10) |
stw r11, 112(r10) |
stw r11, 116(r10) |
stw r11, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r11, 136(r10) |
stw r11, 140(r10) |
stw r11, 144(r10) |
stw r11, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r11, 164(r10) |
stw r11, 168(r10) |
stw r12, 172(r10) |
stw r11, 176(r10) |
stw r11, 180(r10) |
stw r11, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r11, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r11, 212(r10) |
stw r11, 216(r10) |
stw r12, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r11, 88(r10) |
stw r11, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r11, 104(r10) |
stw r11, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r11, 120(r10) |
stw r11, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r11, 148(r10) |
stw r11, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r11, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r11, 196(r10) |
stw r11, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r11, 216(r10) |
stw r11, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r11, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r11, 104(r10) |
stw r11, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r11, 120(r10) |
stw r11, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r11, 136(r10) |
stw r11, 140(r10) |
stw r11, 144(r10) |
stw r11, 148(r10) |
stw r11, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r11, 196(r10) |
stw r11, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r11, 212(r10) |
stw r11, 216(r10) |
stw r11, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r11, 104(r10) |
stw r11, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r11, 120(r10) |
stw r11, 124(r10) |
stw r12, 128(r10) |
stw r11, 132(r10) |
stw r11, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r11, 148(r10) |
stw r11, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r11, 196(r10) |
stw r11, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r11, 104(r10) |
stw r11, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r11, 120(r10) |
stw r11, 124(r10) |
stw r12, 128(r10) |
stw r11, 132(r10) |
stw r11, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r11, 148(r10) |
stw r11, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r11, 196(r10) |
stw r11, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r11, 88(r10) |
stw r11, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r11, 104(r10) |
stw r11, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r11, 120(r10) |
stw r11, 124(r10) |
stw r12, 128(r10) |
stw r11, 132(r10) |
stw r11, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r11, 148(r10) |
stw r11, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r11, 196(r10) |
stw r11, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r11, 216(r10) |
stw r11, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r11, 20(r10) |
stw r11, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r11, 104(r10) |
stw r11, 108(r10) |
stw r11, 112(r10) |
stw r11, 116(r10) |
stw r11, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r11, 136(r10) |
stw r11, 140(r10) |
stw r11, 144(r10) |
stw r12, 148(r10) |
stw r11, 152(r10) |
stw r11, 156(r10) |
stw r12, 160(r10) |
stw r11, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r11, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r11, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r11, 212(r10) |
stw r11, 216(r10) |
stw r12, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r11, 104(r10) |
stw r11, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r11, 104(r10) |
stw r11, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r11, 100(r10) |
stw r11, 104(r10) |
stw r11, 108(r10) |
stw r11, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
#endif |
.endm |
.macro DEBUG_rfi |
#ifdef CONFIG_DEBUG |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r12, 12(r10) |
stw r11, 16(r10) |
stw r11, 20(r10) |
stw r11, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
#endif |
.endm |
.macro DEBUG_pht |
#ifdef CONFIG_DEBUG |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r12, 12(r10) |
stw r11, 16(r10) |
stw r11, 20(r10) |
stw r11, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r12, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r11, 88(r10) |
stw r11, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r11, 20(r10) |
stw r11, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
#endif |
.endm |
.macro DEBUG_end_pht_clear |
#ifdef CONFIG_DEBUG |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r12, 304(r10) |
stw r12, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r12, 324(r10) |
stw r12, 328(r10) |
stw r12, 332(r10) |
stw r12, 336(r10) |
stw r12, 340(r10) |
stw r12, 344(r10) |
stw r12, 348(r10) |
stw r12, 352(r10) |
stw r12, 356(r10) |
stw r12, 360(r10) |
stw r12, 364(r10) |
stw r12, 368(r10) |
stw r12, 372(r10) |
stw r12, 376(r10) |
stw r12, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r12, 392(r10) |
stw r12, 396(r10) |
stw r12, 400(r10) |
stw r12, 404(r10) |
stw r12, 408(r10) |
stw r12, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r12, 304(r10) |
stw r12, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r12, 324(r10) |
stw r12, 328(r10) |
stw r12, 332(r10) |
stw r12, 336(r10) |
stw r12, 340(r10) |
stw r12, 344(r10) |
stw r12, 348(r10) |
stw r12, 352(r10) |
stw r12, 356(r10) |
stw r12, 360(r10) |
stw r12, 364(r10) |
stw r12, 368(r10) |
stw r12, 372(r10) |
stw r12, 376(r10) |
stw r12, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r12, 392(r10) |
stw r12, 396(r10) |
stw r12, 400(r10) |
stw r12, 404(r10) |
stw r12, 408(r10) |
stw r12, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r11, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r11, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r11, 300(r10) |
stw r11, 304(r10) |
stw r11, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r12, 324(r10) |
stw r12, 328(r10) |
stw r12, 332(r10) |
stw r12, 336(r10) |
stw r12, 340(r10) |
stw r12, 344(r10) |
stw r12, 348(r10) |
stw r12, 352(r10) |
stw r12, 356(r10) |
stw r12, 360(r10) |
stw r12, 364(r10) |
stw r12, 368(r10) |
stw r12, 372(r10) |
stw r12, 376(r10) |
stw r12, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r12, 392(r10) |
stw r12, 396(r10) |
stw r12, 400(r10) |
stw r12, 404(r10) |
stw r12, 408(r10) |
stw r12, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r11, 304(r10) |
stw r11, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r12, 324(r10) |
stw r12, 328(r10) |
stw r12, 332(r10) |
stw r12, 336(r10) |
stw r12, 340(r10) |
stw r12, 344(r10) |
stw r12, 348(r10) |
stw r12, 352(r10) |
stw r12, 356(r10) |
stw r12, 360(r10) |
stw r12, 364(r10) |
stw r12, 368(r10) |
stw r12, 372(r10) |
stw r12, 376(r10) |
stw r12, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r12, 392(r10) |
stw r12, 396(r10) |
stw r12, 400(r10) |
stw r12, 404(r10) |
stw r12, 408(r10) |
stw r12, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r11, 304(r10) |
stw r11, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r12, 324(r10) |
stw r12, 328(r10) |
stw r12, 332(r10) |
stw r12, 336(r10) |
stw r12, 340(r10) |
stw r12, 344(r10) |
stw r12, 348(r10) |
stw r12, 352(r10) |
stw r12, 356(r10) |
stw r12, 360(r10) |
stw r12, 364(r10) |
stw r12, 368(r10) |
stw r12, 372(r10) |
stw r12, 376(r10) |
stw r12, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r12, 392(r10) |
stw r12, 396(r10) |
stw r12, 400(r10) |
stw r12, 404(r10) |
stw r12, 408(r10) |
stw r12, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r11, 20(r10) |
stw r11, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r12, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r11, 132(r10) |
stw r11, 136(r10) |
stw r12, 140(r10) |
stw r11, 144(r10) |
stw r11, 148(r10) |
stw r11, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r12, 176(r10) |
stw r11, 180(r10) |
stw r11, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r11, 196(r10) |
stw r11, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r11, 212(r10) |
stw r11, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r11, 264(r10) |
stw r11, 268(r10) |
stw r11, 272(r10) |
stw r11, 276(r10) |
stw r11, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r11, 304(r10) |
stw r11, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r12, 324(r10) |
stw r11, 328(r10) |
stw r11, 332(r10) |
stw r11, 336(r10) |
stw r11, 340(r10) |
stw r11, 344(r10) |
stw r12, 348(r10) |
stw r12, 352(r10) |
stw r12, 356(r10) |
stw r11, 360(r10) |
stw r11, 364(r10) |
stw r11, 368(r10) |
stw r11, 372(r10) |
stw r12, 376(r10) |
stw r12, 380(r10) |
stw r12, 384(r10) |
stw r11, 388(r10) |
stw r11, 392(r10) |
stw r12, 396(r10) |
stw r11, 400(r10) |
stw r11, 404(r10) |
stw r11, 408(r10) |
stw r12, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r12, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r11, 136(r10) |
stw r11, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r11, 152(r10) |
stw r11, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r11, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r11, 260(r10) |
stw r11, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r11, 280(r10) |
stw r11, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r11, 304(r10) |
stw r11, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r11, 324(r10) |
stw r11, 328(r10) |
stw r12, 332(r10) |
stw r12, 336(r10) |
stw r12, 340(r10) |
stw r11, 344(r10) |
stw r11, 348(r10) |
stw r12, 352(r10) |
stw r12, 356(r10) |
stw r12, 360(r10) |
stw r12, 364(r10) |
stw r12, 368(r10) |
stw r11, 372(r10) |
stw r11, 376(r10) |
stw r12, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r11, 392(r10) |
stw r11, 396(r10) |
stw r11, 400(r10) |
stw r12, 404(r10) |
stw r11, 408(r10) |
stw r11, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r11, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r11, 136(r10) |
stw r11, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r11, 152(r10) |
stw r11, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r11, 260(r10) |
stw r11, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r11, 304(r10) |
stw r11, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r11, 324(r10) |
stw r11, 328(r10) |
stw r11, 332(r10) |
stw r11, 336(r10) |
stw r11, 340(r10) |
stw r11, 344(r10) |
stw r11, 348(r10) |
stw r12, 352(r10) |
stw r12, 356(r10) |
stw r11, 360(r10) |
stw r11, 364(r10) |
stw r11, 368(r10) |
stw r11, 372(r10) |
stw r11, 376(r10) |
stw r12, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r11, 392(r10) |
stw r11, 396(r10) |
stw r12, 400(r10) |
stw r12, 404(r10) |
stw r11, 408(r10) |
stw r11, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r11, 136(r10) |
stw r11, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r11, 152(r10) |
stw r11, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r11, 260(r10) |
stw r11, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r11, 304(r10) |
stw r11, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r11, 324(r10) |
stw r11, 328(r10) |
stw r12, 332(r10) |
stw r12, 336(r10) |
stw r12, 340(r10) |
stw r12, 344(r10) |
stw r12, 348(r10) |
stw r12, 352(r10) |
stw r11, 356(r10) |
stw r11, 360(r10) |
stw r12, 364(r10) |
stw r12, 368(r10) |
stw r11, 372(r10) |
stw r11, 376(r10) |
stw r12, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r11, 392(r10) |
stw r11, 396(r10) |
stw r12, 400(r10) |
stw r12, 404(r10) |
stw r12, 408(r10) |
stw r12, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r11, 136(r10) |
stw r11, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r11, 152(r10) |
stw r11, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r11, 260(r10) |
stw r11, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r11, 304(r10) |
stw r11, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r11, 324(r10) |
stw r11, 328(r10) |
stw r12, 332(r10) |
stw r12, 336(r10) |
stw r12, 340(r10) |
stw r12, 344(r10) |
stw r12, 348(r10) |
stw r12, 352(r10) |
stw r11, 356(r10) |
stw r11, 360(r10) |
stw r12, 364(r10) |
stw r12, 368(r10) |
stw r11, 372(r10) |
stw r11, 376(r10) |
stw r12, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r11, 392(r10) |
stw r11, 396(r10) |
stw r12, 400(r10) |
stw r12, 404(r10) |
stw r12, 408(r10) |
stw r12, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r11, 136(r10) |
stw r11, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r11, 152(r10) |
stw r11, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r12, 212(r10) |
stw r11, 216(r10) |
stw r11, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r11, 260(r10) |
stw r11, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r11, 280(r10) |
stw r11, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r11, 304(r10) |
stw r11, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r11, 324(r10) |
stw r11, 328(r10) |
stw r12, 332(r10) |
stw r12, 336(r10) |
stw r12, 340(r10) |
stw r11, 344(r10) |
stw r11, 348(r10) |
stw r12, 352(r10) |
stw r11, 356(r10) |
stw r11, 360(r10) |
stw r12, 364(r10) |
stw r12, 368(r10) |
stw r11, 372(r10) |
stw r11, 376(r10) |
stw r12, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r11, 392(r10) |
stw r11, 396(r10) |
stw r12, 400(r10) |
stw r12, 404(r10) |
stw r12, 408(r10) |
stw r12, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r11, 20(r10) |
stw r11, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r11, 88(r10) |
stw r11, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r11, 136(r10) |
stw r11, 140(r10) |
stw r11, 144(r10) |
stw r11, 148(r10) |
stw r11, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r11, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r11, 208(r10) |
stw r11, 212(r10) |
stw r11, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r11, 264(r10) |
stw r11, 268(r10) |
stw r11, 272(r10) |
stw r11, 276(r10) |
stw r11, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r11, 300(r10) |
stw r11, 304(r10) |
stw r11, 308(r10) |
stw r11, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r12, 324(r10) |
stw r11, 328(r10) |
stw r11, 332(r10) |
stw r11, 336(r10) |
stw r11, 340(r10) |
stw r11, 344(r10) |
stw r12, 348(r10) |
stw r12, 352(r10) |
stw r12, 356(r10) |
stw r11, 360(r10) |
stw r11, 364(r10) |
stw r11, 368(r10) |
stw r12, 372(r10) |
stw r11, 376(r10) |
stw r11, 380(r10) |
stw r12, 384(r10) |
stw r11, 388(r10) |
stw r11, 392(r10) |
stw r11, 396(r10) |
stw r11, 400(r10) |
stw r12, 404(r10) |
stw r12, 408(r10) |
stw r12, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r11, 136(r10) |
stw r11, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r12, 304(r10) |
stw r12, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r12, 324(r10) |
stw r12, 328(r10) |
stw r12, 332(r10) |
stw r12, 336(r10) |
stw r12, 340(r10) |
stw r12, 344(r10) |
stw r12, 348(r10) |
stw r12, 352(r10) |
stw r12, 356(r10) |
stw r12, 360(r10) |
stw r12, 364(r10) |
stw r12, 368(r10) |
stw r12, 372(r10) |
stw r12, 376(r10) |
stw r12, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r12, 392(r10) |
stw r12, 396(r10) |
stw r12, 400(r10) |
stw r12, 404(r10) |
stw r12, 408(r10) |
stw r12, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r11, 100(r10) |
stw r11, 104(r10) |
stw r11, 108(r10) |
stw r11, 112(r10) |
stw r11, 116(r10) |
stw r11, 120(r10) |
stw r11, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r11, 136(r10) |
stw r11, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r11, 228(r10) |
stw r11, 232(r10) |
stw r11, 236(r10) |
stw r11, 240(r10) |
stw r11, 244(r10) |
stw r11, 248(r10) |
stw r11, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r12, 304(r10) |
stw r12, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r12, 324(r10) |
stw r12, 328(r10) |
stw r12, 332(r10) |
stw r12, 336(r10) |
stw r12, 340(r10) |
stw r12, 344(r10) |
stw r12, 348(r10) |
stw r12, 352(r10) |
stw r12, 356(r10) |
stw r12, 360(r10) |
stw r12, 364(r10) |
stw r12, 368(r10) |
stw r12, 372(r10) |
stw r12, 376(r10) |
stw r12, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r12, 392(r10) |
stw r12, 396(r10) |
stw r12, 400(r10) |
stw r12, 404(r10) |
stw r12, 408(r10) |
stw r12, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r11, 132(r10) |
stw r11, 136(r10) |
stw r11, 140(r10) |
stw r11, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r12, 304(r10) |
stw r12, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r12, 324(r10) |
stw r12, 328(r10) |
stw r12, 332(r10) |
stw r12, 336(r10) |
stw r12, 340(r10) |
stw r12, 344(r10) |
stw r12, 348(r10) |
stw r12, 352(r10) |
stw r12, 356(r10) |
stw r12, 360(r10) |
stw r12, 364(r10) |
stw r12, 368(r10) |
stw r12, 372(r10) |
stw r12, 376(r10) |
stw r12, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r12, 392(r10) |
stw r12, 396(r10) |
stw r12, 400(r10) |
stw r12, 404(r10) |
stw r12, 408(r10) |
stw r12, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r12, 304(r10) |
stw r12, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r12, 324(r10) |
stw r12, 328(r10) |
stw r12, 332(r10) |
stw r12, 336(r10) |
stw r12, 340(r10) |
stw r12, 344(r10) |
stw r12, 348(r10) |
stw r12, 352(r10) |
stw r12, 356(r10) |
stw r12, 360(r10) |
stw r12, 364(r10) |
stw r12, 368(r10) |
stw r12, 372(r10) |
stw r12, 376(r10) |
stw r12, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r12, 392(r10) |
stw r12, 396(r10) |
stw r12, 400(r10) |
stw r12, 404(r10) |
stw r12, 408(r10) |
stw r12, 412(r10) |
#endif |
.endm |
.macro DEBUG_bat_mask |
#ifdef CONFIG_DEBUG |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r11, 228(r10) |
stw r11, 232(r10) |
stw r11, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r11, 232(r10) |
stw r11, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r11, 232(r10) |
stw r11, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r11, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r11, 132(r10) |
stw r11, 136(r10) |
stw r11, 140(r10) |
stw r12, 144(r10) |
stw r11, 148(r10) |
stw r11, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r11, 176(r10) |
stw r11, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r11, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r11, 212(r10) |
stw r11, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r11, 232(r10) |
stw r11, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r11, 248(r10) |
stw r11, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r11, 20(r10) |
stw r11, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r11, 132(r10) |
stw r11, 136(r10) |
stw r11, 140(r10) |
stw r11, 144(r10) |
stw r11, 148(r10) |
stw r11, 152(r10) |
stw r11, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r11, 180(r10) |
stw r11, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r11, 196(r10) |
stw r11, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r11, 216(r10) |
stw r11, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r11, 232(r10) |
stw r11, 236(r10) |
stw r12, 240(r10) |
stw r11, 244(r10) |
stw r11, 248(r10) |
stw r12, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r11, 132(r10) |
stw r11, 136(r10) |
stw r12, 140(r10) |
stw r11, 144(r10) |
stw r12, 148(r10) |
stw r11, 152(r10) |
stw r11, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r11, 176(r10) |
stw r11, 180(r10) |
stw r11, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r11, 200(r10) |
stw r11, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r11, 232(r10) |
stw r11, 236(r10) |
stw r11, 240(r10) |
stw r11, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r11, 132(r10) |
stw r11, 136(r10) |
stw r12, 140(r10) |
stw r11, 144(r10) |
stw r12, 148(r10) |
stw r11, 152(r10) |
stw r11, 156(r10) |
stw r12, 160(r10) |
stw r11, 164(r10) |
stw r11, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r11, 180(r10) |
stw r11, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r11, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r11, 232(r10) |
stw r11, 236(r10) |
stw r11, 240(r10) |
stw r11, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r11, 132(r10) |
stw r11, 136(r10) |
stw r12, 140(r10) |
stw r11, 144(r10) |
stw r12, 148(r10) |
stw r11, 152(r10) |
stw r11, 156(r10) |
stw r12, 160(r10) |
stw r11, 164(r10) |
stw r11, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r11, 180(r10) |
stw r11, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r11, 212(r10) |
stw r11, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r11, 232(r10) |
stw r11, 236(r10) |
stw r12, 240(r10) |
stw r11, 244(r10) |
stw r11, 248(r10) |
stw r12, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r11, 88(r10) |
stw r11, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r11, 132(r10) |
stw r11, 136(r10) |
stw r12, 140(r10) |
stw r11, 144(r10) |
stw r12, 148(r10) |
stw r11, 152(r10) |
stw r11, 156(r10) |
stw r12, 160(r10) |
stw r11, 164(r10) |
stw r11, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r11, 180(r10) |
stw r11, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r11, 196(r10) |
stw r11, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r11, 216(r10) |
stw r11, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r11, 232(r10) |
stw r11, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r11, 248(r10) |
stw r11, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r11, 20(r10) |
stw r11, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r11, 132(r10) |
stw r11, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r11, 152(r10) |
stw r11, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r11, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r11, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r11, 212(r10) |
stw r11, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r11, 228(r10) |
stw r11, 232(r10) |
stw r11, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r11, 248(r10) |
stw r11, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r11, 100(r10) |
stw r11, 104(r10) |
stw r11, 108(r10) |
stw r11, 112(r10) |
stw r11, 116(r10) |
stw r11, 120(r10) |
stw r11, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
#endif |
.endm |
/tags/0.3.0/boot/arch/ppc32/loader/pack |
---|
0,0 → 1,115 |
#! /bin/sh |
# |
# Copyright (C) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
[ "$#" -lt 1 ] && exit 1 |
OBJCOPY="$1" |
LINK="_link.ld" |
HEADER="_components.h" |
shift |
echo 'OUTPUT_FORMAT("elf32-powerpc") |
OUTPUT_ARCH(powerpc:common) |
ENTRY(start) |
SECTIONS { |
.boot 0x10000000: AT (0) { |
*(BOOTSTRAP); |
*(REALMODE); |
*(.text); |
*(.rodata); |
*(.rodata.*); |
*(.data); /* initialized data */ |
*(.sdata); |
*(.sdata2); |
*(.sbss); |
*(.bss); /* uninitialized static variables */ |
*(COMMON); /* global variables */' > "$LINK" |
echo '#ifndef ___COMPONENTS_H__ |
#define ___COMPONENTS_H__ |
typedef struct { |
char *name; |
void *start; |
void *end; |
unsigned int size; |
} component_t;' > "$HEADER" |
COUNT="0" |
DATA="" |
for TASK in "$@" ; do |
BASENAME="`basename "$TASK" | sed 's/^\(.*\)\.[^.]*$/\1/'`" |
OBJECT="${BASENAME}.o" |
SYMBOL="`echo "_binary_$TASK" | tr "./" "__"`" |
MACRO="`echo "$BASENAME" | tr [:lower:] [:upper:]`" |
echo "$TASK -> $OBJECT" |
echo " |
. = ALIGN(4096); |
*(.${BASENAME}_image);" >> "$LINK" |
echo " |
extern int ${SYMBOL}_start; |
extern int ${SYMBOL}_end; |
#define ${MACRO}_START ((void *) &${SYMBOL}_start) |
#define ${MACRO}_END ((void *) &${SYMBOL}_end) |
#define ${MACRO}_SIZE ((unsigned int) ${MACRO}_END - (unsigned int) ${MACRO}_START)" >> "$HEADER" |
"$OBJCOPY" -I binary -O elf32-powerpc -B powerpc:common --rename-section ".data=.${BASENAME}_image" "$TASK" "$OBJECT" |
DATA="${DATA} |
components[$COUNT].name = \"${BASENAME}\"; |
components[$COUNT].start = ${MACRO}_START; |
components[$COUNT].end = ${MACRO}_END; |
components[$COUNT].size = ${MACRO}_SIZE;"; |
COUNT="`expr "$COUNT" + 1`" |
done |
echo ' } |
}' >> "$LINK" |
echo " |
#define COMPONENTS $COUNT |
component_t components[COMPONENTS]; |
static void init_components(void) |
{ |
$DATA |
} |
#endif |
" >> "$HEADER" |
Property changes: |
Added: svn:executable |
+* |
\ No newline at end of property |
/tags/0.3.0/boot/arch/ppc32/Makefile.inc |
---|
0,0 → 1,42 |
# |
# Copyright (c) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
build: $(BASE)/image.boot |
$(BASE)/image.boot: depend arch/$(ARCH)/loader/image.boot |
cp arch/$(ARCH)/loader/image.boot $(BASE)/image.boot |
depend: |
-rm arch/$(ARCH)/loader/image.boot |
arch/$(ARCH)/loader/image.boot: |
make -C arch/$(ARCH)/loader COMPILER=$(COMPILER) KERNELDIR=../../../$(KERNELDIR) USPACEDIR=../../../$(USPACEDIR) "DEFS=$(DEFS)" |
clean: generic_clean |
make -C arch/$(ARCH)/loader clean COMPILER=$(COMPILER) KERNELDIR=../../../$(KERNELDIR) USPACEDIR=../../../$(USPACEDIR) "DEFS=$(DEFS)" |
-rm -f $(BASE)/image.boot |
/tags/0.3.0/boot/arch/ia32xen/grub/menu.lst |
---|
0,0 → 1,20 |
default 0 |
timeout 10 |
title=HelenOS/ia32xen |
root (cd) |
kernel /boot/xen.gz |
module /boot/kernel.bin |
module /boot/ns |
module /boot/init |
module /boot/pci |
module /boot/fb |
module /boot/kbd |
module /boot/console |
module /boot/vfs |
module /boot/tmpfs |
module /boot/fat |
module /boot/devmap |
module /boot/tetris |
module /boot/tester |
module /boot/klog |
/tags/0.3.0/boot/arch/ia32xen/grub/menu.debug.lst |
---|
0,0 → 1,16 |
default 0 |
timeout 10 |
title=HelenOS/ia32xen |
root (cd) |
kernel /boot/xen.debug.gz noreboot console=com1,vga com1=auto,8n1,0x3f8 |
module /boot/kernel.bin |
module /boot/ns |
module /boot/init |
module /boot/pci |
module /boot/fb |
module /boot/kbd |
module /boot/console |
module /boot/tetris |
module /boot/tester |
module /boot/klog |
/tags/0.3.0/boot/arch/ia32xen/grub/xen.gz |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/tags/0.3.0/boot/arch/ia32xen/grub/xen.debug.gz |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/tags/0.3.0/boot/arch/ia32xen/grub/stage2_eltorito |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/tags/0.3.0/boot/arch/ia32xen/grub/COPYING |
---|
0,0 → 1,340 |
GNU GENERAL PUBLIC LICENSE |
Version 2, June 1991 |
Copyright (C) 1989, 1991 Free Software Foundation, Inc. |
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
Everyone is permitted to copy and distribute verbatim copies |
of this license document, but changing it is not allowed. |
Preamble |
The licenses for most software are designed to take away your |
freedom to share and change it. By contrast, the GNU General Public |
License is intended to guarantee your freedom to share and change free |
software--to make sure the software is free for all its users. This |
General Public License applies to most of the Free Software |
Foundation's software and to any other program whose authors commit to |
using it. (Some other Free Software Foundation software is covered by |
the GNU Library General Public License instead.) You can apply it to |
your programs, too. |
When we speak of free software, we are referring to freedom, not |
price. Our General Public Licenses are designed to make sure that you |
have the freedom to distribute copies of free software (and charge for |
this service if you wish), that you receive source code or can get it |
if you want it, that you can change the software or use pieces of it |
in new free programs; and that you know you can do these things. |
To protect your rights, we need to make restrictions that forbid |
anyone to deny you these rights or to ask you to surrender the rights. |
These restrictions translate to certain responsibilities for you if you |
distribute copies of the software, or if you modify it. |
For example, if you distribute copies of such a program, whether |
gratis or for a fee, you must give the recipients all the rights that |
you have. You must make sure that they, too, receive or can get the |
source code. And you must show them these terms so they know their |
rights. |
We protect your rights with two steps: (1) copyright the software, and |
(2) offer you this license which gives you legal permission to copy, |
distribute and/or modify the software. |
Also, for each author's protection and ours, we want to make certain |
that everyone understands that there is no warranty for this free |
software. If the software is modified by someone else and passed on, we |
want its recipients to know that what they have is not the original, so |
that any problems introduced by others will not reflect on the original |
authors' reputations. |
Finally, any free program is threatened constantly by software |
patents. We wish to avoid the danger that redistributors of a free |
program will individually obtain patent licenses, in effect making the |
program proprietary. To prevent this, we have made it clear that any |
patent must be licensed for everyone's free use or not licensed at all. |
The precise terms and conditions for copying, distribution and |
modification follow. |
GNU GENERAL PUBLIC LICENSE |
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION |
0. This License applies to any program or other work which contains |
a notice placed by the copyright holder saying it may be distributed |
under the terms of this General Public License. The "Program", below, |
refers to any such program or work, and a "work based on the Program" |
means either the Program or any derivative work under copyright law: |
that is to say, a work containing the Program or a portion of it, |
either verbatim or with modifications and/or translated into another |
language. (Hereinafter, translation is included without limitation in |
the term "modification".) Each licensee is addressed as "you". |
Activities other than copying, distribution and modification are not |
covered by this License; they are outside its scope. The act of |
running the Program is not restricted, and the output from the Program |
is covered only if its contents constitute a work based on the |
Program (independent of having been made by running the Program). |
Whether that is true depends on what the Program does. |
1. You may copy and distribute verbatim copies of the Program's |
source code as you receive it, in any medium, provided that you |
conspicuously and appropriately publish on each copy an appropriate |
copyright notice and disclaimer of warranty; keep intact all the |
notices that refer to this License and to the absence of any warranty; |
and give any other recipients of the Program a copy of this License |
along with the Program. |
You may charge a fee for the physical act of transferring a copy, and |
you may at your option offer warranty protection in exchange for a fee. |
2. You may modify your copy or copies of the Program or any portion |
of it, thus forming a work based on the Program, and copy and |
distribute such modifications or work under the terms of Section 1 |
above, provided that you also meet all of these conditions: |
a) You must cause the modified files to carry prominent notices |
stating that you changed the files and the date of any change. |
b) You must cause any work that you distribute or publish, that in |
whole or in part contains or is derived from the Program or any |
part thereof, to be licensed as a whole at no charge to all third |
parties under the terms of this License. |
c) If the modified program normally reads commands interactively |
when run, you must cause it, when started running for such |
interactive use in the most ordinary way, to print or display an |
announcement including an appropriate copyright notice and a |
notice that there is no warranty (or else, saying that you provide |
a warranty) and that users may redistribute the program under |
these conditions, and telling the user how to view a copy of this |
License. (Exception: if the Program itself is interactive but |
does not normally print such an announcement, your work based on |
the Program is not required to print an announcement.) |
These requirements apply to the modified work as a whole. If |
identifiable sections of that work are not derived from the Program, |
and can be reasonably considered independent and separate works in |
themselves, then this License, and its terms, do not apply to those |
sections when you distribute them as separate works. But when you |
distribute the same sections as part of a whole which is a work based |
on the Program, the distribution of the whole must be on the terms of |
this License, whose permissions for other licensees extend to the |
entire whole, and thus to each and every part regardless of who wrote it. |
Thus, it is not the intent of this section to claim rights or contest |
your rights to work written entirely by you; rather, the intent is to |
exercise the right to control the distribution of derivative or |
collective works based on the Program. |
In addition, mere aggregation of another work not based on the Program |
with the Program (or with a work based on the Program) on a volume of |
a storage or distribution medium does not bring the other work under |
the scope of this License. |
3. You may copy and distribute the Program (or a work based on it, |
under Section 2) in object code or executable form under the terms of |
Sections 1 and 2 above provided that you also do one of the following: |
a) Accompany it with the complete corresponding machine-readable |
source code, which must be distributed under the terms of Sections |
1 and 2 above on a medium customarily used for software interchange; or, |
b) Accompany it with a written offer, valid for at least three |
years, to give any third party, for a charge no more than your |
cost of physically performing source distribution, a complete |
machine-readable copy of the corresponding source code, to be |
distributed under the terms of Sections 1 and 2 above on a medium |
customarily used for software interchange; or, |
c) Accompany it with the information you received as to the offer |
to distribute corresponding source code. (This alternative is |
allowed only for noncommercial distribution and only if you |
received the program in object code or executable form with such |
an offer, in accord with Subsection b above.) |
The source code for a work means the preferred form of the work for |
making modifications to it. For an executable work, complete source |
code means all the source code for all modules it contains, plus any |
associated interface definition files, plus the scripts used to |
control compilation and installation of the executable. However, as a |
special exception, the source code distributed need not include |
anything that is normally distributed (in either source or binary |
form) with the major components (compiler, kernel, and so on) of the |
operating system on which the executable runs, unless that component |
itself accompanies the executable. |
If distribution of executable or object code is made by offering |
access to copy from a designated place, then offering equivalent |
access to copy the source code from the same place counts as |
distribution of the source code, even though third parties are not |
compelled to copy the source along with the object code. |
4. You may not copy, modify, sublicense, or distribute the Program |
except as expressly provided under this License. Any attempt |
otherwise to copy, modify, sublicense or distribute the Program is |
void, and will automatically terminate your rights under this License. |
However, parties who have received copies, or rights, from you under |
this License will not have their licenses terminated so long as such |
parties remain in full compliance. |
5. You are not required to accept this License, since you have not |
signed it. However, nothing else grants you permission to modify or |
distribute the Program or its derivative works. These actions are |
prohibited by law if you do not accept this License. Therefore, by |
modifying or distributing the Program (or any work based on the |
Program), you indicate your acceptance of this License to do so, and |
all its terms and conditions for copying, distributing or modifying |
the Program or works based on it. |
6. Each time you redistribute the Program (or any work based on the |
Program), the recipient automatically receives a license from the |
original licensor to copy, distribute or modify the Program subject to |
these terms and conditions. You may not impose any further |
restrictions on the recipients' exercise of the rights granted herein. |
You are not responsible for enforcing compliance by third parties to |
this License. |
7. If, as a consequence of a court judgment or allegation of patent |
infringement or for any other reason (not limited to patent issues), |
conditions are imposed on you (whether by court order, agreement or |
otherwise) that contradict the conditions of this License, they do not |
excuse you from the conditions of this License. If you cannot |
distribute so as to satisfy simultaneously your obligations under this |
License and any other pertinent obligations, then as a consequence you |
may not distribute the Program at all. For example, if a patent |
license would not permit royalty-free redistribution of the Program by |
all those who receive copies directly or indirectly through you, then |
the only way you could satisfy both it and this License would be to |
refrain entirely from distribution of the Program. |
If any portion of this section is held invalid or unenforceable under |
any particular circumstance, the balance of the section is intended to |
apply and the section as a whole is intended to apply in other |
circumstances. |
It is not the purpose of this section to induce you to infringe any |
patents or other property right claims or to contest validity of any |
such claims; this section has the sole purpose of protecting the |
integrity of the free software distribution system, which is |
implemented by public license practices. Many people have made |
generous contributions to the wide range of software distributed |
through that system in reliance on consistent application of that |
system; it is up to the author/donor to decide if he or she is willing |
to distribute software through any other system and a licensee cannot |
impose that choice. |
This section is intended to make thoroughly clear what is believed to |
be a consequence of the rest of this License. |
8. If the distribution and/or use of the Program is restricted in |
certain countries either by patents or by copyrighted interfaces, the |
original copyright holder who places the Program under this License |
may add an explicit geographical distribution limitation excluding |
those countries, so that distribution is permitted only in or among |
countries not thus excluded. In such case, this License incorporates |
the limitation as if written in the body of this License. |
9. The Free Software Foundation may publish revised and/or new versions |
of the General Public License from time to time. Such new versions will |
be similar in spirit to the present version, but may differ in detail to |
address new problems or concerns. |
Each version is given a distinguishing version number. If the Program |
specifies a version number of this License which applies to it and "any |
later version", you have the option of following the terms and conditions |
either of that version or of any later version published by the Free |
Software Foundation. If the Program does not specify a version number of |
this License, you may choose any version ever published by the Free Software |
Foundation. |
10. If you wish to incorporate parts of the Program into other free |
programs whose distribution conditions are different, write to the author |
to ask for permission. For software which is copyrighted by the Free |
Software Foundation, write to the Free Software Foundation; we sometimes |
make exceptions for this. Our decision will be guided by the two goals |
of preserving the free status of all derivatives of our free software and |
of promoting the sharing and reuse of software generally. |
NO WARRANTY |
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY |
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN |
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES |
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED |
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS |
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE |
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, |
REPAIR OR CORRECTION. |
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING |
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR |
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, |
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING |
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED |
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY |
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER |
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE |
POSSIBILITY OF SUCH DAMAGES. |
END OF TERMS AND CONDITIONS |
How to Apply These Terms to Your New Programs |
If you develop a new program, and you want it to be of the greatest |
possible use to the public, the best way to achieve this is to make it |
free software which everyone can redistribute and change under these terms. |
To do so, attach the following notices to the program. It is safest |
to attach them to the start of each source file to most effectively |
convey the exclusion of warranty; and each file should have at least |
the "copyright" line and a pointer to where the full notice is found. |
<one line to give the program's name and a brief idea of what it does.> |
Copyright (C) <year> <name of author> |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 2 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
Also add information on how to contact you by electronic and paper mail. |
If the program is interactive, make it output a short notice like this |
when it starts in an interactive mode: |
Gnomovision version 69, Copyright (C) year name of author |
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. |
This is free software, and you are welcome to redistribute it |
under certain conditions; type `show c' for details. |
The hypothetical commands `show w' and `show c' should show the appropriate |
parts of the General Public License. Of course, the commands you use may |
be called something other than `show w' and `show c'; they could even be |
mouse-clicks or menu items--whatever suits your program. |
You should also get your employer (if you work as a programmer) or your |
school, if any, to sign a "copyright disclaimer" for the program, if |
necessary. Here is a sample; alter the names: |
Yoyodyne, Inc., hereby disclaims all copyright interest in the program |
`Gnomovision' (which makes passes at compilers) written by James Hacker. |
<signature of Ty Coon>, 1 April 1989 |
Ty Coon, President of Vice |
This General Public License does not permit incorporating your program into |
proprietary programs. If your program is a subroutine library, you may |
consider it more useful to permit linking proprietary applications with the |
library. If this is what you want to do, use the GNU Library General |
Public License instead of this License. |
/tags/0.3.0/boot/arch/ia32xen/grub/README |
---|
0,0 → 1,5 |
For licensing terms of GRUB boot loader see the file COPYING contained |
in this directory. Full version of GRUB, including its source code, |
can be downloaded from GRUB's project page: |
http://www.gnu.org/software/grub/ |
/tags/0.3.0/boot/arch/ia32xen/Makefile.inc |
---|
0,0 → 1,64 |
# |
# Copyright (c) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
TASKS = \ |
$(USPACEDIR)/srv/ns/ns \ |
$(USPACEDIR)/srv/pci/pci \ |
$(USPACEDIR)/srv/fb/fb \ |
$(USPACEDIR)/srv/kbd/kbd \ |
$(USPACEDIR)/srv/console/console \ |
$(USPACEDIR)/srv/vfs/vfs \ |
$(USPACEDIR)/srv/fs/tmpfs/tmpfs \ |
$(USPACEDIR)/srv/fs/fat/fat \ |
$(USPACEDIR)/srv/devmap/devmap \ |
$(USPACEDIR)/app/init/init \ |
$(USPACEDIR)/app/tetris/tetris \ |
$(USPACEDIR)/app/tester/tester \ |
$(USPACEDIR)/app/klog/klog |
build: $(BASE)/image.iso |
$(BASE)/image.iso: arch/$(ARCH)/grub/stage2_eltorito arch/$(ARCH)/grub/menu.lst arch/$(ARCH)/grub/menu.debug.lst arch/$(ARCH)/grub/xen.gz arch/$(ARCH)/grub/xen.debug.gz $(KERNELDIR)/kernel.bin $(TASKS) |
mkdir -p arch/$(ARCH)/iso/boot/grub |
cp arch/$(ARCH)/grub/stage2_eltorito arch/$(ARCH)/iso/boot/grub/ |
ifeq ($(CONFIG_DEBUG),y) |
cp arch/$(ARCH)/grub/menu.debug.lst arch/$(ARCH)/iso/boot/grub/menu.lst |
cp arch/$(ARCH)/grub/xen.debug.gz arch/$(ARCH)/iso/boot/ |
else |
cp arch/$(ARCH)/grub/menu.lst arch/$(ARCH)/iso/boot/grub/ |
cp arch/$(ARCH)/grub/xen.gz arch/$(ARCH)/iso/boot/ |
endif |
cp $(KERNELDIR)/kernel.bin arch/$(ARCH)/iso/boot/ |
for task in $(TASKS) ; do \ |
cp $$task arch/$(ARCH)/iso/boot/ ; \ |
done |
mkisofs -J -r -b boot/grub/stage2_eltorito -no-emul-boot -boot-load-size 4 -boot-info-table -o $(BASE)/image.iso arch/$(ARCH)/iso/ |
clean: |
-rm -fr arch/$(ARCH)/iso |
-rm -f $(BASE)/image.iso |
/tags/0.3.0/boot/arch/ppc64/loader/Makefile |
---|
0,0 → 1,120 |
# |
# Copyright (c) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
include ../../../../version |
include ../../../Makefile.config |
## Toolchain configuration |
# |
TARGET = ppc64-linux-gnu |
TOOLCHAIN_DIR = /usr/local/ppc64/bin |
ifeq ($(COMPILER),gcc_native) |
CC = gcc |
AS = as |
LD = ld |
OBJCOPY = objcopy |
OBJDUMP = objdump |
endif |
ifeq ($(COMPILER),icc_native) |
CC = icc |
AS = as |
LD = ld |
OBJCOPY = objcopy |
OBJDUMP = objdump |
endif |
ifeq ($(COMPILER),gcc_cross) |
CC = $(TOOLCHAIN_DIR)/$(TARGET)-gcc |
AS = $(TOOLCHAIN_DIR)/$(TARGET)-as |
LD = $(TOOLCHAIN_DIR)/$(TARGET)-ld |
OBJCOPY = $(TOOLCHAIN_DIR)/$(TARGET)-objcopy |
OBJDUMP = $(TOOLCHAIN_DIR)/$(TARGET)-objdump |
endif |
CFLAGS = -DRELEASE=\"$(RELEASE)\" -I. -I../../../generic -I../../../genarch -nostdinc -nostdlib -fno-builtin -Werror-implicit-function-declaration -Wmissing-prototypes -Werror -O3 -mcpu=powerpc64 -msoft-float -m64 |
ifdef REVISION |
CFLAGS += "-DREVISION=\"$(REVISION)\"" |
endif |
ifdef TIMESTAMP |
CFLAGS += "-DTIMESTAMP=\"$(TIMESTAMP)\"" |
endif |
SOURCES = \ |
main.c \ |
ofwarch.c \ |
../../../genarch/ofw.c \ |
../../../generic/printf.c \ |
asm.S \ |
boot.S |
COMPONENTS = \ |
$(KERNELDIR)/kernel.bin \ |
$(USPACEDIR)/srv/ns/ns \ |
$(USPACEDIR)/srv/fb/fb \ |
$(USPACEDIR)/srv/kbd/kbd \ |
$(USPACEDIR)/srv/console/console \ |
$(USPACEDIR)/srv/vfs/vfs \ |
$(USPACEDIR)/srv/fs/tmpfs/tmpfs \ |
$(USPACEDIR)/srv/fs/fat/fat \ |
$(USPACEDIR)/srv/devmap/devmap \ |
$(USPACEDIR)/app/init/init \ |
$(USPACEDIR)/app/tetris/tetris \ |
$(USPACEDIR)/app/tester/tester \ |
$(USPACEDIR)/app/klog/klog |
OBJECTS := $(addsuffix .o,$(basename $(SOURCES))) |
COMPONENT_OBJECTS := $(addsuffix .o,$(basename $(notdir $(COMPONENTS)))) |
.PHONY: all clean depend |
all: image.boot |
-include Makefile.depend |
image.boot: depend _components.h _link.ld $(COMPONENT_OBJECTS) $(OBJECTS) |
$(LD) -no-check-sections -N -T _link.ld $(COMPONENT_OBJECTS) $(OBJECTS) -o $@ |
depend: |
-makedepend $(DEFS) $(CFLAGS) -f - $(SOURCES) > Makefile.depend 2> /dev/null |
clean: |
-rm -f _components.h _link.ld $(COMPONENT_OBJECTS) $(OBJECTS) image.boot Makefile.depend |
_components.h _link.ld $(COMPONENT_OBJECTS): $(COMPONENTS) |
./pack $(OBJCOPY) $(COMPONENTS) |
%.o: %.S |
$(CC) $(DEFS) $(CFLAGS) -D__ASM__ -c $< -o $@ |
%.o: %.c |
$(CC) $(DEFS) $(CFLAGS) -c $< -o $@ |
/tags/0.3.0/boot/arch/ppc64/loader/ofwarch.h |
---|
0,0 → 1,35 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#ifndef BOOT_ppc64_OFWARCH_H_ |
#define BOOT_ppc64_OFWARCH_H_ |
#define OFW_ADDRESS_CELLS 2 |
#define OFW_SIZE_CELLS 2 |
#endif |
/tags/0.3.0/boot/arch/ppc64/loader/asm.S |
---|
0,0 → 1,301 |
# |
# Copyright (c) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
#include "asm.h" |
#include "regname.h" |
#include "debug.inc" |
.text |
.global halt |
.global memcpy |
.global jump_to_kernel |
halt: |
b halt |
memcpy: |
srwi. r7, r5, 3 |
addi r6, r3, -4 |
addi r4, r4, -4 |
beq 2f |
andi. r0, r6, 3 |
mtctr r7 |
bne 5f |
1: |
lwz r7, 4(r4) |
lwzu r8, 8(r4) |
stw r7, 4(r6) |
stwu r8, 8(r6) |
bdnz 1b |
andi. r5, r5, 7 |
2: |
cmplwi 0, r5, 4 |
blt 3f |
lwzu r0, 4(r4) |
addi r5, r5, -4 |
stwu r0, 4(r6) |
3: |
cmpwi 0, r5, 0 |
beqlr |
mtctr r5 |
addi r4, r4, 3 |
addi r6, r6, 3 |
4: |
lbzu r0, 1(r4) |
stbu r0, 1(r6) |
bdnz 4b |
blr |
5: |
subfic r0, r0, 4 |
mtctr r0 |
6: |
lbz r7, 4(r4) |
addi r4, r4, 1 |
stb r7, 4(r6) |
addi r6, r6, 1 |
bdnz 6b |
subf r5, r0, r5 |
rlwinm. r7, r5, 32-3, 3, 31 |
beq 2b |
mtctr r7 |
b 1b |
jump_to_kernel: |
# r3 = bootinfo (pa) |
# r4 = bootinfo_size |
# r5 = trans (pa) |
# r6 = bytes to copy |
# r7 = real_mode (pa) |
# r8 = framebuffer (pa) |
# r9 = scanline |
# disable interrupts |
mfmsr r31 |
rlwinm r31, r31, 0, 17, 15 |
mtmsr r31 |
# set real_mode meeting point address |
mtspr srr0, r7 |
# jumps to real_mode |
mfmsr r31 |
lis r30, ~0@h |
ori r30, r30, ~(msr_ir | msr_dr)@l |
and r31, r31, r30 |
mtspr srr1, r31 |
sync |
isync |
rfid |
.section REALMODE, "ax" |
.align PAGE_WIDTH |
.global real_mode |
real_mode: |
DEBUG_INIT |
DEBUG_real_mode |
# copy kernel to proper location |
# |
# r5 = trans (pa) |
# r6 = bytes to copy |
# r8 = framebuffer (pa) |
# r9 = scanline |
li r31, PAGE_SIZE >> 2 |
li r30, 0 |
page_copy: |
cmpwi r6, 0 |
beq copy_end |
# copy page |
mtctr r31 |
lwz r29, 0(r5) |
DEBUG_INIT |
DEBUG_copy_loop |
copy_loop: |
lwz r28, 0(r29) |
stw r28, 0(r30) |
addi r29, r29, 4 |
addi r30, r30, 4 |
subi r6, r6, 4 |
cmpwi r6, 0 |
beq copy_end |
bdnz copy_loop |
DEBUG_end_copy_loop |
addi r5, r5, 4 |
b page_copy |
copy_end: |
DEBUG_segments |
# initially fill segment registers |
li r31, 0 |
li r29, 8 |
mtctr r29 |
li r30, 0 # ASID 0 (VSIDs 0 .. 7) |
seg_fill_uspace: |
mtsrin r30, r31 |
addi r30, r30, 1 |
addis r31, r31, 0x1000 # move to next SR |
bdnz seg_fill_uspace |
li r29, 8 |
mtctr r29 |
lis r30, 0x4000 # priviledged access only |
ori r30, r30, 8 # ASID 0 (VSIDs 8 .. 15) |
seg_fill_kernel: |
mtsrin r30, r31 |
addi r30, r30, 1 |
addis r31, r31, 0x1000 # move to next SR |
bdnz seg_fill_kernel |
# create empty Page Hash Table |
# on top of memory, size 64 KB |
DEBUG_pht |
lwz r31, 0(r3) # r31 = memory size |
lis r30, 65536@h |
ori r30, r30, 65536@l # r30 = 65536 |
subi r29, r30, 1 # r29 = 65535 |
sub r31, r31, r30 |
andc r31, r31, r29 # pht = ALIGN_DOWN(memory_size - 65536, 65536) |
mtsdr1 r31 |
li r29, 2 |
srw r30, r30, r29 # r30 = 16384 |
li r29, 0 |
pht_clear: |
# write zeroes |
stw r29, 0(r31) |
addi r31, r31, 4 |
subi r30, r30, 4 |
cmpwi r30, 0 |
beq clear_end |
bdnz pht_clear |
DEBUG_end_pht_clear |
clear_end: |
DEBUG_tlb |
tlbia |
tlbsync |
DEBUG_prepare |
# start the kernel |
# |
# pc = KERNEL_START_ADDR |
# r3 = bootinfo (pa) |
# sprg0 = KA2PA(KERNEL_START_ADDR) |
# sprg3 = physical memory size |
# sp = 0 (pa) |
lis r31, KERNEL_START_ADDR@ha |
addi r31, r31, KERNEL_START_ADDR@l |
mtspr srr0, r31 |
subis r31, r31, 0x8000 |
mtsprg0 r31 |
lwz r31, 0(r3) |
mtsprg3 r31 |
li sp, 0 |
mfmsr r31 |
ori r31, r31, (msr_ir | msr_dr)@l |
mtspr srr1, r31 |
sync |
isync |
DEBUG_rfi |
rfid |
.align PAGE_WIDTH |
.global trans |
trans: |
.space (TRANS_SIZE * TRANS_ITEM_SIZE) |
/tags/0.3.0/boot/arch/ppc64/loader/boot.S |
---|
0,0 → 1,42 |
# |
# Copyright (c) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
#include "regname.h" |
.section BOOTSTRAP, "ax" |
.global start |
start: |
lis r4, ofw_cif@ha |
addi r4, r4, ofw_cif@l |
stw r5, 0(r4) |
bl ofw_init |
b bootstrap |
/tags/0.3.0/boot/arch/ppc64/loader/regname.h |
---|
0,0 → 1,204 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#ifndef __ppc32_REGNAME_H__ |
#define __ppc32_REGNAME_H__ |
/* Condition Register Bit Fields */ |
#define cr0 0 |
#define cr1 1 |
#define cr2 2 |
#define cr3 3 |
#define cr4 4 |
#define cr5 5 |
#define cr6 6 |
#define cr7 7 |
/* General Purpose Registers (GPRs) */ |
#define r0 0 |
#define r1 1 |
#define r2 2 |
#define r3 3 |
#define r4 4 |
#define r5 5 |
#define r6 6 |
#define r7 7 |
#define r8 8 |
#define r9 9 |
#define r10 10 |
#define r11 11 |
#define r12 12 |
#define r13 13 |
#define r14 14 |
#define r15 15 |
#define r16 16 |
#define r17 17 |
#define r18 18 |
#define r19 19 |
#define r20 20 |
#define r21 21 |
#define r22 22 |
#define r23 23 |
#define r24 24 |
#define r25 25 |
#define r26 26 |
#define r27 27 |
#define r28 28 |
#define r29 29 |
#define r30 30 |
#define r31 31 |
/* GPR Aliases */ |
#define sp 1 |
/* Floating Point Registers (FPRs) */ |
#define fr0 0 |
#define fr1 1 |
#define fr2 2 |
#define fr3 3 |
#define fr4 4 |
#define fr5 5 |
#define fr6 6 |
#define fr7 7 |
#define fr8 8 |
#define fr9 9 |
#define fr10 10 |
#define fr11 11 |
#define fr12 12 |
#define fr13 13 |
#define fr14 14 |
#define fr15 15 |
#define fr16 16 |
#define fr17 17 |
#define fr18 18 |
#define fr19 19 |
#define fr20 20 |
#define fr21 21 |
#define fr22 22 |
#define fr23 23 |
#define fr24 24 |
#define fr25 25 |
#define fr26 26 |
#define fr27 27 |
#define fr28 28 |
#define fr29 29 |
#define fr30 30 |
#define fr31 31 |
#define vr0 0 |
#define vr1 1 |
#define vr2 2 |
#define vr3 3 |
#define vr4 4 |
#define vr5 5 |
#define vr6 6 |
#define vr7 7 |
#define vr8 8 |
#define vr9 9 |
#define vr10 10 |
#define vr11 11 |
#define vr12 12 |
#define vr13 13 |
#define vr14 14 |
#define vr15 15 |
#define vr16 16 |
#define vr17 17 |
#define vr18 18 |
#define vr19 19 |
#define vr20 20 |
#define vr21 21 |
#define vr22 22 |
#define vr23 23 |
#define vr24 24 |
#define vr25 25 |
#define vr26 26 |
#define vr27 27 |
#define vr28 28 |
#define vr29 29 |
#define vr30 30 |
#define vr31 31 |
#define evr0 0 |
#define evr1 1 |
#define evr2 2 |
#define evr3 3 |
#define evr4 4 |
#define evr5 5 |
#define evr6 6 |
#define evr7 7 |
#define evr8 8 |
#define evr9 9 |
#define evr10 10 |
#define evr11 11 |
#define evr12 12 |
#define evr13 13 |
#define evr14 14 |
#define evr15 15 |
#define evr16 16 |
#define evr17 17 |
#define evr18 18 |
#define evr19 19 |
#define evr20 20 |
#define evr21 21 |
#define evr22 22 |
#define evr23 23 |
#define evr24 24 |
#define evr25 25 |
#define evr26 26 |
#define evr27 27 |
#define evr28 28 |
#define evr29 29 |
#define evr30 30 |
#define evr31 31 |
/* Special Purpose Registers (SPRs) */ |
#define xer 1 |
#define lr 8 |
#define ctr 9 |
#define dec 22 |
#define sdr1 25 |
#define srr0 26 |
#define srr1 27 |
#define sprg0 272 |
#define sprg1 273 |
#define sprg2 274 |
#define sprg3 275 |
#define prv 287 |
#define hid0 1008 |
/* MSR bits */ |
#define msr_ir (1 << 4) |
#define msr_dr (1 << 5) |
/* HID0 bits */ |
#define hid0_ice (1 << 15) |
#define hid0_dce (1 << 14) |
#define hid0_icfi (1 << 11) |
#define hid0_dci (1 << 10) |
#endif |
/tags/0.3.0/boot/arch/ppc64/loader/main.c |
---|
0,0 → 1,181 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#include "main.h" |
#include <printf.h> |
#include "asm.h" |
#include "_components.h" |
#include <ofw.h> |
#include <align.h> |
#define HEAP_GAP 1024000 |
bootinfo_t bootinfo; |
static void check_align(const void *addr, const char *desc) |
{ |
if ((unsigned long) addr % PAGE_SIZE != 0) { |
printf("Error: %s not on page boundary, halting.\n", desc); |
halt(); |
} |
} |
static void fix_overlap(void *va, void **pa, const char *desc, unsigned long *top) |
{ |
if ((unsigned long) *pa + PAGE_SIZE < *top) { |
printf("Warning: %s overlaps kernel physical area\n", desc); |
void *new_va = (void *) (ALIGN_UP((unsigned long) KERNEL_END + HEAP_GAP, PAGE_SIZE) + *top); |
void *new_pa = (void *) (HEAP_GAP + *top); |
*top += PAGE_SIZE; |
if (ofw_map(new_pa, new_va, PAGE_SIZE, 0) != 0) { |
printf("Error: Unable to map page aligned memory at %L (physical %L), halting.\n", new_va, new_pa); |
halt(); |
} |
if ((unsigned long) new_pa + PAGE_SIZE < KERNEL_SIZE) { |
printf("Error: %s cannot be relocated, halting.\n", desc); |
halt(); |
} |
printf("Relocating %L -> %L (physical %L -> %L)\n", va, new_va, *pa, new_pa); |
*pa = new_pa; |
memcpy(new_va, va, PAGE_SIZE); |
} |
} |
char *release = RELEASE; |
#ifdef REVISION |
char *revision = ", revision " REVISION; |
#else |
char *revision = ""; |
#endif |
#ifdef TIMESTAMP |
char *timestamp = "\nBuilt on " TIMESTAMP; |
#else |
char *timestamp = ""; |
#endif |
/** Print version information. */ |
static void version_print(void) |
{ |
printf("HelenOS PPC64 Bootloader\nRelease %s%s%s\nCopyright (c) 2006 HelenOS project\n", release, revision, timestamp); |
} |
void bootstrap(void) |
{ |
version_print(); |
init_components(); |
unsigned int i; |
for (i = 0; i < COMPONENTS; i++) |
check_align(components[i].start, components[i].name); |
check_align(&real_mode, "bootstrap trampoline"); |
check_align(&trans, "translation table"); |
if (!ofw_memmap(&bootinfo.memmap)) { |
printf("Error: unable to get memory map, halting.\n"); |
halt(); |
} |
if (bootinfo.memmap.total == 0) { |
printf("Error: no memory detected, halting.\n"); |
halt(); |
} |
if (!ofw_screen(&bootinfo.screen)) { |
printf("Error: unable to get screen properties, halting.\n"); |
halt(); |
} |
if (!ofw_keyboard(&bootinfo.keyboard)) { |
printf("Error: unable to get keyboard properties, halting.\n"); |
halt(); |
} |
printf("\nDevice statistics\n"); |
printf(" screen at %L, resolution %dx%d, %d bpp (scanline %d bytes)\n", bootinfo.screen.addr, bootinfo.screen.width, bootinfo.screen.height, bootinfo.screen.bpp, bootinfo.screen.scanline); |
printf(" keyboard at %L (size %d bytes)\n", bootinfo.keyboard.addr, bootinfo.keyboard.size); |
void *real_mode_pa = ofw_translate(&real_mode); |
void *trans_pa = ofw_translate(&trans); |
void *bootinfo_pa = ofw_translate(&bootinfo); |
printf("\nMemory statistics (total %d MB)\n", bootinfo.memmap.total >> 20); |
printf(" %L: boot info structure (physical %L)\n", &bootinfo, bootinfo_pa); |
printf(" %L: bootstrap trampoline (physical %L)\n", &real_mode, real_mode_pa); |
printf(" %L: translation table (physical %L)\n", &trans, trans_pa); |
for (i = 0; i < COMPONENTS; i++) |
printf(" %L: %s image (size %d bytes)\n", components[i].start, components[i].name, components[i].size); |
unsigned long top = 0; |
for (i = 0; i < COMPONENTS; i++) |
top += ALIGN_UP(components[i].size, PAGE_SIZE); |
unsigned long pages = ALIGN_UP(KERNEL_SIZE, PAGE_SIZE) >> PAGE_WIDTH; |
for (i = 0; i < pages; i++) { |
void *pa = ofw_translate(KERNEL_START + (i << PAGE_WIDTH)); |
fix_overlap(KERNEL_START + (i << PAGE_WIDTH), &pa, "kernel", &top); |
trans[i] = pa; |
} |
bootinfo.taskmap.count = 0; |
for (i = 1; i < COMPONENTS; i++) { |
unsigned long component_pages = ALIGN_UP(components[i].size, PAGE_SIZE) >> PAGE_WIDTH; |
unsigned long j; |
for (j = 0; j < component_pages; j++) { |
void *pa = ofw_translate(components[i].start + (j << PAGE_WIDTH)); |
fix_overlap(components[i].start + (j << PAGE_WIDTH), &pa, components[i].name, &top); |
trans[pages + j] = pa; |
if (j == 0) { |
bootinfo.taskmap.tasks[bootinfo.taskmap.count].addr = (void *) (pages << PAGE_WIDTH); |
bootinfo.taskmap.tasks[bootinfo.taskmap.count].size = components[i].size; |
bootinfo.taskmap.count++; |
} |
} |
pages += component_pages; |
} |
fix_overlap(&real_mode, &real_mode_pa, "bootstrap trampoline", &top); |
fix_overlap(&trans, &trans_pa, "translation table", &top); |
fix_overlap(&bootinfo, &bootinfo_pa, "boot info", &top); |
printf("\nBooting the kernel...\n"); |
jump_to_kernel(bootinfo_pa, sizeof(bootinfo), trans_pa, pages << PAGE_WIDTH, real_mode_pa, (void *) bootinfo.screen.addr, bootinfo.screen.scanline); |
} |
/tags/0.3.0/boot/arch/ppc64/loader/asm.h |
---|
0,0 → 1,52 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#ifndef BOOT_ppc64_ASM_H_ |
#define BOOT_ppc64_ASM_H_ |
#define PAGE_SIZE 4096 |
#define PAGE_WIDTH 12 |
#define TRANS_SIZE 1024 |
#define TRANS_ITEM_SIZE 8 |
#define KERNEL_START_ADDR 0x80008000 |
#ifndef __ASM__ |
#define memcpy(dst, src, cnt) __builtin_memcpy((dst), (src), (cnt)) |
extern void *trans[TRANS_SIZE]; |
extern void halt(); |
extern void jump_to_kernel(void *bootinfo, unsigned long bootinfo_size, void *trans, unsigned long kernel_size, void *real_mode, void *fb, unsigned long scanline) __attribute__((noreturn)); |
extern void real_mode(); |
#endif |
#endif |
/tags/0.3.0/boot/arch/ppc64/loader/main.h |
---|
0,0 → 1,58 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#ifndef BOOT_ppc64_MAIN_H_ |
#define BOOT_ppc64_MAIN_H_ |
#include "ofw.h" |
#define TASKMAP_MAX_RECORDS 32 |
typedef struct { |
void *addr; |
unsigned long size; |
} task_t; |
typedef struct { |
unsigned long count; |
task_t tasks[TASKMAP_MAX_RECORDS]; |
} taskmap_t; |
typedef struct { |
memmap_t memmap; |
taskmap_t taskmap; |
screen_t screen; |
keyboard_t keyboard; |
} bootinfo_t; |
extern void start(void); |
extern void bootstrap(void); |
extern memmap_t memmap; |
#endif |
/tags/0.3.0/boot/arch/ppc64/loader/ofwarch.c |
---|
0,0 → 1,68 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#include <ofwarch.h> |
#include <ofw.h> |
#include <printf.h> |
typedef int (* ofw_entry_t)(ofw_args_t *args); |
int ofw(ofw_args_t *args) |
{ |
return ((ofw_entry_t) ofw_cif)(args); |
} |
void write(const char *str, const int len) |
{ |
ofw_write(str, len); |
} |
int ofw_keyboard(keyboard_t *keyboard) |
{ |
char device_name[BUF_SIZE]; |
if (ofw_get_property(ofw_aliases, "macio", device_name, sizeof(device_name)) <= 0) |
return false; |
phandle device = ofw_find_device(device_name); |
if (device == -1) |
return false; |
pci_reg_t macio; |
if (ofw_get_property(device, "assigned-addresses", &macio, sizeof(macio)) <= 0) |
return false; |
keyboard->addr = (void *) (((unsigned long) macio.addr.addr_lo) | (((unsigned long) macio.addr.addr_hi) << 32)); |
keyboard->size = macio.size_lo; |
return true; |
} |
int ofw_translate_failed(ofw_arg_t flag) |
{ |
return 0; |
} |
/tags/0.3.0/boot/arch/ppc64/loader/types.h |
---|
0,0 → 1,44 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#ifndef BOOT_ppc64_TYPES_H_ |
#define BOOT_ppc64_TYPES_H_ |
#include <gentypes.h> |
typedef signed char int8_t; |
typedef unsigned char uint8_t; |
typedef unsigned short uint16_t; |
typedef unsigned int uint32_t; |
typedef unsigned long uint64_t; |
typedef uint64_t uintptr_t; |
typedef uint64_t unative_t; |
#endif |
/tags/0.3.0/boot/arch/ppc64/loader/debug.inc |
---|
0,0 → 1,11479 |
# |
# Copyright (C) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
.macro DEBUG_INIT |
#ifdef CONFIG_DEBUG |
lis r11, 65535 |
ori r11, r11, 65535 |
lis r12, 0 |
ori r12, r12, 0 |
mr r10, r8 |
#endif |
.endm |
.macro DEBUG_real_mode |
#ifdef CONFIG_DEBUG |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r11, 108(r10) |
stw r11, 112(r10) |
stw r11, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r11, 240(r10) |
stw r11, 244(r10) |
stw r11, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r11, 112(r10) |
stw r11, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r11, 244(r10) |
stw r11, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r11, 112(r10) |
stw r11, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r11, 244(r10) |
stw r11, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r12, 12(r10) |
stw r11, 16(r10) |
stw r11, 20(r10) |
stw r11, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r11, 112(r10) |
stw r11, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r11, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r12, 176(r10) |
stw r11, 180(r10) |
stw r11, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r11, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r11, 212(r10) |
stw r11, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r11, 236(r10) |
stw r11, 240(r10) |
stw r11, 244(r10) |
stw r11, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r11, 264(r10) |
stw r11, 268(r10) |
stw r11, 272(r10) |
stw r11, 276(r10) |
stw r11, 280(r10) |
stw r12, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r11, 112(r10) |
stw r11, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r11, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r11, 176(r10) |
stw r11, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r11, 196(r10) |
stw r11, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r11, 216(r10) |
stw r11, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r11, 232(r10) |
stw r11, 236(r10) |
stw r12, 240(r10) |
stw r11, 244(r10) |
stw r11, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r11, 260(r10) |
stw r11, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r11, 280(r10) |
stw r11, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r11, 112(r10) |
stw r11, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r11, 164(r10) |
stw r11, 168(r10) |
stw r12, 172(r10) |
stw r11, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r11, 196(r10) |
stw r11, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r11, 216(r10) |
stw r11, 220(r10) |
stw r12, 224(r10) |
stw r11, 228(r10) |
stw r11, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r11, 244(r10) |
stw r11, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r11, 260(r10) |
stw r11, 264(r10) |
stw r11, 268(r10) |
stw r11, 272(r10) |
stw r11, 276(r10) |
stw r11, 280(r10) |
stw r11, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r11, 112(r10) |
stw r11, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r11, 164(r10) |
stw r11, 168(r10) |
stw r12, 172(r10) |
stw r11, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r11, 196(r10) |
stw r11, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r11, 216(r10) |
stw r11, 220(r10) |
stw r12, 224(r10) |
stw r11, 228(r10) |
stw r11, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r11, 244(r10) |
stw r11, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r11, 260(r10) |
stw r11, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r11, 112(r10) |
stw r11, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r11, 164(r10) |
stw r11, 168(r10) |
stw r12, 172(r10) |
stw r11, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r11, 196(r10) |
stw r11, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r11, 216(r10) |
stw r11, 220(r10) |
stw r12, 224(r10) |
stw r11, 228(r10) |
stw r11, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r11, 244(r10) |
stw r11, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r11, 260(r10) |
stw r11, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r11, 112(r10) |
stw r11, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r11, 164(r10) |
stw r11, 168(r10) |
stw r12, 172(r10) |
stw r11, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r11, 196(r10) |
stw r11, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r11, 216(r10) |
stw r11, 220(r10) |
stw r12, 224(r10) |
stw r11, 228(r10) |
stw r11, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r11, 244(r10) |
stw r11, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r11, 260(r10) |
stw r11, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r11, 280(r10) |
stw r11, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r11, 88(r10) |
stw r11, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r11, 108(r10) |
stw r11, 112(r10) |
stw r11, 116(r10) |
stw r11, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r11, 164(r10) |
stw r11, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r11, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r11, 212(r10) |
stw r11, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r11, 232(r10) |
stw r11, 236(r10) |
stw r11, 240(r10) |
stw r12, 244(r10) |
stw r11, 248(r10) |
stw r11, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r11, 264(r10) |
stw r11, 268(r10) |
stw r11, 272(r10) |
stw r11, 276(r10) |
stw r11, 280(r10) |
stw r12, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r11, 132(r10) |
stw r11, 136(r10) |
stw r11, 140(r10) |
stw r11, 144(r10) |
stw r11, 148(r10) |
stw r11, 152(r10) |
stw r11, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
#endif |
.endm |
.macro DEBUG_copy_loop |
#ifdef CONFIG_DEBUG |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r11, 172(r10) |
stw r11, 176(r10) |
stw r11, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r11, 176(r10) |
stw r11, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r11, 176(r10) |
stw r11, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r11, 20(r10) |
stw r11, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r12, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r11, 100(r10) |
stw r11, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r11, 120(r10) |
stw r11, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r11, 176(r10) |
stw r11, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r11, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r11, 212(r10) |
stw r11, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r11, 232(r10) |
stw r11, 236(r10) |
stw r11, 240(r10) |
stw r11, 244(r10) |
stw r11, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r11, 260(r10) |
stw r11, 264(r10) |
stw r12, 268(r10) |
stw r11, 272(r10) |
stw r11, 276(r10) |
stw r11, 280(r10) |
stw r12, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r11, 88(r10) |
stw r11, 92(r10) |
stw r12, 96(r10) |
stw r11, 100(r10) |
stw r11, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r11, 120(r10) |
stw r11, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r11, 176(r10) |
stw r11, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r11, 196(r10) |
stw r11, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r11, 216(r10) |
stw r11, 220(r10) |
stw r12, 224(r10) |
stw r11, 228(r10) |
stw r11, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r11, 248(r10) |
stw r11, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r11, 264(r10) |
stw r11, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r11, 280(r10) |
stw r11, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r11, 88(r10) |
stw r11, 92(r10) |
stw r12, 96(r10) |
stw r11, 100(r10) |
stw r11, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r11, 120(r10) |
stw r11, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r11, 176(r10) |
stw r11, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r11, 196(r10) |
stw r11, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r11, 216(r10) |
stw r11, 220(r10) |
stw r12, 224(r10) |
stw r11, 228(r10) |
stw r11, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r11, 248(r10) |
stw r11, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r11, 264(r10) |
stw r11, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r11, 280(r10) |
stw r11, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r11, 88(r10) |
stw r11, 92(r10) |
stw r12, 96(r10) |
stw r11, 100(r10) |
stw r11, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r11, 120(r10) |
stw r11, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r11, 176(r10) |
stw r11, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r11, 196(r10) |
stw r11, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r11, 216(r10) |
stw r11, 220(r10) |
stw r12, 224(r10) |
stw r11, 228(r10) |
stw r11, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r11, 248(r10) |
stw r11, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r11, 264(r10) |
stw r11, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r11, 280(r10) |
stw r11, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r11, 88(r10) |
stw r11, 92(r10) |
stw r12, 96(r10) |
stw r11, 100(r10) |
stw r11, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r11, 120(r10) |
stw r11, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r11, 176(r10) |
stw r11, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r11, 196(r10) |
stw r11, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r11, 216(r10) |
stw r11, 220(r10) |
stw r12, 224(r10) |
stw r11, 228(r10) |
stw r11, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r11, 248(r10) |
stw r11, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r11, 264(r10) |
stw r11, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r11, 280(r10) |
stw r11, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r11, 88(r10) |
stw r11, 92(r10) |
stw r12, 96(r10) |
stw r11, 100(r10) |
stw r11, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r11, 120(r10) |
stw r11, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r11, 176(r10) |
stw r11, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r11, 196(r10) |
stw r11, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r11, 216(r10) |
stw r11, 220(r10) |
stw r12, 224(r10) |
stw r11, 228(r10) |
stw r11, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r11, 248(r10) |
stw r11, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r11, 264(r10) |
stw r11, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r11, 280(r10) |
stw r11, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r11, 20(r10) |
stw r11, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r11, 104(r10) |
stw r11, 108(r10) |
stw r11, 112(r10) |
stw r11, 116(r10) |
stw r11, 120(r10) |
stw r11, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r11, 172(r10) |
stw r11, 176(r10) |
stw r11, 180(r10) |
stw r11, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r11, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r11, 212(r10) |
stw r11, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r11, 232(r10) |
stw r11, 236(r10) |
stw r11, 240(r10) |
stw r11, 244(r10) |
stw r11, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r11, 264(r10) |
stw r11, 268(r10) |
stw r11, 272(r10) |
stw r11, 276(r10) |
stw r11, 280(r10) |
stw r12, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r11, 120(r10) |
stw r11, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r11, 264(r10) |
stw r11, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r11, 116(r10) |
stw r11, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r11, 132(r10) |
stw r11, 136(r10) |
stw r11, 140(r10) |
stw r11, 144(r10) |
stw r11, 148(r10) |
stw r11, 152(r10) |
stw r11, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r11, 264(r10) |
stw r11, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r11, 100(r10) |
stw r11, 104(r10) |
stw r11, 108(r10) |
stw r11, 112(r10) |
stw r11, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r11, 260(r10) |
stw r11, 264(r10) |
stw r11, 268(r10) |
stw r11, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
#endif |
.endm |
.macro DEBUG_end_copy_loop |
#ifdef CONFIG_DEBUG |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r12, 304(r10) |
stw r12, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r12, 324(r10) |
stw r12, 328(r10) |
stw r12, 332(r10) |
stw r12, 336(r10) |
stw r12, 340(r10) |
stw r12, 344(r10) |
stw r12, 348(r10) |
stw r12, 352(r10) |
stw r12, 356(r10) |
stw r12, 360(r10) |
stw r12, 364(r10) |
stw r12, 368(r10) |
stw r12, 372(r10) |
stw r12, 376(r10) |
stw r12, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r12, 392(r10) |
stw r12, 396(r10) |
stw r12, 400(r10) |
stw r12, 404(r10) |
stw r12, 408(r10) |
stw r12, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r12, 304(r10) |
stw r12, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r12, 324(r10) |
stw r12, 328(r10) |
stw r12, 332(r10) |
stw r12, 336(r10) |
stw r12, 340(r10) |
stw r12, 344(r10) |
stw r12, 348(r10) |
stw r12, 352(r10) |
stw r12, 356(r10) |
stw r12, 360(r10) |
stw r12, 364(r10) |
stw r12, 368(r10) |
stw r12, 372(r10) |
stw r12, 376(r10) |
stw r12, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r12, 392(r10) |
stw r12, 396(r10) |
stw r12, 400(r10) |
stw r12, 404(r10) |
stw r12, 408(r10) |
stw r12, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r11, 300(r10) |
stw r11, 304(r10) |
stw r11, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r12, 324(r10) |
stw r12, 328(r10) |
stw r12, 332(r10) |
stw r12, 336(r10) |
stw r12, 340(r10) |
stw r12, 344(r10) |
stw r12, 348(r10) |
stw r12, 352(r10) |
stw r12, 356(r10) |
stw r12, 360(r10) |
stw r12, 364(r10) |
stw r12, 368(r10) |
stw r12, 372(r10) |
stw r12, 376(r10) |
stw r12, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r12, 392(r10) |
stw r12, 396(r10) |
stw r12, 400(r10) |
stw r12, 404(r10) |
stw r12, 408(r10) |
stw r12, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r11, 304(r10) |
stw r11, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r12, 324(r10) |
stw r12, 328(r10) |
stw r12, 332(r10) |
stw r12, 336(r10) |
stw r12, 340(r10) |
stw r12, 344(r10) |
stw r12, 348(r10) |
stw r12, 352(r10) |
stw r12, 356(r10) |
stw r12, 360(r10) |
stw r12, 364(r10) |
stw r12, 368(r10) |
stw r12, 372(r10) |
stw r12, 376(r10) |
stw r12, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r12, 392(r10) |
stw r12, 396(r10) |
stw r12, 400(r10) |
stw r12, 404(r10) |
stw r12, 408(r10) |
stw r12, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r11, 304(r10) |
stw r11, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r12, 324(r10) |
stw r12, 328(r10) |
stw r12, 332(r10) |
stw r12, 336(r10) |
stw r12, 340(r10) |
stw r12, 344(r10) |
stw r12, 348(r10) |
stw r12, 352(r10) |
stw r12, 356(r10) |
stw r12, 360(r10) |
stw r12, 364(r10) |
stw r12, 368(r10) |
stw r12, 372(r10) |
stw r12, 376(r10) |
stw r12, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r12, 392(r10) |
stw r12, 396(r10) |
stw r12, 400(r10) |
stw r12, 404(r10) |
stw r12, 408(r10) |
stw r12, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r11, 20(r10) |
stw r11, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r12, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r11, 136(r10) |
stw r11, 140(r10) |
stw r11, 144(r10) |
stw r11, 148(r10) |
stw r11, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r11, 176(r10) |
stw r11, 180(r10) |
stw r11, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r11, 196(r10) |
stw r11, 200(r10) |
stw r12, 204(r10) |
stw r11, 208(r10) |
stw r11, 212(r10) |
stw r11, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r11, 228(r10) |
stw r11, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r11, 248(r10) |
stw r11, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r11, 304(r10) |
stw r11, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r12, 324(r10) |
stw r11, 328(r10) |
stw r11, 332(r10) |
stw r11, 336(r10) |
stw r11, 340(r10) |
stw r11, 344(r10) |
stw r12, 348(r10) |
stw r12, 352(r10) |
stw r12, 356(r10) |
stw r11, 360(r10) |
stw r11, 364(r10) |
stw r11, 368(r10) |
stw r11, 372(r10) |
stw r11, 376(r10) |
stw r12, 380(r10) |
stw r12, 384(r10) |
stw r11, 388(r10) |
stw r11, 392(r10) |
stw r12, 396(r10) |
stw r11, 400(r10) |
stw r11, 404(r10) |
stw r11, 408(r10) |
stw r12, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r12, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r11, 132(r10) |
stw r11, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r11, 152(r10) |
stw r11, 156(r10) |
stw r12, 160(r10) |
stw r11, 164(r10) |
stw r11, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r11, 200(r10) |
stw r11, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r11, 216(r10) |
stw r11, 220(r10) |
stw r12, 224(r10) |
stw r11, 228(r10) |
stw r11, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r11, 248(r10) |
stw r11, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r11, 304(r10) |
stw r11, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r11, 324(r10) |
stw r11, 328(r10) |
stw r12, 332(r10) |
stw r12, 336(r10) |
stw r12, 340(r10) |
stw r11, 344(r10) |
stw r11, 348(r10) |
stw r12, 352(r10) |
stw r11, 356(r10) |
stw r11, 360(r10) |
stw r12, 364(r10) |
stw r12, 368(r10) |
stw r12, 372(r10) |
stw r11, 376(r10) |
stw r11, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r11, 392(r10) |
stw r11, 396(r10) |
stw r12, 400(r10) |
stw r12, 404(r10) |
stw r11, 408(r10) |
stw r11, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r11, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r11, 132(r10) |
stw r11, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r11, 164(r10) |
stw r11, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r11, 200(r10) |
stw r11, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r11, 216(r10) |
stw r11, 220(r10) |
stw r12, 224(r10) |
stw r11, 228(r10) |
stw r11, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r11, 248(r10) |
stw r11, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r11, 304(r10) |
stw r11, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r11, 324(r10) |
stw r11, 328(r10) |
stw r12, 332(r10) |
stw r12, 336(r10) |
stw r12, 340(r10) |
stw r11, 344(r10) |
stw r11, 348(r10) |
stw r12, 352(r10) |
stw r11, 356(r10) |
stw r11, 360(r10) |
stw r12, 364(r10) |
stw r12, 368(r10) |
stw r12, 372(r10) |
stw r11, 376(r10) |
stw r11, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r11, 392(r10) |
stw r11, 396(r10) |
stw r12, 400(r10) |
stw r12, 404(r10) |
stw r11, 408(r10) |
stw r11, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r11, 132(r10) |
stw r11, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r11, 164(r10) |
stw r11, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r11, 200(r10) |
stw r11, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r11, 216(r10) |
stw r11, 220(r10) |
stw r12, 224(r10) |
stw r11, 228(r10) |
stw r11, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r11, 248(r10) |
stw r11, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r11, 304(r10) |
stw r11, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r11, 324(r10) |
stw r11, 328(r10) |
stw r12, 332(r10) |
stw r12, 336(r10) |
stw r12, 340(r10) |
stw r11, 344(r10) |
stw r11, 348(r10) |
stw r12, 352(r10) |
stw r11, 356(r10) |
stw r11, 360(r10) |
stw r12, 364(r10) |
stw r12, 368(r10) |
stw r12, 372(r10) |
stw r11, 376(r10) |
stw r11, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r11, 392(r10) |
stw r11, 396(r10) |
stw r12, 400(r10) |
stw r12, 404(r10) |
stw r11, 408(r10) |
stw r11, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r11, 132(r10) |
stw r11, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r11, 164(r10) |
stw r11, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r11, 200(r10) |
stw r11, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r11, 216(r10) |
stw r11, 220(r10) |
stw r12, 224(r10) |
stw r11, 228(r10) |
stw r11, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r11, 248(r10) |
stw r11, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r11, 304(r10) |
stw r11, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r11, 324(r10) |
stw r11, 328(r10) |
stw r12, 332(r10) |
stw r12, 336(r10) |
stw r12, 340(r10) |
stw r11, 344(r10) |
stw r11, 348(r10) |
stw r12, 352(r10) |
stw r11, 356(r10) |
stw r11, 360(r10) |
stw r12, 364(r10) |
stw r12, 368(r10) |
stw r12, 372(r10) |
stw r11, 376(r10) |
stw r11, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r11, 392(r10) |
stw r11, 396(r10) |
stw r12, 400(r10) |
stw r12, 404(r10) |
stw r11, 408(r10) |
stw r11, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r11, 132(r10) |
stw r11, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r11, 152(r10) |
stw r11, 156(r10) |
stw r12, 160(r10) |
stw r11, 164(r10) |
stw r11, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r11, 200(r10) |
stw r11, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r11, 216(r10) |
stw r11, 220(r10) |
stw r12, 224(r10) |
stw r11, 228(r10) |
stw r11, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r11, 248(r10) |
stw r11, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r11, 304(r10) |
stw r11, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r11, 324(r10) |
stw r11, 328(r10) |
stw r12, 332(r10) |
stw r12, 336(r10) |
stw r12, 340(r10) |
stw r11, 344(r10) |
stw r11, 348(r10) |
stw r12, 352(r10) |
stw r11, 356(r10) |
stw r11, 360(r10) |
stw r12, 364(r10) |
stw r12, 368(r10) |
stw r12, 372(r10) |
stw r11, 376(r10) |
stw r11, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r11, 392(r10) |
stw r11, 396(r10) |
stw r12, 400(r10) |
stw r12, 404(r10) |
stw r11, 408(r10) |
stw r11, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r11, 20(r10) |
stw r11, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r11, 88(r10) |
stw r11, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r11, 136(r10) |
stw r11, 140(r10) |
stw r11, 144(r10) |
stw r11, 148(r10) |
stw r11, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r11, 176(r10) |
stw r11, 180(r10) |
stw r11, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r11, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r11, 212(r10) |
stw r11, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r11, 232(r10) |
stw r11, 236(r10) |
stw r11, 240(r10) |
stw r11, 244(r10) |
stw r11, 248(r10) |
stw r11, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r11, 300(r10) |
stw r11, 304(r10) |
stw r11, 308(r10) |
stw r11, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r12, 324(r10) |
stw r11, 328(r10) |
stw r11, 332(r10) |
stw r11, 336(r10) |
stw r11, 340(r10) |
stw r11, 344(r10) |
stw r12, 348(r10) |
stw r12, 352(r10) |
stw r12, 356(r10) |
stw r11, 360(r10) |
stw r11, 364(r10) |
stw r11, 368(r10) |
stw r11, 372(r10) |
stw r11, 376(r10) |
stw r12, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r11, 392(r10) |
stw r11, 396(r10) |
stw r11, 400(r10) |
stw r11, 404(r10) |
stw r11, 408(r10) |
stw r12, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r11, 200(r10) |
stw r11, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r11, 248(r10) |
stw r11, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r12, 304(r10) |
stw r12, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r12, 324(r10) |
stw r12, 328(r10) |
stw r12, 332(r10) |
stw r12, 336(r10) |
stw r12, 340(r10) |
stw r12, 344(r10) |
stw r12, 348(r10) |
stw r12, 352(r10) |
stw r12, 356(r10) |
stw r12, 360(r10) |
stw r12, 364(r10) |
stw r12, 368(r10) |
stw r12, 372(r10) |
stw r12, 376(r10) |
stw r12, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r11, 392(r10) |
stw r11, 396(r10) |
stw r12, 400(r10) |
stw r12, 404(r10) |
stw r12, 408(r10) |
stw r12, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r11, 100(r10) |
stw r11, 104(r10) |
stw r11, 108(r10) |
stw r11, 112(r10) |
stw r11, 116(r10) |
stw r11, 120(r10) |
stw r11, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r11, 200(r10) |
stw r11, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r11, 244(r10) |
stw r11, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r11, 260(r10) |
stw r11, 264(r10) |
stw r11, 268(r10) |
stw r11, 272(r10) |
stw r11, 276(r10) |
stw r11, 280(r10) |
stw r11, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r12, 304(r10) |
stw r12, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r12, 324(r10) |
stw r12, 328(r10) |
stw r12, 332(r10) |
stw r12, 336(r10) |
stw r12, 340(r10) |
stw r12, 344(r10) |
stw r12, 348(r10) |
stw r12, 352(r10) |
stw r12, 356(r10) |
stw r12, 360(r10) |
stw r12, 364(r10) |
stw r12, 368(r10) |
stw r12, 372(r10) |
stw r12, 376(r10) |
stw r12, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r11, 392(r10) |
stw r11, 396(r10) |
stw r12, 400(r10) |
stw r12, 404(r10) |
stw r12, 408(r10) |
stw r12, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r11, 196(r10) |
stw r11, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r11, 228(r10) |
stw r11, 232(r10) |
stw r11, 236(r10) |
stw r11, 240(r10) |
stw r11, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r12, 304(r10) |
stw r12, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r12, 324(r10) |
stw r12, 328(r10) |
stw r12, 332(r10) |
stw r12, 336(r10) |
stw r12, 340(r10) |
stw r12, 344(r10) |
stw r12, 348(r10) |
stw r12, 352(r10) |
stw r12, 356(r10) |
stw r12, 360(r10) |
stw r12, 364(r10) |
stw r12, 368(r10) |
stw r12, 372(r10) |
stw r12, 376(r10) |
stw r12, 380(r10) |
stw r12, 384(r10) |
stw r11, 388(r10) |
stw r11, 392(r10) |
stw r11, 396(r10) |
stw r11, 400(r10) |
stw r12, 404(r10) |
stw r12, 408(r10) |
stw r12, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r12, 304(r10) |
stw r12, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r12, 324(r10) |
stw r12, 328(r10) |
stw r12, 332(r10) |
stw r12, 336(r10) |
stw r12, 340(r10) |
stw r12, 344(r10) |
stw r12, 348(r10) |
stw r12, 352(r10) |
stw r12, 356(r10) |
stw r12, 360(r10) |
stw r12, 364(r10) |
stw r12, 368(r10) |
stw r12, 372(r10) |
stw r12, 376(r10) |
stw r12, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r12, 392(r10) |
stw r12, 396(r10) |
stw r12, 400(r10) |
stw r12, 404(r10) |
stw r12, 408(r10) |
stw r12, 412(r10) |
#endif |
.endm |
.macro DEBUG_segments |
#ifdef CONFIG_DEBUG |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r11, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r11, 20(r10) |
stw r11, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r11, 88(r10) |
stw r11, 92(r10) |
stw r12, 96(r10) |
stw r11, 100(r10) |
stw r11, 104(r10) |
stw r11, 108(r10) |
stw r12, 112(r10) |
stw r11, 116(r10) |
stw r11, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r11, 136(r10) |
stw r11, 140(r10) |
stw r11, 144(r10) |
stw r11, 148(r10) |
stw r11, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r11, 164(r10) |
stw r11, 168(r10) |
stw r12, 172(r10) |
stw r11, 176(r10) |
stw r11, 180(r10) |
stw r11, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r11, 196(r10) |
stw r11, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r11, 212(r10) |
stw r11, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r11, 232(r10) |
stw r11, 236(r10) |
stw r11, 240(r10) |
stw r11, 244(r10) |
stw r11, 248(r10) |
stw r12, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r11, 100(r10) |
stw r11, 104(r10) |
stw r11, 108(r10) |
stw r11, 112(r10) |
stw r11, 116(r10) |
stw r11, 120(r10) |
stw r11, 124(r10) |
stw r12, 128(r10) |
stw r11, 132(r10) |
stw r11, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r11, 152(r10) |
stw r11, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r11, 228(r10) |
stw r11, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r11, 248(r10) |
stw r11, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r11, 100(r10) |
stw r11, 104(r10) |
stw r12, 108(r10) |
stw r11, 112(r10) |
stw r12, 116(r10) |
stw r11, 120(r10) |
stw r11, 124(r10) |
stw r12, 128(r10) |
stw r11, 132(r10) |
stw r11, 136(r10) |
stw r11, 140(r10) |
stw r11, 144(r10) |
stw r11, 148(r10) |
stw r11, 152(r10) |
stw r11, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r11, 232(r10) |
stw r11, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r11, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r11, 100(r10) |
stw r11, 104(r10) |
stw r12, 108(r10) |
stw r11, 112(r10) |
stw r12, 116(r10) |
stw r11, 120(r10) |
stw r11, 124(r10) |
stw r12, 128(r10) |
stw r11, 132(r10) |
stw r11, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r11, 236(r10) |
stw r11, 240(r10) |
stw r11, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r11, 20(r10) |
stw r11, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r11, 100(r10) |
stw r11, 104(r10) |
stw r12, 108(r10) |
stw r11, 112(r10) |
stw r12, 116(r10) |
stw r11, 120(r10) |
stw r11, 124(r10) |
stw r12, 128(r10) |
stw r11, 132(r10) |
stw r11, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r11, 244(r10) |
stw r11, 248(r10) |
stw r12, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r11, 100(r10) |
stw r11, 104(r10) |
stw r12, 108(r10) |
stw r11, 112(r10) |
stw r12, 116(r10) |
stw r11, 120(r10) |
stw r11, 124(r10) |
stw r12, 128(r10) |
stw r11, 132(r10) |
stw r11, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r11, 152(r10) |
stw r11, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r12, 212(r10) |
stw r11, 216(r10) |
stw r11, 220(r10) |
stw r12, 224(r10) |
stw r11, 228(r10) |
stw r11, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r11, 248(r10) |
stw r11, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r11, 20(r10) |
stw r11, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r11, 100(r10) |
stw r11, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r11, 120(r10) |
stw r11, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r11, 136(r10) |
stw r11, 140(r10) |
stw r11, 144(r10) |
stw r11, 148(r10) |
stw r11, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r11, 208(r10) |
stw r11, 212(r10) |
stw r11, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r11, 232(r10) |
stw r11, 236(r10) |
stw r11, 240(r10) |
stw r11, 244(r10) |
stw r11, 248(r10) |
stw r12, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
#endif |
.endm |
.macro DEBUG_bat |
#ifdef CONFIG_DEBUG |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r11, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r11, 20(r10) |
stw r11, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r11, 88(r10) |
stw r11, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r11, 20(r10) |
stw r11, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
#endif |
.endm |
.macro DEBUG_mapping |
#ifdef CONFIG_DEBUG |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r11, 144(r10) |
stw r11, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r11, 144(r10) |
stw r11, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r11, 20(r10) |
stw r11, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r12, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r11, 100(r10) |
stw r11, 104(r10) |
stw r12, 108(r10) |
stw r11, 112(r10) |
stw r11, 116(r10) |
stw r11, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r11, 140(r10) |
stw r11, 144(r10) |
stw r11, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r11, 164(r10) |
stw r11, 168(r10) |
stw r12, 172(r10) |
stw r11, 176(r10) |
stw r11, 180(r10) |
stw r11, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r11, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r12, 212(r10) |
stw r11, 216(r10) |
stw r11, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r11, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r11, 88(r10) |
stw r11, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r11, 104(r10) |
stw r11, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r11, 120(r10) |
stw r11, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r11, 144(r10) |
stw r11, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r11, 196(r10) |
stw r11, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r11, 212(r10) |
stw r11, 216(r10) |
stw r12, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r12, 12(r10) |
stw r11, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r11, 88(r10) |
stw r11, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r11, 104(r10) |
stw r11, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r11, 120(r10) |
stw r11, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r11, 144(r10) |
stw r11, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r11, 196(r10) |
stw r11, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r11, 212(r10) |
stw r11, 216(r10) |
stw r12, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r12, 12(r10) |
stw r11, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r11, 88(r10) |
stw r11, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r11, 104(r10) |
stw r11, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r11, 120(r10) |
stw r11, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r11, 144(r10) |
stw r11, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r11, 196(r10) |
stw r11, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r11, 212(r10) |
stw r11, 216(r10) |
stw r12, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r12, 12(r10) |
stw r11, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r11, 88(r10) |
stw r11, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r11, 104(r10) |
stw r11, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r11, 120(r10) |
stw r11, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r11, 144(r10) |
stw r11, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r11, 196(r10) |
stw r11, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r11, 212(r10) |
stw r11, 216(r10) |
stw r12, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r12, 12(r10) |
stw r11, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r11, 88(r10) |
stw r11, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r11, 104(r10) |
stw r11, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r11, 120(r10) |
stw r11, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r11, 144(r10) |
stw r11, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r11, 196(r10) |
stw r11, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r11, 212(r10) |
stw r11, 216(r10) |
stw r12, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r11, 104(r10) |
stw r11, 108(r10) |
stw r11, 112(r10) |
stw r11, 116(r10) |
stw r11, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r11, 140(r10) |
stw r11, 144(r10) |
stw r11, 148(r10) |
stw r11, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r11, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r11, 212(r10) |
stw r11, 216(r10) |
stw r12, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r11, 104(r10) |
stw r11, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r11, 212(r10) |
stw r11, 216(r10) |
stw r12, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r11, 104(r10) |
stw r11, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r11, 196(r10) |
stw r11, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r11, 212(r10) |
stw r11, 216(r10) |
stw r12, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r11, 100(r10) |
stw r11, 104(r10) |
stw r11, 108(r10) |
stw r11, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r11, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r11, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
#endif |
.endm |
.macro DEBUG_tlb |
#ifdef CONFIG_DEBUG |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r11, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r11, 20(r10) |
stw r11, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r12, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r11, 88(r10) |
stw r11, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r11, 88(r10) |
stw r11, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r11, 88(r10) |
stw r11, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r11, 88(r10) |
stw r11, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r11, 16(r10) |
stw r11, 20(r10) |
stw r11, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
#endif |
.endm |
.macro DEBUG_prepare |
#ifdef CONFIG_DEBUG |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r12, 12(r10) |
stw r11, 16(r10) |
stw r11, 20(r10) |
stw r11, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r12, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r11, 100(r10) |
stw r11, 104(r10) |
stw r12, 108(r10) |
stw r11, 112(r10) |
stw r11, 116(r10) |
stw r11, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r11, 136(r10) |
stw r11, 140(r10) |
stw r11, 144(r10) |
stw r11, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r11, 164(r10) |
stw r11, 168(r10) |
stw r12, 172(r10) |
stw r11, 176(r10) |
stw r11, 180(r10) |
stw r11, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r11, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r11, 212(r10) |
stw r11, 216(r10) |
stw r12, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r11, 88(r10) |
stw r11, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r11, 104(r10) |
stw r11, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r11, 120(r10) |
stw r11, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r11, 148(r10) |
stw r11, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r11, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r11, 196(r10) |
stw r11, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r11, 216(r10) |
stw r11, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r11, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r11, 104(r10) |
stw r11, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r11, 120(r10) |
stw r11, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r11, 136(r10) |
stw r11, 140(r10) |
stw r11, 144(r10) |
stw r11, 148(r10) |
stw r11, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r11, 196(r10) |
stw r11, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r11, 212(r10) |
stw r11, 216(r10) |
stw r11, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r11, 104(r10) |
stw r11, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r11, 120(r10) |
stw r11, 124(r10) |
stw r12, 128(r10) |
stw r11, 132(r10) |
stw r11, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r11, 148(r10) |
stw r11, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r11, 196(r10) |
stw r11, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r11, 104(r10) |
stw r11, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r11, 120(r10) |
stw r11, 124(r10) |
stw r12, 128(r10) |
stw r11, 132(r10) |
stw r11, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r11, 148(r10) |
stw r11, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r11, 196(r10) |
stw r11, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r11, 88(r10) |
stw r11, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r11, 104(r10) |
stw r11, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r11, 120(r10) |
stw r11, 124(r10) |
stw r12, 128(r10) |
stw r11, 132(r10) |
stw r11, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r11, 148(r10) |
stw r11, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r11, 196(r10) |
stw r11, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r11, 216(r10) |
stw r11, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r11, 20(r10) |
stw r11, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r11, 104(r10) |
stw r11, 108(r10) |
stw r11, 112(r10) |
stw r11, 116(r10) |
stw r11, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r11, 136(r10) |
stw r11, 140(r10) |
stw r11, 144(r10) |
stw r12, 148(r10) |
stw r11, 152(r10) |
stw r11, 156(r10) |
stw r12, 160(r10) |
stw r11, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r11, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r11, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r11, 212(r10) |
stw r11, 216(r10) |
stw r12, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r11, 104(r10) |
stw r11, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r11, 104(r10) |
stw r11, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r11, 100(r10) |
stw r11, 104(r10) |
stw r11, 108(r10) |
stw r11, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
#endif |
.endm |
.macro DEBUG_rfi |
#ifdef CONFIG_DEBUG |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r12, 12(r10) |
stw r11, 16(r10) |
stw r11, 20(r10) |
stw r11, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
#endif |
.endm |
.macro DEBUG_pht |
#ifdef CONFIG_DEBUG |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r12, 12(r10) |
stw r11, 16(r10) |
stw r11, 20(r10) |
stw r11, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r12, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r11, 88(r10) |
stw r11, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r11, 20(r10) |
stw r11, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
#endif |
.endm |
.macro DEBUG_end_pht_clear |
#ifdef CONFIG_DEBUG |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r12, 304(r10) |
stw r12, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r12, 324(r10) |
stw r12, 328(r10) |
stw r12, 332(r10) |
stw r12, 336(r10) |
stw r12, 340(r10) |
stw r12, 344(r10) |
stw r12, 348(r10) |
stw r12, 352(r10) |
stw r12, 356(r10) |
stw r12, 360(r10) |
stw r12, 364(r10) |
stw r12, 368(r10) |
stw r12, 372(r10) |
stw r12, 376(r10) |
stw r12, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r12, 392(r10) |
stw r12, 396(r10) |
stw r12, 400(r10) |
stw r12, 404(r10) |
stw r12, 408(r10) |
stw r12, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r12, 304(r10) |
stw r12, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r12, 324(r10) |
stw r12, 328(r10) |
stw r12, 332(r10) |
stw r12, 336(r10) |
stw r12, 340(r10) |
stw r12, 344(r10) |
stw r12, 348(r10) |
stw r12, 352(r10) |
stw r12, 356(r10) |
stw r12, 360(r10) |
stw r12, 364(r10) |
stw r12, 368(r10) |
stw r12, 372(r10) |
stw r12, 376(r10) |
stw r12, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r12, 392(r10) |
stw r12, 396(r10) |
stw r12, 400(r10) |
stw r12, 404(r10) |
stw r12, 408(r10) |
stw r12, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r11, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r11, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r11, 300(r10) |
stw r11, 304(r10) |
stw r11, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r12, 324(r10) |
stw r12, 328(r10) |
stw r12, 332(r10) |
stw r12, 336(r10) |
stw r12, 340(r10) |
stw r12, 344(r10) |
stw r12, 348(r10) |
stw r12, 352(r10) |
stw r12, 356(r10) |
stw r12, 360(r10) |
stw r12, 364(r10) |
stw r12, 368(r10) |
stw r12, 372(r10) |
stw r12, 376(r10) |
stw r12, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r12, 392(r10) |
stw r12, 396(r10) |
stw r12, 400(r10) |
stw r12, 404(r10) |
stw r12, 408(r10) |
stw r12, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r11, 304(r10) |
stw r11, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r12, 324(r10) |
stw r12, 328(r10) |
stw r12, 332(r10) |
stw r12, 336(r10) |
stw r12, 340(r10) |
stw r12, 344(r10) |
stw r12, 348(r10) |
stw r12, 352(r10) |
stw r12, 356(r10) |
stw r12, 360(r10) |
stw r12, 364(r10) |
stw r12, 368(r10) |
stw r12, 372(r10) |
stw r12, 376(r10) |
stw r12, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r12, 392(r10) |
stw r12, 396(r10) |
stw r12, 400(r10) |
stw r12, 404(r10) |
stw r12, 408(r10) |
stw r12, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r11, 304(r10) |
stw r11, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r12, 324(r10) |
stw r12, 328(r10) |
stw r12, 332(r10) |
stw r12, 336(r10) |
stw r12, 340(r10) |
stw r12, 344(r10) |
stw r12, 348(r10) |
stw r12, 352(r10) |
stw r12, 356(r10) |
stw r12, 360(r10) |
stw r12, 364(r10) |
stw r12, 368(r10) |
stw r12, 372(r10) |
stw r12, 376(r10) |
stw r12, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r12, 392(r10) |
stw r12, 396(r10) |
stw r12, 400(r10) |
stw r12, 404(r10) |
stw r12, 408(r10) |
stw r12, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r11, 20(r10) |
stw r11, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r12, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r11, 132(r10) |
stw r11, 136(r10) |
stw r12, 140(r10) |
stw r11, 144(r10) |
stw r11, 148(r10) |
stw r11, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r12, 176(r10) |
stw r11, 180(r10) |
stw r11, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r11, 196(r10) |
stw r11, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r11, 212(r10) |
stw r11, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r11, 264(r10) |
stw r11, 268(r10) |
stw r11, 272(r10) |
stw r11, 276(r10) |
stw r11, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r11, 304(r10) |
stw r11, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r12, 324(r10) |
stw r11, 328(r10) |
stw r11, 332(r10) |
stw r11, 336(r10) |
stw r11, 340(r10) |
stw r11, 344(r10) |
stw r12, 348(r10) |
stw r12, 352(r10) |
stw r12, 356(r10) |
stw r11, 360(r10) |
stw r11, 364(r10) |
stw r11, 368(r10) |
stw r11, 372(r10) |
stw r12, 376(r10) |
stw r12, 380(r10) |
stw r12, 384(r10) |
stw r11, 388(r10) |
stw r11, 392(r10) |
stw r12, 396(r10) |
stw r11, 400(r10) |
stw r11, 404(r10) |
stw r11, 408(r10) |
stw r12, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r12, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r11, 136(r10) |
stw r11, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r11, 152(r10) |
stw r11, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r11, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r11, 260(r10) |
stw r11, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r11, 280(r10) |
stw r11, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r11, 304(r10) |
stw r11, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r11, 324(r10) |
stw r11, 328(r10) |
stw r12, 332(r10) |
stw r12, 336(r10) |
stw r12, 340(r10) |
stw r11, 344(r10) |
stw r11, 348(r10) |
stw r12, 352(r10) |
stw r12, 356(r10) |
stw r12, 360(r10) |
stw r12, 364(r10) |
stw r12, 368(r10) |
stw r11, 372(r10) |
stw r11, 376(r10) |
stw r12, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r11, 392(r10) |
stw r11, 396(r10) |
stw r11, 400(r10) |
stw r12, 404(r10) |
stw r11, 408(r10) |
stw r11, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r11, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r11, 136(r10) |
stw r11, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r11, 152(r10) |
stw r11, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r11, 260(r10) |
stw r11, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r11, 304(r10) |
stw r11, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r11, 324(r10) |
stw r11, 328(r10) |
stw r11, 332(r10) |
stw r11, 336(r10) |
stw r11, 340(r10) |
stw r11, 344(r10) |
stw r11, 348(r10) |
stw r12, 352(r10) |
stw r12, 356(r10) |
stw r11, 360(r10) |
stw r11, 364(r10) |
stw r11, 368(r10) |
stw r11, 372(r10) |
stw r11, 376(r10) |
stw r12, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r11, 392(r10) |
stw r11, 396(r10) |
stw r12, 400(r10) |
stw r12, 404(r10) |
stw r11, 408(r10) |
stw r11, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r11, 136(r10) |
stw r11, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r11, 152(r10) |
stw r11, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r11, 260(r10) |
stw r11, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r11, 304(r10) |
stw r11, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r11, 324(r10) |
stw r11, 328(r10) |
stw r12, 332(r10) |
stw r12, 336(r10) |
stw r12, 340(r10) |
stw r12, 344(r10) |
stw r12, 348(r10) |
stw r12, 352(r10) |
stw r11, 356(r10) |
stw r11, 360(r10) |
stw r12, 364(r10) |
stw r12, 368(r10) |
stw r11, 372(r10) |
stw r11, 376(r10) |
stw r12, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r11, 392(r10) |
stw r11, 396(r10) |
stw r12, 400(r10) |
stw r12, 404(r10) |
stw r12, 408(r10) |
stw r12, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r11, 136(r10) |
stw r11, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r11, 152(r10) |
stw r11, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r11, 260(r10) |
stw r11, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r11, 304(r10) |
stw r11, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r11, 324(r10) |
stw r11, 328(r10) |
stw r12, 332(r10) |
stw r12, 336(r10) |
stw r12, 340(r10) |
stw r12, 344(r10) |
stw r12, 348(r10) |
stw r12, 352(r10) |
stw r11, 356(r10) |
stw r11, 360(r10) |
stw r12, 364(r10) |
stw r12, 368(r10) |
stw r11, 372(r10) |
stw r11, 376(r10) |
stw r12, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r11, 392(r10) |
stw r11, 396(r10) |
stw r12, 400(r10) |
stw r12, 404(r10) |
stw r12, 408(r10) |
stw r12, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r11, 136(r10) |
stw r11, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r11, 152(r10) |
stw r11, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r12, 212(r10) |
stw r11, 216(r10) |
stw r11, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r11, 260(r10) |
stw r11, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r11, 280(r10) |
stw r11, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r11, 304(r10) |
stw r11, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r11, 324(r10) |
stw r11, 328(r10) |
stw r12, 332(r10) |
stw r12, 336(r10) |
stw r12, 340(r10) |
stw r11, 344(r10) |
stw r11, 348(r10) |
stw r12, 352(r10) |
stw r11, 356(r10) |
stw r11, 360(r10) |
stw r12, 364(r10) |
stw r12, 368(r10) |
stw r11, 372(r10) |
stw r11, 376(r10) |
stw r12, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r11, 392(r10) |
stw r11, 396(r10) |
stw r12, 400(r10) |
stw r12, 404(r10) |
stw r12, 408(r10) |
stw r12, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r11, 20(r10) |
stw r11, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r11, 88(r10) |
stw r11, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r11, 136(r10) |
stw r11, 140(r10) |
stw r11, 144(r10) |
stw r11, 148(r10) |
stw r11, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r11, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r11, 208(r10) |
stw r11, 212(r10) |
stw r11, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r11, 264(r10) |
stw r11, 268(r10) |
stw r11, 272(r10) |
stw r11, 276(r10) |
stw r11, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r11, 300(r10) |
stw r11, 304(r10) |
stw r11, 308(r10) |
stw r11, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r12, 324(r10) |
stw r11, 328(r10) |
stw r11, 332(r10) |
stw r11, 336(r10) |
stw r11, 340(r10) |
stw r11, 344(r10) |
stw r12, 348(r10) |
stw r12, 352(r10) |
stw r12, 356(r10) |
stw r11, 360(r10) |
stw r11, 364(r10) |
stw r11, 368(r10) |
stw r12, 372(r10) |
stw r11, 376(r10) |
stw r11, 380(r10) |
stw r12, 384(r10) |
stw r11, 388(r10) |
stw r11, 392(r10) |
stw r11, 396(r10) |
stw r11, 400(r10) |
stw r12, 404(r10) |
stw r12, 408(r10) |
stw r12, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r11, 136(r10) |
stw r11, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r12, 304(r10) |
stw r12, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r12, 324(r10) |
stw r12, 328(r10) |
stw r12, 332(r10) |
stw r12, 336(r10) |
stw r12, 340(r10) |
stw r12, 344(r10) |
stw r12, 348(r10) |
stw r12, 352(r10) |
stw r12, 356(r10) |
stw r12, 360(r10) |
stw r12, 364(r10) |
stw r12, 368(r10) |
stw r12, 372(r10) |
stw r12, 376(r10) |
stw r12, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r12, 392(r10) |
stw r12, 396(r10) |
stw r12, 400(r10) |
stw r12, 404(r10) |
stw r12, 408(r10) |
stw r12, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r11, 100(r10) |
stw r11, 104(r10) |
stw r11, 108(r10) |
stw r11, 112(r10) |
stw r11, 116(r10) |
stw r11, 120(r10) |
stw r11, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r11, 136(r10) |
stw r11, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r11, 228(r10) |
stw r11, 232(r10) |
stw r11, 236(r10) |
stw r11, 240(r10) |
stw r11, 244(r10) |
stw r11, 248(r10) |
stw r11, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r12, 304(r10) |
stw r12, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r12, 324(r10) |
stw r12, 328(r10) |
stw r12, 332(r10) |
stw r12, 336(r10) |
stw r12, 340(r10) |
stw r12, 344(r10) |
stw r12, 348(r10) |
stw r12, 352(r10) |
stw r12, 356(r10) |
stw r12, 360(r10) |
stw r12, 364(r10) |
stw r12, 368(r10) |
stw r12, 372(r10) |
stw r12, 376(r10) |
stw r12, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r12, 392(r10) |
stw r12, 396(r10) |
stw r12, 400(r10) |
stw r12, 404(r10) |
stw r12, 408(r10) |
stw r12, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r11, 132(r10) |
stw r11, 136(r10) |
stw r11, 140(r10) |
stw r11, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r12, 304(r10) |
stw r12, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r12, 324(r10) |
stw r12, 328(r10) |
stw r12, 332(r10) |
stw r12, 336(r10) |
stw r12, 340(r10) |
stw r12, 344(r10) |
stw r12, 348(r10) |
stw r12, 352(r10) |
stw r12, 356(r10) |
stw r12, 360(r10) |
stw r12, 364(r10) |
stw r12, 368(r10) |
stw r12, 372(r10) |
stw r12, 376(r10) |
stw r12, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r12, 392(r10) |
stw r12, 396(r10) |
stw r12, 400(r10) |
stw r12, 404(r10) |
stw r12, 408(r10) |
stw r12, 412(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
stw r12, 256(r10) |
stw r12, 260(r10) |
stw r12, 264(r10) |
stw r12, 268(r10) |
stw r12, 272(r10) |
stw r12, 276(r10) |
stw r12, 280(r10) |
stw r12, 284(r10) |
stw r12, 288(r10) |
stw r12, 292(r10) |
stw r12, 296(r10) |
stw r12, 300(r10) |
stw r12, 304(r10) |
stw r12, 308(r10) |
stw r12, 312(r10) |
stw r12, 316(r10) |
stw r12, 320(r10) |
stw r12, 324(r10) |
stw r12, 328(r10) |
stw r12, 332(r10) |
stw r12, 336(r10) |
stw r12, 340(r10) |
stw r12, 344(r10) |
stw r12, 348(r10) |
stw r12, 352(r10) |
stw r12, 356(r10) |
stw r12, 360(r10) |
stw r12, 364(r10) |
stw r12, 368(r10) |
stw r12, 372(r10) |
stw r12, 376(r10) |
stw r12, 380(r10) |
stw r12, 384(r10) |
stw r12, 388(r10) |
stw r12, 392(r10) |
stw r12, 396(r10) |
stw r12, 400(r10) |
stw r12, 404(r10) |
stw r12, 408(r10) |
stw r12, 412(r10) |
#endif |
.endm |
.macro DEBUG_bat_mask |
#ifdef CONFIG_DEBUG |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r11, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r11, 228(r10) |
stw r11, 232(r10) |
stw r11, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r11, 232(r10) |
stw r11, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r11, 232(r10) |
stw r11, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r11, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r11, 68(r10) |
stw r11, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r11, 132(r10) |
stw r11, 136(r10) |
stw r11, 140(r10) |
stw r12, 144(r10) |
stw r11, 148(r10) |
stw r11, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r11, 176(r10) |
stw r11, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r11, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r11, 212(r10) |
stw r11, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r11, 232(r10) |
stw r11, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r11, 248(r10) |
stw r11, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r11, 20(r10) |
stw r11, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r11, 132(r10) |
stw r11, 136(r10) |
stw r11, 140(r10) |
stw r11, 144(r10) |
stw r11, 148(r10) |
stw r11, 152(r10) |
stw r11, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r11, 180(r10) |
stw r11, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r11, 196(r10) |
stw r11, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r11, 216(r10) |
stw r11, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r11, 232(r10) |
stw r11, 236(r10) |
stw r12, 240(r10) |
stw r11, 244(r10) |
stw r11, 248(r10) |
stw r12, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r11, 132(r10) |
stw r11, 136(r10) |
stw r12, 140(r10) |
stw r11, 144(r10) |
stw r12, 148(r10) |
stw r11, 152(r10) |
stw r11, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r11, 176(r10) |
stw r11, 180(r10) |
stw r11, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r11, 200(r10) |
stw r11, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r11, 232(r10) |
stw r11, 236(r10) |
stw r11, 240(r10) |
stw r11, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r11, 132(r10) |
stw r11, 136(r10) |
stw r12, 140(r10) |
stw r11, 144(r10) |
stw r12, 148(r10) |
stw r11, 152(r10) |
stw r11, 156(r10) |
stw r12, 160(r10) |
stw r11, 164(r10) |
stw r11, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r11, 180(r10) |
stw r11, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r11, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r11, 232(r10) |
stw r11, 236(r10) |
stw r11, 240(r10) |
stw r11, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r11, 132(r10) |
stw r11, 136(r10) |
stw r12, 140(r10) |
stw r11, 144(r10) |
stw r12, 148(r10) |
stw r11, 152(r10) |
stw r11, 156(r10) |
stw r12, 160(r10) |
stw r11, 164(r10) |
stw r11, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r11, 180(r10) |
stw r11, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r11, 212(r10) |
stw r11, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r11, 232(r10) |
stw r11, 236(r10) |
stw r12, 240(r10) |
stw r11, 244(r10) |
stw r11, 248(r10) |
stw r12, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r11, 24(r10) |
stw r11, 28(r10) |
stw r12, 32(r10) |
stw r11, 36(r10) |
stw r11, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r11, 52(r10) |
stw r11, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r11, 76(r10) |
stw r11, 80(r10) |
stw r12, 84(r10) |
stw r11, 88(r10) |
stw r11, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r11, 132(r10) |
stw r11, 136(r10) |
stw r12, 140(r10) |
stw r11, 144(r10) |
stw r12, 148(r10) |
stw r11, 152(r10) |
stw r11, 156(r10) |
stw r12, 160(r10) |
stw r11, 164(r10) |
stw r11, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r11, 180(r10) |
stw r11, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r11, 196(r10) |
stw r11, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r11, 216(r10) |
stw r11, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r11, 232(r10) |
stw r11, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r11, 248(r10) |
stw r11, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r11, 8(r10) |
stw r11, 12(r10) |
stw r11, 16(r10) |
stw r11, 20(r10) |
stw r11, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r11, 40(r10) |
stw r11, 44(r10) |
stw r11, 48(r10) |
stw r12, 52(r10) |
stw r11, 56(r10) |
stw r11, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r11, 80(r10) |
stw r11, 84(r10) |
stw r11, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r11, 132(r10) |
stw r11, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r11, 152(r10) |
stw r11, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r11, 168(r10) |
stw r11, 172(r10) |
stw r11, 176(r10) |
stw r12, 180(r10) |
stw r11, 184(r10) |
stw r11, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r11, 200(r10) |
stw r11, 204(r10) |
stw r11, 208(r10) |
stw r11, 212(r10) |
stw r11, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r11, 228(r10) |
stw r11, 232(r10) |
stw r11, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r11, 248(r10) |
stw r11, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r11, 100(r10) |
stw r11, 104(r10) |
stw r11, 108(r10) |
stw r11, 112(r10) |
stw r11, 116(r10) |
stw r11, 120(r10) |
stw r11, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
add r10, r10, r9 |
stw r12, 0(r10) |
stw r12, 4(r10) |
stw r12, 8(r10) |
stw r12, 12(r10) |
stw r12, 16(r10) |
stw r12, 20(r10) |
stw r12, 24(r10) |
stw r12, 28(r10) |
stw r12, 32(r10) |
stw r12, 36(r10) |
stw r12, 40(r10) |
stw r12, 44(r10) |
stw r12, 48(r10) |
stw r12, 52(r10) |
stw r12, 56(r10) |
stw r12, 60(r10) |
stw r12, 64(r10) |
stw r12, 68(r10) |
stw r12, 72(r10) |
stw r12, 76(r10) |
stw r12, 80(r10) |
stw r12, 84(r10) |
stw r12, 88(r10) |
stw r12, 92(r10) |
stw r12, 96(r10) |
stw r12, 100(r10) |
stw r12, 104(r10) |
stw r12, 108(r10) |
stw r12, 112(r10) |
stw r12, 116(r10) |
stw r12, 120(r10) |
stw r12, 124(r10) |
stw r12, 128(r10) |
stw r12, 132(r10) |
stw r12, 136(r10) |
stw r12, 140(r10) |
stw r12, 144(r10) |
stw r12, 148(r10) |
stw r12, 152(r10) |
stw r12, 156(r10) |
stw r12, 160(r10) |
stw r12, 164(r10) |
stw r12, 168(r10) |
stw r12, 172(r10) |
stw r12, 176(r10) |
stw r12, 180(r10) |
stw r12, 184(r10) |
stw r12, 188(r10) |
stw r12, 192(r10) |
stw r12, 196(r10) |
stw r12, 200(r10) |
stw r12, 204(r10) |
stw r12, 208(r10) |
stw r12, 212(r10) |
stw r12, 216(r10) |
stw r12, 220(r10) |
stw r12, 224(r10) |
stw r12, 228(r10) |
stw r12, 232(r10) |
stw r12, 236(r10) |
stw r12, 240(r10) |
stw r12, 244(r10) |
stw r12, 248(r10) |
stw r12, 252(r10) |
#endif |
.endm |
/tags/0.3.0/boot/arch/ppc64/loader/pack |
---|
0,0 → 1,124 |
#! /bin/sh |
# |
# Copyright (C) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
[ "$#" -lt 1 ] && exit 1 |
OBJCOPY="$1" |
LINK="_link.ld" |
HEADER="_components.h" |
shift |
echo 'OUTPUT_FORMAT("elf64-powerpc") |
OUTPUT_ARCH(powerpc:common64) |
ENTRY(start) |
SECTIONS { |
.boot 0x0000000010000000: AT (0) { |
*(BOOTSTRAP); |
*(REALMODE); |
*(.text); |
*(.toc); |
*(.opd); |
*(.rodata); |
*(.rodata.*); |
*(.data); /* initialized data */ |
*(.sdata); |
*(.sdata2); |
*(.sbss); |
*(.bss); /* uninitialized static variables */ |
*(COMMON); /* global variables */ |
. = ALIGN(4096); |
*(.kernel_image);' > "$LINK" |
echo '#ifndef ___COMPONENTS_H__ |
#define ___COMPONENTS_H__ |
typedef struct { |
char *name; |
void *start; |
void *end; |
unsigned long size; |
} component_t;' > "$HEADER" |
COUNT="0" |
DATA="" |
for TASK in "$@" ; do |
BASENAME="`basename "$TASK" | sed 's/^\(.*\)\.[^.]*$/\1/'`" |
OBJECT="${BASENAME}.o" |
SYMBOL="`echo "_binary_$TASK" | tr "./" "__"`" |
MACRO="`echo "$BASENAME" | tr [:lower:] [:upper:]`" |
echo "$TASK -> $OBJECT" |
echo " |
. = ALIGN(4096); |
*(.${BASENAME}_image);" >> "$LINK" |
echo " |
extern int ${SYMBOL}_start; |
extern int ${SYMBOL}_end; |
#define ${MACRO}_START ((void *) &${SYMBOL}_start) |
#define ${MACRO}_END ((void *) &${SYMBOL}_end) |
#define ${MACRO}_SIZE ((unsigned long) ${MACRO}_END - (unsigned long) ${MACRO}_START)" >> "$HEADER" |
"$OBJCOPY" -I binary -O elf64-powerpc -B powerpc:common64 --rename-section ".data=.${BASENAME}_image" "$TASK" "$OBJECT" |
DATA="${DATA} |
components[$COUNT].name = \"${BASENAME}\"; |
components[$COUNT].start = ${MACRO}_START; |
components[$COUNT].end = ${MACRO}_END; |
components[$COUNT].size = ${MACRO}_SIZE;"; |
COUNT="`expr "$COUNT" + 1`" |
done |
echo '} |
/DISCARD/ : { |
*(*); |
} |
}' >> "$LINK" |
echo " |
#define COMPONENTS $COUNT |
component_t components[COMPONENTS]; |
static void init_components(void) |
{ |
$DATA |
} |
#endif |
" >> "$HEADER" |
Property changes: |
Added: svn:executable |
+* |
\ No newline at end of property |
/tags/0.3.0/boot/arch/ppc64/Makefile.inc |
---|
0,0 → 1,42 |
# |
# Copyright (c) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
build: $(BASE)/image.boot |
$(BASE)/image.boot: depend arch/$(ARCH)/loader/image.boot |
cp arch/$(ARCH)/loader/image.boot $(BASE)/image.boot |
depend: |
-rm arch/$(ARCH)/loader/image.boot |
arch/$(ARCH)/loader/image.boot: |
make -C arch/$(ARCH)/loader COMPILER=$(COMPILER) KERNELDIR=../../../$(KERNELDIR) USPACEDIR=../../../$(USPACEDIR) |
clean: generic_clean |
make -C arch/$(ARCH)/loader clean COMPILER=$(COMPILER) KERNELDIR=../../../$(KERNELDIR) USPACEDIR=../../../$(USPACEDIR) |
-rm -f $(BASE)/image.boot |
/tags/0.3.0/boot/arch/amd64/grub/menu.lst |
---|
0,0 → 1,19 |
default 0 |
timeout 10 |
title=HelenOS |
root (cd) |
kernel /boot/kernel.bin |
module /boot/ns |
module /boot/init |
module /boot/pci |
module /boot/fb |
module /boot/kbd |
module /boot/console |
module /boot/tetris |
module /boot/tester |
module /boot/klog |
module /boot/tmpfs |
module /boot/fat |
module /boot/vfs |
module /boot/devmap |
/tags/0.3.0/boot/arch/amd64/grub/stage2_eltorito |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/tags/0.3.0/boot/arch/amd64/grub/COPYING |
---|
0,0 → 1,340 |
GNU GENERAL PUBLIC LICENSE |
Version 2, June 1991 |
Copyright (C) 1989, 1991 Free Software Foundation, Inc. |
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
Everyone is permitted to copy and distribute verbatim copies |
of this license document, but changing it is not allowed. |
Preamble |
The licenses for most software are designed to take away your |
freedom to share and change it. By contrast, the GNU General Public |
License is intended to guarantee your freedom to share and change free |
software--to make sure the software is free for all its users. This |
General Public License applies to most of the Free Software |
Foundation's software and to any other program whose authors commit to |
using it. (Some other Free Software Foundation software is covered by |
the GNU Library General Public License instead.) You can apply it to |
your programs, too. |
When we speak of free software, we are referring to freedom, not |
price. Our General Public Licenses are designed to make sure that you |
have the freedom to distribute copies of free software (and charge for |
this service if you wish), that you receive source code or can get it |
if you want it, that you can change the software or use pieces of it |
in new free programs; and that you know you can do these things. |
To protect your rights, we need to make restrictions that forbid |
anyone to deny you these rights or to ask you to surrender the rights. |
These restrictions translate to certain responsibilities for you if you |
distribute copies of the software, or if you modify it. |
For example, if you distribute copies of such a program, whether |
gratis or for a fee, you must give the recipients all the rights that |
you have. You must make sure that they, too, receive or can get the |
source code. And you must show them these terms so they know their |
rights. |
We protect your rights with two steps: (1) copyright the software, and |
(2) offer you this license which gives you legal permission to copy, |
distribute and/or modify the software. |
Also, for each author's protection and ours, we want to make certain |
that everyone understands that there is no warranty for this free |
software. If the software is modified by someone else and passed on, we |
want its recipients to know that what they have is not the original, so |
that any problems introduced by others will not reflect on the original |
authors' reputations. |
Finally, any free program is threatened constantly by software |
patents. We wish to avoid the danger that redistributors of a free |
program will individually obtain patent licenses, in effect making the |
program proprietary. To prevent this, we have made it clear that any |
patent must be licensed for everyone's free use or not licensed at all. |
The precise terms and conditions for copying, distribution and |
modification follow. |
GNU GENERAL PUBLIC LICENSE |
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION |
0. This License applies to any program or other work which contains |
a notice placed by the copyright holder saying it may be distributed |
under the terms of this General Public License. The "Program", below, |
refers to any such program or work, and a "work based on the Program" |
means either the Program or any derivative work under copyright law: |
that is to say, a work containing the Program or a portion of it, |
either verbatim or with modifications and/or translated into another |
language. (Hereinafter, translation is included without limitation in |
the term "modification".) Each licensee is addressed as "you". |
Activities other than copying, distribution and modification are not |
covered by this License; they are outside its scope. The act of |
running the Program is not restricted, and the output from the Program |
is covered only if its contents constitute a work based on the |
Program (independent of having been made by running the Program). |
Whether that is true depends on what the Program does. |
1. You may copy and distribute verbatim copies of the Program's |
source code as you receive it, in any medium, provided that you |
conspicuously and appropriately publish on each copy an appropriate |
copyright notice and disclaimer of warranty; keep intact all the |
notices that refer to this License and to the absence of any warranty; |
and give any other recipients of the Program a copy of this License |
along with the Program. |
You may charge a fee for the physical act of transferring a copy, and |
you may at your option offer warranty protection in exchange for a fee. |
2. You may modify your copy or copies of the Program or any portion |
of it, thus forming a work based on the Program, and copy and |
distribute such modifications or work under the terms of Section 1 |
above, provided that you also meet all of these conditions: |
a) You must cause the modified files to carry prominent notices |
stating that you changed the files and the date of any change. |
b) You must cause any work that you distribute or publish, that in |
whole or in part contains or is derived from the Program or any |
part thereof, to be licensed as a whole at no charge to all third |
parties under the terms of this License. |
c) If the modified program normally reads commands interactively |
when run, you must cause it, when started running for such |
interactive use in the most ordinary way, to print or display an |
announcement including an appropriate copyright notice and a |
notice that there is no warranty (or else, saying that you provide |
a warranty) and that users may redistribute the program under |
these conditions, and telling the user how to view a copy of this |
License. (Exception: if the Program itself is interactive but |
does not normally print such an announcement, your work based on |
the Program is not required to print an announcement.) |
These requirements apply to the modified work as a whole. If |
identifiable sections of that work are not derived from the Program, |
and can be reasonably considered independent and separate works in |
themselves, then this License, and its terms, do not apply to those |
sections when you distribute them as separate works. But when you |
distribute the same sections as part of a whole which is a work based |
on the Program, the distribution of the whole must be on the terms of |
this License, whose permissions for other licensees extend to the |
entire whole, and thus to each and every part regardless of who wrote it. |
Thus, it is not the intent of this section to claim rights or contest |
your rights to work written entirely by you; rather, the intent is to |
exercise the right to control the distribution of derivative or |
collective works based on the Program. |
In addition, mere aggregation of another work not based on the Program |
with the Program (or with a work based on the Program) on a volume of |
a storage or distribution medium does not bring the other work under |
the scope of this License. |
3. You may copy and distribute the Program (or a work based on it, |
under Section 2) in object code or executable form under the terms of |
Sections 1 and 2 above provided that you also do one of the following: |
a) Accompany it with the complete corresponding machine-readable |
source code, which must be distributed under the terms of Sections |
1 and 2 above on a medium customarily used for software interchange; or, |
b) Accompany it with a written offer, valid for at least three |
years, to give any third party, for a charge no more than your |
cost of physically performing source distribution, a complete |
machine-readable copy of the corresponding source code, to be |
distributed under the terms of Sections 1 and 2 above on a medium |
customarily used for software interchange; or, |
c) Accompany it with the information you received as to the offer |
to distribute corresponding source code. (This alternative is |
allowed only for noncommercial distribution and only if you |
received the program in object code or executable form with such |
an offer, in accord with Subsection b above.) |
The source code for a work means the preferred form of the work for |
making modifications to it. For an executable work, complete source |
code means all the source code for all modules it contains, plus any |
associated interface definition files, plus the scripts used to |
control compilation and installation of the executable. However, as a |
special exception, the source code distributed need not include |
anything that is normally distributed (in either source or binary |
form) with the major components (compiler, kernel, and so on) of the |
operating system on which the executable runs, unless that component |
itself accompanies the executable. |
If distribution of executable or object code is made by offering |
access to copy from a designated place, then offering equivalent |
access to copy the source code from the same place counts as |
distribution of the source code, even though third parties are not |
compelled to copy the source along with the object code. |
4. You may not copy, modify, sublicense, or distribute the Program |
except as expressly provided under this License. Any attempt |
otherwise to copy, modify, sublicense or distribute the Program is |
void, and will automatically terminate your rights under this License. |
However, parties who have received copies, or rights, from you under |
this License will not have their licenses terminated so long as such |
parties remain in full compliance. |
5. You are not required to accept this License, since you have not |
signed it. However, nothing else grants you permission to modify or |
distribute the Program or its derivative works. These actions are |
prohibited by law if you do not accept this License. Therefore, by |
modifying or distributing the Program (or any work based on the |
Program), you indicate your acceptance of this License to do so, and |
all its terms and conditions for copying, distributing or modifying |
the Program or works based on it. |
6. Each time you redistribute the Program (or any work based on the |
Program), the recipient automatically receives a license from the |
original licensor to copy, distribute or modify the Program subject to |
these terms and conditions. You may not impose any further |
restrictions on the recipients' exercise of the rights granted herein. |
You are not responsible for enforcing compliance by third parties to |
this License. |
7. If, as a consequence of a court judgment or allegation of patent |
infringement or for any other reason (not limited to patent issues), |
conditions are imposed on you (whether by court order, agreement or |
otherwise) that contradict the conditions of this License, they do not |
excuse you from the conditions of this License. If you cannot |
distribute so as to satisfy simultaneously your obligations under this |
License and any other pertinent obligations, then as a consequence you |
may not distribute the Program at all. For example, if a patent |
license would not permit royalty-free redistribution of the Program by |
all those who receive copies directly or indirectly through you, then |
the only way you could satisfy both it and this License would be to |
refrain entirely from distribution of the Program. |
If any portion of this section is held invalid or unenforceable under |
any particular circumstance, the balance of the section is intended to |
apply and the section as a whole is intended to apply in other |
circumstances. |
It is not the purpose of this section to induce you to infringe any |
patents or other property right claims or to contest validity of any |
such claims; this section has the sole purpose of protecting the |
integrity of the free software distribution system, which is |
implemented by public license practices. Many people have made |
generous contributions to the wide range of software distributed |
through that system in reliance on consistent application of that |
system; it is up to the author/donor to decide if he or she is willing |
to distribute software through any other system and a licensee cannot |
impose that choice. |
This section is intended to make thoroughly clear what is believed to |
be a consequence of the rest of this License. |
8. If the distribution and/or use of the Program is restricted in |
certain countries either by patents or by copyrighted interfaces, the |
original copyright holder who places the Program under this License |
may add an explicit geographical distribution limitation excluding |
those countries, so that distribution is permitted only in or among |
countries not thus excluded. In such case, this License incorporates |
the limitation as if written in the body of this License. |
9. The Free Software Foundation may publish revised and/or new versions |
of the General Public License from time to time. Such new versions will |
be similar in spirit to the present version, but may differ in detail to |
address new problems or concerns. |
Each version is given a distinguishing version number. If the Program |
specifies a version number of this License which applies to it and "any |
later version", you have the option of following the terms and conditions |
either of that version or of any later version published by the Free |
Software Foundation. If the Program does not specify a version number of |
this License, you may choose any version ever published by the Free Software |
Foundation. |
10. If you wish to incorporate parts of the Program into other free |
programs whose distribution conditions are different, write to the author |
to ask for permission. For software which is copyrighted by the Free |
Software Foundation, write to the Free Software Foundation; we sometimes |
make exceptions for this. Our decision will be guided by the two goals |
of preserving the free status of all derivatives of our free software and |
of promoting the sharing and reuse of software generally. |
NO WARRANTY |
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY |
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN |
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES |
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED |
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS |
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE |
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, |
REPAIR OR CORRECTION. |
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING |
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR |
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, |
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING |
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED |
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY |
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER |
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE |
POSSIBILITY OF SUCH DAMAGES. |
END OF TERMS AND CONDITIONS |
How to Apply These Terms to Your New Programs |
If you develop a new program, and you want it to be of the greatest |
possible use to the public, the best way to achieve this is to make it |
free software which everyone can redistribute and change under these terms. |
To do so, attach the following notices to the program. It is safest |
to attach them to the start of each source file to most effectively |
convey the exclusion of warranty; and each file should have at least |
the "copyright" line and a pointer to where the full notice is found. |
<one line to give the program's name and a brief idea of what it does.> |
Copyright (C) <year> <name of author> |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 2 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
Also add information on how to contact you by electronic and paper mail. |
If the program is interactive, make it output a short notice like this |
when it starts in an interactive mode: |
Gnomovision version 69, Copyright (C) year name of author |
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. |
This is free software, and you are welcome to redistribute it |
under certain conditions; type `show c' for details. |
The hypothetical commands `show w' and `show c' should show the appropriate |
parts of the General Public License. Of course, the commands you use may |
be called something other than `show w' and `show c'; they could even be |
mouse-clicks or menu items--whatever suits your program. |
You should also get your employer (if you work as a programmer) or your |
school, if any, to sign a "copyright disclaimer" for the program, if |
necessary. Here is a sample; alter the names: |
Yoyodyne, Inc., hereby disclaims all copyright interest in the program |
`Gnomovision' (which makes passes at compilers) written by James Hacker. |
<signature of Ty Coon>, 1 April 1989 |
Ty Coon, President of Vice |
This General Public License does not permit incorporating your program into |
proprietary programs. If your program is a subroutine library, you may |
consider it more useful to permit linking proprietary applications with the |
library. If this is what you want to do, use the GNU Library General |
Public License instead of this License. |
/tags/0.3.0/boot/arch/amd64/grub/README |
---|
0,0 → 1,5 |
For licensing terms of GRUB boot loader see the file COPYING contained |
in this directory. Full version of GRUB, including its source code, |
can be downloaded from GRUB's project page: |
http://www.gnu.org/software/grub/ |
/tags/0.3.0/boot/arch/amd64/Makefile.inc |
---|
0,0 → 1,58 |
# |
# Copyright (c) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
TASKS = \ |
$(USPACEDIR)/srv/ns/ns \ |
$(USPACEDIR)/srv/pci/pci \ |
$(USPACEDIR)/srv/fb/fb \ |
$(USPACEDIR)/srv/kbd/kbd \ |
$(USPACEDIR)/srv/vfs/vfs \ |
$(USPACEDIR)/srv/fs/tmpfs/tmpfs \ |
$(USPACEDIR)/srv/fs/fat/fat \ |
$(USPACEDIR)/srv/devmap/devmap \ |
$(USPACEDIR)/srv/console/console \ |
$(USPACEDIR)/app/init/init \ |
$(USPACEDIR)/app/tetris/tetris \ |
$(USPACEDIR)/app/tester/tester \ |
$(USPACEDIR)/app/klog/klog |
build: $(BASE)/image.iso |
$(BASE)/image.iso: arch/$(ARCH)/grub/stage2_eltorito arch/$(ARCH)/grub/menu.lst $(KERNELDIR)/kernel.bin $(TASKS) |
mkdir -p arch/$(ARCH)/iso/boot/grub |
cp arch/$(ARCH)/grub/stage2_eltorito arch/$(ARCH)/iso/boot/grub/ |
cp arch/$(ARCH)/grub/menu.lst arch/$(ARCH)/iso/boot/grub/ |
cp $(KERNELDIR)/kernel.bin arch/$(ARCH)/iso/boot/ |
for task in $(TASKS) ; do \ |
cp $$task arch/$(ARCH)/iso/boot/ ; \ |
done |
mkisofs -J -r -b boot/grub/stage2_eltorito -no-emul-boot -boot-load-size 4 -boot-info-table -o $(BASE)/image.iso arch/$(ARCH)/iso/ |
clean: |
-rm -fr arch/$(ARCH)/iso |
-rm -f $(BASE)/image.iso |
/tags/0.3.0/boot/arch/mips32/loader/Makefile |
---|
0,0 → 1,119 |
# |
# Copyright (c) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
include ../../../../version |
include ../../../Makefile.config |
## Toolchain configuration |
# |
TARGET = mipsel-linux-gnu |
TOOLCHAIN_DIR = /usr/local/mipsel/bin |
ifeq ($(COMPILER),gcc_native) |
CC = gcc |
AS = as |
LD = ld |
OBJCOPY = objcopy |
OBJDUMP = objdump |
endif |
ifeq ($(COMPILER),icc_native) |
CC = icc |
AS = as |
LD = ld |
OBJCOPY = objcopy |
OBJDUMP = objdump |
endif |
ifeq ($(COMPILER),gcc_cross) |
CC = $(TOOLCHAIN_DIR)/$(TARGET)-gcc |
AS = $(TOOLCHAIN_DIR)/$(TARGET)-as |
LD = $(TOOLCHAIN_DIR)/$(TARGET)-ld |
OBJCOPY = $(TOOLCHAIN_DIR)/$(TARGET)-objcopy |
OBJDUMP = $(TOOLCHAIN_DIR)/$(TARGET)-objdump |
endif |
CFLAGS = -DRELEASE=\"$(RELEASE)\" -I. -I../../../generic -nostdinc -nostdlib -fno-builtin -Werror-implicit-function-declaration -Wmissing-prototypes -Werror -O3 -mno-abicalls -G 0 -fno-zero-initialized-in-bss -mhard-float -mips3 |
ifdef REVISION |
CFLAGS += "-DREVISION=\"$(REVISION)\"" |
endif |
ifdef TIMESTAMP |
CFLAGS += "-DTIMESTAMP=\"$(TIMESTAMP)\"" |
endif |
SOURCES = \ |
main.c \ |
msim.c \ |
../../../generic/printf.c \ |
asm.S \ |
boot.S |
COMPONENTS = \ |
$(KERNELDIR)/kernel.bin \ |
$(USPACEDIR)/srv/ns/ns \ |
$(USPACEDIR)/srv/fb/fb \ |
$(USPACEDIR)/srv/kbd/kbd \ |
$(USPACEDIR)/srv/console/console \ |
$(USPACEDIR)/srv/vfs/vfs \ |
$(USPACEDIR)/srv/fs/tmpfs/tmpfs \ |
$(USPACEDIR)/srv/fs/fat/fat \ |
$(USPACEDIR)/srv/devmap/devmap \ |
$(USPACEDIR)/app/init/init \ |
$(USPACEDIR)/app/tetris/tetris \ |
$(USPACEDIR)/app/tester/tester \ |
$(USPACEDIR)/app/klog/klog |
OBJECTS := $(addsuffix .o,$(basename $(SOURCES))) |
COMPONENT_OBJECTS := $(addsuffix .o,$(basename $(notdir $(COMPONENTS)))) |
.PHONY: all clean depend |
all: image.boot |
-include Makefile.depend |
image.boot: depend _components.h _link.ld $(COMPONENT_OBJECTS) $(OBJECTS) |
$(LD) -no-check-sections -N -T _link.ld $(COMPONENT_OBJECTS) $(OBJECTS) -o $@ |
depend: |
-makedepend $(DEFS) $(CFLAGS) -f - $(SOURCES) > Makefile.depend 2> /dev/null |
clean: |
-rm -f _components.h _link.ld $(COMPONENT_OBJECTS) $(OBJECTS) image.boot Makefile.depend |
_components.h _link.ld $(COMPONENT_OBJECTS): $(COMPONENTS) |
./pack $(IMAGE) $(OBJCOPY) $(COMPONENTS) |
%.o: %.S |
$(CC) $(DEFS) $(CFLAGS) -D__ASM__ -c $< -o $@ |
%.o: %.c |
$(CC) $(DEFS) $(CFLAGS) -c $< -o $@ |
/tags/0.3.0/boot/arch/mips32/loader/regname.h |
---|
0,0 → 1,88 |
/* |
* Copyright (c) 2005 Ondrej Palkovsky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#ifndef BOOT_mips32_REGNAME_H_ |
#define BOOT_mips32_REGNAME_H_ |
#define zero 0 |
#define at 1 |
#define v0 2 |
#define v1 3 |
#define a0 4 |
#define a1 5 |
#define a2 6 |
#define a3 7 |
#define t0 8 |
#define t1 9 |
#define t2 10 |
#define t3 11 |
#define t4 12 |
#define t5 13 |
#define t6 14 |
#define t7 15 |
#define s0 16 |
#define s1 17 |
#define s2 18 |
#define s3 19 |
#define s4 20 |
#define s5 21 |
#define s6 22 |
#define s7 23 |
#define t8 24 |
#define t9 25 |
#define k0 26 |
#define k1 27 |
#define gp 28 |
#define sp 29 |
#define s8 30 |
#define ra 31 |
#define rindex 0 |
#define rrandom 1 |
#define entrylo0 2 |
#define entrylo1 3 |
#define context 4 |
#define pagemask 5 |
#define wired 6 |
#define badvaddr 8 |
#define count 9 |
#define entryhi 10 |
#define compare 11 |
#define status 12 |
#define cause 13 |
#define epc 14 |
#define rconfig 16 |
#define lladdr 17 |
#define watchlo 18 |
#define watchhi 19 |
#define xcontext 20 |
#define rdebug 23 |
#define depc 24 |
#define eepc 30 |
#endif /* _REGNAME_H_ */ |
/tags/0.3.0/boot/arch/mips32/loader/asm.h |
---|
0,0 → 1,39 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#ifndef BOOT_mips32_ASM_H_ |
#define BOOT_mips32_ASM_H_ |
#define PAGE_SIZE 16384 |
#define PAGE_WIDTH 14 |
#define memcpy(dst, src, cnt) __builtin_memcpy((dst), (src), (cnt)) |
void jump_to_kernel(void *entry, void *bootinfo, unsigned int bootinfo_size) __attribute__((noreturn)); |
#endif |
/tags/0.3.0/boot/arch/mips32/loader/main.h |
---|
0,0 → 1,54 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#ifndef BOOT_mips32_MAIN_H_ |
#define BOOT_mips32_MAIN_H_ |
/** Align to the nearest higher address. |
* |
* @param addr Address or size to be aligned. |
* @param align Size of alignment, must be power of 2. |
*/ |
#define ALIGN_UP(addr, align) (((addr) + ((align) - 1)) & ~((align) - 1)) |
#define TASKMAP_MAX_RECORDS 32 |
typedef struct { |
void *addr; |
unsigned int size; |
} task_t; |
typedef struct { |
unsigned int cnt; |
task_t tasks[TASKMAP_MAX_RECORDS]; |
} bootinfo_t; |
extern void start(void); |
extern void bootstrap(void); |
#endif |
/tags/0.3.0/boot/arch/mips32/loader/types.h |
---|
0,0 → 1,44 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#ifndef BOOT_mips32_TYPES_H_ |
#define BOOT_mips32_TYPES_H_ |
#include <gentypes.h> |
typedef signed char int8_t; |
typedef unsigned char uint8_t; |
typedef unsigned short uint16_t; |
typedef unsigned int uint32_t; |
typedef unsigned long long uint64_t; |
typedef uint32_t uintptr_t; |
typedef uint32_t unative_t; |
#endif |
/tags/0.3.0/boot/arch/mips32/loader/msim.h |
---|
0,0 → 1,37 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#ifndef BOOT_mips32_MSIM_H_ |
#define BOOT_mips32_MSIM_H_ |
extern void init(void); |
extern void halt(void); |
extern void *translate(void *addr); |
#endif |
/tags/0.3.0/boot/arch/mips32/loader/asm.S |
---|
0,0 → 1,111 |
# |
# Copyright (c) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
#include "regname.h" |
.set noat |
.set noreorder |
.set nomacro |
.text |
.global halt |
.global memcpy |
.global jump_to_kernel |
halt: |
b halt |
nop |
memcpy: |
addiu $v0,$a1,3 |
li $v1,-4 # 0xfffffffffffffffc |
and $v0,$v0,$v1 |
beq $a1,$v0,3f |
move $t0,$a0 |
0: |
beq $a2,$zero,2f |
move $a3,$zero |
1: |
addu $v0,$a1,$a3 |
lbu $a0,0($v0) |
addu $v1,$t0,$a3 |
addiu $a3,$a3,1 |
bne $a3,$a2,1b |
sb $a0,0($v1) |
2: |
jr $ra |
move $v0,$a1 |
3: |
addiu $v0,$a0,3 |
and $v0,$v0,$v1 |
bne $a0,$v0,0b |
srl $t1,$a2,2 |
beq $t1,$zero,5f |
move $a3,$zero |
move $a3,$zero |
move $a0,$zero |
4: |
addu $v0,$a1,$a0 |
lw $v1,0($v0) |
addiu $a3,$a3,1 |
addu $v0,$t0,$a0 |
sw $v1,0($v0) |
bne $a3,$t1,4b |
addiu $a0,$a0,4 |
5: |
andi $a2,$a2,0x3 |
beq $a2,$zero,2b |
nop |
sll $v0,$a3,2 |
addu $t1,$v0,$t0 |
move $a3,$zero |
addu $t0,$v0,$a1 |
6: |
addu $v0,$t0,$a3 |
lbu $a0,0($v0) |
addu $v1,$t1,$a3 |
addiu $a3,$a3,1 |
bne $a3,$a2,6b |
sb $a0,0($v1) |
jr $ra |
move $v0,$a1 |
jump_to_kernel: |
# .word 0x39 |
j $a0 |
nop |
/tags/0.3.0/boot/arch/mips32/loader/boot.S |
---|
0,0 → 1,45 |
# |
# Copyright (c) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
#include "regname.h" |
#define INITIAL_STACK 0x80040000 |
.set noat |
.set noreorder |
.set nomacro |
.section BOOTSTRAP |
.global start |
start: |
lui $sp, INITIAL_STACK >> 16 |
ori $sp, $sp, INITIAL_STACK & 0xffff |
j bootstrap |
nop |
/tags/0.3.0/boot/arch/mips32/loader/main.c |
---|
0,0 → 1,91 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#include "main.h" |
#include <printf.h> |
#include "msim.h" |
#include "asm.h" |
#include "_components.h" |
#define KERNEL_VIRTUAL_ADDRESS 0x80100000 |
char *release = RELEASE; |
#ifdef REVISION |
char *revision = ", revision " REVISION; |
#else |
char *revision = ""; |
#endif |
#ifdef TIMESTAMP |
char *timestamp = "\nBuilt on " TIMESTAMP; |
#else |
char *timestamp = ""; |
#endif |
/** Print version information. */ |
static void version_print(void) |
{ |
printf("HelenOS MIPS32 Bootloader\nRelease %s%s%s\nCopyright (c) 2006 HelenOS project\n", release, revision, timestamp); |
} |
void bootstrap(void) |
{ |
version_print(); |
component_t components[COMPONENTS]; |
bootinfo_t bootinfo; |
init_components(components); |
printf("\nMemory statistics\n"); |
printf(" kernel entry point at %L\n", KERNEL_VIRTUAL_ADDRESS); |
printf(" %L: boot info structure\n", &bootinfo); |
unsigned int i; |
for (i = 0; i < COMPONENTS; i++) |
printf(" %L: %s image (size %d bytes)\n", components[i].start, components[i].name, components[i].size); |
printf("\nCopying components\n"); |
unsigned int top = 0; |
bootinfo.cnt = 0; |
for (i = 0; i < COMPONENTS; i++) { |
printf(" %s...", components[i].name); |
top = ALIGN_UP(top, PAGE_SIZE); |
memcpy(((void *) KERNEL_VIRTUAL_ADDRESS) + top, components[i].start, components[i].size); |
if (i > 0) { |
bootinfo.tasks[bootinfo.cnt].addr = ((void *) KERNEL_VIRTUAL_ADDRESS) + top; |
bootinfo.tasks[bootinfo.cnt].size = components[i].size; |
bootinfo.cnt++; |
} |
top += components[i].size; |
printf("done.\n"); |
} |
printf("\nBooting the kernel...\n"); |
jump_to_kernel((void *) KERNEL_VIRTUAL_ADDRESS, &bootinfo, sizeof(bootinfo)); |
} |
/tags/0.3.0/boot/arch/mips32/loader/msim.c |
---|
0,0 → 1,40 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#include "msim.h" |
#include <printf.h> |
#define MSIM_VIDEORAM 0xB0000000 |
void write(const char *str, const int len) |
{ |
int i; |
for (i = 0; i < len; i++) |
*((char *) MSIM_VIDEORAM) = str[i]; |
} |
/tags/0.3.0/boot/arch/mips32/loader/pack |
---|
0,0 → 1,126 |
#! /bin/sh |
# |
# Copyright (C) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
[ "$#" -lt 1 ] && exit 1 |
case "$1" in |
"binary") |
BFD="binary" |
;; |
"ecoff") |
BFD="ecoff-littlemips" |
;; |
*) |
echo "Undefined image format" >&1 |
exit 1 |
;; |
esac |
OBJCOPY="$2" |
LINK="_link.ld" |
HEADER="_components.h" |
shift 2 |
echo "OUTPUT_FORMAT(\"${BFD}\") |
ENTRY(start) |
SECTIONS { |
.boot 0xbfc00000: AT (0) { |
*(BOOTSTRAP); |
*(.text); |
*(.rodata); |
*(.rodata.*); |
*(.data); /* initialized data */ |
*(.sdata); |
*(.sdata2); |
*(.sbss); |
*(.scommon); |
*(.bss); /* uninitialized static variables */ |
*(COMMON); /* global variables */ |
*(.reginfo);" > "$LINK" |
echo '#ifndef ___COMPONENTS_H__ |
#define ___COMPONENTS_H__ |
typedef struct { |
char *name; |
void *start; |
void *end; |
unsigned int size; |
} component_t;' > "$HEADER" |
COUNT="0" |
DATA="" |
for TASK in "$@" ; do |
BASENAME="`basename "$TASK" | sed 's/^\(.*\)\.[^.]*$/\1/'`" |
OBJECT="${BASENAME}.o" |
SYMBOL="`echo "_binary_$TASK" | tr "./" "__"`" |
MACRO="`echo "$BASENAME" | tr [:lower:] [:upper:]`" |
echo "$TASK -> $OBJECT" |
echo " |
. = ALIGN(4096); |
*(.${BASENAME}_image);" >> "$LINK" |
echo " |
extern int ${SYMBOL}_start; |
extern int ${SYMBOL}_end; |
#define ${MACRO}_START ((void *) &${SYMBOL}_start) |
#define ${MACRO}_END ((void *) &${SYMBOL}_end) |
#define ${MACRO}_SIZE ((unsigned int) ${MACRO}_END - (unsigned int) ${MACRO}_START)" >> "$HEADER" |
"$OBJCOPY" -I binary -O elf32-tradlittlemips -B mips --rename-section ".data=.${BASENAME}_image" "$TASK" "$OBJECT" |
DATA="${DATA} |
components[$COUNT].name = \"${BASENAME}\"; |
components[$COUNT].start = ${MACRO}_START; |
components[$COUNT].end = ${MACRO}_END; |
components[$COUNT].size = ${MACRO}_SIZE;"; |
COUNT="`expr "$COUNT" + 1`" |
done |
echo ' } |
}' >> "$LINK" |
echo " |
#define COMPONENTS $COUNT |
static void init_components(component_t components[]) |
{ |
$DATA |
} |
#endif |
" >> "$HEADER" |
Property changes: |
Added: svn:executable |
+* |
\ No newline at end of property |
/tags/0.3.0/boot/arch/mips32/Makefile.inc |
---|
0,0 → 1,42 |
# |
# Copyright (c) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
build: $(BASE)/image.boot |
$(BASE)/image.boot: depend arch/$(ARCH)/loader/image.boot |
cp arch/$(ARCH)/loader/image.boot $(BASE)/image.boot |
depend: |
-rm arch/$(ARCH)/loader/image.boot |
arch/$(ARCH)/loader/image.boot: |
make -C arch/$(ARCH)/loader COMPILER=$(COMPILER) KERNELDIR=../../../$(KERNELDIR) USPACEDIR=../../../$(USPACEDIR) IMAGE=$(IMAGE) |
clean: |
make -C arch/$(ARCH)/loader clean COMPILER=$(COMPILER) KERNELDIR=../../../$(KERNELDIR) USPACEDIR=../../../$(USPACEDIR) IMAGE=$(IMAGE) |
-rm -f $(BASE)/image.boot |
/tags/0.3.0/boot/arch/ia32/grub/menu.lst |
---|
0,0 → 1,19 |
default 0 |
timeout 10 |
title=HelenOS |
root (cd) |
kernel /boot/kernel.bin |
module /boot/ns |
module /boot/init |
module /boot/pci |
module /boot/fb |
module /boot/kbd |
module /boot/console |
module /boot/vfs |
module /boot/tmpfs |
module /boot/fat |
module /boot/devmap |
module /boot/tetris |
module /boot/tester |
module /boot/klog |
/tags/0.3.0/boot/arch/ia32/grub/stage2_eltorito |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/tags/0.3.0/boot/arch/ia32/grub/COPYING |
---|
0,0 → 1,340 |
GNU GENERAL PUBLIC LICENSE |
Version 2, June 1991 |
Copyright (C) 1989, 1991 Free Software Foundation, Inc. |
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
Everyone is permitted to copy and distribute verbatim copies |
of this license document, but changing it is not allowed. |
Preamble |
The licenses for most software are designed to take away your |
freedom to share and change it. By contrast, the GNU General Public |
License is intended to guarantee your freedom to share and change free |
software--to make sure the software is free for all its users. This |
General Public License applies to most of the Free Software |
Foundation's software and to any other program whose authors commit to |
using it. (Some other Free Software Foundation software is covered by |
the GNU Library General Public License instead.) You can apply it to |
your programs, too. |
When we speak of free software, we are referring to freedom, not |
price. Our General Public Licenses are designed to make sure that you |
have the freedom to distribute copies of free software (and charge for |
this service if you wish), that you receive source code or can get it |
if you want it, that you can change the software or use pieces of it |
in new free programs; and that you know you can do these things. |
To protect your rights, we need to make restrictions that forbid |
anyone to deny you these rights or to ask you to surrender the rights. |
These restrictions translate to certain responsibilities for you if you |
distribute copies of the software, or if you modify it. |
For example, if you distribute copies of such a program, whether |
gratis or for a fee, you must give the recipients all the rights that |
you have. You must make sure that they, too, receive or can get the |
source code. And you must show them these terms so they know their |
rights. |
We protect your rights with two steps: (1) copyright the software, and |
(2) offer you this license which gives you legal permission to copy, |
distribute and/or modify the software. |
Also, for each author's protection and ours, we want to make certain |
that everyone understands that there is no warranty for this free |
software. If the software is modified by someone else and passed on, we |
want its recipients to know that what they have is not the original, so |
that any problems introduced by others will not reflect on the original |
authors' reputations. |
Finally, any free program is threatened constantly by software |
patents. We wish to avoid the danger that redistributors of a free |
program will individually obtain patent licenses, in effect making the |
program proprietary. To prevent this, we have made it clear that any |
patent must be licensed for everyone's free use or not licensed at all. |
The precise terms and conditions for copying, distribution and |
modification follow. |
GNU GENERAL PUBLIC LICENSE |
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION |
0. This License applies to any program or other work which contains |
a notice placed by the copyright holder saying it may be distributed |
under the terms of this General Public License. The "Program", below, |
refers to any such program or work, and a "work based on the Program" |
means either the Program or any derivative work under copyright law: |
that is to say, a work containing the Program or a portion of it, |
either verbatim or with modifications and/or translated into another |
language. (Hereinafter, translation is included without limitation in |
the term "modification".) Each licensee is addressed as "you". |
Activities other than copying, distribution and modification are not |
covered by this License; they are outside its scope. The act of |
running the Program is not restricted, and the output from the Program |
is covered only if its contents constitute a work based on the |
Program (independent of having been made by running the Program). |
Whether that is true depends on what the Program does. |
1. You may copy and distribute verbatim copies of the Program's |
source code as you receive it, in any medium, provided that you |
conspicuously and appropriately publish on each copy an appropriate |
copyright notice and disclaimer of warranty; keep intact all the |
notices that refer to this License and to the absence of any warranty; |
and give any other recipients of the Program a copy of this License |
along with the Program. |
You may charge a fee for the physical act of transferring a copy, and |
you may at your option offer warranty protection in exchange for a fee. |
2. You may modify your copy or copies of the Program or any portion |
of it, thus forming a work based on the Program, and copy and |
distribute such modifications or work under the terms of Section 1 |
above, provided that you also meet all of these conditions: |
a) You must cause the modified files to carry prominent notices |
stating that you changed the files and the date of any change. |
b) You must cause any work that you distribute or publish, that in |
whole or in part contains or is derived from the Program or any |
part thereof, to be licensed as a whole at no charge to all third |
parties under the terms of this License. |
c) If the modified program normally reads commands interactively |
when run, you must cause it, when started running for such |
interactive use in the most ordinary way, to print or display an |
announcement including an appropriate copyright notice and a |
notice that there is no warranty (or else, saying that you provide |
a warranty) and that users may redistribute the program under |
these conditions, and telling the user how to view a copy of this |
License. (Exception: if the Program itself is interactive but |
does not normally print such an announcement, your work based on |
the Program is not required to print an announcement.) |
These requirements apply to the modified work as a whole. If |
identifiable sections of that work are not derived from the Program, |
and can be reasonably considered independent and separate works in |
themselves, then this License, and its terms, do not apply to those |
sections when you distribute them as separate works. But when you |
distribute the same sections as part of a whole which is a work based |
on the Program, the distribution of the whole must be on the terms of |
this License, whose permissions for other licensees extend to the |
entire whole, and thus to each and every part regardless of who wrote it. |
Thus, it is not the intent of this section to claim rights or contest |
your rights to work written entirely by you; rather, the intent is to |
exercise the right to control the distribution of derivative or |
collective works based on the Program. |
In addition, mere aggregation of another work not based on the Program |
with the Program (or with a work based on the Program) on a volume of |
a storage or distribution medium does not bring the other work under |
the scope of this License. |
3. You may copy and distribute the Program (or a work based on it, |
under Section 2) in object code or executable form under the terms of |
Sections 1 and 2 above provided that you also do one of the following: |
a) Accompany it with the complete corresponding machine-readable |
source code, which must be distributed under the terms of Sections |
1 and 2 above on a medium customarily used for software interchange; or, |
b) Accompany it with a written offer, valid for at least three |
years, to give any third party, for a charge no more than your |
cost of physically performing source distribution, a complete |
machine-readable copy of the corresponding source code, to be |
distributed under the terms of Sections 1 and 2 above on a medium |
customarily used for software interchange; or, |
c) Accompany it with the information you received as to the offer |
to distribute corresponding source code. (This alternative is |
allowed only for noncommercial distribution and only if you |
received the program in object code or executable form with such |
an offer, in accord with Subsection b above.) |
The source code for a work means the preferred form of the work for |
making modifications to it. For an executable work, complete source |
code means all the source code for all modules it contains, plus any |
associated interface definition files, plus the scripts used to |
control compilation and installation of the executable. However, as a |
special exception, the source code distributed need not include |
anything that is normally distributed (in either source or binary |
form) with the major components (compiler, kernel, and so on) of the |
operating system on which the executable runs, unless that component |
itself accompanies the executable. |
If distribution of executable or object code is made by offering |
access to copy from a designated place, then offering equivalent |
access to copy the source code from the same place counts as |
distribution of the source code, even though third parties are not |
compelled to copy the source along with the object code. |
4. You may not copy, modify, sublicense, or distribute the Program |
except as expressly provided under this License. Any attempt |
otherwise to copy, modify, sublicense or distribute the Program is |
void, and will automatically terminate your rights under this License. |
However, parties who have received copies, or rights, from you under |
this License will not have their licenses terminated so long as such |
parties remain in full compliance. |
5. You are not required to accept this License, since you have not |
signed it. However, nothing else grants you permission to modify or |
distribute the Program or its derivative works. These actions are |
prohibited by law if you do not accept this License. Therefore, by |
modifying or distributing the Program (or any work based on the |
Program), you indicate your acceptance of this License to do so, and |
all its terms and conditions for copying, distributing or modifying |
the Program or works based on it. |
6. Each time you redistribute the Program (or any work based on the |
Program), the recipient automatically receives a license from the |
original licensor to copy, distribute or modify the Program subject to |
these terms and conditions. You may not impose any further |
restrictions on the recipients' exercise of the rights granted herein. |
You are not responsible for enforcing compliance by third parties to |
this License. |
7. If, as a consequence of a court judgment or allegation of patent |
infringement or for any other reason (not limited to patent issues), |
conditions are imposed on you (whether by court order, agreement or |
otherwise) that contradict the conditions of this License, they do not |
excuse you from the conditions of this License. If you cannot |
distribute so as to satisfy simultaneously your obligations under this |
License and any other pertinent obligations, then as a consequence you |
may not distribute the Program at all. For example, if a patent |
license would not permit royalty-free redistribution of the Program by |
all those who receive copies directly or indirectly through you, then |
the only way you could satisfy both it and this License would be to |
refrain entirely from distribution of the Program. |
If any portion of this section is held invalid or unenforceable under |
any particular circumstance, the balance of the section is intended to |
apply and the section as a whole is intended to apply in other |
circumstances. |
It is not the purpose of this section to induce you to infringe any |
patents or other property right claims or to contest validity of any |
such claims; this section has the sole purpose of protecting the |
integrity of the free software distribution system, which is |
implemented by public license practices. Many people have made |
generous contributions to the wide range of software distributed |
through that system in reliance on consistent application of that |
system; it is up to the author/donor to decide if he or she is willing |
to distribute software through any other system and a licensee cannot |
impose that choice. |
This section is intended to make thoroughly clear what is believed to |
be a consequence of the rest of this License. |
8. If the distribution and/or use of the Program is restricted in |
certain countries either by patents or by copyrighted interfaces, the |
original copyright holder who places the Program under this License |
may add an explicit geographical distribution limitation excluding |
those countries, so that distribution is permitted only in or among |
countries not thus excluded. In such case, this License incorporates |
the limitation as if written in the body of this License. |
9. The Free Software Foundation may publish revised and/or new versions |
of the General Public License from time to time. Such new versions will |
be similar in spirit to the present version, but may differ in detail to |
address new problems or concerns. |
Each version is given a distinguishing version number. If the Program |
specifies a version number of this License which applies to it and "any |
later version", you have the option of following the terms and conditions |
either of that version or of any later version published by the Free |
Software Foundation. If the Program does not specify a version number of |
this License, you may choose any version ever published by the Free Software |
Foundation. |
10. If you wish to incorporate parts of the Program into other free |
programs whose distribution conditions are different, write to the author |
to ask for permission. For software which is copyrighted by the Free |
Software Foundation, write to the Free Software Foundation; we sometimes |
make exceptions for this. Our decision will be guided by the two goals |
of preserving the free status of all derivatives of our free software and |
of promoting the sharing and reuse of software generally. |
NO WARRANTY |
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY |
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN |
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES |
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED |
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS |
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE |
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, |
REPAIR OR CORRECTION. |
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING |
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR |
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, |
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING |
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED |
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY |
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER |
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE |
POSSIBILITY OF SUCH DAMAGES. |
END OF TERMS AND CONDITIONS |
How to Apply These Terms to Your New Programs |
If you develop a new program, and you want it to be of the greatest |
possible use to the public, the best way to achieve this is to make it |
free software which everyone can redistribute and change under these terms. |
To do so, attach the following notices to the program. It is safest |
to attach them to the start of each source file to most effectively |
convey the exclusion of warranty; and each file should have at least |
the "copyright" line and a pointer to where the full notice is found. |
<one line to give the program's name and a brief idea of what it does.> |
Copyright (C) <year> <name of author> |
This program is free software; you can redistribute it and/or modify |
it under the terms of the GNU General Public License as published by |
the Free Software Foundation; either version 2 of the License, or |
(at your option) any later version. |
This program is distributed in the hope that it will be useful, |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
GNU General Public License for more details. |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
Also add information on how to contact you by electronic and paper mail. |
If the program is interactive, make it output a short notice like this |
when it starts in an interactive mode: |
Gnomovision version 69, Copyright (C) year name of author |
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. |
This is free software, and you are welcome to redistribute it |
under certain conditions; type `show c' for details. |
The hypothetical commands `show w' and `show c' should show the appropriate |
parts of the General Public License. Of course, the commands you use may |
be called something other than `show w' and `show c'; they could even be |
mouse-clicks or menu items--whatever suits your program. |
You should also get your employer (if you work as a programmer) or your |
school, if any, to sign a "copyright disclaimer" for the program, if |
necessary. Here is a sample; alter the names: |
Yoyodyne, Inc., hereby disclaims all copyright interest in the program |
`Gnomovision' (which makes passes at compilers) written by James Hacker. |
<signature of Ty Coon>, 1 April 1989 |
Ty Coon, President of Vice |
This General Public License does not permit incorporating your program into |
proprietary programs. If your program is a subroutine library, you may |
consider it more useful to permit linking proprietary applications with the |
library. If this is what you want to do, use the GNU Library General |
Public License instead of this License. |
/tags/0.3.0/boot/arch/ia32/grub/README |
---|
0,0 → 1,5 |
For licensing terms of GRUB boot loader see the file COPYING contained |
in this directory. Full version of GRUB, including its source code, |
can be downloaded from GRUB's project page: |
http://www.gnu.org/software/grub/ |
/tags/0.3.0/boot/arch/ia32/Makefile.inc |
---|
0,0 → 1,58 |
# |
# Copyright (c) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
TASKS = \ |
$(USPACEDIR)/srv/ns/ns \ |
$(USPACEDIR)/srv/pci/pci \ |
$(USPACEDIR)/srv/fb/fb \ |
$(USPACEDIR)/srv/kbd/kbd \ |
$(USPACEDIR)/srv/console/console \ |
$(USPACEDIR)/srv/vfs/vfs \ |
$(USPACEDIR)/srv/fs/tmpfs/tmpfs \ |
$(USPACEDIR)/srv/fs/fat/fat \ |
$(USPACEDIR)/srv/devmap/devmap \ |
$(USPACEDIR)/app/init/init \ |
$(USPACEDIR)/app/tetris/tetris \ |
$(USPACEDIR)/app/tester/tester \ |
$(USPACEDIR)/app/klog/klog |
build: $(BASE)/image.iso |
$(BASE)/image.iso: arch/$(ARCH)/grub/stage2_eltorito arch/$(ARCH)/grub/menu.lst $(KERNELDIR)/kernel.bin $(TASKS) |
mkdir -p arch/$(ARCH)/iso/boot/grub |
cp arch/$(ARCH)/grub/stage2_eltorito arch/$(ARCH)/iso/boot/grub/ |
cp arch/$(ARCH)/grub/menu.lst arch/$(ARCH)/iso/boot/grub/ |
cp $(KERNELDIR)/kernel.bin arch/$(ARCH)/iso/boot/ |
for task in $(TASKS) ; do \ |
cp $$task arch/$(ARCH)/iso/boot/ ; \ |
done |
mkisofs -J -r -b boot/grub/stage2_eltorito -no-emul-boot -boot-load-size 4 -boot-info-table -o $(BASE)/image.iso arch/$(ARCH)/iso/ |
clean: |
-rm -fr arch/$(ARCH)/iso |
-rm -f $(BASE)/image.iso |
/tags/0.3.0/boot/genarch/include/softint |
---|
0,0 → 1,0 |
link ../../../kernel/genarch/include/softint |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/boot/genarch/division.c |
---|
0,0 → 1,0 |
link ../../kernel/genarch/src/softint/division.c |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/boot/genarch/ofw.h |
---|
0,0 → 1,128 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#ifndef BOOT_OFW_H_ |
#define BOOT_OFW_H_ |
#include <types.h> |
#include <stdarg.h> |
#define BUF_SIZE 1024 |
#define MEMMAP_MAX_RECORDS 32 |
#define MAX_OFW_ARGS 12 |
typedef unative_t ofw_arg_t; |
typedef unsigned int ihandle; |
typedef unsigned int phandle; |
/** OpenFirmware command structure |
* |
*/ |
typedef struct { |
ofw_arg_t service; /**< Command name. */ |
ofw_arg_t nargs; /**< Number of in arguments. */ |
ofw_arg_t nret; /**< Number of out arguments. */ |
ofw_arg_t args[MAX_OFW_ARGS]; /**< List of arguments. */ |
} ofw_args_t; |
typedef struct { |
void *start; |
uint32_t size; |
} memzone_t; |
typedef struct { |
uint32_t total; |
uint32_t count; |
memzone_t zones[MEMMAP_MAX_RECORDS]; |
} memmap_t; |
typedef struct { |
void *addr; |
uint32_t width; |
uint32_t height; |
uint32_t bpp; |
uint32_t scanline; |
} screen_t; |
typedef struct { |
void *addr; |
uint32_t size; |
} keyboard_t; |
typedef struct { |
uint32_t info; |
uint32_t addr_hi; |
uint32_t addr_lo; |
} pci_addr_t; |
typedef struct { |
pci_addr_t addr; |
uint32_t size_hi; |
uint32_t size_lo; |
} pci_reg_t; |
extern uintptr_t ofw_cif; |
extern phandle ofw_chosen; |
extern ihandle ofw_stdout; |
extern phandle ofw_root; |
extern ihandle ofw_mmu; |
extern phandle ofw_memory; |
extern phandle ofw_aliases; |
extern void ofw_init(void); |
extern void ofw_write(const char *str, const int len); |
extern int ofw_get_property(const phandle device, const char *name, void *buf, const int buflen); |
extern int ofw_get_proplen(const phandle device, const char *name); |
extern int ofw_next_property(const phandle device, char *previous, char *buf); |
extern phandle ofw_get_child_node(const phandle node); |
extern phandle ofw_get_peer_node(const phandle node); |
extern phandle ofw_find_device(const char *name); |
extern int ofw_package_to_path(const phandle device, char *buf, const int buflen); |
extern int ofw(ofw_args_t *arg); |
extern unsigned long ofw_call(const char *service, const int nargs, const int nret, ofw_arg_t *rets, ...); |
extern unsigned int ofw_get_address_cells(const phandle device); |
extern unsigned int ofw_get_size_cells(const phandle device); |
extern void *ofw_translate(const void *virt); |
extern int ofw_translate_failed(ofw_arg_t flag); |
extern void *ofw_claim_virt(const void *virt, const int len); |
extern void *ofw_claim_phys(const void *virt, const int len); |
extern int ofw_map(const void *phys, const void *virt, const int size, const int mode); |
extern int ofw_memmap(memmap_t *map); |
extern int ofw_screen(screen_t *screen); |
extern int ofw_keyboard(keyboard_t *keyboard); |
extern void ofw_quiesce(void); |
#endif |
/tags/0.3.0/boot/genarch/balloc.h |
---|
0,0 → 1,44 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#ifndef BOOT_BALLOC_H_ |
#define BOOT_BALLOC_H_ |
#include <types.h> |
#define BALLOC_MAX_SIZE (1024 * 1024) |
typedef struct { |
uintptr_t base; |
size_t size; |
} ballocs_t; |
extern void balloc_init(ballocs_t *b, uintptr_t base); |
extern void *balloc(size_t size, size_t alignment); |
#endif |
/tags/0.3.0/boot/genarch/ofw.c |
---|
0,0 → 1,348 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#include <ofw.h> |
#include <ofwarch.h> |
#include <printf.h> |
#include <asm.h> |
#include <types.h> |
uintptr_t ofw_cif; |
phandle ofw_chosen; |
ihandle ofw_stdout; |
phandle ofw_root; |
ihandle ofw_mmu; |
ihandle ofw_memory_prop; |
phandle ofw_memory; |
phandle ofw_aliases; |
void ofw_init(void) |
{ |
ofw_chosen = ofw_find_device("/chosen"); |
if (ofw_chosen == -1) |
halt(); |
if (ofw_get_property(ofw_chosen, "stdout", &ofw_stdout, sizeof(ofw_stdout)) <= 0) |
ofw_stdout = 0; |
ofw_root = ofw_find_device("/"); |
if (ofw_root == -1) { |
puts("\r\nError: Unable to find / device, halted.\r\n"); |
halt(); |
} |
if (ofw_get_property(ofw_chosen, "mmu", &ofw_mmu, sizeof(ofw_mmu)) <= 0) { |
puts("\r\nError: Unable to get mmu property, halted.\r\n"); |
halt(); |
} |
if (ofw_get_property(ofw_chosen, "memory", &ofw_memory_prop, sizeof(ofw_memory_prop)) <= 0) { |
puts("\r\nError: Unable to get memory property, halted.\r\n"); |
halt(); |
} |
ofw_memory = ofw_find_device("/memory"); |
if (ofw_memory == -1) { |
puts("\r\nError: Unable to find /memory device, halted.\r\n"); |
halt(); |
} |
ofw_aliases = ofw_find_device("/aliases"); |
if (ofw_aliases == -1) { |
puts("\r\nError: Unable to find /aliases device, halted.\r\n"); |
halt(); |
} |
} |
/** Perform a call to OpenFirmware client interface. |
* |
* @param service String identifying the service requested. |
* @param nargs Number of input arguments. |
* @param nret Number of output arguments. This includes the return value. |
* @param rets Buffer for output arguments or NULL. The buffer must accommodate nret - 1 items. |
* |
* @return Return value returned by the client interface. |
*/ |
unsigned long ofw_call(const char *service, const int nargs, const int nret, ofw_arg_t *rets, ...) |
{ |
va_list list; |
ofw_args_t args; |
int i; |
args.service = (ofw_arg_t) service; |
args.nargs = nargs; |
args.nret = nret; |
va_start(list, rets); |
for (i = 0; i < nargs; i++) |
args.args[i] = va_arg(list, ofw_arg_t); |
va_end(list); |
for (i = 0; i < nret; i++) |
args.args[i + nargs] = 0; |
(void) ofw(&args); |
for (i = 1; i < nret; i++) |
rets[i - 1] = args.args[i + nargs]; |
return args.args[nargs]; |
} |
phandle ofw_find_device(const char *name) |
{ |
return ofw_call("finddevice", 1, 1, NULL, name); |
} |
int ofw_get_property(const phandle device, const char *name, void *buf, const int buflen) |
{ |
return ofw_call("getprop", 4, 1, NULL, device, name, buf, buflen); |
} |
int ofw_get_proplen(const phandle device, const char *name) |
{ |
return ofw_call("getproplen", 2, 1, NULL, device, name); |
} |
int ofw_next_property(const phandle device, char *previous, char *buf) |
{ |
return ofw_call("nextprop", 3, 1, NULL, device, previous, buf); |
} |
int ofw_package_to_path(const phandle device, char *buf, const int buflen) |
{ |
return ofw_call("package-to-path", 3, 1, NULL, device, buf, buflen); |
} |
unsigned int ofw_get_address_cells(const phandle device) |
{ |
unsigned int ret = 1; |
if (ofw_get_property(device, "#address-cells", &ret, sizeof(ret)) <= 0) |
if (ofw_get_property(ofw_root, "#address-cells", &ret, sizeof(ret)) <= 0) |
ret = OFW_ADDRESS_CELLS; |
return ret; |
} |
unsigned int ofw_get_size_cells(const phandle device) |
{ |
unsigned int ret; |
if (ofw_get_property(device, "#size-cells", &ret, sizeof(ret)) <= 0) |
if (ofw_get_property(ofw_root, "#size-cells", &ret, sizeof(ret)) <= 0) |
ret = OFW_SIZE_CELLS; |
return ret; |
} |
phandle ofw_get_child_node(const phandle node) |
{ |
return ofw_call("child", 1, 1, NULL, node); |
} |
phandle ofw_get_peer_node(const phandle node) |
{ |
return ofw_call("peer", 1, 1, NULL, node); |
} |
static ihandle ofw_open(const char *name) |
{ |
return ofw_call("open", 1, 1, NULL, name); |
} |
void ofw_write(const char *str, const int len) |
{ |
if (ofw_stdout == 0) |
return; |
ofw_call("write", 3, 1, NULL, ofw_stdout, str, len); |
} |
void *ofw_translate(const void *virt) |
{ |
ofw_arg_t result[4]; |
int shift; |
if (ofw_call("call-method", 3, 5, result, "translate", ofw_mmu, virt) != 0) { |
puts("Error: MMU method translate() failed, halting.\n"); |
halt(); |
} |
if (ofw_translate_failed(result[0])) |
return NULL; |
if (sizeof(unative_t) == 8) |
shift = 32; |
else |
shift = 0; |
return (void *) ((result[2] << shift) | result[3]); |
} |
void *ofw_claim_virt(const void *virt, const int len) |
{ |
ofw_arg_t retaddr; |
if (ofw_call("call-method", 5, 2, &retaddr, "claim", ofw_mmu, 0, len, virt) != 0) { |
puts("Error: MMU method claim() failed, halting.\n"); |
halt(); |
} |
return (void *) retaddr; |
} |
void *ofw_claim_phys(const void *phys, const int len) |
{ |
ofw_arg_t retaddr[2]; |
int shift; |
if (sizeof(unative_t) == 8) { |
shift = 32; |
if (ofw_call("call-method", 6, 3, retaddr, "claim", |
ofw_memory_prop, 0, len, ((uintptr_t) phys) >> shift, |
((uintptr_t) phys) & ((uint32_t) -1)) != 0) { |
/* |
* Note that this will help us to discover |
* conflicts between OpenFirmware allocations |
* and our use of physical memory. |
* It is better to detect collisions here |
* than to cope with weird errors later. |
* |
* So this is really not to make the loader |
* more generic; it is here for debugging |
* purposes. |
*/ |
puts("Error: memory method claim() failed, halting.\n"); |
halt(); |
} |
} else { |
shift = 0; |
/* |
* FIXME: the number of arguments is probably different... |
*/ |
puts("Error: 32-bit ofw_claim_phys not implemented.\n"); |
halt(); |
} |
return (void *) ((retaddr[0] << shift) | retaddr[1]); |
} |
int ofw_map(const void *phys, const void *virt, const int size, const int mode) |
{ |
uintptr_t phys_hi, phys_lo; |
if (sizeof(unative_t) == 8) { |
int shift = 32; |
phys_hi = (uintptr_t) phys >> shift; |
phys_lo = (uintptr_t) phys & 0xffffffff; |
} else { |
phys_hi = 0; |
phys_lo = (uintptr_t) phys; |
} |
return ofw_call("call-method", 7, 1, NULL, "map", ofw_mmu, mode, size, virt, |
phys_hi, phys_lo); |
} |
/** Save OpenFirmware physical memory map. |
* |
* @param map Memory map structure where the map will be saved. |
* |
* @return Zero on failure, non-zero on success. |
*/ |
int ofw_memmap(memmap_t *map) |
{ |
unsigned int ac = ofw_get_address_cells(ofw_memory); |
unsigned int sc = ofw_get_size_cells(ofw_memory); |
uint32_t buf[((ac + sc) * MEMMAP_MAX_RECORDS)]; |
int ret = ofw_get_property(ofw_memory, "reg", buf, sizeof(buf)); |
if (ret <= 0) /* ret is the number of written bytes */ |
return false; |
int pos; |
map->total = 0; |
map->count = 0; |
for (pos = 0; (pos < ret / sizeof(uint32_t)) && |
(map->count < MEMMAP_MAX_RECORDS); pos += ac + sc) { |
void * start = (void *) ((uintptr_t) buf[pos + ac - 1]); |
unsigned int size = buf[pos + ac + sc - 1]; |
if (size > 0) { |
map->zones[map->count].start = start; |
map->zones[map->count].size = size; |
map->count++; |
map->total += size; |
} |
} |
return true; |
} |
int ofw_screen(screen_t *screen) |
{ |
char device_name[BUF_SIZE]; |
uint32_t virtaddr; |
if (ofw_get_property(ofw_aliases, "screen", device_name, sizeof(device_name)) <= 0) |
return false; |
phandle device = ofw_find_device(device_name); |
if (device == -1) |
return false; |
if (ofw_get_property(device, "address", &virtaddr, sizeof(virtaddr)) <= 0) |
return false; |
screen->addr = (void *) ((uintptr_t) virtaddr); |
if (ofw_get_property(device, "width", &screen->width, sizeof(screen->width)) <= 0) |
return false; |
if (ofw_get_property(device, "height", &screen->height, sizeof(screen->height)) <= 0) |
return false; |
if (ofw_get_property(device, "depth", &screen->bpp, sizeof(screen->bpp)) <= 0) |
return false; |
if (ofw_get_property(device, "linebytes", &screen->scanline, sizeof(screen->scanline)) <= 0) |
return false; |
return true; |
} |
void ofw_quiesce(void) |
{ |
ofw_call("quiesce", 0, 0, NULL); |
} |
/tags/0.3.0/boot/genarch/balloc.c |
---|
0,0 → 1,57 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#include <balloc.h> |
#include <types.h> |
#include <align.h> |
static ballocs_t *ballocs; |
void balloc_init(ballocs_t *b, uintptr_t base) |
{ |
ballocs = b; |
ballocs->base = base; |
ballocs->size = 0; |
} |
void *balloc(size_t size, size_t alignment) |
{ |
uintptr_t addr; |
/* Enforce minimal alignment. */ |
alignment = ALIGN_UP(alignment, 4); |
addr = ballocs->base + ALIGN_UP(ballocs->size, alignment); |
if (ALIGN_UP(ballocs->size, alignment) + size > BALLOC_MAX_SIZE) |
return NULL; |
ballocs->size = ALIGN_UP(ballocs->size, alignment) + size; |
return (void *) addr; |
} |
/tags/0.3.0/boot/genarch/ofw_tree.h |
---|
0,0 → 1,65 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#ifndef BOOT_OFW_TREE_H_ |
#define BOOT_OFW_TREE_H_ |
#include <types.h> |
#include <ofw.h> |
#define OFW_TREE_PROPERTY_MAX_NAMELEN 32 |
typedef struct ofw_tree_node ofw_tree_node_t; |
typedef struct ofw_tree_property ofw_tree_property_t; |
/** Memory representation of OpenFirmware device tree node. */ |
struct ofw_tree_node { |
ofw_tree_node_t *parent; |
ofw_tree_node_t *peer; |
ofw_tree_node_t *child; |
uint32_t node_handle; /**< Old OpenFirmware node handle. */ |
char *da_name; /**< Disambigued name. */ |
unsigned properties; /**< Number of properties. */ |
ofw_tree_property_t *property; |
void *device; /**< Member used solely by the kernel. */ |
}; |
/** Memory representation of OpenFirmware device tree node property. */ |
struct ofw_tree_property { |
char name[OFW_TREE_PROPERTY_MAX_NAMELEN]; |
size_t size; |
void *value; |
}; |
extern ofw_tree_node_t *ofw_tree_build(void); |
#endif |
/tags/0.3.0/boot/genarch/ofw_tree.c |
---|
0,0 → 1,228 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#include <ofw_tree.h> |
#include <ofw.h> |
#include <types.h> |
#include <string.h> |
#include <balloc.h> |
#include <asm.h> |
#define MAX_PATH_LEN 256 |
static ofw_tree_node_t *ofw_tree_node_alloc(void) |
{ |
return balloc(sizeof(ofw_tree_node_t), sizeof(ofw_tree_node_t)); |
} |
static ofw_tree_property_t *ofw_tree_properties_alloc(unsigned count) |
{ |
return balloc(count * sizeof(ofw_tree_property_t), sizeof(ofw_tree_property_t)); |
} |
static void * ofw_tree_space_alloc(size_t size) |
{ |
char *addr; |
/* |
* What we do here is a nasty hack :-) |
* Problem: string property values that are allocated via this |
* function typically do not contain the trailing '\0'. This |
* is very uncomfortable for kernel, which is supposed to deal |
* with the properties. |
* Solution: when allocating space via this function, we always |
* allocate space for the extra '\0' character that we store |
* behind the requested memory. |
*/ |
addr = balloc(size + 1, size); |
if (addr) |
addr[size] = '\0'; |
return addr; |
} |
/** Transfer information from one OpenFirmware node into its memory representation. |
* |
* Transfer entire information from the OpenFirmware device tree 'current' node to |
* its memory representation in 'current_node'. This function recursively processes |
* all node's children. Node's peers are processed iteratively in order to prevent |
* stack from overflowing. |
* |
* @param current_node Pointer to uninitialized ofw_tree_node structure that will |
* become the memory represenation of 'current'. |
* @param parent_node Parent ofw_tree_node structure or NULL in case of root node. |
* @param current OpenFirmware phandle to the current device tree node. |
*/ |
static void ofw_tree_node_process(ofw_tree_node_t *current_node, |
ofw_tree_node_t *parent_node, phandle current) |
{ |
static char path[MAX_PATH_LEN+1]; |
static char name[OFW_TREE_PROPERTY_MAX_NAMELEN]; |
phandle peer; |
phandle child; |
size_t len; |
int i; |
while (current_node) { |
/* |
* Initialize node. |
*/ |
current_node->parent = parent_node; |
current_node->peer = NULL; |
current_node->child = NULL; |
current_node->node_handle = current; |
current_node->properties = 0; |
current_node->property = NULL; |
current_node->device = NULL; |
/* |
* Get the disambigued name. |
*/ |
len = ofw_package_to_path(current, path, MAX_PATH_LEN); |
if (len == -1) |
return; |
path[len] = '\0'; |
for (i = len - 1; i >= 0 && path[i] != '/'; i--) |
; |
i++; /* do not include '/' */ |
len -= i; |
/* add space for trailing '\0' */ |
current_node->da_name = ofw_tree_space_alloc(len + 1); |
if (!current_node->da_name) |
return; |
memcpy(current_node->da_name, &path[i], len); |
current_node->da_name[len] = '\0'; |
/* |
* Recursively process the potential child node. |
*/ |
child = ofw_get_child_node(current); |
if (child != 0 && child != -1) { |
ofw_tree_node_t *child_node; |
child_node = ofw_tree_node_alloc(); |
if (child_node) { |
ofw_tree_node_process(child_node, current_node, child); |
current_node->child = child_node; |
} |
} |
/* |
* Count properties. |
*/ |
name[0] = '\0'; |
while (ofw_next_property(current, name, name) == 1) |
current_node->properties++; |
if (!current_node->properties) |
return; |
/* |
* Copy properties. |
*/ |
current_node->property = ofw_tree_properties_alloc(current_node->properties); |
if (!current_node->property) |
return; |
name[0] = '\0'; |
for (i = 0; ofw_next_property(current, name, name) == 1; i++) { |
size_t size; |
if (i == current_node->properties) |
break; |
memcpy(current_node->property[i].name, name, |
OFW_TREE_PROPERTY_MAX_NAMELEN); |
current_node->property[i].name[OFW_TREE_PROPERTY_MAX_NAMELEN] = '\0'; |
size = ofw_get_proplen(current, name); |
current_node->property[i].size = size; |
if (size) { |
void *buf; |
buf = ofw_tree_space_alloc(size); |
if (current_node->property[i].value = buf) { |
/* |
* Copy property value to memory node. |
*/ |
(void) ofw_get_property(current, name, buf, size); |
} |
} else { |
current_node->property[i].value = NULL; |
} |
} |
current_node->properties = i; /* Just in case we ran out of memory. */ |
/* |
* Iteratively process the next peer node. |
* Note that recursion is a bad idea here. |
* Due to the topology of the OpenFirmware device tree, |
* the nesting of peer nodes could be to wide and the |
* risk of overflowing the stack is too real. |
*/ |
peer = ofw_get_peer_node(current); |
if (peer != 0 && peer != -1) { |
ofw_tree_node_t *peer_node; |
peer_node = ofw_tree_node_alloc(); |
if (peer_node) { |
current_node->peer = peer_node; |
current_node = peer_node; |
current = peer; |
/* |
* Process the peer in next iteration. |
*/ |
continue; |
} |
} |
/* |
* No more peers on this level. |
*/ |
break; |
} |
} |
/** Construct memory representation of OpenFirmware device tree. |
* |
* @return NULL on failure or pointer to the root node. |
*/ |
ofw_tree_node_t *ofw_tree_build(void) |
{ |
ofw_tree_node_t *root; |
root = ofw_tree_node_alloc(); |
if (root) |
ofw_tree_node_process(root, NULL, ofw_root); |
return root; |
} |
/tags/0.3.0/boot/generic/genarch |
---|
0,0 → 1,0 |
link ../genarch/include |
Property changes: |
Added: svn:special |
+* |
\ No newline at end of property |
/tags/0.3.0/boot/generic/align.h |
---|
0,0 → 1,48 |
/* |
* Copyright (c) 2006 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** @file |
*/ |
#ifndef BOOT_ALIGN_H_ |
#define BOOT_ALIGN_H_ |
/** Align to the nearest higher address. |
* |
* @param addr Address or size to be aligned. |
* @param align Size of alignment, must be power of 2. |
*/ |
#define ALIGN_UP(addr, align) (((addr) + ((align) - 1)) & ~((align) - 1)) |
#endif |
/** @} |
*/ |
/tags/0.3.0/boot/generic/printf.c |
---|
0,0 → 1,252 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** @file |
*/ |
#include "printf.h" |
#include "stdarg.h" |
#include <types.h> |
typedef char *char_ptr; |
static char digits[] = "0123456789abcdef"; /**< Hexadecimal characters */ |
void puts(const char *str) |
{ |
int len = 0; |
while (str[len] != 0) |
len++; |
write(str, len); |
} |
/** Print hexadecimal digits |
* |
* Print fixed count of hexadecimal digits from |
* the number num. The digits are printed in |
* natural left-to-right order starting with |
* the width-th digit. |
* |
* @param num Number containing digits. |
* @param width Count of digits to print. |
* |
*/ |
static void print_fixed_hex(const uint64_t num, const int width) |
{ |
int i; |
for (i = width * 8 - 4; i >= 0; i -= 4) |
write(digits + ((num >> i) & 0xf), 1); |
} |
/** Print number in given base |
* |
* Print significant digits of a number in given |
* base. |
* |
* @param num Number to print. |
* @param base Base to print the number in (should |
* be in range 2 .. 16). |
* |
*/ |
static void print_number(const unative_t num, const unsigned int base) |
{ |
int val = num; |
char d[sizeof(unative_t) * 8 + 1]; /* this is good enough even for base == 2 */ |
int i = sizeof(unative_t) * 8 - 1; |
do { |
d[i--] = digits[val % base]; |
} while (val /= base); |
d[sizeof(unative_t) * 8] = 0; |
puts(&d[i + 1]); |
} |
/** General formatted text print |
* |
* Print text formatted according the fmt parameter |
* and variant arguments. Each formatting directive |
* begins with \% (percentage) character and one of the |
* following character: |
* |
* \% Prints the percentage character. |
* |
* s The next variant argument is treated as char* |
* and printed as a NULL terminated string. |
* |
* c The next variant argument is treated as a single char. |
* |
* p The next variant argument is treated as a maximum |
* bit-width integer with respect to architecture |
* and printed in full hexadecimal width. |
* |
* P As with 'p', but '0x' is prefixed. |
* |
* q The next variant argument is treated as a 64b integer |
* and printed in full hexadecimal width. |
* |
* Q As with 'q', but '0x' is prefixed. |
* |
* l The next variant argument is treated as a 32b integer |
* and printed in full hexadecimal width. |
* |
* L As with 'l', but '0x' is prefixed. |
* |
* w The next variant argument is treated as a 16b integer |
* and printed in full hexadecimal width. |
* |
* W As with 'w', but '0x' is prefixed. |
* |
* b The next variant argument is treated as a 8b integer |
* and printed in full hexadecimal width. |
* |
* B As with 'b', but '0x' is prefixed. |
* |
* d The next variant argument is treated as integer |
* and printed in standard decimal format (only significant |
* digits). |
* |
* x The next variant argument is treated as integer |
* and printed in standard hexadecimal format (only significant |
* digits). |
* |
* X As with 'x', but '0x' is prefixed. |
* |
* All other characters from fmt except the formatting directives |
* are printed in verbatim. |
* |
* @param fmt Formatting NULL terminated string. |
*/ |
void printf(const char *fmt, ...) |
{ |
int i = 0; |
va_list ap; |
char c; |
va_start(ap, fmt); |
while ((c = fmt[i++])) { |
switch (c) { |
/* control character */ |
case '%': |
switch (c = fmt[i++]) { |
/* percentile itself */ |
case '%': |
break; |
/* |
* String and character conversions. |
*/ |
case 's': |
puts(va_arg(ap, char_ptr)); |
goto loop; |
case 'c': |
c = (char) va_arg(ap, int); |
break; |
/* |
* Hexadecimal conversions with fixed width. |
*/ |
case 'P': |
puts("0x"); |
case 'p': |
print_fixed_hex(va_arg(ap, unative_t), sizeof(unative_t)); |
goto loop; |
case 'Q': |
puts("0x"); |
case 'q': |
print_fixed_hex(va_arg(ap, uint64_t), INT64); |
goto loop; |
case 'L': |
puts("0x"); |
case 'l': |
print_fixed_hex(va_arg(ap, unative_t), INT32); |
goto loop; |
case 'W': |
puts("0x"); |
case 'w': |
print_fixed_hex(va_arg(ap, unative_t), INT16); |
goto loop; |
case 'B': |
puts("0x"); |
case 'b': |
print_fixed_hex(va_arg(ap, unative_t), INT8); |
goto loop; |
/* |
* Decimal and hexadecimal conversions. |
*/ |
case 'd': |
print_number(va_arg(ap, unative_t), 10); |
goto loop; |
case 'X': |
puts("0x"); |
case 'x': |
print_number(va_arg(ap, unative_t), 16); |
goto loop; |
/* |
* Bad formatting. |
*/ |
default: |
goto out; |
} |
default: |
write(&c, 1); |
} |
loop: |
; |
} |
out: |
va_end(ap); |
} |
/** @} |
*/ |
/tags/0.3.0/boot/generic/gentypes.h |
---|
0,0 → 1,47 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** @file |
*/ |
#ifndef BOOT_GENTYPES_H_ |
#define BOOT_GENTYPES_H_ |
#define NULL 0 |
#define false 0 |
#define true 1 |
typedef unsigned long size_t; |
#endif |
/** @} |
*/ |
/tags/0.3.0/boot/generic/printf.h |
---|
0,0 → 1,51 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** @file |
*/ |
#ifndef BOOT_PRINTF_H_ |
#define BOOT_PRINTF_H_ |
#define INT8 1 |
#define INT16 2 |
#define INT32 4 |
#define INT64 8 |
extern void puts(const char *str); |
extern void printf(const char *fmt, ...); |
extern void write(const char *str, const int len); |
#endif |
/** @} |
*/ |
/tags/0.3.0/boot/generic/stdarg.h |
---|
0,0 → 1,47 |
/* |
* Copyright (c) 2006 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** @file |
*/ |
#ifndef STDARG_H__ |
#define STDARG_H__ |
typedef __builtin_va_list va_list; |
#define va_start(ap, last) __builtin_va_start(ap, last) |
#define va_arg(ap, type) __builtin_va_arg(ap, type) |
#define va_end(ap) __builtin_va_end(ap) |
#endif |
/** @} |
*/ |
/tags/0.3.0/boot/generic/string.c |
---|
0,0 → 1,180 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
#include <string.h> |
/** |
* @file |
* @brief String manipulation functions. |
*/ |
/** Return number of characters in a string. |
* |
* @param str NULL terminated string. |
* |
* @return Number of characters in str. |
*/ |
size_t strlen(const char *str) |
{ |
int i; |
for (i = 0; str[i]; i++) |
; |
return i; |
} |
/** Compare two NULL terminated strings |
* |
* Do a char-by-char comparison of two NULL terminated strings. |
* The strings are considered equal iff they consist of the same |
* characters on the minimum of their lengths. |
* |
* @param src First string to compare. |
* @param dst Second string to compare. |
* |
* @return 0 if the strings are equal, -1 if first is smaller, 1 if second smaller. |
* |
*/ |
int strcmp(const char *src, const char *dst) |
{ |
for (; *src && *dst; src++, dst++) { |
if (*src < *dst) |
return -1; |
if (*src > *dst) |
return 1; |
} |
if (*src == *dst) |
return 0; |
if (!*src) |
return -1; |
return 1; |
} |
/** Compare two NULL terminated strings |
* |
* Do a char-by-char comparison of two NULL terminated strings. |
* The strings are considered equal iff they consist of the same |
* characters on the minimum of their lengths and specified maximal |
* length. |
* |
* @param src First string to compare. |
* @param dst Second string to compare. |
* @param len Maximal length for comparison. |
* |
* @return 0 if the strings are equal, -1 if first is smaller, 1 if second smaller. |
* |
*/ |
int strncmp(const char *src, const char *dst, size_t len) |
{ |
int i; |
for (i = 0; *src && *dst && i < len; src++, dst++, i++) { |
if (*src < *dst) |
return -1; |
if (*src > *dst) |
return 1; |
} |
if (i == len || *src == *dst) |
return 0; |
if (!*src) |
return -1; |
return 1; |
} |
/** Copy NULL terminated string. |
* |
* Copy at most 'len' characters from string 'src' to 'dest'. |
* If 'src' is shorter than 'len', '\0' is inserted behind the |
* last copied character. |
* |
* @param src Source string. |
* @param dest Destination buffer. |
* @param len Size of destination buffer. |
*/ |
void strncpy(char *dest, const char *src, size_t len) |
{ |
int i; |
for (i = 0; i < len; i++) { |
if (!(dest[i] = src[i])) |
return; |
} |
dest[i-1] = '\0'; |
} |
/** Convert ascii representation to unative_t |
* |
* Supports 0x for hexa & 0 for octal notation. |
* Does not check for overflows, does not support negative numbers |
* |
* @param text Textual representation of number |
* @return Converted number or 0 if no valid number ofund |
*/ |
unative_t atoi(const char *text) |
{ |
int base = 10; |
unative_t result = 0; |
if (text[0] == '0' && text[1] == 'x') { |
base = 16; |
text += 2; |
} else if (text[0] == '0') |
base = 8; |
while (*text) { |
if (base != 16 && \ |
((*text >= 'A' && *text <= 'F' ) |
|| (*text >='a' && *text <='f'))) |
break; |
if (base == 8 && *text >='8') |
break; |
if (*text >= '0' && *text <= '9') { |
result *= base; |
result += *text - '0'; |
} else if (*text >= 'A' && *text <= 'F') { |
result *= base; |
result += *text - 'A' + 10; |
} else if (*text >= 'a' && *text <= 'f') { |
result *= base; |
result += *text - 'a' + 10; |
} else |
break; |
text++; |
} |
return result; |
} |
/** @} |
*/ |
/tags/0.3.0/boot/generic/string.h |
---|
0,0 → 1,49 |
/* |
* Copyright (c) 2001-2004 Jakub Jermar |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
/** @addtogroup generic |
* @{ |
*/ |
/** @file |
*/ |
#ifndef BOOT_STRING_H_ |
#define BOOT_STRING_H_ |
#include <types.h> |
extern size_t strlen(const char *str); |
extern int strcmp(const char *src, const char *dst); |
extern int strncmp(const char *src, const char *dst, size_t len); |
extern void strncpy(char *dest, const char *src, size_t len); |
extern unative_t atoi(const char *text); |
#endif |
/** @} |
*/ |
/tags/0.3.0/boot/doc/doxygroups.h |
---|
0,0 → 1,10 |
/* Definitions of modules and its relations for generating Doxygen documentation */ |
/** @defgroup generic generic |
*/ |
/** @defgroup arm32boot arm32 |
*/ |
/tags/0.3.0/boot/boot.config |
---|
0,0 → 1,52 |
## General configuration directives |
# Architecture |
@ "amd64" AMD64/Intel EM64T |
@ "arm32" ARM 32-bit |
@ "ia32" Intel IA-32 |
@ "ia32xen" Intel IA-32 on Xen hypervisor |
@ "ia64" Intel IA-64 |
@ "mips32" MIPS 32-bit |
@ "ppc32" PowerPC 32-bit |
@ "ppc64" PowerPC 64-bit |
@ "sparc64" Sun UltraSPARC |
! ARCH (choice) |
# Compiler |
@ "gcc_cross" GCC Cross-compiler |
@ "gcc_native" GCC Native |
@ "icc_native" ICC Native |
@ "suncc_native" Sun Studio C Compiler |
! [ARCH=amd64|ARCH=ia32|ARCH=ia32xen] COMPILER (choice) |
# Compiler |
@ "gcc_cross" GCC Cross-compiler |
@ "gcc_native" GCC Native |
@ "icc_native" ICC Native |
! [ARCH=ia64] COMPILER (choice) |
# Compiler |
@ "gcc_cross" GCC Cross-compiler |
@ "gcc_native" GCC Native |
@ "suncc_native" Sun Studio C Compiler |
! [ARCH=sparc64] COMPILER (choice) |
# Compiler |
@ "gcc_cross" GCC Cross-compiler |
@ "gcc_native" GCC Native |
! [ARCH=arm32|ARCH=mips32|ARCH=ppc32|ARCH=ppc64] COMPILER (choice) |
# Start AP processors by the loader |
! [ARCH=sparc64] CONFIG_SMP (y/n) |
# Debug bootloader |
! [ARCH=ppc32] CONFIG_DEBUG (n/y) |
# Use Block Address Translation |
! [ARCH=ppc32] CONFIG_BAT (y/n) |
# Target image |
@ "binary" Binary image (MSIM) |
@ "ecoff" Ecoff image (GXEmul) |
! [ARCH=mips32] IMAGE (choice) |
/tags/0.3.0/boot/tools/ia32/gen_vga323.c |
---|
0,0 → 1,14 |
#include <stdio.h> |
#define RED(i) ((i >> 5) & ((1 << 3) - 1)) |
#define GREEN(i) ((i >> 3) & ((1 << 2) - 1)) |
#define BLUE(i) (i & ((1 << 3) - 1)) |
int main(int argc, char *argv[]) { |
unsigned int i; |
for (i = 0; i < 256; i++) |
printf("\t.byte 0x%02x, 0x%02x, 0x%02x, 0x00\n", BLUE(i) * 9, GREEN(i) * 21, RED(i) * 9); |
return 0; |
} |
/tags/0.3.0/boot/tools/ppc32/font-8x16.h |
---|
0,0 → 1,38 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#ifndef __FONT_8X16_H__ |
#define __FONT_8X16_H__ |
#define FONT_GLIPHS 256 |
#define FONT_SCANLINES 16 |
#define FONT_WIDTH 8 |
extern unsigned char fb_font[FONT_GLIPHS * FONT_SCANLINES]; |
#endif |
/tags/0.3.0/boot/tools/ppc32/font-8x16.c |
---|
0,0 → 1,4641 |
/* |
* Copyright (c) 2005 Martin Decky |
* All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* are met: |
* |
* - Redistributions of source code must retain the above copyright |
* notice, this list of conditions and the following disclaimer. |
* - Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* - The name of the author may not be used to endorse or promote products |
* derived from this software without specific prior written permission. |
* |
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
#include "font-8x16.h" |
unsigned char fb_font[FONT_GLIPHS * FONT_SCANLINES] = { |
/* 0 0x00 '^@' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 1 0x01 '^A' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0x81, /* 10000001 */ |
0xa5, /* 10100101 */ |
0x81, /* 10000001 */ |
0x81, /* 10000001 */ |
0xbd, /* 10111101 */ |
0x99, /* 10011001 */ |
0x81, /* 10000001 */ |
0x81, /* 10000001 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 2 0x02 '^B' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0xff, /* 11111111 */ |
0xdb, /* 11011011 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xc3, /* 11000011 */ |
0xe7, /* 11100111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 3 0x03 '^C' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x6c, /* 01101100 */ |
0xfe, /* 11111110 */ |
0xfe, /* 11111110 */ |
0xfe, /* 11111110 */ |
0xfe, /* 11111110 */ |
0x7c, /* 01111100 */ |
0x38, /* 00111000 */ |
0x10, /* 00010000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 4 0x04 '^D' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x10, /* 00010000 */ |
0x38, /* 00111000 */ |
0x7c, /* 01111100 */ |
0xfe, /* 11111110 */ |
0x7c, /* 01111100 */ |
0x38, /* 00111000 */ |
0x10, /* 00010000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 5 0x05 '^E' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x3c, /* 00111100 */ |
0xe7, /* 11100111 */ |
0xe7, /* 11100111 */ |
0xe7, /* 11100111 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 6 0x06 '^F' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x7e, /* 01111110 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0x7e, /* 01111110 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 7 0x07 '^G' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x3c, /* 00111100 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 8 0x08 '^H' */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xe7, /* 11100111 */ |
0xc3, /* 11000011 */ |
0xc3, /* 11000011 */ |
0xe7, /* 11100111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
/* 9 0x09 '^I' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x3c, /* 00111100 */ |
0x66, /* 01100110 */ |
0x42, /* 01000010 */ |
0x42, /* 01000010 */ |
0x66, /* 01100110 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 10 0x0a '^J' */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xc3, /* 11000011 */ |
0x99, /* 10011001 */ |
0xbd, /* 10111101 */ |
0xbd, /* 10111101 */ |
0x99, /* 10011001 */ |
0xc3, /* 11000011 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
/* 11 0x0b '^K' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x1e, /* 00011110 */ |
0x0e, /* 00001110 */ |
0x1a, /* 00011010 */ |
0x32, /* 00110010 */ |
0x78, /* 01111000 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x78, /* 01111000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 12 0x0c '^L' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x3c, /* 00111100 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x3c, /* 00111100 */ |
0x18, /* 00011000 */ |
0x7e, /* 01111110 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 13 0x0d '^M' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x3f, /* 00111111 */ |
0x33, /* 00110011 */ |
0x3f, /* 00111111 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x70, /* 01110000 */ |
0xf0, /* 11110000 */ |
0xe0, /* 11100000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 14 0x0e '^N' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7f, /* 01111111 */ |
0x63, /* 01100011 */ |
0x7f, /* 01111111 */ |
0x63, /* 01100011 */ |
0x63, /* 01100011 */ |
0x63, /* 01100011 */ |
0x63, /* 01100011 */ |
0x67, /* 01100111 */ |
0xe7, /* 11100111 */ |
0xe6, /* 11100110 */ |
0xc0, /* 11000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 15 0x0f '^O' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0xdb, /* 11011011 */ |
0x3c, /* 00111100 */ |
0xe7, /* 11100111 */ |
0x3c, /* 00111100 */ |
0xdb, /* 11011011 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 16 0x10 '^P' */ |
0x00, /* 00000000 */ |
0x80, /* 10000000 */ |
0xc0, /* 11000000 */ |
0xe0, /* 11100000 */ |
0xf0, /* 11110000 */ |
0xf8, /* 11111000 */ |
0xfe, /* 11111110 */ |
0xf8, /* 11111000 */ |
0xf0, /* 11110000 */ |
0xe0, /* 11100000 */ |
0xc0, /* 11000000 */ |
0x80, /* 10000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 17 0x11 '^Q' */ |
0x00, /* 00000000 */ |
0x02, /* 00000010 */ |
0x06, /* 00000110 */ |
0x0e, /* 00001110 */ |
0x1e, /* 00011110 */ |
0x3e, /* 00111110 */ |
0xfe, /* 11111110 */ |
0x3e, /* 00111110 */ |
0x1e, /* 00011110 */ |
0x0e, /* 00001110 */ |
0x06, /* 00000110 */ |
0x02, /* 00000010 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 18 0x12 '^R' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x7e, /* 01111110 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x7e, /* 01111110 */ |
0x3c, /* 00111100 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 19 0x13 '^S' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x00, /* 00000000 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 20 0x14 '^T' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7f, /* 01111111 */ |
0xdb, /* 11011011 */ |
0xdb, /* 11011011 */ |
0xdb, /* 11011011 */ |
0x7b, /* 01111011 */ |
0x1b, /* 00011011 */ |
0x1b, /* 00011011 */ |
0x1b, /* 00011011 */ |
0x1b, /* 00011011 */ |
0x1b, /* 00011011 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 21 0x15 '^U' */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0x60, /* 01100000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x6c, /* 01101100 */ |
0x38, /* 00111000 */ |
0x0c, /* 00001100 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 22 0x16 '^V' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0xfe, /* 11111110 */ |
0xfe, /* 11111110 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 23 0x17 '^W' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x7e, /* 01111110 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x7e, /* 01111110 */ |
0x3c, /* 00111100 */ |
0x18, /* 00011000 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 24 0x18 '^X' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x7e, /* 01111110 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 25 0x19 '^Y' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x7e, /* 01111110 */ |
0x3c, /* 00111100 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 26 0x1a '^Z' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x0c, /* 00001100 */ |
0xfe, /* 11111110 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 27 0x1b '^[' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0xfe, /* 11111110 */ |
0x60, /* 01100000 */ |
0x30, /* 00110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 28 0x1c '^\' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 29 0x1d '^]' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x28, /* 00101000 */ |
0x6c, /* 01101100 */ |
0xfe, /* 11111110 */ |
0x6c, /* 01101100 */ |
0x28, /* 00101000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 30 0x1e '^^' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x10, /* 00010000 */ |
0x38, /* 00111000 */ |
0x38, /* 00111000 */ |
0x7c, /* 01111100 */ |
0x7c, /* 01111100 */ |
0xfe, /* 11111110 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 31 0x1f '^_' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0xfe, /* 11111110 */ |
0x7c, /* 01111100 */ |
0x7c, /* 01111100 */ |
0x38, /* 00111000 */ |
0x38, /* 00111000 */ |
0x10, /* 00010000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 32 0x20 ' ' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 33 0x21 '!' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x3c, /* 00111100 */ |
0x3c, /* 00111100 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 34 0x22 '"' */ |
0x00, /* 00000000 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x24, /* 00100100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 35 0x23 '#' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0xfe, /* 11111110 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0xfe, /* 11111110 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 36 0x24 '$' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc2, /* 11000010 */ |
0xc0, /* 11000000 */ |
0x7c, /* 01111100 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x86, /* 10000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 37 0x25 '%' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc2, /* 11000010 */ |
0xc6, /* 11000110 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0xc6, /* 11000110 */ |
0x86, /* 10000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 38 0x26 '&' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x38, /* 00111000 */ |
0x76, /* 01110110 */ |
0xdc, /* 11011100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 39 0x27 ''' */ |
0x00, /* 00000000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 40 0x28 '(' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x0c, /* 00001100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 41 0x29 ')' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 42 0x2a '*' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x66, /* 01100110 */ |
0x3c, /* 00111100 */ |
0xff, /* 11111111 */ |
0x3c, /* 00111100 */ |
0x66, /* 01100110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 43 0x2b '+' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x7e, /* 01111110 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 44 0x2c ',' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 45 0x2d '-' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 46 0x2e '.' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 47 0x2f '/' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x02, /* 00000010 */ |
0x06, /* 00000110 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0xc0, /* 11000000 */ |
0x80, /* 10000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 48 0x30 '0' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xd6, /* 11010110 */ |
0xd6, /* 11010110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x6c, /* 01101100 */ |
0x38, /* 00111000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 49 0x31 '1' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x38, /* 00111000 */ |
0x78, /* 01111000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 50 0x32 '2' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0x06, /* 00000110 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0xc0, /* 11000000 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 51 0x33 '3' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x3c, /* 00111100 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 52 0x34 '4' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x0c, /* 00001100 */ |
0x1c, /* 00011100 */ |
0x3c, /* 00111100 */ |
0x6c, /* 01101100 */ |
0xcc, /* 11001100 */ |
0xfe, /* 11111110 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x1e, /* 00011110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 53 0x35 '5' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xfc, /* 11111100 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 54 0x36 '6' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x60, /* 01100000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xfc, /* 11111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 55 0x37 '7' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0xc6, /* 11000110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 56 0x38 '8' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 57 0x39 '9' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7e, /* 01111110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x0c, /* 00001100 */ |
0x78, /* 01111000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 58 0x3a ':' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 59 0x3b ';' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 60 0x3c '<' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x06, /* 00000110 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x0c, /* 00001100 */ |
0x06, /* 00000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 61 0x3d '=' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 62 0x3e '>' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x60, /* 01100000 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x0c, /* 00001100 */ |
0x06, /* 00000110 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 63 0x3f '?' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 64 0x40 '@' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xde, /* 11011110 */ |
0xde, /* 11011110 */ |
0xde, /* 11011110 */ |
0xdc, /* 11011100 */ |
0xc0, /* 11000000 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 65 0x41 'A' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x10, /* 00010000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 66 0x42 'B' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfc, /* 11111100 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x7c, /* 01111100 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0xfc, /* 11111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 67 0x43 'C' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x3c, /* 00111100 */ |
0x66, /* 01100110 */ |
0xc2, /* 11000010 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc2, /* 11000010 */ |
0x66, /* 01100110 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 68 0x44 'D' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xf8, /* 11111000 */ |
0x6c, /* 01101100 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x6c, /* 01101100 */ |
0xf8, /* 11111000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 69 0x45 'E' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0x66, /* 01100110 */ |
0x62, /* 01100010 */ |
0x68, /* 01101000 */ |
0x78, /* 01111000 */ |
0x68, /* 01101000 */ |
0x60, /* 01100000 */ |
0x62, /* 01100010 */ |
0x66, /* 01100110 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 70 0x46 'F' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0x66, /* 01100110 */ |
0x62, /* 01100010 */ |
0x68, /* 01101000 */ |
0x78, /* 01111000 */ |
0x68, /* 01101000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0xf0, /* 11110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 71 0x47 'G' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x3c, /* 00111100 */ |
0x66, /* 01100110 */ |
0xc2, /* 11000010 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xde, /* 11011110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x66, /* 01100110 */ |
0x3a, /* 00111010 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 72 0x48 'H' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 73 0x49 'I' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x3c, /* 00111100 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 74 0x4a 'J' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x1e, /* 00011110 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x78, /* 01111000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 75 0x4b 'K' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xe6, /* 11100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x6c, /* 01101100 */ |
0x78, /* 01111000 */ |
0x78, /* 01111000 */ |
0x6c, /* 01101100 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0xe6, /* 11100110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 76 0x4c 'L' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xf0, /* 11110000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x62, /* 01100010 */ |
0x66, /* 01100110 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 77 0x4d 'M' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0xee, /* 11101110 */ |
0xfe, /* 11111110 */ |
0xfe, /* 11111110 */ |
0xd6, /* 11010110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 78 0x4e 'N' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0xe6, /* 11100110 */ |
0xf6, /* 11110110 */ |
0xfe, /* 11111110 */ |
0xde, /* 11011110 */ |
0xce, /* 11001110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 79 0x4f 'O' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 80 0x50 'P' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfc, /* 11111100 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x7c, /* 01111100 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0xf0, /* 11110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 81 0x51 'Q' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xd6, /* 11010110 */ |
0xde, /* 11011110 */ |
0x7c, /* 01111100 */ |
0x0c, /* 00001100 */ |
0x0e, /* 00001110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 82 0x52 'R' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfc, /* 11111100 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x7c, /* 01111100 */ |
0x6c, /* 01101100 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0xe6, /* 11100110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 83 0x53 'S' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x60, /* 01100000 */ |
0x38, /* 00111000 */ |
0x0c, /* 00001100 */ |
0x06, /* 00000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 84 0x54 'T' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0x7e, /* 01111110 */ |
0x5a, /* 01011010 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 85 0x55 'U' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 86 0x56 'V' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x6c, /* 01101100 */ |
0x38, /* 00111000 */ |
0x10, /* 00010000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 87 0x57 'W' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xd6, /* 11010110 */ |
0xd6, /* 11010110 */ |
0xd6, /* 11010110 */ |
0xfe, /* 11111110 */ |
0xee, /* 11101110 */ |
0x6c, /* 01101100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 88 0x58 'X' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x6c, /* 01101100 */ |
0x7c, /* 01111100 */ |
0x38, /* 00111000 */ |
0x38, /* 00111000 */ |
0x7c, /* 01111100 */ |
0x6c, /* 01101100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 89 0x59 'Y' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x3c, /* 00111100 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 90 0x5a 'Z' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0xc6, /* 11000110 */ |
0x86, /* 10000110 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0xc2, /* 11000010 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 91 0x5b '[' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x3c, /* 00111100 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 92 0x5c '\' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x80, /* 10000000 */ |
0xc0, /* 11000000 */ |
0xe0, /* 11100000 */ |
0x70, /* 01110000 */ |
0x38, /* 00111000 */ |
0x1c, /* 00011100 */ |
0x0e, /* 00001110 */ |
0x06, /* 00000110 */ |
0x02, /* 00000010 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 93 0x5d ']' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x3c, /* 00111100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 94 0x5e '^' */ |
0x10, /* 00010000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 95 0x5f '_' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xff, /* 11111111 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 96 0x60 '`' */ |
0x00, /* 00000000 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x0c, /* 00001100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 97 0x61 'a' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x78, /* 01111000 */ |
0x0c, /* 00001100 */ |
0x7c, /* 01111100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 98 0x62 'b' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xe0, /* 11100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x78, /* 01111000 */ |
0x6c, /* 01101100 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 99 0x63 'c' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 100 0x64 'd' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x1c, /* 00011100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x3c, /* 00111100 */ |
0x6c, /* 01101100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 101 0x65 'e' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 102 0x66 'f' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x1c, /* 00011100 */ |
0x36, /* 00110110 */ |
0x32, /* 00110010 */ |
0x30, /* 00110000 */ |
0x78, /* 01111000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x78, /* 01111000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 103 0x67 'g' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x76, /* 01110110 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x7c, /* 01111100 */ |
0x0c, /* 00001100 */ |
0xcc, /* 11001100 */ |
0x78, /* 01111000 */ |
0x00, /* 00000000 */ |
/* 104 0x68 'h' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xe0, /* 11100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x6c, /* 01101100 */ |
0x76, /* 01110110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0xe6, /* 11100110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 105 0x69 'i' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 106 0x6a 'j' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x00, /* 00000000 */ |
0x0e, /* 00001110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
/* 107 0x6b 'k' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xe0, /* 11100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x66, /* 01100110 */ |
0x6c, /* 01101100 */ |
0x78, /* 01111000 */ |
0x78, /* 01111000 */ |
0x6c, /* 01101100 */ |
0x66, /* 01100110 */ |
0xe6, /* 11100110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 108 0x6c 'l' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 109 0x6d 'm' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xec, /* 11101100 */ |
0xfe, /* 11111110 */ |
0xd6, /* 11010110 */ |
0xd6, /* 11010110 */ |
0xd6, /* 11010110 */ |
0xd6, /* 11010110 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 110 0x6e 'n' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xdc, /* 11011100 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 111 0x6f 'o' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 112 0x70 'p' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xdc, /* 11011100 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x7c, /* 01111100 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0xf0, /* 11110000 */ |
0x00, /* 00000000 */ |
/* 113 0x71 'q' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x76, /* 01110110 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x7c, /* 01111100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x1e, /* 00011110 */ |
0x00, /* 00000000 */ |
/* 114 0x72 'r' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xdc, /* 11011100 */ |
0x76, /* 01110110 */ |
0x66, /* 01100110 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0xf0, /* 11110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 115 0x73 's' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0x60, /* 01100000 */ |
0x38, /* 00111000 */ |
0x0c, /* 00001100 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 116 0x74 't' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x10, /* 00010000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0xfc, /* 11111100 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x36, /* 00110110 */ |
0x1c, /* 00011100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 117 0x75 'u' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 118 0x76 'v' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x6c, /* 01101100 */ |
0x38, /* 00111000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 119 0x77 'w' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xd6, /* 11010110 */ |
0xd6, /* 11010110 */ |
0xd6, /* 11010110 */ |
0xfe, /* 11111110 */ |
0x6c, /* 01101100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 120 0x78 'x' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0x6c, /* 01101100 */ |
0x38, /* 00111000 */ |
0x38, /* 00111000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 121 0x79 'y' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7e, /* 01111110 */ |
0x06, /* 00000110 */ |
0x0c, /* 00001100 */ |
0xf8, /* 11111000 */ |
0x00, /* 00000000 */ |
/* 122 0x7a 'z' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0xcc, /* 11001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 123 0x7b '{' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x0e, /* 00001110 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x70, /* 01110000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x0e, /* 00001110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 124 0x7c '|' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 125 0x7d '}' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x70, /* 01110000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x0e, /* 00001110 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x70, /* 01110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 126 0x7e '~' */ |
0x00, /* 00000000 */ |
0x76, /* 01110110 */ |
0xdc, /* 11011100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 127 0x7f '' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x10, /* 00010000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 128 0x80 '€' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x3c, /* 00111100 */ |
0x66, /* 01100110 */ |
0xc2, /* 11000010 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc2, /* 11000010 */ |
0x66, /* 01100110 */ |
0x3c, /* 00111100 */ |
0x18, /* 00011000 */ |
0x70, /* 01110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 129 0x81 '' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xcc, /* 11001100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 130 0x82 '‚' */ |
0x00, /* 00000000 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 131 0x83 'ƒ' */ |
0x00, /* 00000000 */ |
0x10, /* 00010000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0x00, /* 00000000 */ |
0x78, /* 01111000 */ |
0x0c, /* 00001100 */ |
0x7c, /* 01111100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 132 0x84 '„' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xcc, /* 11001100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x78, /* 01111000 */ |
0x0c, /* 00001100 */ |
0x7c, /* 01111100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 133 0x85 '…' */ |
0x00, /* 00000000 */ |
0x60, /* 01100000 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x78, /* 01111000 */ |
0x0c, /* 00001100 */ |
0x7c, /* 01111100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 134 0x86 '†' */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0x38, /* 00111000 */ |
0x00, /* 00000000 */ |
0x78, /* 01111000 */ |
0x0c, /* 00001100 */ |
0x7c, /* 01111100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 135 0x87 '‡' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x18, /* 00011000 */ |
0x70, /* 01110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 136 0x88 'ˆ' */ |
0x00, /* 00000000 */ |
0x10, /* 00010000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 137 0x89 '‰' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 138 0x8a 'Š' */ |
0x00, /* 00000000 */ |
0x60, /* 01100000 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 139 0x8b '‹' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x66, /* 01100110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 140 0x8c 'Œ' */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x66, /* 01100110 */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 141 0x8d '' */ |
0x00, /* 00000000 */ |
0x60, /* 01100000 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 142 0x8e 'Ž' */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x10, /* 00010000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 143 0x8f '' */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0x38, /* 00111000 */ |
0x10, /* 00010000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 144 0x90 '' */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0x66, /* 01100110 */ |
0x62, /* 01100010 */ |
0x68, /* 01101000 */ |
0x78, /* 01111000 */ |
0x68, /* 01101000 */ |
0x62, /* 01100010 */ |
0x66, /* 01100110 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 145 0x91 '‘' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xec, /* 11101100 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x7e, /* 01111110 */ |
0xd8, /* 11011000 */ |
0xd8, /* 11011000 */ |
0x6e, /* 01101110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 146 0x92 '’' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x3e, /* 00111110 */ |
0x6c, /* 01101100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xfe, /* 11111110 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xce, /* 11001110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 147 0x93 '“' */ |
0x00, /* 00000000 */ |
0x10, /* 00010000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 148 0x94 '”' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 149 0x95 '•' */ |
0x00, /* 00000000 */ |
0x60, /* 01100000 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 150 0x96 '–' */ |
0x00, /* 00000000 */ |
0x30, /* 00110000 */ |
0x78, /* 01111000 */ |
0xcc, /* 11001100 */ |
0x00, /* 00000000 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 151 0x97 '—' */ |
0x00, /* 00000000 */ |
0x60, /* 01100000 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 152 0x98 '˜' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7e, /* 01111110 */ |
0x06, /* 00000110 */ |
0x0c, /* 00001100 */ |
0x78, /* 01111000 */ |
0x00, /* 00000000 */ |
/* 153 0x99 '™' */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 154 0x9a 'š' */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 155 0x9b '›' */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 156 0x9c 'œ' */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0x64, /* 01100100 */ |
0x60, /* 01100000 */ |
0xf0, /* 11110000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0xe6, /* 11100110 */ |
0xfc, /* 11111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 157 0x9d '' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x3c, /* 00111100 */ |
0x18, /* 00011000 */ |
0x7e, /* 01111110 */ |
0x18, /* 00011000 */ |
0x7e, /* 01111110 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 158 0x9e 'ž' */ |
0x00, /* 00000000 */ |
0xf8, /* 11111000 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xf8, /* 11111000 */ |
0xc4, /* 11000100 */ |
0xcc, /* 11001100 */ |
0xde, /* 11011110 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 159 0x9f 'Ÿ' */ |
0x00, /* 00000000 */ |
0x0e, /* 00001110 */ |
0x1b, /* 00011011 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x7e, /* 01111110 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0xd8, /* 11011000 */ |
0x70, /* 01110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 160 0xa0 ' ' */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0x00, /* 00000000 */ |
0x78, /* 01111000 */ |
0x0c, /* 00001100 */ |
0x7c, /* 01111100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 161 0xa1 '¡' */ |
0x00, /* 00000000 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 162 0xa2 '¢' */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 163 0xa3 '£' */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0x00, /* 00000000 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 164 0xa4 '¤' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x76, /* 01110110 */ |
0xdc, /* 11011100 */ |
0x00, /* 00000000 */ |
0xdc, /* 11011100 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 165 0xa5 '¥' */ |
0x76, /* 01110110 */ |
0xdc, /* 11011100 */ |
0x00, /* 00000000 */ |
0xc6, /* 11000110 */ |
0xe6, /* 11100110 */ |
0xf6, /* 11110110 */ |
0xfe, /* 11111110 */ |
0xde, /* 11011110 */ |
0xce, /* 11001110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 166 0xa6 '¦' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x3c, /* 00111100 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x3e, /* 00111110 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 167 0xa7 '§' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x38, /* 00111000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 168 0xa8 '¨' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x00, /* 00000000 */ |
0x30, /* 00110000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0xc0, /* 11000000 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x7c, /* 01111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 169 0xa9 '©' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 170 0xaa 'ª' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 171 0xab '«' */ |
0x00, /* 00000000 */ |
0x60, /* 01100000 */ |
0xe0, /* 11100000 */ |
0x62, /* 01100010 */ |
0x66, /* 01100110 */ |
0x6c, /* 01101100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0xdc, /* 11011100 */ |
0x86, /* 10000110 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x3e, /* 00111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 172 0xac '¬' */ |
0x00, /* 00000000 */ |
0x60, /* 01100000 */ |
0xe0, /* 11100000 */ |
0x62, /* 01100010 */ |
0x66, /* 01100110 */ |
0x6c, /* 01101100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x66, /* 01100110 */ |
0xce, /* 11001110 */ |
0x9a, /* 10011010 */ |
0x3f, /* 00111111 */ |
0x06, /* 00000110 */ |
0x06, /* 00000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 173 0xad '' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x3c, /* 00111100 */ |
0x3c, /* 00111100 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 174 0xae '®' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x36, /* 00110110 */ |
0x6c, /* 01101100 */ |
0xd8, /* 11011000 */ |
0x6c, /* 01101100 */ |
0x36, /* 00110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 175 0xaf '¯' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xd8, /* 11011000 */ |
0x6c, /* 01101100 */ |
0x36, /* 00110110 */ |
0x6c, /* 01101100 */ |
0xd8, /* 11011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 176 0xb0 '°' */ |
0x11, /* 00010001 */ |
0x44, /* 01000100 */ |
0x11, /* 00010001 */ |
0x44, /* 01000100 */ |
0x11, /* 00010001 */ |
0x44, /* 01000100 */ |
0x11, /* 00010001 */ |
0x44, /* 01000100 */ |
0x11, /* 00010001 */ |
0x44, /* 01000100 */ |
0x11, /* 00010001 */ |
0x44, /* 01000100 */ |
0x11, /* 00010001 */ |
0x44, /* 01000100 */ |
0x11, /* 00010001 */ |
0x44, /* 01000100 */ |
/* 177 0xb1 '±' */ |
0x55, /* 01010101 */ |
0xaa, /* 10101010 */ |
0x55, /* 01010101 */ |
0xaa, /* 10101010 */ |
0x55, /* 01010101 */ |
0xaa, /* 10101010 */ |
0x55, /* 01010101 */ |
0xaa, /* 10101010 */ |
0x55, /* 01010101 */ |
0xaa, /* 10101010 */ |
0x55, /* 01010101 */ |
0xaa, /* 10101010 */ |
0x55, /* 01010101 */ |
0xaa, /* 10101010 */ |
0x55, /* 01010101 */ |
0xaa, /* 10101010 */ |
/* 178 0xb2 '²' */ |
0xdd, /* 11011101 */ |
0x77, /* 01110111 */ |
0xdd, /* 11011101 */ |
0x77, /* 01110111 */ |
0xdd, /* 11011101 */ |
0x77, /* 01110111 */ |
0xdd, /* 11011101 */ |
0x77, /* 01110111 */ |
0xdd, /* 11011101 */ |
0x77, /* 01110111 */ |
0xdd, /* 11011101 */ |
0x77, /* 01110111 */ |
0xdd, /* 11011101 */ |
0x77, /* 01110111 */ |
0xdd, /* 11011101 */ |
0x77, /* 01110111 */ |
/* 179 0xb3 '³' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 180 0xb4 '´' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0xf8, /* 11111000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 181 0xb5 'µ' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0xf8, /* 11111000 */ |
0x18, /* 00011000 */ |
0xf8, /* 11111000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 182 0xb6 '¶' */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0xf6, /* 11110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
/* 183 0xb7 '·' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
/* 184 0xb8 '¸' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xf8, /* 11111000 */ |
0x18, /* 00011000 */ |
0xf8, /* 11111000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 185 0xb9 '¹' */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0xf6, /* 11110110 */ |
0x06, /* 00000110 */ |
0xf6, /* 11110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
/* 186 0xba 'º' */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
/* 187 0xbb '»' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0x06, /* 00000110 */ |
0xf6, /* 11110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
/* 188 0xbc '¼' */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0xf6, /* 11110110 */ |
0x06, /* 00000110 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 189 0xbd '½' */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 190 0xbe '¾' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0xf8, /* 11111000 */ |
0x18, /* 00011000 */ |
0xf8, /* 11111000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 191 0xbf '¿' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xf8, /* 11111000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 192 0xc0 'À' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x1f, /* 00011111 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 193 0xc1 'Á' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0xff, /* 11111111 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 194 0xc2 'Â' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xff, /* 11111111 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 195 0xc3 'Ã' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x1f, /* 00011111 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 196 0xc4 'Ä' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xff, /* 11111111 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 197 0xc5 'Å' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0xff, /* 11111111 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 198 0xc6 'Æ' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x1f, /* 00011111 */ |
0x18, /* 00011000 */ |
0x1f, /* 00011111 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 199 0xc7 'Ç' */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x37, /* 00110111 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
/* 200 0xc8 'È' */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x37, /* 00110111 */ |
0x30, /* 00110000 */ |
0x3f, /* 00111111 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 201 0xc9 'É' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x3f, /* 00111111 */ |
0x30, /* 00110000 */ |
0x37, /* 00110111 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
/* 202 0xca 'Ê' */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0xf7, /* 11110111 */ |
0x00, /* 00000000 */ |
0xff, /* 11111111 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 203 0xcb 'Ë' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xff, /* 11111111 */ |
0x00, /* 00000000 */ |
0xf7, /* 11110111 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
/* 204 0xcc 'Ì' */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x37, /* 00110111 */ |
0x30, /* 00110000 */ |
0x37, /* 00110111 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
/* 205 0xcd 'Í' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xff, /* 11111111 */ |
0x00, /* 00000000 */ |
0xff, /* 11111111 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 206 0xce 'Î' */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0xf7, /* 11110111 */ |
0x00, /* 00000000 */ |
0xf7, /* 11110111 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
/* 207 0xcf 'Ï' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0xff, /* 11111111 */ |
0x00, /* 00000000 */ |
0xff, /* 11111111 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 208 0xd0 'Ð' */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0xff, /* 11111111 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 209 0xd1 'Ñ' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xff, /* 11111111 */ |
0x00, /* 00000000 */ |
0xff, /* 11111111 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 210 0xd2 'Ò' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xff, /* 11111111 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
/* 211 0xd3 'Ó' */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x3f, /* 00111111 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 212 0xd4 'Ô' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x1f, /* 00011111 */ |
0x18, /* 00011000 */ |
0x1f, /* 00011111 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 213 0xd5 'Õ' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x1f, /* 00011111 */ |
0x18, /* 00011000 */ |
0x1f, /* 00011111 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 214 0xd6 'Ö' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x3f, /* 00111111 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
/* 215 0xd7 '×' */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0xff, /* 11111111 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
/* 216 0xd8 'Ø' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0xff, /* 11111111 */ |
0x18, /* 00011000 */ |
0xff, /* 11111111 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 217 0xd9 'Ù' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0xf8, /* 11111000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 218 0xda 'Ú' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x1f, /* 00011111 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 219 0xdb 'Û' */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
/* 220 0xdc 'Ü' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
/* 221 0xdd 'Ý' */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
0xf0, /* 11110000 */ |
/* 222 0xde 'Þ' */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
0x0f, /* 00001111 */ |
/* 223 0xdf 'ß' */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0xff, /* 11111111 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 224 0xe0 'à' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x76, /* 01110110 */ |
0xdc, /* 11011100 */ |
0xd8, /* 11011000 */ |
0xd8, /* 11011000 */ |
0xd8, /* 11011000 */ |
0xdc, /* 11011100 */ |
0x76, /* 01110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 225 0xe1 'á' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x78, /* 01111000 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xcc, /* 11001100 */ |
0xd8, /* 11011000 */ |
0xcc, /* 11001100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xcc, /* 11001100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 226 0xe2 'â' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0xc0, /* 11000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 227 0xe3 'ã' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 228 0xe4 'ä' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0xc6, /* 11000110 */ |
0x60, /* 01100000 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 229 0xe5 'å' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0xd8, /* 11011000 */ |
0xd8, /* 11011000 */ |
0xd8, /* 11011000 */ |
0xd8, /* 11011000 */ |
0xd8, /* 11011000 */ |
0x70, /* 01110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 230 0xe6 'æ' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x7c, /* 01111100 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0xc0, /* 11000000 */ |
0x00, /* 00000000 */ |
/* 231 0xe7 'ç' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x76, /* 01110110 */ |
0xdc, /* 11011100 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 232 0xe8 'è' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0x18, /* 00011000 */ |
0x3c, /* 00111100 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x3c, /* 00111100 */ |
0x18, /* 00011000 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 233 0xe9 'é' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xfe, /* 11111110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x6c, /* 01101100 */ |
0x38, /* 00111000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 234 0xea 'ê' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0xee, /* 11101110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 235 0xeb 'ë' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x1e, /* 00011110 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x0c, /* 00001100 */ |
0x3e, /* 00111110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x66, /* 01100110 */ |
0x3c, /* 00111100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 236 0xec 'ì' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0xdb, /* 11011011 */ |
0xdb, /* 11011011 */ |
0xdb, /* 11011011 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 237 0xed 'í' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x03, /* 00000011 */ |
0x06, /* 00000110 */ |
0x7e, /* 01111110 */ |
0xdb, /* 11011011 */ |
0xdb, /* 11011011 */ |
0xf3, /* 11110011 */ |
0x7e, /* 01111110 */ |
0x60, /* 01100000 */ |
0xc0, /* 11000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 238 0xee 'î' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x1c, /* 00011100 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x7c, /* 01111100 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x60, /* 01100000 */ |
0x30, /* 00110000 */ |
0x1c, /* 00011100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 239 0xef 'ï' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7c, /* 01111100 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0xc6, /* 11000110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 240 0xf0 'ð' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0xfe, /* 11111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 241 0xf1 'ñ' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x7e, /* 01111110 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 242 0xf2 'ò' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x0c, /* 00001100 */ |
0x06, /* 00000110 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 243 0xf3 'ó' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x30, /* 00110000 */ |
0x60, /* 01100000 */ |
0x30, /* 00110000 */ |
0x18, /* 00011000 */ |
0x0c, /* 00001100 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 244 0xf4 'ô' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x0e, /* 00001110 */ |
0x1b, /* 00011011 */ |
0x1b, /* 00011011 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
/* 245 0xf5 'õ' */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0xd8, /* 11011000 */ |
0xd8, /* 11011000 */ |
0xd8, /* 11011000 */ |
0x70, /* 01110000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 246 0xf6 'ö' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 247 0xf7 '÷' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x76, /* 01110110 */ |
0xdc, /* 11011100 */ |
0x00, /* 00000000 */ |
0x76, /* 01110110 */ |
0xdc, /* 11011100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 248 0xf8 'ø' */ |
0x00, /* 00000000 */ |
0x38, /* 00111000 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x38, /* 00111000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 249 0xf9 'ù' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 250 0xfa 'ú' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x18, /* 00011000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 251 0xfb 'û' */ |
0x00, /* 00000000 */ |
0x0f, /* 00001111 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0x0c, /* 00001100 */ |
0xec, /* 11101100 */ |
0x6c, /* 01101100 */ |
0x6c, /* 01101100 */ |
0x3c, /* 00111100 */ |
0x1c, /* 00011100 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 252 0xfc 'ü' */ |
0x00, /* 00000000 */ |
0x6c, /* 01101100 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x36, /* 00110110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 253 0xfd 'ý' */ |
0x00, /* 00000000 */ |
0x3c, /* 00111100 */ |
0x66, /* 01100110 */ |
0x0c, /* 00001100 */ |
0x18, /* 00011000 */ |
0x32, /* 00110010 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 254 0xfe 'þ' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x7e, /* 01111110 */ |
0x7e, /* 01111110 */ |
0x7e, /* 01111110 */ |
0x7e, /* 01111110 */ |
0x7e, /* 01111110 */ |
0x7e, /* 01111110 */ |
0x7e, /* 01111110 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
/* 255 0xff 'ÿ' */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
0x00, /* 00000000 */ |
}; |
/tags/0.3.0/boot/tools/ppc32/debug.c |
---|
0,0 → 1,68 |
#include "font-8x16.h" |
#define FB_REG "r8" |
#define SCAN_REG "r9" |
#define ADDR_REG "r10" |
#define FG_REG "r11" |
#define BG_REG "r12" |
#define FG_COLOR 0xffffffff |
#define BG_COLOR 0x00000000 |
#define BPP 4 |
void print_macro_init(void) { |
printf(".macro DEBUG_INIT\n"); |
printf("#ifdef CONFIG_DEBUG\n"); |
printf("\tlis %s, %d\n", FG_REG, FG_COLOR >> 16); |
printf("\tori %s, %s, %d\n", FG_REG, FG_REG, FG_COLOR & 0xffff); |
printf("\t\n"); |
printf("\tlis %s, %d\n", BG_REG, BG_COLOR >> 16); |
printf("\tori %s, %s, %d\n", BG_REG, BG_REG, BG_COLOR & 0xffff); |
printf("\t\n"); |
printf("\tmr %s, %s\n", ADDR_REG, FB_REG); |
printf("#endif\n"); |
printf(".endm\n"); |
} |
void print_macro(const char *name) { |
printf(".macro DEBUG_%s\n", name); |
printf("#ifdef CONFIG_DEBUG\n"); |
unsigned int y; |
for (y = 0; y < FONT_SCANLINES; y++) { |
printf("\t\n"); |
if (y > 0) |
printf("\tadd %s, %s, %s\n", ADDR_REG, ADDR_REG, SCAN_REG); |
unsigned int i; |
for (i = 0; name[i] != 0; i++) { |
char c = name[i]; |
unsigned int x; |
for (x = 0; x < FONT_WIDTH; x++) { |
if (((fb_font[c * FONT_SCANLINES + y] >> (FONT_WIDTH - x)) & 1) == 1) |
printf("\tstw %s, %d(%s)\n", FG_REG, (i * FONT_WIDTH + x) * BPP, ADDR_REG); |
else |
printf("\tstw %s, %d(%s)\n", BG_REG, (i * FONT_WIDTH + x) * BPP, ADDR_REG); |
} |
} |
} |
printf("#endif\n"); |
printf(".endm\n"); |
} |
int main(int argc, char *argv[]) { |
print_macro_init(); |
int i; |
for (i = 1; i < argc; i++) { |
printf("\n"); |
print_macro(argv[i]); |
} |
return 0; |
} |
/tags/0.3.0/boot/tools/ppc32/Makefile |
---|
0,0 → 1,8 |
debug: debug.o font-8x16.o |
gcc -o debug debug.o font-8x16.o |
debug.o: debug.c font-8x16.h |
gcc -c -o debug.o debug.c |
font-8x16.o: font-8x16.c font-8x16.h |
gcc -c -o font-8x16.o font-8x16.c |
/tags/0.3.0/boot/tools/ia64/vmaxlma.c |
---|
0,0 → 1,75 |
/* |
* Swap VMA and LMA in ELF header. |
* |
* by Jakub Jermar <jermar@itbs.cz> |
* |
* GPL'ed, copyleft |
*/ |
/* |
* HP's IA-64 simulator Ski seems to confuse VMA and LMA in the ELF header. |
* Instead of using LMA, Ski loads sections at their VMA addresses. |
* This short program provides a workaround for this bug by simply |
* swapping VMA and LMA in the ELF header of the executable. |
* |
* Note that after applying this workaround, you will be able to load |
* ELF objects with different VMA and LMA in Ski, but the executable |
* will become wronged for other potential uses. |
*/ |
#include <stdio.h> |
#include <stdlib.h> |
#include <sys/types.h> |
#include <sys/stat.h> |
#include <sys/mman.h> |
#include <unistd.h> |
#include <fcntl.h> |
void syntax(char *prg) |
{ |
printf("%s ELF-file\n", prg); |
exit(1); |
} |
void error(char *msg) |
{ |
printf("Error: %s\n", msg); |
exit(2); |
} |
#define ELF_VMA (0x50/sizeof(unsigned long long)) |
#define ELF_LMA (0x58/sizeof(unsigned long long)) |
#define ELF_ENTRY (0x18/sizeof(unsigned long long)) |
#define LENGTH 0x98 |
int main(int argc, char *argv[]) |
{ |
int fd; |
unsigned long long vma, lma,entry; |
unsigned long long *elf; |
if (argc != 2) |
syntax(argv[0]); |
fd = open(argv[1], O_RDWR); |
if (fd == -1) |
error("open failed"); |
elf = mmap(NULL, LENGTH, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); |
if ((void *) elf == (void *) -1) |
error("map failed"); |
lma = elf[ELF_LMA]; |
elf[ELF_VMA] = lma; |
entry = lma; |
elf[ELF_ENTRY] = entry; |
if (munmap(elf, LENGTH) == -1) |
error("munmap failed"); |
if (close(fd) == -1) |
error("close failed"); |
return 0; |
} |
/tags/0.3.0/boot/Makefile |
---|
0,0 → 1,68 |
# |
# Copyright (c) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
## Include configuration |
# |
-include Makefile.config |
## Paths |
# |
BASE = .. |
KERNELDIR = $(BASE)/kernel |
USPACEDIR = $(BASE)/uspace |
ifeq ($(CONFIG_DEBUG),y) |
DEFS += -DCONFIG_DEBUG |
endif |
ifeq ($(CONFIG_BAT),y) |
DEFS += -DCONFIG_BAT |
endif |
ifeq ($(CONFIG_SMP),y) |
DEFS += -DCONFIG_SMP |
endif |
.PHONY: all build config distclean clean generic_clean |
all: |
../tools/config.py boot.config default $(ARCH) $(COMPILER) $(CONFIG_DEBUG) $(IMAGE) |
$(MAKE) -C . build |
-include arch/$(ARCH)/Makefile.inc |
config: |
../tools/config.py boot.config |
distclean: clean |
-rm Makefile.config |
generic_clean: |
-rm generic/*.o genarch/*.o |
/tags/0.3.0/contrib/toolchain/toolchain.sparc64.sh |
---|
0,0 → 1,97 |
#!/bin/bash |
# Cross-Compiler Toolchain for ${PLATFORM} |
# by Martin Decky <martin@decky.cz> |
# |
# GPL'ed, copyleft |
# |
check_error() { |
if [ "$1" -ne "0" ]; then |
echo |
echo "Script failed: $2" |
exit |
fi |
} |
BINUTILS_VERSION="2.18" |
GCC_VERSION="4.2.3" |
BINUTILS="binutils-${BINUTILS_VERSION}.tar.gz" |
GCC_CORE="gcc-core-${GCC_VERSION}.tar.bz2" |
GCC_OBJC="gcc-objc-${GCC_VERSION}.tar.bz2" |
GCC_CPP="gcc-g++-${GCC_VERSION}.tar.bz2" |
BINUTILS_SOURCE="ftp://ftp.gnu.org/gnu/binutils/" |
GCC_SOURCE="ftp://ftp.gnu.org/gnu/gcc/gcc-${GCC_VERSION}/" |
PLATFORM="sparc64" |
WORKDIR=`pwd` |
TARGET="${PLATFORM}-linux-gnu" |
PREFIX="/usr/local/${PLATFORM}" |
BINUTILSDIR="${WORKDIR}/binutils-${BINUTILS_VERSION}" |
GCCDIR="${WORKDIR}/gcc-${GCC_VERSION}" |
OBJDIR="${WORKDIR}/gcc-obj" |
echo ">>> Downloading tarballs" |
if [ ! -f "${BINUTILS}" ]; then |
wget -c "${BINUTILS_SOURCE}${BINUTILS}" |
check_error $? "Error downloading binutils." |
fi |
if [ ! -f "${GCC_CORE}" ]; then |
wget -c "${GCC_SOURCE}${GCC_CORE}" |
check_error $? "Error downloading GCC Core." |
fi |
if [ ! -f "${GCC_OBJC}" ]; then |
wget -c "${GCC_SOURCE}${GCC_OBJC}" |
check_error $? "Error downloading GCC Objective C." |
fi |
if [ ! -f "${GCC_CPP}" ]; then |
wget -c "${GCC_SOURCE}${GCC_CPP}" |
check_error $? "Error downloading GCC C++." |
fi |
echo ">>> Creating destionation directory" |
if [ ! -d "${PREFIX}" ]; then |
mkdir -p "${PREFIX}" |
test -d "${PREFIX}" |
check_error $? "Unable to create ${PREFIX}." |
fi |
echo ">>> Creating GCC work directory" |
if [ ! -d "${OBJDIR}" ]; then |
mkdir -p "${OBJDIR}" |
test -d "${OBJDIR}" |
check_error $? "Unable to create ${OBJDIR}." |
fi |
echo ">>> Unpacking tarballs" |
tar -xvzf "${BINUTILS}" |
check_error $? "Error unpacking binutils." |
tar -xvjf "${GCC_CORE}" |
check_error $? "Error unpacking GCC Core." |
tar -xvjf "${GCC_OBJC}" |
check_error $? "Error unpacking GCC Objective C." |
tar -xvjf "${GCC_CPP}" |
check_error $? "Error unpacking GCC C++." |
echo ">>> Compiling and installing binutils" |
cd "${BINUTILSDIR}" |
check_error $? "Change directory failed." |
./configure "--target=${TARGET}" "--prefix=${PREFIX}" "--program-prefix=${TARGET}-" "--disable-nls" |
check_error $? "Error configuring binutils." |
make all install |
check_error $? "Error compiling/installing binutils." |
echo ">>> Compiling and installing GCC" |
cd "${OBJDIR}" |
check_error $? "Change directory failed." |
"${GCCDIR}/configure" "--target=${TARGET}" "--prefix=${PREFIX}" "--program-prefix=${TARGET}-" --with-gnu-as --with-gnu-ld --disable-nls --disable-threads --enable-languages=c,objc,c++,obj-c++ --disable-multilib --disable-libgcj --without-headers --disable-shared |
check_error $? "Error configuring GCC." |
PATH="${PATH}:${PREFIX}/bin" make all-gcc install-gcc |
check_error $? "Error compiling/installing GCC." |
echo |
echo ">>> Cross-compiler for ${TARGET} installed." |
Property changes: |
Added: svn:executable |
+* |
\ No newline at end of property |
/tags/0.3.0/contrib/toolchain/toolchain.ppc32.sh |
---|
0,0 → 1,97 |
#!/bin/bash |
# Cross-Compiler Toolchain for ${PLATFORM} |
# by Martin Decky <martin@decky.cz> |
# |
# GPL'ed, copyleft |
# |
check_error() { |
if [ "$1" -ne "0" ]; then |
echo |
echo "Script failed: $2" |
exit |
fi |
} |
BINUTILS_VERSION="2.18" |
GCC_VERSION="4.2.2" |
BINUTILS="binutils-${BINUTILS_VERSION}.tar.gz" |
GCC_CORE="gcc-core-${GCC_VERSION}.tar.bz2" |
GCC_OBJC="gcc-objc-${GCC_VERSION}.tar.bz2" |
GCC_CPP="gcc-g++-${GCC_VERSION}.tar.bz2" |
BINUTILS_SOURCE="ftp://ftp.gnu.org/gnu/binutils/" |
GCC_SOURCE="ftp://ftp.gnu.org/gnu/gcc/gcc-${GCC_VERSION}/" |
PLATFORM="ppc" |
WORKDIR=`pwd` |
TARGET="${PLATFORM}-linux-gnu" |
PREFIX="/usr/local/${PLATFORM}" |
BINUTILSDIR="${WORKDIR}/binutils-${BINUTILS_VERSION}" |
GCCDIR="${WORKDIR}/gcc-${GCC_VERSION}" |
OBJDIR="${WORKDIR}/gcc-obj" |
echo ">>> Downloading tarballs" |
if [ ! -f "${BINUTILS}" ]; then |
wget -c "${BINUTILS_SOURCE}${BINUTILS}" |
check_error $? "Error downloading binutils." |
fi |
if [ ! -f "${GCC_CORE}" ]; then |
wget -c "${GCC_SOURCE}${GCC_CORE}" |
check_error $? "Error downloading GCC Core." |
fi |
if [ ! -f "${GCC_OBJC}" ]; then |
wget -c "${GCC_SOURCE}${GCC_OBJC}" |
check_error $? "Error downloading GCC Objective C." |
fi |
if [ ! -f "${GCC_CPP}" ]; then |
wget -c "${GCC_SOURCE}${GCC_CPP}" |
check_error $? "Error downloading GCC C++." |
fi |
echo ">>> Creating destionation directory" |
if [ ! -d "${PREFIX}" ]; then |
mkdir -p "${PREFIX}" |
test -d "${PREFIX}" |
check_error $? "Unable to create ${PREFIX}." |
fi |
echo ">>> Creating GCC work directory" |
if [ ! -d "${OBJDIR}" ]; then |
mkdir -p "${OBJDIR}" |
test -d "${OBJDIR}" |
check_error $? "Unable to create ${OBJDIR}." |
fi |
echo ">>> Unpacking tarballs" |
tar -xvzf "${BINUTILS}" |
check_error $? "Error unpacking binutils." |
tar -xvjf "${GCC_CORE}" |
check_error $? "Error unpacking GCC Core." |
tar -xvjf "${GCC_OBJC}" |
check_error $? "Error unpacking GCC Objective C." |
tar -xvjf "${GCC_CPP}" |
check_error $? "Error unpacking GCC C++." |
echo ">>> Compiling and installing binutils" |
cd "${BINUTILSDIR}" |
check_error $? "Change directory failed." |
./configure "--target=${TARGET}" "--prefix=${PREFIX}" "--program-prefix=${TARGET}-" "--disable-nls" |
check_error $? "Error configuring binutils." |
make all install |
check_error $? "Error compiling/installing binutils." |
echo ">>> Compiling and installing GCC" |
cd "${OBJDIR}" |
check_error $? "Change directory failed." |
"${GCCDIR}/configure" "--target=${TARGET}" "--prefix=${PREFIX}" "--program-prefix=${TARGET}-" --with-gnu-as --with-gnu-ld --disable-nls --disable-threads --enable-languages=c,objc,c++,obj-c++ --disable-multilib --disable-libgcj --without-headers --disable-shared |
check_error $? "Error configuring GCC." |
PATH="${PATH}:${PREFIX}/bin" make all-gcc install-gcc |
check_error $? "Error compiling/installing GCC." |
echo |
echo ">>> Cross-compiler for ${TARGET} installed." |
Property changes: |
Added: svn:executable |
+* |
\ No newline at end of property |
/tags/0.3.0/contrib/toolchain/toolchain.amd64.sh |
---|
0,0 → 1,97 |
#!/bin/bash |
# Cross-Compiler Toolchain for ${PLATFORM} |
# by Martin Decky <martin@decky.cz> |
# |
# GPL'ed, copyleft |
# |
check_error() { |
if [ "$1" -ne "0" ]; then |
echo |
echo "Script failed: $2" |
exit |
fi |
} |
BINUTILS_VERSION="2.18" |
GCC_VERSION="4.2.2" |
BINUTILS="binutils-${BINUTILS_VERSION}.tar.gz" |
GCC_CORE="gcc-core-${GCC_VERSION}.tar.bz2" |
GCC_OBJC="gcc-objc-${GCC_VERSION}.tar.bz2" |
GCC_CPP="gcc-g++-${GCC_VERSION}.tar.bz2" |
BINUTILS_SOURCE="ftp://ftp.gnu.org/gnu/binutils/" |
GCC_SOURCE="ftp://ftp.gnu.org/gnu/gcc/gcc-${GCC_VERSION}/" |
PLATFORM="amd64" |
WORKDIR=`pwd` |
TARGET="${PLATFORM}-linux-gnu" |
PREFIX="/usr/local/${PLATFORM}" |
BINUTILSDIR="${WORKDIR}/binutils-${BINUTILS_VERSION}" |
GCCDIR="${WORKDIR}/gcc-${GCC_VERSION}" |
OBJDIR="${WORKDIR}/gcc-obj" |
echo ">>> Downloading tarballs" |
if [ ! -f "${BINUTILS}" ]; then |
wget -c "${BINUTILS_SOURCE}${BINUTILS}" |
check_error $? "Error downloading binutils." |
fi |
if [ ! -f "${GCC_CORE}" ]; then |
wget -c "${GCC_SOURCE}${GCC_CORE}" |
check_error $? "Error downloading GCC Core." |
fi |
if [ ! -f "${GCC_OBJC}" ]; then |
wget -c "${GCC_SOURCE}${GCC_OBJC}" |
check_error $? "Error downloading GCC Objective C." |
fi |
if [ ! -f "${GCC_CPP}" ]; then |
wget -c "${GCC_SOURCE}${GCC_CPP}" |
check_error $? "Error downloading GCC C++." |
fi |
echo ">>> Creating destionation directory" |
if [ ! -d "${PREFIX}" ]; then |
mkdir -p "${PREFIX}" |
test -d "${PREFIX}" |
check_error $? "Unable to create ${PREFIX}." |
fi |
echo ">>> Creating GCC work directory" |
if [ ! -d "${OBJDIR}" ]; then |
mkdir -p "${OBJDIR}" |
test -d "${OBJDIR}" |
check_error $? "Unable to create ${OBJDIR}." |
fi |
echo ">>> Unpacking tarballs" |
tar -xvzf "${BINUTILS}" |
check_error $? "Error unpacking binutils." |
tar -xvjf "${GCC_CORE}" |
check_error $? "Error unpacking GCC Core." |
tar -xvjf "${GCC_OBJC}" |
check_error $? "Error unpacking GCC Objective C." |
tar -xvjf "${GCC_CPP}" |
check_error $? "Error unpacking GCC C++." |
echo ">>> Compiling and installing binutils" |
cd "${BINUTILSDIR}" |
check_error $? "Change directory failed." |
./configure "--target=${TARGET}" "--prefix=${PREFIX}" "--program-prefix=${TARGET}-" "--disable-nls" |
check_error $? "Error configuring binutils." |
make all install |
check_error $? "Error compiling/installing binutils." |
echo ">>> Compiling and installing GCC" |
cd "${OBJDIR}" |
check_error $? "Change directory failed." |
"${GCCDIR}/configure" "--target=${TARGET}" "--prefix=${PREFIX}" "--program-prefix=${TARGET}-" --with-gnu-as --with-gnu-ld --disable-nls --disable-threads --enable-languages=c,objc,c++,obj-c++ --disable-multilib --disable-libgcj --without-headers --disable-shared |
check_error $? "Error configuring GCC." |
PATH="${PATH}:${PREFIX}/bin" make all-gcc install-gcc |
check_error $? "Error compiling/installing GCC." |
echo |
echo ">>> Cross-compiler for ${TARGET} installed." |
Property changes: |
Added: svn:executable |
+* |
\ No newline at end of property |
/tags/0.3.0/contrib/toolchain/toolchain.ppc64.sh |
---|
0,0 → 1,97 |
#!/bin/bash |
# Cross-Compiler Toolchain for ${PLATFORM} |
# by Martin Decky <martin@decky.cz> |
# |
# GPL'ed, copyleft |
# |
check_error() { |
if [ "$1" -ne "0" ]; then |
echo |
echo "Script failed: $2" |
exit |
fi |
} |
BINUTILS_VERSION="2.18" |
GCC_VERSION="4.2.2" |
BINUTILS="binutils-${BINUTILS_VERSION}.tar.gz" |
GCC_CORE="gcc-core-${GCC_VERSION}.tar.bz2" |
GCC_OBJC="gcc-objc-${GCC_VERSION}.tar.bz2" |
GCC_CPP="gcc-g++-${GCC_VERSION}.tar.bz2" |
BINUTILS_SOURCE="ftp://ftp.gnu.org/gnu/binutils/" |
GCC_SOURCE="ftp://ftp.gnu.org/gnu/gcc/gcc-${GCC_VERSION}/" |
PLATFORM="ppc64" |
WORKDIR=`pwd` |
TARGET="${PLATFORM}-linux-gnu" |
PREFIX="/usr/local/${PLATFORM}" |
BINUTILSDIR="${WORKDIR}/binutils-${BINUTILS_VERSION}" |
GCCDIR="${WORKDIR}/gcc-${GCC_VERSION}" |
OBJDIR="${WORKDIR}/gcc-obj" |
echo ">>> Downloading tarballs" |
if [ ! -f "${BINUTILS}" ]; then |
wget -c "${BINUTILS_SOURCE}${BINUTILS}" |
check_error $? "Error downloading binutils." |
fi |
if [ ! -f "${GCC_CORE}" ]; then |
wget -c "${GCC_SOURCE}${GCC_CORE}" |
check_error $? "Error downloading GCC Core." |
fi |
if [ ! -f "${GCC_OBJC}" ]; then |
wget -c "${GCC_SOURCE}${GCC_OBJC}" |
check_error $? "Error downloading GCC Objective C." |
fi |
if [ ! -f "${GCC_CPP}" ]; then |
wget -c "${GCC_SOURCE}${GCC_CPP}" |
check_error $? "Error downloading GCC C++." |
fi |
echo ">>> Creating destionation directory" |
if [ ! -d "${PREFIX}" ]; then |
mkdir -p "${PREFIX}" |
test -d "${PREFIX}" |
check_error $? "Unable to create ${PREFIX}." |
fi |
echo ">>> Creating GCC work directory" |
if [ ! -d "${OBJDIR}" ]; then |
mkdir -p "${OBJDIR}" |
test -d "${OBJDIR}" |
check_error $? "Unable to create ${OBJDIR}." |
fi |
echo ">>> Unpacking tarballs" |
tar -xvzf "${BINUTILS}" |
check_error $? "Error unpacking binutils." |
tar -xvjf "${GCC_CORE}" |
check_error $? "Error unpacking GCC Core." |
tar -xvjf "${GCC_OBJC}" |
check_error $? "Error unpacking GCC Objective C." |
tar -xvjf "${GCC_CPP}" |
check_error $? "Error unpacking GCC C++." |
echo ">>> Compiling and installing binutils" |
cd "${BINUTILSDIR}" |
check_error $? "Change directory failed." |
./configure "--target=${TARGET}" "--prefix=${PREFIX}" "--program-prefix=${TARGET}-" "--disable-nls" |
check_error $? "Error configuring binutils." |
make all install |
check_error $? "Error compiling/installing binutils." |
echo ">>> Compiling and installing GCC" |
cd "${OBJDIR}" |
check_error $? "Change directory failed." |
"${GCCDIR}/configure" "--target=${TARGET}" "--prefix=${PREFIX}" "--program-prefix=${TARGET}-" --with-gnu-as --with-gnu-ld --disable-nls --disable-threads --enable-languages=c,objc,c++,obj-c++ --disable-multilib --disable-libgcj --without-headers --disable-shared |
check_error $? "Error configuring GCC." |
PATH="${PATH}:${PREFIX}/bin" make all-gcc install-gcc |
check_error $? "Error compiling/installing GCC." |
echo |
echo ">>> Cross-compiler for ${TARGET} installed." |
Property changes: |
Added: svn:executable |
+* |
\ No newline at end of property |
/tags/0.3.0/contrib/toolchain/toolchain.ia32.sh |
---|
0,0 → 1,97 |
#!/bin/bash |
# Cross-Compiler Toolchain for ${PLATFORM} |
# by Martin Decky <martin@decky.cz> |
# |
# GPL'ed, copyleft |
# |
check_error() { |
if [ "$1" -ne "0" ]; then |
echo |
echo "Script failed: $2" |
exit |
fi |
} |
BINUTILS_VERSION="2.18" |
GCC_VERSION="4.2.2" |
BINUTILS="binutils-${BINUTILS_VERSION}.tar.gz" |
GCC_CORE="gcc-core-${GCC_VERSION}.tar.bz2" |
GCC_OBJC="gcc-objc-${GCC_VERSION}.tar.bz2" |
GCC_CPP="gcc-g++-${GCC_VERSION}.tar.bz2" |
BINUTILS_SOURCE="ftp://ftp.gnu.org/gnu/binutils/" |
GCC_SOURCE="ftp://ftp.gnu.org/gnu/gcc/gcc-${GCC_VERSION}/" |
PLATFORM="i686" |
WORKDIR=`pwd` |
TARGET="${PLATFORM}-pc-linux-gnu" |
PREFIX="/usr/local/${PLATFORM}" |
BINUTILSDIR="${WORKDIR}/binutils-${BINUTILS_VERSION}" |
GCCDIR="${WORKDIR}/gcc-${GCC_VERSION}" |
OBJDIR="${WORKDIR}/gcc-obj" |
echo ">>> Downloading tarballs" |
if [ ! -f "${BINUTILS}" ]; then |
wget -c "${BINUTILS_SOURCE}${BINUTILS}" |
check_error $? "Error downloading binutils." |
fi |
if [ ! -f "${GCC_CORE}" ]; then |
wget -c "${GCC_SOURCE}${GCC_CORE}" |
check_error $? "Error downloading GCC Core." |
fi |
if [ ! -f "${GCC_OBJC}" ]; then |
wget -c "${GCC_SOURCE}${GCC_OBJC}" |
check_error $? "Error downloading GCC Objective C." |
fi |
if [ ! -f "${GCC_CPP}" ]; then |
wget -c "${GCC_SOURCE}${GCC_CPP}" |
check_error $? "Error downloading GCC C++." |
fi |
echo ">>> Creating destionation directory" |
if [ ! -d "${PREFIX}" ]; then |
mkdir -p "${PREFIX}" |
test -d "${PREFIX}" |
check_error $? "Unable to create ${PREFIX}." |
fi |
echo ">>> Creating GCC work directory" |
if [ ! -d "${OBJDIR}" ]; then |
mkdir -p "${OBJDIR}" |
test -d "${OBJDIR}" |
check_error $? "Unable to create ${OBJDIR}." |
fi |
echo ">>> Unpacking tarballs" |
tar -xvzf "${BINUTILS}" |
check_error $? "Error unpacking binutils." |
tar -xvjf "${GCC_CORE}" |
check_error $? "Error unpacking GCC Core." |
tar -xvjf "${GCC_OBJC}" |
check_error $? "Error unpacking GCC Objective C." |
tar -xvjf "${GCC_CPP}" |
check_error $? "Error unpacking GCC C++." |
echo ">>> Compiling and installing binutils" |
cd "${BINUTILSDIR}" |
check_error $? "Change directory failed." |
./configure "--target=${TARGET}" "--prefix=${PREFIX}" "--program-prefix=${TARGET}-" "--disable-nls" |
check_error $? "Error configuring binutils." |
make all install |
check_error $? "Error compiling/installing binutils." |
echo ">>> Compiling and installing GCC" |
cd "${OBJDIR}" |
check_error $? "Change directory failed." |
"${GCCDIR}/configure" "--target=${TARGET}" "--prefix=${PREFIX}" "--program-prefix=${TARGET}-" --with-gnu-as --with-gnu-ld --disable-nls --disable-threads --enable-languages=c,objc,c++,obj-c++ --disable-multilib --disable-libgcj --without-headers --disable-shared |
check_error $? "Error configuring GCC." |
PATH="${PATH}:${PREFIX}/bin" make all-gcc install-gcc |
check_error $? "Error compiling/installing GCC." |
echo |
echo ">>> Cross-compiler for ${TARGET} installed." |
Property changes: |
Added: svn:executable |
+* |
\ No newline at end of property |
/tags/0.3.0/contrib/toolchain/toolchain.mipsel32.sh |
---|
0,0 → 1,97 |
#!/bin/bash |
# Cross-Compiler Toolchain for ${PLATFORM} |
# by Martin Decky <martin@decky.cz> |
# |
# GPL'ed, copyleft |
# |
check_error() { |
if [ "$1" -ne "0" ]; then |
echo |
echo "Script failed: $2" |
exit |
fi |
} |
BINUTILS_VERSION="2.18" |
GCC_VERSION="4.2.2" |
BINUTILS="binutils-${BINUTILS_VERSION}.tar.gz" |
GCC_CORE="gcc-core-${GCC_VERSION}.tar.bz2" |
GCC_OBJC="gcc-objc-${GCC_VERSION}.tar.bz2" |
GCC_CPP="gcc-g++-${GCC_VERSION}.tar.bz2" |
BINUTILS_SOURCE="ftp://ftp.gnu.org/gnu/binutils/" |
GCC_SOURCE="ftp://ftp.gnu.org/gnu/gcc/gcc-${GCC_VERSION}/" |
PLATFORM="mipsel" |
WORKDIR=`pwd` |
TARGET="${PLATFORM}-linux-gnu" |
PREFIX="/usr/local/${PLATFORM}" |
BINUTILSDIR="${WORKDIR}/binutils-${BINUTILS_VERSION}" |
GCCDIR="${WORKDIR}/gcc-${GCC_VERSION}" |
OBJDIR="${WORKDIR}/gcc-obj" |
echo ">>> Downloading tarballs" |
if [ ! -f "${BINUTILS}" ]; then |
wget -c "${BINUTILS_SOURCE}${BINUTILS}" |
check_error $? "Error downloading binutils." |
fi |
if [ ! -f "${GCC_CORE}" ]; then |
wget -c "${GCC_SOURCE}${GCC_CORE}" |
check_error $? "Error downloading GCC Core." |
fi |
if [ ! -f "${GCC_OBJC}" ]; then |
wget -c "${GCC_SOURCE}${GCC_OBJC}" |
check_error $? "Error downloading GCC Objective C." |
fi |
if [ ! -f "${GCC_CPP}" ]; then |
wget -c "${GCC_SOURCE}${GCC_CPP}" |
check_error $? "Error downloading GCC C++." |
fi |
echo ">>> Creating destionation directory" |
if [ ! -d "${PREFIX}" ]; then |
mkdir -p "${PREFIX}" |
test -d "${PREFIX}" |
check_error $? "Unable to create ${PREFIX}." |
fi |
echo ">>> Creating GCC work directory" |
if [ ! -d "${OBJDIR}" ]; then |
mkdir -p "${OBJDIR}" |
test -d "${OBJDIR}" |
check_error $? "Unable to create ${OBJDIR}." |
fi |
echo ">>> Unpacking tarballs" |
tar -xvzf "${BINUTILS}" |
check_error $? "Error unpacking binutils." |
tar -xvjf "${GCC_CORE}" |
check_error $? "Error unpacking GCC Core." |
tar -xvjf "${GCC_OBJC}" |
check_error $? "Error unpacking GCC Objective C." |
tar -xvjf "${GCC_CPP}" |
check_error $? "Error unpacking GCC C++." |
echo ">>> Compiling and installing binutils" |
cd "${BINUTILSDIR}" |
check_error $? "Change directory failed." |
./configure "--target=${TARGET}" "--prefix=${PREFIX}" "--program-prefix=${TARGET}-" "--disable-nls" |
check_error $? "Error configuring binutils." |
make all install |
check_error $? "Error compiling/installing binutils." |
echo ">>> Compiling and installing GCC" |
cd "${OBJDIR}" |
check_error $? "Change directory failed." |
"${GCCDIR}/configure" "--target=${TARGET}" "--prefix=${PREFIX}" "--program-prefix=${TARGET}-" --with-gnu-as --with-gnu-ld --disable-nls --disable-threads --enable-languages=c,objc,c++,obj-c++ --disable-multilib --disable-libgcj --without-headers --disable-shared |
check_error $? "Error configuring GCC." |
PATH="${PATH}:${PREFIX}/bin" make all-gcc install-gcc |
check_error $? "Error compiling/installing GCC." |
echo |
echo ">>> Cross-compiler for ${TARGET} installed." |
Property changes: |
Added: svn:executable |
+* |
\ No newline at end of property |
/tags/0.3.0/contrib/toolchain/toolchain.ia64.sh |
---|
0,0 → 1,106 |
#!/bin/bash |
# Cross-Compiler Toolchain for ${PLATFORM} |
# by Martin Decky <martin@decky.cz> |
# |
# GPL'ed, copyleft |
# |
check_error() { |
if [ "$1" -ne "0" ]; then |
echo |
echo "Script failed: $2" |
exit |
fi |
} |
BINUTILS_VERSION="2.18" |
GCC_VERSION="4.2.2" |
INCLUDES="ia64-pc-gnu-linux_includes.tar.bz2" |
BINUTILS="binutils-${BINUTILS_VERSION}.tar.gz" |
GCC_CORE="gcc-core-${GCC_VERSION}.tar.bz2" |
GCC_OBJC="gcc-objc-${GCC_VERSION}.tar.bz2" |
GCC_CPP="gcc-g++-${GCC_VERSION}.tar.bz2" |
INCLUDES_SOURCE="http://download.decky.cz/" |
BINUTILS_SOURCE="ftp://ftp.gnu.org/gnu/binutils/" |
GCC_SOURCE="ftp://ftp.gnu.org/gnu/gcc/gcc-${GCC_VERSION}/" |
PLATFORM="ia64" |
WORKDIR=`pwd` |
TARGET="${PLATFORM}-pc-linux-gnu" |
PREFIX="/usr/local/${PLATFORM}" |
INCLUDESDIR="${WORKDIR}/include" |
BINUTILSDIR="${WORKDIR}/binutils-${BINUTILS_VERSION}" |
GCCDIR="${WORKDIR}/gcc-${GCC_VERSION}" |
OBJDIR="${WORKDIR}/gcc-obj" |
echo ">>> Downloading tarballs" |
if [ ! -f "${INCLUDES}" ]; then |
wget -c "${INCLUDES_SOURCE}${INCLUDES}" |
check_error $? "Error downloading includes." |
fi |
if [ ! -f "${BINUTILS}" ]; then |
wget -c "${BINUTILS_SOURCE}${BINUTILS}" |
check_error $? "Error downloading binutils." |
fi |
if [ ! -f "${GCC_CORE}" ]; then |
wget -c "${GCC_SOURCE}${GCC_CORE}" |
check_error $? "Error downloading GCC Core." |
fi |
if [ ! -f "${GCC_OBJC}" ]; then |
wget -c "${GCC_SOURCE}${GCC_OBJC}" |
check_error $? "Error downloading GCC Objective C." |
fi |
if [ ! -f "${GCC_CPP}" ]; then |
wget -c "${GCC_SOURCE}${GCC_CPP}" |
check_error $? "Error downloading GCC C++." |
fi |
echo ">>> Creating destionation directory" |
if [ ! -d "${PREFIX}" ]; then |
mkdir -p "${PREFIX}" |
test -d "${PREFIX}" |
check_error $? "Unable to create ${PREFIX}." |
fi |
echo ">>> Creating GCC work directory" |
if [ ! -d "${OBJDIR}" ]; then |
mkdir -p "${OBJDIR}" |
test -d "${OBJDIR}" |
check_error $? "Unable to create ${OBJDIR}." |
fi |
echo ">>> Unpacking tarballs" |
tar -xvjf "${INCLUDES}" |
check_error $? "Error unpacking includes." |
tar -xvzf "${BINUTILS}" |
check_error $? "Error unpacking binutils." |
tar -xvjf "${GCC_CORE}" |
check_error $? "Error unpacking GCC Core." |
tar -xvjf "${GCC_OBJC}" |
check_error $? "Error unpacking GCC Objective C." |
tar -xvjf "${GCC_CPP}" |
check_error $? "Error unpacking GCC C++." |
echo ">>> Compiling and installing binutils" |
cd "${BINUTILSDIR}" |
check_error $? "Change directory failed." |
./configure "--target=${TARGET}" "--prefix=${PREFIX}" "--program-prefix=${TARGET}-" "--disable-nls" |
check_error $? "Error configuring binutils." |
make all install |
check_error $? "Error compiling/installing binutils." |
echo ">>> Compiling and installing GCC" |
cd "${OBJDIR}" |
check_error $? "Change directory failed." |
"${GCCDIR}/configure" "--target=${TARGET}" "--prefix=${PREFIX}" "--program-prefix=${TARGET}-" --with-gnu-as --with-gnu-ld --disable-nls --disable-threads --enable-languages=c,objc,c++,obj-c++ --disable-multilib --disable-libgcj "--with-headers=${INCLUDESDIR}" --disable-shared |
check_error $? "Error configuring GCC." |
PATH="${PATH}:${PREFIX}/bin" make all-gcc install-gcc |
check_error $? "Error compiling/installing GCC." |
echo |
echo ">>> Cross-compiler for ${TARGET} installed." |
Property changes: |
Added: svn:executable |
+* |
\ No newline at end of property |
/tags/0.3.0/contrib/toolchain/toolchain.arm32.sh |
---|
0,0 → 1,97 |
#!/bin/bash |
# Cross-Compiler Toolchain for ${PLATFORM} |
# by Martin Decky <martin@decky.cz> |
# |
# GPL'ed, copyleft |
# |
check_error() { |
if [ "$1" -ne "0" ]; then |
echo |
echo "Script failed: $2" |
exit |
fi |
} |
BINUTILS_VERSION="2.18" |
GCC_VERSION="4.2.2" |
BINUTILS="binutils-${BINUTILS_VERSION}.tar.gz" |
GCC_CORE="gcc-core-${GCC_VERSION}.tar.bz2" |
GCC_OBJC="gcc-objc-${GCC_VERSION}.tar.bz2" |
GCC_CPP="gcc-g++-${GCC_VERSION}.tar.bz2" |
BINUTILS_SOURCE="ftp://ftp.gnu.org/gnu/binutils/" |
GCC_SOURCE="ftp://ftp.gnu.org/gnu/gcc/gcc-${GCC_VERSION}/" |
PLATFORM="arm" |
WORKDIR=`pwd` |
TARGET="${PLATFORM}-linux-gnu" |
PREFIX="/usr/local/${PLATFORM}" |
BINUTILSDIR="${WORKDIR}/binutils-${BINUTILS_VERSION}" |
GCCDIR="${WORKDIR}/gcc-${GCC_VERSION}" |
OBJDIR="${WORKDIR}/gcc-obj" |
echo ">>> Downloading tarballs" |
if [ ! -f "${BINUTILS}" ]; then |
wget -c "${BINUTILS_SOURCE}${BINUTILS}" |
check_error $? "Error downloading binutils." |
fi |
if [ ! -f "${GCC_CORE}" ]; then |
wget -c "${GCC_SOURCE}${GCC_CORE}" |
check_error $? "Error downloading GCC Core." |
fi |
if [ ! -f "${GCC_OBJC}" ]; then |
wget -c "${GCC_SOURCE}${GCC_OBJC}" |
check_error $? "Error downloading GCC Objective C." |
fi |
if [ ! -f "${GCC_CPP}" ]; then |
wget -c "${GCC_SOURCE}${GCC_CPP}" |
check_error $? "Error downloading GCC C++." |
fi |
echo ">>> Creating destionation directory" |
if [ ! -d "${PREFIX}" ]; then |
mkdir -p "${PREFIX}" |
test -d "${PREFIX}" |
check_error $? "Unable to create ${PREFIX}." |
fi |
echo ">>> Creating GCC work directory" |
if [ ! -d "${OBJDIR}" ]; then |
mkdir -p "${OBJDIR}" |
test -d "${OBJDIR}" |
check_error $? "Unable to create ${OBJDIR}." |
fi |
echo ">>> Unpacking tarballs" |
tar -xvzf "${BINUTILS}" |
check_error $? "Error unpacking binutils." |
tar -xvjf "${GCC_CORE}" |
check_error $? "Error unpacking GCC Core." |
tar -xvjf "${GCC_OBJC}" |
check_error $? "Error unpacking GCC Objective C." |
tar -xvjf "${GCC_CPP}" |
check_error $? "Error unpacking GCC C++." |
echo ">>> Compiling and installing binutils" |
cd "${BINUTILSDIR}" |
check_error $? "Change directory failed." |
./configure "--target=${TARGET}" "--prefix=${PREFIX}" "--program-prefix=${TARGET}-" "--disable-nls" |
check_error $? "Error configuring binutils." |
make all install |
check_error $? "Error compiling/installing binutils." |
echo ">>> Compiling and installing GCC" |
cd "${OBJDIR}" |
check_error $? "Change directory failed." |
"${GCCDIR}/configure" "--target=${TARGET}" "--prefix=${PREFIX}" "--program-prefix=${TARGET}-" --with-gnu-as --with-gnu-ld --disable-nls --disable-threads --enable-languages=c,objc,c++,obj-c++ --disable-multilib --disable-libgcj --without-headers --disable-shared |
check_error $? "Error configuring GCC." |
PATH="${PATH}:${PREFIX}/bin" make all-gcc install-gcc |
check_error $? "Error compiling/installing GCC." |
echo |
echo ">>> Cross-compiler for ${TARGET} installed." |
Property changes: |
Added: svn:executable |
+* |
\ No newline at end of property |
/tags/0.3.0/contrib/toolchain/toolchain.mipseb32.sh |
---|
0,0 → 1,97 |
#!/bin/bash |
# Cross-Compiler Toolchain for ${PLATFORM} |
# by Martin Decky <martin@decky.cz> |
# |
# GPL'ed, copyleft |
# |
check_error() { |
if [ "$1" -ne "0" ]; then |
echo |
echo "Script failed: $2" |
exit |
fi |
} |
BINUTILS_VERSION="2.18" |
GCC_VERSION="4.2.2" |
BINUTILS="binutils-${BINUTILS_VERSION}.tar.gz" |
GCC_CORE="gcc-core-${GCC_VERSION}.tar.bz2" |
GCC_OBJC="gcc-objc-${GCC_VERSION}.tar.bz2" |
GCC_CPP="gcc-g++-${GCC_VERSION}.tar.bz2" |
BINUTILS_SOURCE="ftp://ftp.gnu.org/gnu/binutils/" |
GCC_SOURCE="ftp://ftp.gnu.org/gnu/gcc/gcc-${GCC_VERSION}/" |
PLATFORM="mips" |
WORKDIR=`pwd` |
TARGET="${PLATFORM}-sgi-irix5" |
PREFIX="/usr/local/${PLATFORM}" |
BINUTILSDIR="${WORKDIR}/binutils-${BINUTILS_VERSION}" |
GCCDIR="${WORKDIR}/gcc-${GCC_VERSION}" |
OBJDIR="${WORKDIR}/gcc-obj" |
echo ">>> Downloading tarballs" |
if [ ! -f "${BINUTILS}" ]; then |
wget -c "${BINUTILS_SOURCE}${BINUTILS}" |
check_error $? "Error downloading binutils." |
fi |
if [ ! -f "${GCC_CORE}" ]; then |
wget -c "${GCC_SOURCE}${GCC_CORE}" |
check_error $? "Error downloading GCC Core." |
fi |
if [ ! -f "${GCC_OBJC}" ]; then |
wget -c "${GCC_SOURCE}${GCC_OBJC}" |
check_error $? "Error downloading GCC Objective C." |
fi |
if [ ! -f "${GCC_CPP}" ]; then |
wget -c "${GCC_SOURCE}${GCC_CPP}" |
check_error $? "Error downloading GCC C++." |
fi |
echo ">>> Creating destionation directory" |
if [ ! -d "${PREFIX}" ]; then |
mkdir -p "${PREFIX}" |
test -d "${PREFIX}" |
check_error $? "Unable to create ${PREFIX}." |
fi |
echo ">>> Creating GCC work directory" |
if [ ! -d "${OBJDIR}" ]; then |
mkdir -p "${OBJDIR}" |
test -d "${OBJDIR}" |
check_error $? "Unable to create ${OBJDIR}." |
fi |
echo ">>> Unpacking tarballs" |
tar -xvzf "${BINUTILS}" |
check_error $? "Error unpacking binutils." |
tar -xvjf "${GCC_CORE}" |
check_error $? "Error unpacking GCC Core." |
tar -xvjf "${GCC_OBJC}" |
check_error $? "Error unpacking GCC Objective C." |
tar -xvjf "${GCC_CPP}" |
check_error $? "Error unpacking GCC C++." |
echo ">>> Compiling and installing binutils" |
cd "${BINUTILSDIR}" |
check_error $? "Change directory failed." |
./configure "--target=${TARGET}" "--prefix=${PREFIX}" "--program-prefix=${TARGET}-" "--disable-nls" |
check_error $? "Error configuring binutils." |
make all install |
check_error $? "Error compiling/installing binutils." |
echo ">>> Compiling and installing GCC" |
cd "${OBJDIR}" |
check_error $? "Change directory failed." |
"${GCCDIR}/configure" "--target=${TARGET}" "--prefix=${PREFIX}" "--program-prefix=${TARGET}-" --with-gnu-as --with-gnu-ld --disable-nls --disable-threads --enable-languages=c,objc,c++,obj-c++ --disable-multilib --disable-libgcj --without-headers --disable-shared |
check_error $? "Error configuring GCC." |
PATH="${PATH}:${PREFIX}/bin" make all-gcc install-gcc |
check_error $? "Error compiling/installing GCC." |
echo |
echo ">>> Cross-compiler for ${TARGET} installed." |
Property changes: |
Added: svn:executable |
+* |
\ No newline at end of property |
/tags/0.3.0/contrib/conf/msim.conf |
---|
0,0 → 1,15 |
# |
# MSIM configuration script |
# |
add dcpu mips1 |
add rwm mainmem 0x00000000 8M |
mainmem load "/dev/zero" |
add rom bootmem 0x1fc00000 2048k |
bootmem load "image.boot" |
add dprinter printer 0x10000000 |
add dkeyboard keyboard 0x10000000 2 |
add dorder order 0x10000004 5 |
/tags/0.3.0/contrib/conf/ski.conf |
---|
0,0 → 1,0 |
load HelenOS/image.boot |
/tags/0.3.0/contrib/conf/gxemul.sh |
---|
0,0 → 1,3 |
#!/bin/sh |
gxemul $@ -E testmips -C R4000 -X image.boot |
Property changes: |
Added: svn:executable |
+* |
\ No newline at end of property |
/tags/0.3.0/contrib/conf/HelenOS.sparc64.simics |
---|
0,0 → 1,110 |
# |
# This configuration file was assembled from the bagle machine |
# configuration files as found in Simics 3.0.21. It won't probably |
# work in Simics versions prior to Simics 3.0. |
# |
# The machine simulated is SunFire server Sun Enterprise E6500. |
# |
# - modified to boot from CD-ROM |
# - framebuffer color depth set to 24bpp |
# |
script-branch { |
wait-for-variable machine_defined |
$pcibrd = (create-sunfire-pci-board mac_address = "10:10:10:10:10:14") |
$pgx64 = (create-sun-pci-pgx64) |
$gfxcon = (create-std-graphics-console) |
$keyboard = (create-sun-type5-keyboard) |
$mouse = (create-sun-type5-mouse) |
$scsi_bus = (create-std-scsi-bus) |
$system.connect slot2 $pcibrd |
$pcibrd.connect pci-slot0 $pgx64 |
$pcibrd.connect $scsi_bus |
$system.connect keyboard $keyboard |
$system.connect mouse $mouse |
$gfxcon.connect $pgx64 |
$gfxcon.connect $keyboard |
$gfxcon.connect $mouse |
} |
$save_slot2 = "yes" |
if not defined hostid {$hostid = 0x80804a6c} |
if not defined freq_mhz {$freq_mhz = 168} |
if not defined mac_address {$mac_address = "10:10:10:10:10:12"} |
if not defined disk_size {$disk_size = 2128486400} |
if not defined rtc_time {$rtc_time = "2002-06-02 13:00:00 UTC"} |
if not defined num_cpus {$num_cpus = 1} |
if not defined memory_megs {$memory_megs = 256} |
if not defined save_slot2 {$save_slot2 = "no"} |
add-directory "%simics%/targets/sunfire/images/" |
import-pci-components |
import-std-components |
import-sun-components |
import-sunfire-components |
$system = (create-sunfire-6500-backplane cpu_frequency = $freq_mhz |
hostid = $hostid |
mac_address = $mac_address |
rtc_time = $rtc_time) |
$board = 0 |
$cpus_left = $num_cpus |
$megs_left = $memory_megs |
while $cpus_left or $megs_left { |
$cpubrd[$board] = (create-sunfire-cpu-board |
num_cpus = (min $cpus_left 2) |
memory_megs = (min $megs_left 4096)) |
$system.connect ("slot" + $board) $cpubrd[$board] |
if $board == 0 { |
$system.connect central-cpu $cpubrd[$board] |
} |
$cpus_left = (max ($cpus_left - 2) 0) |
$megs_left = (max ($megs_left - 4096) 0) |
$board += 1 |
if $board == 1 {$board = 2} |
if $board == 2 and ($save_slot2 == yes) {$board = 3} |
} |
$sbusbrd = (create-sunfire-sbus-board mac_address = $mac_address) |
$scsi_bus = (create-std-scsi-bus) |
$scsi_disk = (create-std-scsi-disk scsi_id = 1 size = $disk_size) |
$scsi_cdrom = (create-std-scsi-cdrom scsi_id = 6) |
$console = (create-std-text-console) |
$system.connect slot1 $sbusbrd |
$sbusbrd.connect $scsi_bus |
$scsi_bus.connect $scsi_disk |
$scsi_bus.connect $scsi_cdrom |
$system.connect ttya $console |
$machine_defined = 1 |
instantiate-components |
$eth_comp = $sbus_fas_hme |
$eth_cnt = "" |
run-command-file "%simics%/targets/common/add-eth-link.include" |
if not defined ip_address {$ip_address = "10.10.0.6"} |
if $service_node { |
local $sn = ($service_node.get-component-object sn) |
($sn.add-host name = $host_name |
ip = $ip_address domain = network.sim |
mac = $mac_address) |
} |
default-port-forward-target $ip_address |
$cdrom_path = "/home/jermar/software/HelenOS/image.iso" |
($scsi_cdrom.get-component-object cd).insert (new-file-cdrom $cdrom_path) |
$system.set-prom-env boot-command "boot cdrom" |
$system.set-prom-env auto-boot? true |
$system.set-prom-env "output-device" "screen:r1152x900x76x24" |
/tags/0.3.0/contrib/conf/pearpc.conf |
---|
0,0 → 1,7 |
ppc_start_resolution = "800x600x32" |
pci_ide0_master_installed = 0 |
prom_bootmethod = "force" |
prom_loadfile = "image.boot" |
key_toggle_mouse_grab = "F11" |
/tags/0.3.0/contrib/conf/dot.bochsrc |
---|
0,0 → 1,719 |
# You may now use double quotes around pathnames, in case |
# your pathname includes spaces. |
#======================================================================= |
# CONFIG_INTERFACE |
# |
# The configuration interface is a series of menus or dialog boxes that |
# allows you to change all the settings that control Bochs's behavior. |
# There are two choices of configuration interface: a text mode version |
# called "textconfig" and a graphical version called "wx". The text |
# mode version uses stdin/stdout and is always compiled in. The graphical |
# version is only available when you use "--with-wx" on the configure |
# command. If you do not write a config_interface line, Bochs will |
# choose a default for you. |
# |
# NOTE: if you use the "wx" configuration interface, you must also use |
# the "wx" display library. |
#======================================================================= |
config_interface: textconfig |
#config_interface: wx |
#======================================================================= |
# DISPLAY_LIBRARY |
# |
# The display library is the code that displays the Bochs VGA screen. Bochs |
# has a selection of about 10 different display library implementations for |
# different platforms. If you run configure with multiple --with-* options, |
# the display_library command lets you choose which one you want to run with. |
# If you do not write a display_library line, Bochs will choose a default for |
# you. |
# |
# The choices are: |
# x use X windows interface, cross platform |
# win32 use native win32 libraries |
# carbon use Carbon library (for MacOS X) |
# beos use native BeOS libraries |
# macintosh use MacOS pre-10 |
# amigaos use native AmigaOS libraries |
# sdl use SDL library, cross platform |
# svga use SVGALIB library for Linux, allows graphics without X11 |
# term text only, uses curses/ncurses library, cross platform |
# rfb provides an interface to AT&T's VNC viewer, cross platform |
# wx use wxWindows library, cross platform |
# nogui no display at all |
# |
# NOTE: if you use the "wx" configuration interface, you must also use |
# the "wx" display library. |
#======================================================================= |
#display_library: amigaos |
#display_library: beos |
#display_library: carbon |
#display_library: macintosh |
#display_library: nogui |
#display_library: rfb |
#display_library: sdl |
#display_library: term |
#display_library: win32 |
#display_library: wx |
display_library: x |
cpu: count=8, ips=10000000 |
#======================================================================= |
# ROMIMAGE: |
# You now need to load a ROM BIOS into F0000-FFFFF. Normally, you can |
# use a precompiled BIOS in the bios/ directory of the source tree, |
# named BIOS-bochs-latest. |
# You can also use the environment variable $BXSHARE to specify the |
# location of the BIOS. |
#======================================================================= |
romimage: file=$BXSHARE/BIOS-bochs-latest, address=0xf0000 |
#romimage: file=$BXSHARE/BIOS-bochs-8-processors, address=0xf0000 |
#romimage: file=bios/P4SMT, address=0xf0000 |
#======================================================================= |
# MEGS |
# set this to the default number of Megabytes of memory you want |
# to emulate. You may also pass the '-megs xyz' option to bochs |
# |
# The default is 32MB, most OS's won't need more than that. |
#======================================================================= |
#megs: 256 |
#megs: 128 |
#megs: 64 |
megs: 32 |
#megs: 16 |
#megs: 8 |
#======================================================================= |
# OPTROMIMAGE[1-4]: |
# You may now load up to 4 optional ROM images. Be sure to use a |
# read-only area, typically between C8000 and EFFFF. These optional |
# ROM images should not overwrite the rombios (located at |
# F0000-FFFFF) and the videobios (located at C0000-C7FFF). |
# Those ROM images will be initialized by the bios if they contain |
# the right signature (0x55AA). |
# It can also be a convenient way to upload some arbitary code/data |
# in the simulation, that can be retrieved by the boot loader |
#======================================================================= |
#optromimage1: file=optionalrom.bin, address=0xd0000 |
#optromimage2: file=optionalrom.bin, address=0xd1000 |
#optromimage3: file=optionalrom.bin, address=0xd2000 |
#optromimage4: file=optionalrom.bin, address=0xd3000 |
#======================================================================= |
# VGAROMIMAGE |
# You now need to load a VGA ROM BIOS into C0000. |
#======================================================================= |
vgaromimage: $BXSHARE/VGABIOS-lgpl-latest |
#vgaromimage: bios/VGABIOS-elpin-2.40 |
#vgaromimage: $BXSHARE/VGABIOS-elpin-2.40 |
#======================================================================= |
# FLOPPYA: |
# Point this to pathname of floppy image file or device |
# This should be of a bootable floppy(image/device) if you're |
# booting from 'a'. |
# |
# You can set the initial status of the media to 'ejected' or 'inserted'. |
# floppya: 2_88=path, status=ejected (2.88M 3.5" floppy) |
# floppya: 1_44=path, status=inserted (1.44M 3.5" floppy) |
# floppya: 1_2=path, status=ejected (1.2M 5.25" floppy) |
# floppya: 720k=path, status=inserted (720K 3.5" floppy) |
# floppya: 360k=path, status=inserted (360K 5.25" floppy) |
# floppya: 320k=path, status=inserted (320K 5.25" floppy) |
# floppya: 180k=path, status=inserted (180K 5.25" floppy) |
# floppya: 160k=path, status=inserted (160K 5.25" floppy) |
# |
# The path should be the name of a disk image file. On unix, you can use |
# a raw device name such as /dev/fd0 on Linux. On WinNT and Win2k, use |
# drive letters such as a: or b: as the path. Raw floppy access is not |
# supported on Windows 95 and 98. |
#======================================================================= |
#floppya: 1_44=image.boot, status=inserted |
#floppya: 1_44=/dev/fd0, status=inserted |
#======================================================================= |
# FLOPPYB: |
# See FLOPPYA above for syntax |
#======================================================================= |
#floppyb: 1_44=b:, status=inserted |
#floppyb: 1_44=b.img, status=inserted |
#======================================================================= |
# ATA0, ATA1, ATA2, ATA3 |
# ATA controller for hard disks and cdroms |
# |
# ata[0-3]: enabled=[0|1], ioaddr1=addr, ioaddr2=addr, irq=number |
# |
# These options enables up to 4 ata channels. For each channel |
# the two base io addresses and the irq must be specified. |
# |
# ata0 is enabled by default, with ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14 |
# |
# Examples: |
# ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14 |
# ata1: enabled=1, ioaddr1=0x170, ioaddr2=0x370, irq=15 |
# ata2: enabled=1, ioaddr1=0x1e8, ioaddr2=0x3e0, irq=11 |
# ata3: enabled=1, ioaddr1=0x168, ioaddr2=0x360, irq=9 |
#======================================================================= |
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14 |
ata1: enabled=0, ioaddr1=0x170, ioaddr2=0x370, irq=15 |
ata2: enabled=0, ioaddr1=0x1e8, ioaddr2=0x3e0, irq=11 |
ata3: enabled=0, ioaddr1=0x168, ioaddr2=0x360, irq=9 |
#======================================================================= |
# ATA[0-3]-MASTER, ATA[0-3]-SLAVE |
# |
# This defines the type and characteristics of all attached ata devices: |
# type= type of attached device [disk|cdrom] |
# mode= only valid for disks [flat|concat|external|dll|sparse|vmware3] |
# mode= only valid for disks [undoable|growing|volatile] |
# path= path of the image |
# cylinders= only valid for disks |
# heads= only valid for disks |
# spt= only valid for disks |
# status= only valid for cdroms [inserted|ejected] |
# biosdetect= type of biosdetection [none|auto], only for disks on ata0 [cmos] |
# translation=type of transation of the bios, only for disks [none|lba|large|rechs|auto] |
# model= string returned by identify device command |
# journal= optional filename of the redolog for undoable and volatile disks |
# |
# Point this at a hard disk image file, cdrom iso file, or physical cdrom |
# device. To create a hard disk image, try running bximage. It will help you |
# choose the size and then suggest a line that works with it. |
# |
# In UNIX it may be possible to use a raw device as a Bochs hard disk, |
# but WE DON'T RECOMMEND IT. In Windows there is no easy way. |
# |
# In windows, the drive letter + colon notation should be used for cdroms. |
# Depending on versions of windows and drivers, you may only be able to |
# access the "first" cdrom in the system. On MacOSX, use path="drive" |
# to access the physical drive. |
# |
# The path, cylinders, heads, and spt are mandatory for type=disk |
# The path is mandatory for type=cdrom |
# |
# Default values are: |
# mode=flat, biosdetect=auto, translation=auto, model="Generic 1234" |
# |
# The biosdetect option has currently no effect on the bios |
# |
# Examples: |
# ata0-master: type=disk, mode=flat, path=10M.sample, cylinders=306, heads=4, spt=17 |
# ata0-slave: type=disk, mode=flat, path=20M.sample, cylinders=615, heads=4, spt=17 |
# ata1-master: type=disk, mode=flat, path=30M.sample, cylinders=615, heads=6, spt=17 |
# ata1-slave: type=disk, mode=flat, path=46M.sample, cylinders=940, heads=6, spt=17 |
# ata2-master: type=disk, mode=flat, path=62M.sample, cylinders=940, heads=8, spt=17 |
# ata2-slave: type=disk, mode=flat, path=112M.sample, cylinders=900, heads=15, spt=17 |
# ata3-master: type=disk, mode=flat, path=483M.sample, cylinders=1024, heads=15, spt=63 |
# ata3-slave: type=cdrom, path=iso.sample, status=inserted |
#======================================================================= |
ata0-master: type=cdrom, path="image.iso", status=inserted |
#ata0-master: type=disk, mode=flat, path="30M.sample", cylinders=615, heads=6, spt=17 |
#ata0-slave: type=cdrom, path=D:, status=inserted |
#ata0-slave: type=cdrom, path=/dev/cdrom, status=inserted |
#ata0-slave: type=cdrom, path="drive", status=inserted |
#ata0-slave: type=cdrom, path=/dev/rcd0d, status=inserted |
#======================================================================= |
# BOOT: |
# This defines your boot drive. |
# You can either boot from 'floppy', 'disk' or 'cdrom' |
# legacy 'a' and 'c' are also supported |
# Examples: |
# boot: floppy |
# boot: disk |
# boot: cdrom |
# boot: c |
# boot: a |
#======================================================================= |
boot: cdrom |
#boot: disk |
#======================================================================= |
# IPS: |
# Emulated Instructions Per Second. This is the number of IPS that bochs |
# is capable of running on your machine. Read the note in config.h |
# on how to find this. Make sure to recompile after. |
# |
# IPS is used to calibrate many time-dependent events within the bochs |
# simulation. For example, changing IPS affects the frequency of VGA |
# updates, the duration of time before a key starts to autorepeat, and |
# the measurement of BogoMips and other benchmarks. |
# |
# Examples: |
# Machine Mips |
# ________________________________________________________________ |
# 650Mhz Athlon K-7 with Linux 2.4.4/egcs-2.91.66 2 to 2.5 Mips |
# 400Mhz Pentium II with Linux 2.0.36/egcs-1.0.3 1 to 1.8 Mips |
# 166Mhz 64bit Sparc with Solaris 2.x approx 0.75 Mips |
# 200Mhz Pentium with Linux 2.x approx 0.5 Mips |
# |
#======================================================================= |
ips: 2500000 |
#======================================================================= |
# CLOCK: |
# This defines the parameters of the clock inside Bochs: |
# |
# SYNC: |
# TO BE COMPLETED (see Greg explaination in bug #536329) |
# |
# TIME0: |
# Specifies the start (boot) time of the virtual machine. Use a time |
# value as returned by the time(2) system call. If no time0 value is |
# set or if time0 equal to 1 (special case) or if time0 equal 'local', |
# the simulation will be started at the current local host time. |
# If time0 equal to 2 (special case) or if time0 equal 'utc', |
# the simulation will be started at the current utc time. |
# |
# Syntax: |
# clock: sync=[none|slowdown|realtime], time0=[timeValue|local|utc] |
# |
# Example: |
# clock: sync=none, time0=local # Now (localtime) |
# clock: sync=slowdown, time0=315529200 # Tue Jan 1 00:00:00 1980 |
# clock: sync=none, time0=631148400 # Mon Jan 1 00:00:00 1990 |
# clock: sync=realtime, time0=938581955 # Wed Sep 29 07:12:35 1999 |
# clock: sync=realtime, time0=946681200 # Sat Jan 1 00:00:00 2000 |
# clock: sync=none, time0=1 # Now (localtime) |
# clock: sync=none, time0=utc # Now (utc/gmt) |
# |
# Default value are sync=none, time0=local |
#======================================================================= |
clock: sync=none, time0=local |
#======================================================================= |
# FLOPPY_BOOTSIG_CHECK: disabled=[0|1] |
# Enables or disables the 0xaa55 signature check on boot floppies |
# Defaults to disabled=0 |
# Examples: |
# floppy_bootsig_check: disabled=0 |
# floppy_bootsig_check: disabled=1 |
#======================================================================= |
#floppy_bootsig_check: disabled=1 |
floppy_bootsig_check: disabled=1 |
#======================================================================= |
# LOG: |
# Give the path of the log file you'd like Bochs debug and misc. verbage |
# to be written to. If you really don't want it, make it /dev/null. :^( |
# |
# Examples: |
# log: ./bochs.out |
# log: /dev/tty |
#======================================================================= |
#log: /dev/null |
log: bochsout.txt |
#======================================================================= |
# LOGPREFIX: |
# This handles the format of the string prepended to each log line. |
# You may use those special tokens : |
# %t : 11 decimal digits timer tick |
# %i : 8 hexadecimal digits of cpu0 current eip |
# %e : 1 character event type ('i'nfo, 'd'ebug, 'p'anic, 'e'rror) |
# %d : 5 characters string of the device, between brackets |
# |
# Default : %t%e%d |
# Examples: |
# logprefix: %t-%e-@%i-%d |
# logprefix: %i%e%d |
#======================================================================= |
#logprefix: %t%e%d |
#======================================================================= |
# LOG CONTROLS |
# |
# Bochs now has four severity levels for event logging. |
# panic: cannot proceed. If you choose to continue after a panic, |
# don't be surprised if you get strange behavior or crashes. |
# error: something went wrong, but it is probably safe to continue the |
# simulation. |
# info: interesting or useful messages. |
# debug: messages useful only when debugging the code. This may |
# spit out thousands per second. |
# |
# For events of each level, you can choose to crash, report, or ignore. |
# TODO: allow choice based on the facility: e.g. crash on panics from |
# everything except the cdrom, and only report those. |
# |
# If you are experiencing many panics, it can be helpful to change |
# the panic action to report instead of fatal. However, be aware |
# that anything executed after a panic is uncharted territory and can |
# cause bochs to become unstable. The panic is a "graceful exit," so |
# if you disable it you may get a spectacular disaster instead. |
#======================================================================= |
panic: action=report |
error: action=report |
info: action=report |
debug: action=ignore |
#pass: action=fatal |
#======================================================================= |
# DEBUGGER_LOG: |
# Give the path of the log file you'd like Bochs to log debugger output. |
# If you really don't want it, make it /dev/null or '-'. :^( |
# |
# Examples: |
# debugger_log: ./debugger.out |
#======================================================================= |
#debugger_log: /dev/null |
#debugger_log: debugger.out |
debugger_log: - |
#======================================================================= |
# COM1: |
# This defines a serial port (UART type 16550A). You can specify a device |
# to use as com1. This can be a real serial line, or a pty. To use a pty |
# (under X/Unix), create two windows (xterms, usually). One of them will |
# run bochs, and the other will act as com1. Find out the tty the com1 |
# window using the `tty' command, and use that as the `dev' parameter. |
# Then do `sleep 1000000' in the com1 window to keep the shell from |
# messing with things, and run bochs in the other window. Serial I/O to |
# com1 (port 0x3f8) will all go to the other window. |
#======================================================================= |
#com1: enabled=1, dev=/dev/ttyp9 |
#======================================================================= |
# PARPORT1: |
# This defines a parallel (printer) port. When turned on and an output file is |
# defined the emulated printer port sends characters printed by the guest OS |
# into the output file. On some platforms a device filename can be used to |
# send the data to the real parallel port (e.g. "/dev/lp0" on Linux, "lpt1" on |
# win32 platforms). |
# |
# Examples: |
# parport1: enabled=1, file="parport.out" |
# parport1: enabled=1, file="/dev/lp0" |
# parport1: enabled=0 |
#======================================================================= |
parport1: enabled=1, file="parport.out" |
#======================================================================= |
# SB16: |
# This defines the SB16 sound emulation. It can have several of the |
# following properties. |
# All properties are in the format sb16: property=value |
# midi: The filename is where the midi data is sent. This can be a |
# device or just a file if you want to record the midi data. |
# midimode: |
# 0=no data |
# 1=output to device (system dependent. midi denotes the device driver) |
# 2=SMF file output, including headers |
# 3=output the midi data stream to the file (no midi headers and no |
# delta times, just command and data bytes) |
# wave: This is the device/file where wave output is stored |
# wavemode: |
# 0=no data |
# 1=output to device (system dependent. wave denotes the device driver) |
# 2=VOC file output, incl. headers |
# 3=output the raw wave stream to the file |
# log: The file to write the sb16 emulator messages to. |
# loglevel: |
# 0=no log |
# 1=only midi program and bank changes |
# 2=severe errors |
# 3=all errors |
# 4=all errors plus all port accesses |
# 5=all errors and port accesses plus a lot of extra info |
# dmatimer: |
# microseconds per second for a DMA cycle. Make it smaller to fix |
# non-continous sound. 750000 is usually a good value. This needs a |
# reasonably correct setting for IPS. |
# |
# For an example look at the next line: |
#======================================================================= |
#sb16: midimode=1, midi=/dev/midi00, wavemode=1, wave=/dev/dsp, loglevel=2, log=sb16.log, dmatimer=600000 |
#======================================================================= |
# VGA_UPDATE_INTERVAL: |
# Video memory is scanned for updates and screen updated every so many |
# virtual seconds. The default is 300000, about 3Hz. This is generally |
# plenty. Keep in mind that you must tweak the 'ips:' directive |
# to be as close to the number of emulated instructions-per-second |
# your workstation can do, for this to be accurate. |
# |
# Examples: |
# vga_update_interval: 250000 |
#======================================================================= |
vga_update_interval: 300000 |
# using for Winstone '98 tests |
#vga_update_interval: 100000 |
#======================================================================= |
# KEYBOARD_SERIAL_DELAY: |
# Approximate time in microseconds that it takes one character to |
# be transfered from the keyboard to controller over the serial path. |
# Examples: |
# keyboard_serial_delay: 200 |
#======================================================================= |
keyboard_serial_delay: 250 |
#======================================================================= |
# KEYBOARD_PASTE_DELAY: |
# Approximate time in microseconds between attempts to paste |
# characters to the keyboard controller. This leaves time for the |
# guest os to deal with the flow of characters. The ideal setting |
# depends on how your operating system processes characters. The |
# default of 100000 usec (.1 seconds) was chosen because it works |
# consistently in Windows. |
# |
# If your OS is losing characters during a paste, increase the paste |
# delay until it stops losing characters. |
# |
# Examples: |
# keyboard_paste_delay: 100000 |
#======================================================================= |
keyboard_paste_delay: 100000 |
#======================================================================= |
# FLOPPY_COMMAND_DELAY: |
# Time in microseconds to wait before completing some floppy commands |
# such as read/write/seek/etc, which normally have a delay associated. |
# I had this hardwired to 50,000 before. |
# |
# Examples: |
# floppy_command_delay: 50000 |
#======================================================================= |
floppy_command_delay: 500 |
#======================================================================= |
# MOUSE: |
# This option prevents Bochs from creating mouse "events" unless a mouse |
# is enabled. The hardware emulation itself is not disabled by this. |
# You can turn the mouse on by setting enabled to 1, or turn it off by |
# setting enabled to 0. Unless you have a particular reason for enabling |
# the mouse by default, it is recommended that you leave it off. |
# You can also toggle the mouse usage at runtime (middle mouse button on |
# X11 and SDL, F12 on Win32). |
# |
# Examples: |
# mouse: enabled=1 |
# mouse: enabled=0 |
#======================================================================= |
mouse: enabled=0 |
#======================================================================= |
# private_colormap: Request that the GUI create and use it's own |
# non-shared colormap. This colormap will be used |
# when in the bochs window. If not enabled, a |
# shared colormap scheme may be used. Not implemented |
# on all GUI's. |
# |
# Examples: |
# private_colormap: enabled=1 |
# private_colormap: enabled=0 |
#======================================================================= |
private_colormap: enabled=0 |
#======================================================================= |
# fullscreen: ONLY IMPLEMENTED ON AMIGA |
# Request that Bochs occupy the entire screen instead of a |
# window. |
# |
# Examples: |
# fullscreen: enabled=0 |
# fullscreen: enabled=1 |
#======================================================================= |
#fullscreen: enabled=0 |
#screenmode: name="sample" |
#======================================================================= |
# ne2k: NE2000 compatible ethernet adapter |
# |
# Examples: |
# ne2k: ioaddr=IOADDR, irq=IRQ, mac=MACADDR, ethmod=MODULE, ethdev=DEVICE, script=SCRIPT |
# |
# ioaddr, irq: You probably won't need to change ioaddr and irq, unless there |
# are IRQ conflicts. |
# |
# mac: The MAC address MUST NOT match the address of any machine on the net. |
# Also, the first byte must be an even number (bit 0 set means a multicast |
# address), and you cannot use ff:ff:ff:ff:ff:ff because that's the broadcast |
# address. For the ethertap module, you must use fe:fd:00:00:00:01. There may |
# be other restrictions too. To be safe, just use the b0:c4... address. |
# |
# ethdev: The ethdev value is the name of the network interface on your host |
# platform. On UNIX machines, you can get the name by running ifconfig. On |
# Windows machines, you must run niclist to get the name of the ethdev. |
# Niclist source code is in misc/niclist.c and it is included in Windows |
# binary releases. |
# |
# script: The script value is optionnal, and is the name of a script that |
# is executed after bochs initialize the network interface. You can use |
# this script to configure this network interface, or enable masquerading. |
# This is mainly useful for the tun/tap devices that only exist during |
# Bochs execution. The network interface name is supplied to the script |
# as first parameter |
#======================================================================= |
# ne2k: ioaddr=0x240, irq=9, mac=fe:fd:00:00:00:01, ethmod=fbsd, ethdev=en0 #macosx |
# ne2k: ioaddr=0x240, irq=9, mac=b0:c4:20:00:00:00, ethmod=fbsd, ethdev=xl0 |
# ne2k: ioaddr=0x240, irq=9, mac=b0:c4:20:00:00:00, ethmod=linux, ethdev=eth0 |
# ne2k: ioaddr=0x240, irq=9, mac=b0:c4:20:00:00:01, ethmod=win32, ethdev=MYCARD |
# ne2k: ioaddr=0x240, irq=9, mac=fe:fd:00:00:00:01, ethmod=tap, ethdev=tap0 |
# ne2k: ioaddr=0x240, irq=9, mac=fe:fd:00:00:00:01, ethmod=tuntap, ethdev=tun0, script=./tunconfig |
#======================================================================= |
# KEYBOARD_MAPPING: |
# This enables a remap of a physical localized keyboard to a |
# virtualized us keyboard, as the PC architecture expects. |
# If enabled, the keymap file must be specified. |
# |
# Examples: |
# keyboard_mapping: enabled=1, map=gui/keymaps/x11-pc-de.map |
#======================================================================= |
keyboard_mapping: enabled=0, map= |
#======================================================================= |
# KEYBOARD_TYPE: |
# Type of keyboard return by a "identify keyboard" command to the |
# keyboard controler. It must be one of "xt", "at" or "mf". |
# Defaults to "mf". It should be ok for almost everybody. A known |
# exception is french macs, that do have a "at"-like keyboard. |
# |
# Examples: |
# keyboard_type: mf |
#======================================================================= |
#keyboard_type: mf |
#======================================================================= |
# USER_SHORTCUT: |
# This defines the keyboard shortcut to be sent when you press the "user" |
# button in the headerbar. The shortcut string can be a combination of |
# these key names: "alt", "bksp", "ctrl", "del", "esc", "f1", "f4", "tab" |
# and "win". Up to 3 keys can be pressed at a time. |
# |
# Example: |
# user_shortcut: keys=ctrlaltdel |
#======================================================================= |
#user_shortcut: keys=ctrlaltdel |
#======================================================================= |
# other stuff |
#======================================================================= |
#magic_break: enabled=1 |
#cmosimage: cmos.img |
#load32bitOSImage: os=nullkernel, path=../kernel.img, iolog=../vga_io.log |
#load32bitOSImage: os=linux, path=../linux.img, iolog=../vga_io.log, initrd=../initrd.img |
#i440fxsupport: enabled=1 |
usb1: enabled=1, ioaddr=0xFF80, irq=10 |
#text_snapshot_check: enable |
#======================================================================= |
# for Macintosh, use the style of pathnames in the following |
# examples. |
# |
# vgaromimage: :bios:VGABIOS-elpin-2.40 |
# romimage: file=:bios:BIOS-bochs-latest, address=0xf0000 |
# floppya: 1_44=[fd:], status=inserted |
#======================================================================= |
#======================================================================= |
# |
# The following directives are DEPRECATED |
# Please convert them to the new syntax or remove them |
# |
#======================================================================= |
#======================================================================= |
# |
# The DISKC option is deprecated. Use ATA* options instead. |
# |
# DISKC: file=, cyl=, heads=, spt= |
# Point this at a hard disk image file. To create |
# a hard disk image, try running bximage. It will help you choose the |
# size and then suggest a diskc line that works with it. |
# |
# In UNIX it may be possible to use a raw device as a Bochs hard disk, |
# but WE DON'T RECOMMEND IT. In Windows there is no easy way. |
# |
# Examples: |
# diskc: file=10M.sample, cyl=306, heads=4, spt=17 |
# diskc: file=20M.sample, cyl=615, heads=4, spt=17 |
# diskc: file=30M.sample, cyl=615, heads=6, spt=17 |
# diskc: file=46M.sample, cyl=940, heads=6, spt=17 |
# diskc: file=62M.sample, cyl=940, heads=8, spt=17 |
# diskc: file=112M.sample, cyl=900, heads=15, spt=17 |
# diskc: file=483M.sample, cyl=1024, heads=15, spt=63 |
#======================================================================= |
#diskc: file="30M.sample", cyl=615, heads=6, spt=17 |
#======================================================================= |
# |
# The DISKD option is deprecated. Use ATA* options instead. |
# |
# DISKD: |
# See DISKC above for syntax |
# |
# NOTE: diskd and cdromd must not be used together! |
#======================================================================= |
#diskd: file="diskd.img", cyl=615, heads=6, spt=17 |
#======================================================================= |
# |
# The CDROMD option is deprecated. Use ATA* options instead. |
# |
# CDROMD: |
# |
# cdromd: dev=/dev/cdrom, status=inserted |
# cdromd: dev=/dev/cdrom, status=ejected |
# cdromd: dev=e:, status=ejected |
# |
# In windows, the drive letter + colon notation should be used for cdroms. |
# Depending on versions of windows and drivers, you may only be able to |
# access the "first" cdrom in the system. On MacOSX, use path="drive" |
# to access the physical drive. |
# |
# NOTE: diskd and cdromd must not be used together! |
#======================================================================= |
#cdromd: dev=D:, status=inserted |
#cdromd: dev=/dev/cdrom, status=inserted |
#cdromd: dev="drive", status=inserted |
#======================================================================= |
# |
# The TIME0 directive is DEPRECATED. Use the CLOCK directive instead |
# |
# TIME0: |
# Specifies the start (boot) time of the virtual machine. Use a time |
# value as returned by the time(2) system call. If no time0 value is |
# set or if time0 equal to 1 (special case), the simulation will be |
# started at the current time of the host. |
# |
# Examples: |
# time0: 1 # Now |
# time0: 315529200 # Tue Jan 1 00:00:00 1980 |
# time0: 631148400 # Mon Jan 1 00:00:00 1990 |
# time0: 938581955 # Wed Sep 29 07:12:35 1999 |
# time0: 946681200 # Sat Jan 1 00:00:00 2000 |
#======================================================================= |
#time0: 938581955 |
#======================================================================= |
# |
# The PIT directive is DEPRECATED. Use the CLOCK directive instead |
# |
# PIT: |
# The PIT is the programmable interval timer. It has an option that tries to |
# keep the PIT in sync with real time. This feature is still experimental, |
# but it may be useful if you want to prevent Bochs from running too fast, for |
# example a DOS video game. Be aware that with the realtime pit option, your |
# simulation will not be repeatable; this can a problem if you are debugging. |
#======================================================================= |
#pit: realtime=1 |
#======================================================================= |
# NEWHARDDRIVESUPPORT: enabled=[0|1] |
# The old harddrive code is not maintened any more. |
# Default value is enabled=1 |
#======================================================================= |
#newharddrivesupport: enabled=1 |
/tags/0.3.0/contrib/conf/HelenOS.amd64.simics |
---|
0,0 → 1,57 |
# |
# Simics 3.0 AMD64 configuration |
# |
$num_cpus = 2 |
$cpu_class = "x86-hammer" |
$freq_mhz = 50 |
add-directory "%simics%/targets/x86-440bx/images" |
import-isa-components |
import-pci-components |
import-std-components |
import-x86-components |
$system = (create-x86-apic-system memory_megs = 256 |
rtc_time = "2006-03-12 10:00:00 UTC" |
break_on_reboot = 1 |
bios = "rombios-2.65.2.3") |
$count = 0 |
$create_command = ("create-" + $cpu_class + "-cpu") |
while $count < $num_cpus { |
$cpu[$count] = ($create_command cpu_frequency = $freq_mhz) |
$system.connect ("cpu" + $count) $cpu[$count] |
$count += 1 |
} |
$nb = (create-north-bridge-443bx-agp) |
$vga = (create-agp-voodoo3) |
$nb.connect agp-slot0 $vga |
$sb = (create-south-bridge-piix4) |
$sio = (create-std-super-io) |
$cdrom = (create-std-ide-cdrom) |
$console = (create-std-graphics-console) |
$console.connect mouse $sio mse-console |
$console.connect keyboard $sio kbd-console |
$console.connect $vga |
$system.connect chipset $nb |
$system.connect interrupt $sb |
$system.connect reset $sio |
$nb.connect pci-slot7 $sb |
$sb.connect $sio |
$sb.connect ide0-slave $cdrom |
instantiate-components |
run-python-file "%simics%/home/scripts/cdrom_bootloader.py" |
@install_cdrom_bootloader((conf.cpu0,)) |
new-file-cdrom "image.iso" image |
cd0.insert image |
/tags/0.3.0/contrib/conf/simics.conf |
---|
0,0 → 1,25 |
# Test machine features |
# - Standard PC system |
# - 256 Mb memory |
# - 40 MHz processor(s) |
# - AM79C960 NIC (ISA Lance) |
# - Voodoo3 PCI graphics device |
@num_processors = 2 |
#@num_processors = 1 |
@if not "cpu_class" in dir(): cpu_class = "x86-hammer" |
@if not "clock_freq_mhz" in dir(): clock_freq_mhz = 40 |
@if not "memory_megs" in dir(): memory_megs = 256 |
@if not "cdrom_image" in dir(): cdrom_image = "image.iso" |
@if not "use_voodoo3_pci" in dir(): use_voodoo3_pci = 1 |
@if not "use_voodoo3_agp" in dir(): use_voodoo3_agp = 0 |
run-command-file ../x86-test-machine/pc-common.simics |
run-python-file ../scripts/cdrom_bootloader.py |
@install_cdrom_bootloader((conf.cpu0,)) |
@if cdrom_image != None: |
eval_cli_line("new-file-cdrom %s image" % cdrom_image) |
eval_cli_line("cd0.insert image") |
/tags/0.3.0/contrib/conf/HelenOS.ppc32.simics |
---|
0,0 → 1,32 |
# |
# Simics 3.0 PPC32 simple configuration |
# |
$cpu_class = "ppc750" |
$freq_mhz = 50 |
$image = "image.boot" |
$image_offset = -0x7a000000 |
add-directory "%simics%/targets/ppc64-simple/images" |
import-std-components |
import-ppc-simple-components |
$system = (create-ppc-simple cpu_class = $cpu_class |
cpu_frequency = $freq_mhz |
memory_megs = 256) |
$cpu = ($system.get-component-object "cpu") |
$system.connect uart0 (create-std-text-console) |
instantiate-components |
$start = (load-binary $image $image_offset) |
$cpu->msr = ($cpu->msr | (1 << 13) | (1 << 5) | (1 << 4)) |
$cpu.set-pc $start - $image_offset |
@itlb = conf.cpu0.itlb |
@itlb[0] = [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0]] |
@conf.cpu0.itlb = itlb |
/tags/0.3.0/contrib/conf/spmips.conf |
---|
0,0 → 1,263 |
OBJECT cpu0 TYPE mips-4kc { |
freq-mhz: 10 |
queue: cpu0 |
physical-memory: phys-mem0 |
} |
OBJECT phys-mem0 TYPE memory-space { |
map: ((0x18000020, pic0, 0, 0x20, 1), |
(0x18000021, pic0, 0, 0x21, 1), |
(0x180000a0, pic0, 0, 0xa0, 1), |
(0x180000a1, pic0, 0, 0xa1, 1), |
(0x180004d0, pic0, 0, 0x4d0, 1), |
(0x180004d1, pic0, 0, 0x4d1, 1), |
(0x18000070, rtc0, 0, 0, 1), |
(0x18000071, rtc0, 0, 1, 1), |
(0x180003f8, tty0, 0, 0, 1), |
(0x180003f9, tty0, 0, 1, 1), |
(0x180003fa, tty0, 0, 2, 1), |
(0x180003fb, tty0, 0, 3, 1), |
(0x180003fc, tty0, 0, 4, 1), |
(0x180003fd, tty0, 0, 5, 1), |
(0x180003fe, tty0, 0, 6, 1), |
(0x180003ff, tty0, 0, 7, 1), |
(0x1c000000, hfs0, 0, 0, 16), |
(0x01000000, initmem0, 0, 0, 0x100000)) |
} |
OBJECT cbus-space TYPE memory-space { |
map: ((0x1f000000, malta0, 0, 0, 0xc00000), |
(0x1fc00000, rom0, 0, 0, 0x400000)) |
} |
OBJECT memory0 TYPE ram { |
image: memory0-image |
} |
OBJECT memory0-image TYPE image { |
queue: cpu0 |
size: 0x08000000 |
} |
OBJECT initmem0 TYPE ram { |
image: initmem0-image |
} |
OBJECT initmem0-image TYPE image { |
queue: cpu0 |
size: 0x100000 |
files: (("../../../uspace/init/init", "ro", 0,0)) |
} |
OBJECT rom0 TYPE rom { |
image: rom0-image |
} |
OBJECT rom0-image TYPE image { |
queue: cpu0 |
size: 0x00400000 |
} |
OBJECT tty0 TYPE NS16550 { |
irq-dev: pic0 |
irq-level: 4 |
queue: cpu0 |
console: con0 |
recorder: rec0 |
} |
OBJECT pic0 TYPE i8259x2 { |
queue: cpu0 |
irq-dev: gt64120-0 |
# It seems like Linux expects the master 8259 to have VBA 0. |
# Maybe that would be set up by YAMON? |
vba: (0, 1) |
} |
OBJECT con0 TYPE xterm-console { |
title: "mips32-test-machine" |
bg-color: "black" |
fg-color: "green" |
queue: cpu0 |
device: tty0 |
output-timeout: 120 |
} |
OBJECT rtc0 TYPE DS12887 { |
irq-dev: pic0 |
irq-level: 8 |
queue: cpu0 |
} |
OBJECT malta0 TYPE malta { |
console: display0 |
} |
OBJECT display0 TYPE xterm-console { |
title: "MALTA Display" |
bg-color: "black" |
fg-color: "red" |
width: 8 |
height: 1 |
scrollbar: 0 |
x11-font: "-*-*-*-r-*-*-*-240-*-*-m-*-*-*" |
win32-font: "Lucida Console:Bold:48" |
queue: cpu0 |
output-timeout: 120 |
} |
# PCI buses |
OBJECT pci-bus0 TYPE pci-bus { |
queue: cpu0 |
bridge: gt64120-0-pci-0-0 |
interrupt: gt64120-0-pci-0-0 |
conf-space: pci-bus0-conf-space |
memory-space: pci-bus0-memory-space |
io-space: pci-bus0-io-space |
pci-devices: ((0, 0, gt64120-0-pci-0-0), |
(0, 1, gt64120-0-pci-0-1)) |
} |
OBJECT pci-bus0-conf-space TYPE memory-space { |
queue: cpu0 |
} |
OBJECT pci-bus1-conf-space TYPE memory-space { |
queue: cpu0 |
} |
OBJECT pci-bus0-memory-space TYPE memory-space { |
queue: cpu0 |
} |
OBJECT pci-bus1 TYPE pci-bus { |
queue: cpu0 |
bridge: gt64120-0-pci-1-0 |
interrupt: gt64120-0-pci-1-0 |
conf-space: pci-bus1-conf-space |
memory-space: pci-bus1-memory-space |
io-space: pci-bus1-io-space |
pci-devices: ((0, 0, gt64120-0-pci-1-0), |
(0, 1, gt64120-0-pci-1-1)) |
} |
OBJECT pci-bus1-memory-space TYPE memory-space { |
queue: cpu0 |
} |
OBJECT pci-bus0-io-space TYPE memory-space { |
queue: cpu0 |
} |
OBJECT pci-bus1-io-space TYPE memory-space { |
queue: cpu0 |
} |
# GT64120 chipset |
OBJECT gt64120-0 TYPE GT64120 { |
queue: cpu0 |
cpu-mem: phys-mem0 |
pci-0-0: gt64120-0-pci-0-0 |
pci-0-1: gt64120-0-pci-0-1 |
pci-1-0: gt64120-0-pci-1-0 |
pci-1-1: gt64120-0-pci-1-1 |
scs0: memory0 |
cs3: cbus-space |
bootcs: cbus-space |
pci-0-conf: pci-bus0-conf-space |
pci-0-io: pci-bus0-io-space |
pci-0-memory: pci-bus0-memory-space |
pci-1-conf: pci-bus1-conf-space |
pci-1-io: pci-bus1-io-space |
pci-1-memory: pci-bus1-memory-space |
irq-dev: cpu0 |
irq-level: 2 |
# Little endian |
cpu_interface_configuration: 0x00041000 |
# Map 128MB RAM. |
scs10-high-decode-address: 0x40 |
scs0-low-decode-address: 0x0 |
scs0-high-decode-address: 0x7f |
# Map the internal registers at 0x1be00000. |
internal-space-decode: 0xdf |
# Disable host-PCI mappings |
pci-0-io-high-decode-address: 0 |
pci-0-io-low-decode-address: 1 |
pci-0-io-remap: 1 |
pci-0-memory-0-high-decode-address: 0 |
pci-0-memory-0-low-decode-address: 1 |
pci-0-memory-0-remap: 1 |
pci-0-memory-1-high-decode-address: 0 |
pci-0-memory-1-low-decode-address: 1 |
pci-0-memory-1-remap: 1 |
pci-1-io-high-decode-address: 0 |
pci-1-io-low-decode-address: 1 |
pci-1-io-remap: 1 |
pci-1-memory-0-high-decode-address: 0 |
pci-1-memory-0-low-decode-address: 1 |
pci-1-memory-0-remap: 1 |
pci-1-memory-1-high-decode-address: 0 |
pci-1-memory-1-low-decode-address: 1 |
pci-1-memory-1-remap: 1 |
# Disable PCI-host mappings |
pci-0-base-address-registers-enable: 0x1ff |
pci-1-base-address-registers-enable: 0x1ff |
} |
OBJECT gt64120-0-pci-0-0 TYPE GT64120-pci { |
queue: cpu0 |
gt64120: gt64120-0 |
bridge-num: 0 |
function-num: 0 |
pci-bus: pci-bus0 |
} |
OBJECT gt64120-0-pci-0-1 TYPE GT64120-pci { |
queue: cpu0 |
gt64120: gt64120-0 |
bridge-num: 0 |
function-num: 1 |
pci-bus: pci-bus0 |
} |
OBJECT gt64120-0-pci-1-0 TYPE GT64120-pci { |
queue: cpu0 |
gt64120: gt64120-0 |
bridge-num: 1 |
function-num: 0 |
pci-bus: pci-bus1 |
} |
OBJECT gt64120-0-pci-1-1 TYPE GT64120-pci { |
queue: cpu0 |
gt64120: gt64120-0 |
bridge-num: 1 |
function-num: 1 |
pci-bus: pci-bus1 |
} |
# Various |
OBJECT rec0 TYPE recorder { |
} |
OBJECT hfs0 TYPE hostfs { |
} |
OBJECT sim TYPE sim { |
handle-outside-memory: 1 |
} |
/tags/0.3.0/contrib/conf/bootindy |
---|
0,0 → 1,2 |
Without this the indy will not boot |
echo 1 > /proc/sys/net/ipv4/ip_no_pmtu_disc |
/tags/0.3.0/contrib/conf/SPMIPS.simics |
---|
0,0 → 1,14 |
run-python-file ../scripts/extrapath.py |
add-directory ../../import/mips |
read-configuration spmips.conf |
set-pc (cpu0.load-binary ../../../SPARTAN/kernel.bin) |
# Setup uart to use 8 bits |
@conf.tty0.lcr = 0xf; |
# Set date |
rtc0.set-date-time 2001 01 01 01 01 01 |
@century = 20 |
@ignore=SIM_set_attribute_idx(conf.rtc0, "nvram", 0x32, century) |
/tags/0.3.0/contrib/conf/vmware.conf |
---|
0,0 → 1,15 |
#!/opt/vmware/bin/vmware |
config.version = "8" |
virtualHW.version = "4" |
scsi0.present = "FALSE" |
memsize = "96" |
ide0:0.present = "FALSE" |
ide1:0.present = "FALSE" |
floppy0.startConnected = "TRUE" |
floppy0.fileType = "file" |
floppy0.fileName = "image.bin" |
sound.present = "FALSE" |
displayName = "HelenOS" |
guestOS = "other" |
nvram = "HelenOS.nvram" |
isolation.tools.hgfs.disable = "TRUE" |
/tags/0.3.0/tools/config.py |
---|
0,0 → 1,511 |
#!/usr/bin/env python |
""" |
HelenOS configuration script |
""" |
import sys |
import os |
import re |
import commands |
INPUT = sys.argv[1] |
OUTPUT = 'Makefile.config' |
TMPOUTPUT = 'Makefile.config.tmp' |
class DefaultDialog: |
"Wrapper dialog that tries to return default values" |
def __init__(self, dlg): |
self.dlg = dlg |
def set_title(self,text): |
self.dlg.set_title(text) |
def yesno(self, text, default=None): |
if default is not None: |
return default |
return self.dlg.yesno(text, default) |
def noyes(self, text, default=None): |
if default is not None: |
return default |
return self.dlg.noyes(text, default) |
def choice(self, text, choices, defopt=None): |
if defopt is not None: |
return choices[defopt][0] |
return self.dlg.choice(text, choices, defopt) |
class NoDialog: |
def __init__(self): |
self.printed = None |
self.title = 'HelenOS Configuration' |
def print_title(self): |
if not self.printed: |
sys.stdout.write("\n*** %s ***\n" % self.title) |
self.printed = True |
def set_title(self, text): |
self.title = text |
self.printed = False |
def noyes(self, text, default=None): |
if not default: |
default = 'n' |
return self.yesno(text, default) |
def yesno(self, text, default=None): |
self.print_title() |
if default != 'n': |
default = 'y' |
while 1: |
sys.stdout.write("%s (y/n)[%s]: " % (text,default)) |
inp = sys.stdin.readline() |
if not inp: |
raise EOFError |
inp = inp.strip().lower() |
if not inp: |
return default |
if inp == 'y': |
return 'y' |
elif inp == 'n': |
return 'n' |
def _print_choice(self, text, choices, defopt): |
sys.stdout.write('%s:\n' % text) |
for i,(text,descr) in enumerate(choices): |
if descr is '': |
sys.stdout.write('\t%2d. %s\n' % (i, text)) |
else: |
sys.stdout.write('\t%2d. %s\n' % (i, descr)) |
if defopt is not None: |
sys.stdout.write('Enter choice number[%d]: ' % defopt) |
else: |
sys.stdout.write('Enter choice number: ') |
def menu(self, text, choices, button, defopt=None): |
self.title = 'Main menu' |
menu = [] |
for key, descr in choices: |
txt = key + (45-len(key))*' ' + ': ' + descr |
menu.append((key, txt)) |
return self.choice(text, [button] + menu) |
def choice(self, text, choices, defopt=None): |
self.print_title() |
while 1: |
self._print_choice(text, choices, defopt) |
inp = sys.stdin.readline() |
if not inp: |
raise EOFError |
if not inp.strip(): |
if defopt is not None: |
return choices[defopt][0] |
continue |
try: |
number = int(inp.strip()) |
except ValueError: |
continue |
if number < 0 or number >= len(choices): |
continue |
return choices[number][0] |
def eof_checker(fnc): |
def wrapper(self, *args, **kw): |
try: |
return fnc(self, *args, **kw) |
except EOFError: |
return getattr(self.bckdialog,fnc.func_name)(*args, **kw) |
return wrapper |
class Dialog(NoDialog): |
def __init__(self): |
NoDialog.__init__(self) |
self.dlgcmd = os.environ.get('DIALOG','dialog') |
self.title = '' |
self.backtitle = 'HelenOS Configuration' |
if os.system('%s --print-maxsize >/dev/null 2>&1' % self.dlgcmd) != 0: |
raise NotImplementedError |
self.bckdialog = NoDialog() |
def set_title(self,text): |
self.title = text |
self.bckdialog.set_title(text) |
def calldlg(self,*args,**kw): |
"Wrapper for calling 'dialog' program" |
indesc, outdesc = os.pipe() |
pid = os.fork() |
if not pid: |
os.close(2) |
os.dup(outdesc) |
os.close(indesc) |
dlgargs = [self.dlgcmd,'--title',self.title, |
'--backtitle', self.backtitle] |
for key,val in kw.items(): |
dlgargs.append('--'+key) |
dlgargs.append(val) |
dlgargs += args |
os.execlp(self.dlgcmd,*dlgargs) |
os.close(outdesc) |
try: |
errout = os.fdopen(indesc,'r') |
data = errout.read() |
errout.close() |
pid,status = os.wait() |
except: |
os.system('reset') # Reset terminal |
raise |
if not os.WIFEXITED(status): |
os.system('reset') # Reset terminal |
raise EOFError |
status = os.WEXITSTATUS(status) |
if status == 255: |
raise EOFError |
return status,data |
def yesno(self, text, default=None): |
if text[-1] not in ('?',':'): |
text = text + ':' |
width = '50' |
height = '5' |
if len(text) < 48: |
text = ' '*int(((48-len(text))/2)) + text |
else: |
width = '0' |
height = '0' |
if default == 'n': |
res,data = self.calldlg('--defaultno','--yesno',text,height,width) |
else: |
res,data = self.calldlg('--yesno',text,height,width) |
if res == 0: |
return 'y' |
return 'n' |
yesno = eof_checker(yesno) |
def menu(self, text, choices, button, defopt=None): |
self.title = 'Main menu' |
text = text + ':' |
width = '70' |
height = str(8 + len(choices)) |
args = [] |
for key,val in choices: |
args.append(key) |
args.append(val) |
kw = {} |
if defopt: |
kw['default-item'] = choices[defopt][0] |
res,data = self.calldlg('--ok-label','Change', |
'--extra-label',button[1], |
'--extra-button', |
'--menu',text,height,width, |
str(len(choices)),*args,**kw) |
if res == 3: |
return button[0] |
if res == 1: # Cancel |
sys.exit(1) |
elif res: |
print data |
raise EOFError |
return data |
menu = eof_checker(menu) |
def choice(self, text, choices, defopt=None): |
text = text + ':' |
width = '50' |
height = str(8 + len(choices)) |
args = [] |
for key,val in choices: |
args.append(key) |
args.append(val) |
kw = {} |
if defopt: |
kw['default-item'] = choices[defopt][0] |
res,data = self.calldlg('--nocancel','--menu',text,height,width, |
str(len(choices)),*args, **kw) |
if res: |
print data |
raise EOFError |
return data |
choice = eof_checker(choice) |
def read_defaults(fname,defaults): |
"Read saved values from last configuration run" |
f = file(fname,'r') |
for line in f: |
res = re.match(r'^(?:#!# )?([^#]\w*)\s*=\s*(.*?)\s*$', line) |
if res: |
defaults[res.group(1)] = res.group(2) |
f.close() |
def check_condition(text, defaults, asked_names): |
seen_vars = [ x[0] for x in asked_names ] |
ctype = 'cnf' |
if ')|' in text or '|(' in text: |
ctype = 'dnf' |
if ctype == 'cnf': |
conds = text.split('&') |
else: |
conds = text.split('|') |
for cond in conds: |
if cond.startswith('(') and cond.endswith(')'): |
cond = cond[1:-1] |
inside = check_inside(cond, defaults, ctype, seen_vars) |
if ctype == 'cnf' and not inside: |
return False |
if ctype == 'dnf' and inside: |
return True |
if ctype == 'cnf': |
return True |
return False |
def check_inside(text, defaults, ctype, seen_vars): |
""" |
Check that the condition specified on input line is True |
only CNF is supported |
""" |
if ctype == 'cnf': |
conds = text.split('|') |
else: |
conds = text.split('&') |
for cond in conds: |
res = re.match(r'^(.*?)(!?=)(.*)$', cond) |
if not res: |
raise RuntimeError("Invalid condition: %s" % cond) |
condname = res.group(1) |
oper = res.group(2) |
condval = res.group(3) |
if condname not in seen_vars: |
varval = '' |
## raise RuntimeError("Variable %s not defined before being asked." %\ |
## condname) |
elif not defaults.has_key(condname): |
raise RuntimeError("Condition var %s does not exist: %s" % \ |
(condname,text)) |
else: |
varval = defaults[condname] |
if ctype == 'cnf': |
if oper == '=' and condval == varval: |
return True |
if oper == '!=' and condval != varval: |
return True |
else: |
if oper== '=' and condval != varval: |
return False |
if oper== '!=' and condval == varval: |
return False |
if ctype=='cnf': |
return False |
return True |
def parse_config(input, output, dlg, defaults={}, askonly=None): |
"Parse configuration file and create Makefile.config on the fly" |
def ask_the_question(dialog): |
"Ask question based on the type of variables to ask" |
# This is quite a hack, this thingy is written just to |
# have access to local variables.. |
if vartype == 'y/n': |
return dialog.yesno(comment, default) |
elif vartype == 'n/y': |
return dialog.noyes(comment, default) |
elif vartype == 'choice': |
defopt = None |
if default is not None: |
for i,(key,val) in enumerate(choices): |
if key == default: |
defopt = i |
break |
return dialog.choice(comment, choices, defopt) |
else: |
raise RuntimeError("Bad method: %s" % vartype) |
f = file(input, 'r') |
outf = file(output, 'w') |
outf.write('#########################################\n') |
outf.write('## AUTO-GENERATED FILE, DO NOT EDIT!!! ##\n') |
outf.write('#########################################\n\n') |
asked_names = [] |
comment = '' |
default = None |
choices = [] |
for line in f: |
if line.startswith('%'): |
res = re.match(r'^%\s*(?:\[(.*?)\])?\s*(.*)$', line) |
if not res: |
raise RuntimeError('Invalid command: %s' % line) |
if res.group(1): |
if not check_condition(res.group(1), defaults, |
asked_names): |
continue |
args = res.group(2).strip().split(' ') |
cmd = args[0].lower() |
args = args[1:] |
if cmd == 'saveas': |
outf.write('%s = %s\n' % (args[1],defaults[args[0]])) |
elif cmd == 'shellcmd': |
varname = args[0] |
args = args[1:] |
for i,arg in enumerate(args): |
if arg.startswith('$'): |
args[i] = defaults[arg[1:]] |
data,status = commands.getstatusoutput(' '.join(args)) |
if status: |
raise RuntimeError('Error running: %s' % ' '.join(args)) |
outf.write('%s = %s\n' % (varname,data.strip())) |
continue |
if line.startswith('!'): |
# Ask a question |
res = re.search(r'!\s*(?:\[(.*?)\])?\s*([^\s]+)\s*\((.*)\)\s*$', line) |
if not res: |
raise RuntimeError("Weird line: %s" % line) |
varname = res.group(2) |
vartype = res.group(3) |
default = defaults.get(varname,None) |
if res.group(1): |
if not check_condition(res.group(1), defaults, |
asked_names): |
if default is not None: |
outf.write('#!# %s = %s\n' % (varname, default)) |
# Clear cumulated values |
comment = '' |
default = None |
choices = [] |
continue |
asked_names.append((varname,comment)) |
if default is None or not askonly or askonly == varname: |
default = ask_the_question(dlg) |
else: |
default = ask_the_question(DefaultDialog(dlg)) |
outf.write('%s = %s\n' % (varname, default)) |
# Remeber the selected value |
defaults[varname] = default |
# Clear cumulated values |
comment = '' |
default = None |
choices = [] |
continue |
if line.startswith('@'): |
# Add new line into the 'choice array' |
res = re.match(r'@\s*(?:\[(.*?)\])?\s*"(.*?)"\s*(.*)$', line) |
if not res: |
raise RuntimeError("Bad line: %s" % line) |
if res.group(1): |
if not check_condition(res.group(1),defaults, |
asked_names): |
continue |
choices.append((res.group(2), res.group(3))) |
continue |
# All other things print to output file |
outf.write(line) |
if re.match(r'^#[^#]', line): |
# Last comment before question will be displayed to the user |
comment = line[1:].strip() |
elif line.startswith('## '): |
# Set title of the dialog window |
dlg.set_title(line[2:].strip()) |
outf.write('\n') |
outf.write('REVISION = %s\n' % commands.getoutput('svnversion . 2> /dev/null')) |
outf.write('TIMESTAMP = %s\n' % commands.getoutput('date "+%Y-%m-%d %H:%M:%S"')) |
outf.close() |
f.close() |
return asked_names |
def main(): |
defaults = {} |
try: |
dlg = Dialog() |
except NotImplementedError: |
dlg = NoDialog() |
if len(sys.argv) >= 3 and sys.argv[2]=='default': |
defmode = True |
else: |
defmode = False |
# Default run will update the configuration file |
# with newest options |
if os.path.exists(OUTPUT): |
read_defaults(OUTPUT, defaults) |
# Get ARCH from command line if specified |
if len(sys.argv) >= 4: |
defaults['ARCH'] = sys.argv[3] |
defaults['PLATFORM'] = sys.argv[3] |
# Get COMPILER from command line if specified |
if len(sys.argv) >= 5: |
defaults['COMPILER'] = sys.argv[4] |
# Get CONFIG_DEBUG from command line if specified |
if len(sys.argv) >= 6: |
defaults['CONFIG_DEBUG'] = sys.argv[5] |
# Get MACHINE/IMAGE from command line if specified |
if len(sys.argv) >= 7: |
defaults['MACHINE'] = sys.argv[6] |
defaults['IMAGE'] = sys.argv[6] |
# Dry run only with defaults |
varnames = parse_config(INPUT, TMPOUTPUT, DefaultDialog(dlg), defaults) |
# If not in default mode, present selection of all possibilities |
if not defmode: |
defopt = 0 |
while 1: |
# varnames contains variable names that were in the |
# last question set |
choices = [ (x[1],defaults[x[0]]) for x in varnames ] |
res = dlg.menu('Configuration',choices,('save','Save'),defopt) |
if res == 'save': |
parse_config(INPUT, TMPOUTPUT, DefaultDialog(dlg), defaults) |
break |
# transfer description back to varname |
for i,(vname,descr) in enumerate(varnames): |
if res == descr: |
defopt = i |
break |
# Ask the user a simple question, produce output |
# as if the user answered all the other questions |
# with default answer |
varnames = parse_config(INPUT, TMPOUTPUT, dlg, defaults, |
askonly=varnames[i][0]) |
if os.path.exists(OUTPUT): |
os.unlink(OUTPUT) |
os.rename(TMPOUTPUT, OUTPUT) |
if not defmode and dlg.yesno('Rebuild everything?') == 'y': |
os.execlp('make','make','clean','build') |
if __name__ == '__main__': |
main() |
Property changes: |
Added: svn:executable |
+* |
\ No newline at end of property |
/tags/0.3.0/tools/cygwin_symlink_patch.sh |
---|
0,0 → 1,29 |
# by Alf |
# This script solves malfunction of symlinks in cygwin |
# |
# Download sources from repository and than run this script to correct symlinks |
# to be able compile project |
if uname | grep 'CYGWIN' > /dev/null; then |
echo "Good ... you have cygwin" |
else |
echo "Wrong. This script is only for cygwin" |
exit |
fi |
for linkName in `find . ! -iwholename '.*svn*' ! -type d -print`; do |
if head -n 1 $linkName | grep '^link' > /dev/null; then |
linkTarget=`head -n 1 $linkName | sed 's/^link //'` |
echo $linkName " -->" $linkTarget |
rm $linkName |
ln -s "$linkTarget" "$linkName" |
fi |
done |
/tags/0.3.0/tools/build |
---|
0,0 → 1,29 |
#! /bin/bash |
BASE="$HOME/HelenOS.export" |
TARGETS="amd64 ia32 ia64 mips32gbe mips32gle ppc32 ppc64 sparc64" |
OUTPUT="$HOME/arch" |
for TARGET in $TARGETS ; do |
if [ "$TARGET" == "mips32gbe" ]; then |
UTARGET="mips32eb" |
elif [ "$TARGET" == "mips32gle" ]; then |
UTARGET="mips32" |
else |
UTARGET="$TARGET" |
fi |
rm -fr "$OUTPUT/$TARGET" |
mkdir -p "$OUTPUT/$TARGET/include" |
cd "$BASE" |
make distclean |
make "PLATFORM=$TARGET" "COMPILER=gcc_cross" "CONFIG_DEBUG=n" |
cp -v "$BASE/uspace/libc/arch/$UTARGET/src/entry.o" "$OUTPUT/$TARGET" |
cp -v "$BASE/uspace/libc/arch/$UTARGET/_link.ld" "$OUTPUT/$TARGET" |
cp -v "$BASE/uspace/libc/libc.a" "$OUTPUT/$TARGET" |
cp -v "$BASE/uspace/softint/libsoftint.a" "$OUTPUT/$TARGET" |
cp -v "$BASE/uspace/softfloat/libsoftfloat.a" "$OUTPUT/$TARGET" |
cp -v -R -L "$BASE/uspace/libc/include" "$OUTPUT/$TARGET" |
done |
Property changes: |
Added: svn:executable |
+* |
\ No newline at end of property |
/tags/0.3.0/Makefile |
---|
0,0 → 1,147 |
# |
# Copyright (c) 2006 Martin Decky |
# All rights reserved. |
# |
# Redistribution and use in source and binary forms, with or without |
# modification, are permitted provided that the following conditions |
# are met: |
# |
# - Redistributions of source code must retain the above copyright |
# notice, this list of conditions and the following disclaimer. |
# - Redistributions in binary form must reproduce the above copyright |
# notice, this list of conditions and the following disclaimer in the |
# documentation and/or other materials provided with the distribution. |
# - The name of the author may not be used to endorse or promote products |
# derived from this software without specific prior written permission. |
# |
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
# |
## Include configuration |
# |
-include Makefile.config |
## Setup platform configuration |
# |
ifeq ($(PLATFORM),amd64) |
KARCH = amd64 |
MACHINE = opteron |
UARCH = amd64 |
BARCH = amd64 |
endif |
ifeq ($(PLATFORM),arm32) |
KARCH = arm32 |
UARCH = arm32 |
BARCH = arm32 |
endif |
ifeq ($(PLATFORM),ia32) |
KARCH = ia32 |
UARCH = ia32 |
BARCH = ia32 |
endif |
ifeq ($(PLATFORM),ia64) |
KARCH = ia64 |
UARCH = ia64 |
BARCH = ia64 |
endif |
ifeq ($(PLATFORM),mips32) |
KARCH = mips32 |
BARCH = mips32 |
ifeq ($(MACHINE),msim) |
UARCH = mips32 |
IMAGE = binary |
endif |
ifeq ($(MACHINE),simics) |
UARCH = mips32 |
IMAGE = ecoff |
endif |
ifeq ($(MACHINE),bgxemul) |
UARCH = mips32eb |
IMAGE = ecoff |
endif |
ifeq ($(MACHINE),lgxemul) |
UARCH = mips32 |
IMAGE = ecoff |
endif |
ifeq ($(MACHINE),indy) |
UARCH = mips32eb |
IMAGE = ecoff |
endif |
endif |
ifeq ($(PLATFORM),ppc32) |
KARCH = ppc32 |
UARCH = ppc32 |
BARCH = ppc32 |
endif |
ifeq ($(PLATFORM),ppc64) |
KARCH = ppc64 |
UARCH = ppc64 |
BARCH = ppc64 |
endif |
ifeq ($(PLATFORM),sparc64) |
KARCH = sparc64 |
UARCH = sparc64 |
BARCH = sparc64 |
endif |
ifeq ($(PLATFORM),ia32xen) |
KARCH = ia32xen |
UARCH = ia32 |
BARCH = ia32xen |
endif |
.PHONY: all build config distclean clean |
all: |
tools/config.py HelenOS.config default $(PLATFORM) $(COMPILER) $(CONFIG_DEBUG) |
$(MAKE) -C . build |
build: |
ifneq ($(MACHINE),) |
$(MAKE) -C kernel ARCH=$(KARCH) COMPILER=$(COMPILER) CONFIG_DEBUG=$(CONFIG_DEBUG) MACHINE=$(MACHINE) |
else |
$(MAKE) -C kernel ARCH=$(KARCH) COMPILER=$(COMPILER) CONFIG_DEBUG=$(CONFIG_DEBUG) |
endif |
$(MAKE) -C uspace ARCH=$(UARCH) COMPILER=$(COMPILER) CONFIG_DEBUG=$(CONFIG_DEBUG) |
ifneq ($(IMAGE),) |
$(MAKE) -C boot ARCH=$(BARCH) COMPILER=$(COMPILER) CONFIG_DEBUG=$(CONFIG_DEBUG) IMAGE=$(IMAGE) |
else |
$(MAKE) -C boot ARCH=$(BARCH) COMPILER=$(COMPILER) CONFIG_DEBUG=$(CONFIG_DEBUG) |
endif |
config: |
tools/config.py HelenOS.config |
distclean: |
-$(MAKE) -C kernel distclean |
-$(MAKE) -C uspace distclean |
-$(MAKE) -C boot distclean |
-rm Makefile.config |
clean: |
-$(MAKE) -C kernel clean |
-$(MAKE) -C uspace clean |
-$(MAKE) -C boot clean |
/tags/0.3.0/HelenOS.config |
---|
0,0 → 1,57 |
## General configuration directives |
# Platform |
@ "amd64" AMD64/Intel EM64T (PC) |
@ "arm32" ARM 32-bit |
@ "ia32" Intel IA-32 (PC) |
@ "ia32xen" Intel IA-32 on Xen hypervisor |
@ "ia64" Intel IA-64 |
@ "mips32" MIPS 32-bit |
@ "ppc32" PowerPC 32-bit (iMac G4) |
@ "ppc64" PowerPC 64-bit (iMac G5) |
@ "sparc64" Sun UltraSPARC 64-bit |
! PLATFORM (choice) |
# Machine |
@ "msim" MSIM |
@ "simics" Simics |
@ "bgxemul" GXEmul big endian |
@ "lgxemul" GXEmul little endia |
@ "indy" Sgi Indy |
! [PLATFORM=mips32] MACHINE (choice) |
# Machine type |
@ "ski" Ski ia64 simulator |
@ "i460GX" i460GX chipset machine |
! [PLATFORM=ia64] MACHINE (choice) |
# Machine |
@ "gxemul_testarm" GXEmul testarm |
! [PLATFORM=arm32] MACHINE (choice) |
# Compiler |
@ "gcc_cross" GCC Cross-compiler |
@ "gcc_native" GCC Native |
@ "icc_native" ICC Native |
@ "suncc_native" Sun Studio C Compiler |
! [PLATFORM=amd64|PLATFORM=ia32|PLATFORM=ia32xen] COMPILER (choice) |
# Compiler |
@ "gcc_cross" GCC Cross-compiler |
@ "gcc_native" GCC Native |
@ "icc_native" ICC Native |
! [PLATFORM=ia64] COMPILER (choice) |
# Compiler |
@ "gcc_cross" GCC Cross-compiler |
@ "gcc_native" GCC Native |
@ "suncc_native" Sun Studio C Compiler |
! [PLATFORM=sparc64] COMPILER (choice) |
# Compiler |
@ "gcc_cross" GCC Cross-compiler |
@ "gcc_native" GCC Native |
! [PLATFORM=arm32|PLATFORM=mips32|PLATFORM=ppc32|PLATFORM=ppc64] COMPILER (choice) |
# Debug build |
! CONFIG_DEBUG (y/n) |